AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
10.09.2019, 16:46
|
|
Частый гость
Регистрация: 19.05.2010
Сообщений: 27
Сказал спасибо: 76
Сказали Спасибо 8 раз(а) в 2 сообщении(ях)
|
Странный баг управления драйвером RS-485
Устройство работает не первый год.
ATmega2560 через UART0 и ADM2483 выполняет роль единственного ведомого по Modbus RTU на 19200 бодах. Обычно работает как часы, но иногда связь МК с панелью оператора (Ведущий) зависает, помогает только рестарт МК.
Уже дважды в разных комплектах оборудования обнаруживал осциллом странную картину зависания: в ответ на запрос Ведущего МК формирует правильный ответ Ведомого, но переключение из режима передачи в режим приема выполняет до передачи последних двух байт (CRC16). Ведомый видит "обрезанный ответ", ждет свой таймаут (у меня 2 с) и все повторяется до бесконечности.
Осциллограмма c "бедой": 1к - TxD (ATmega:TXD0, ADM2483:6), 2к - R/W (ATmega:PB4, ADM2483:4,5)
Штатная осциллограмма (каналы те же):
Ответ передается подпрограммой в основном цикле:
Код:
|
void RS485_U0_send(unsigned char *buff, unsigned char len)
{
int cnt;
PORTB |= (1 ‹‹ PB4);//and set high level
cnt = 0;
while(cnt ‹ len)
{
while(!( UCSR0A & (1 ‹‹ UDRE0)));
UDR0 = buff[cnt ++];
}
while(!( UCSR0A & (1 ‹‹ TXC0)));//
UCSR0A |= (1 ‹‹ TXC0);
PORTB &= ~(1 ‹‹ PB4);//set R/W low level
inc_tranzaction_MB1();
} |
Проверил поисковиком редактора все файлы проекта - нигде больше нет обращения к биту PORTB.PB4
Прерывания в МК используются, в том числе приемника UART0, передатчик не использует.
Транслятор старенький AVR GCC под AVR Studio 4.18
Когда увидел в первый раз, вставил программную задержку порядка 1 мс, но... не нравится.
Может ли помочь такое "обрамление":
Код:
|
__asm__ ("cli");
PORTB &= ~(1 ‹‹ PB4);//
__asm__ ("sei"); |
?
Для автовосстановления обмена данными в основном цикле веду счет успешных запросов, если за секунду ни одного, вызываю функцию инициализации UART0+Modbus. Как видно, не помогает...
Код:
|
void ModBus1k_init(_ModBusCallBack *ModBusCallBack)
{
UCSR0B = 0;
UBRR0 = 0;
DDRB |= (1 ‹‹ PB4);//485 R/W2
PORTB &= ~(1 ‹‹ PB4);//Reciver
PRR0 &= ~(1 ‹‹ PRUSART0); //power on
UBRR0 = F_CPU / 16 / BAUD - 1;//t_bit=1/BAUD=52us, t_Byte=52*10/11=520/572us, t_silent=tB*3.5=1820/2002us
UCSR0B = (1 ‹‹ TXEN0) | (1 ‹‹ RXEN0) | (1 ‹‹ RXCIE0); //Enable RX, TX port IO and RX interrupt
//UCSR0C |= (1 ‹‹ USBS0);//Stop2
Rxcounter1 = 0;
DataAvalable1=0;
CallBack = ModBusCallBack;
frame_error = 0;
OCR3A = F_CPU * 45 / 256 / BAUD;//=150 (45*1.1=49.5)
TIMSK3 = (1 ‹‹ OCIE3A);
} |
Пните, кому не лень!
Последний раз редактировалось bdn62; 10.09.2019 в 16:59.
|
|
|
|
10.09.2019, 18:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,032
Сказал спасибо: 3,035
Сказали Спасибо 3,205 раз(а) в 2,175 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Сообщение от bdn62
|
Ведомый видит "обрезанный ответ", .....
|
Свой-же ответ? Т.е полудуплекс с объединёнными DE/!RE ?
Сообщение от bdn62
|
Для автовосстановления ...
|
Заблокировать на время передачи?
Сообщение от bdn62
|
нигде больше нет обращения к биту PORTB.PB4
|
А к DDRB .PB4 нет-ли другого доступа?
__________________
Экзорцист 40-го уровня.
|
|
|
|
11.09.2019, 02:04
|
|
Частый гость
Регистрация: 19.05.2010
Сообщений: 27
Сказал спасибо: 76
Сказали Спасибо 8 раз(а) в 2 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Оговорился: ...Ведущий видит...
Не понял
К DDRB.PB4 тоже обращение лишь при инициализации
|
|
|
|
11.09.2019, 02:34
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,705
Сказал спасибо: 189
Сказали Спасибо 3,194 раз(а) в 2,071 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Сообщение от bdn62
|
while(!( UCSR0A & (1 ‹‹ TXC0)));//
|
тупой метод. жрет время проца.
я 15 лет не использовал авр.
у них нет там прерывания по признаку line idle или transaction end??
вот по этим признакам и переключать на прием.
__________________
кагмаподэ магмаподэ
|
|
|
|
11.09.2019, 08:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,032
Сказал спасибо: 3,035
Сказали Спасибо 3,205 раз(а) в 2,175 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Сообщение от bdn62
|
Не понял
|
Может-ли функция "ModBus1k_init" прервать работу "RS485_U0_send"? Если может - запрещать попытки реинициализации на время передачи.
__________________
Экзорцист 40-го уровня.
|
|
|
|
11.09.2019, 10:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,718
Сказал спасибо: 130
Сказали Спасибо 1,108 раз(а) в 527 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Перед тем, как переводить режим в состояние "прием" проверь состояние передатчика. Где-то в нем должен быть флаг типа "очередь на передачу пуста".
А то похоже программный цикл передачи отработал, а аппаратная часть немного запаздывает, выполняя передачу. В результате ты переключаешь режим до того, как передатчик полностью вытолкнет из своего буфера данные в линию.
|
|
|
|
11.09.2019, 10:13
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,705
Сказал спасибо: 189
Сказали Спасибо 3,194 раз(а) в 2,071 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Бит TXC0 (6) регистра UCSR0A - флаг завершения передачи (1 - после завершения передачи из сдвигового регистра, и если в UDR0 не было загружено нового значения. флаг сбрасывается записью в него 1).
Бит UDRE0 (5) регистра UCSR0A - флаг опустошения регистра данных UDR0 (устанавливается в 1 после пересылки данных из UDR0 в сдвиговый регистр передатчика и означает что в регистр данных можно загружать новое значение. сбрасывается при записи в UDR0 новых данных).
мошт лучше 5 бит мониторить?
__________________
кагмаподэ магмаподэ
|
|
|
|
11.09.2019, 10:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,985
Сказал спасибо: 0
Сказали Спасибо 4,943 раз(а) в 2,371 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Сообщение от индюк
|
15 лет не использовал авр
|
с 2004? зуб даешь?
|
|
|
|
11.09.2019, 10:34
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,705
Сказал спасибо: 189
Сказали Спасибо 3,194 раз(а) в 2,071 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Сообщение от jump
|
с 2004? зуб даешь?
|
да хоть все дам.
я тогда перешел на lpc17xx lpc13xx
потом уж на стм32 через несколько лет.
у меня комп на котором я кодил для lpc не включался уж лет 8 точно.
__________________
кагмаподэ магмаподэ
|
|
|
|
11.09.2019, 10:35
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,058
Сказал спасибо: 2,563
Сказали Спасибо 11,890 раз(а) в 5,964 сообщении(ях)
|
Re: Странный баг управления драйвером RS-485
Сообщение от индюк
|
мошт лучше 5 бит мониторить?
|
Лучше оба. Переписывание байта из регистра данных в регистр передачи не говорит о завершении передачи и если в этот момент выключить передачу...
А вообще, в АВР-ках у меня прием-передача на прерываниях и через буфер. Загнал в буфер - и не парюсь. Все стабильно принимается и передается.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:23.
|
|