Перейти к содержанию
    

А какие проблемы? далаете нормальный протоколо-независимый драйвер UART'а c буферизированным приемом и передачей.

Пишете две функции-задачи по очереди вызываемые в основном цикле программы, одна для обслуживания мастера, вторая для слейва. Никаких Delay_ms и прочий хлам не использовать!! Если слейв требует какого-то реалтайма для выдержки 3.5 символьного интервала, что организуется одним из таймеров, то modbus мастер - это совершенно неприхотливая задача. Выплевывать данные в UART и забирать ответ через скажем 100ms. Вот и вся ее суть.

В принципе, я так и сделал. На Slave постоянно включено прерывание по приему. И по завершению приема фрейма посылается ответ... А Master вызывается по прерыванию tim2. И вопрос в том, что Slave перебивает работу Mastera своими прерываниями. И Master посылает все время 1й запрос...А если выключаю устройство, которое подключено к Slave (то есть Slave не работает), Master начинает работать нормально...

А если на время работы Мастера запрещать Слейв, то обратно включить не могу его..Молчит..Может подскажите что?

Какой смысл ставить такой медленный кварц, и пользовать только ~20% производительности МК?

Ну это да, согласен, что протупил...Исправлю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для выдержки 3.5 символьного интервала, что организуется одним из таймеров

Можно вообще обнаглеть и использовать dummy writes при выключенном передатчике. Будет 4. Кунсткамера, но экономненько :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И вопрос в том, что Slave перебивает работу Mastera своими прерываниями. И Master посылает все время 1й запрос...А если выключаю устройство, которое подключено к Slave (то есть Slave не работает), Master начинает работать нормально...
Очень похоже, что у Slave разрешено какое-то прерывание, а соответствующей процедуры обработки этого прерывания - нет. При этом происходит переход на ячейку с адресом 0, и всё - заново с первой посылки Master'а...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень похоже, что у Slave разрешено какое-то прерывание, а соответствующей процедуры обработки этого прерывания - нет. При этом происходит переход на ячейку с адресом 0, и всё - заново с первой посылки Master'а...

Точно. :a14:

Напутал с регистром UCSR1B. Разрешил прерывание по "завершению передачи" (его вообще в программе не использовал), а прерывание по "очистке регистра передатчика" вообще не включено было.. Как оно вообще работало...хз... :biggrin:

Спасибо :beer:

Вечером попробую на устройстве..Отпишусь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравия желаю всем !

 

Делаю устройство на Mega162 с двумя протоколами modbus.

USART0 - master, посылает всего 11 разных запросов. USART1 - slave, отвечает на эти 11 запросов с некоторыми корректировками. То есть устройство устанавливается между master и slave и общается с ними с нужными мне исправлениями.

 

В общем, сделал отдельно master и slave - работает, но когда все в целом, то работает только slave, а master зацикливается на 1-й посылке, иногда 2-я проскакивает.

 

Вроде проблема с прерываниями, т.к. slave постоянно принимает и отвечает, и не дает master работать. Игрался с запретом прерываний, но ничего не помогло.

 

Также делал чтобы slave принял, ответил, а потом master послал, принял, поочередно, но так теряется слейвом фреймы.

 

У кого могут быть какие идеи? Такое устройство возможно ли вообще?

 

Мега162, кварц - 3,6864... Параметры связи обоих 2400-О-1...

Делал такое: модбас на меге 162 в два USARTA, без прерываний (только переполнение таймера для интервалов), работает устойчиво на 115200. Кстати, действительно, почему такая маленькая частота кварца? Подсчёт контрольной суммы "на лету". Написано на ассемблере. Если интересно могу выслать исходник без дешифратора команд и других "прибамбасов".

Только работа USATR'ов. Мой адрес [email protected]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если интересно могу выслать исходник без дешифратора команд и других "прибамбасов".

Недавний опыт общения показал: не надо сишников снабжать асмовыми исходниками. Пусть задохнутся. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Недавний опыт общения показал: не надо сишников снабжать асмовыми исходниками. Пусть задохнутся. :(

 

А к чему это написано??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Утройство сделал. Даже хватило кварца на 3,6864....Всем спасибо за помощь. Отдельное спасибо defunct и Палыч :a14:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...