|
Гарантия того, что по USART все данные ушли |
|
|
|
Jan 14 2010, 10:27
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 14-12-07
Из: Беларусь, Гомель
Пользователь №: 33 305

|
Здравствуйте, не могли бы вы разъяснить такую ситуацию? Перед входом в спящий режим мне нужно убедиться, что все данные ушли в линию. Для этого есть флаг ТХС. В даташите сказано: Флаг устанавливается в 1 после передачи всех битов посылки из сдвигового регистра передатчика при условии, что в регистр данных UDR не было загружено новое значение. Флаг сбрасывается аппаратно при выполнении подпрограммы обработки прерывания или программно, записью в него лог. 1
Прерываний я не активировал, т.е. получается что после первой передачи, когда данные ушли, и в буфер я данных для отсылки не заносил, этот флаг установится в 1 и больше никогда не сбросится? Если да, то получается, что после каждой передачи мне нужно программно сбрасывать этот бит?
|
|
|
|
|
 |
Ответов
|
Jan 31 2010, 22:26
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 8-08-05
Пользователь №: 7 466

|
Пользуюсь простым алгоритмом при реализации Modbus RTU (потолок скорости 115200). Назначения: 1. Буфер приёмника/передатчика (первый байт - счётчик). 2. 1 РОН для счётчика "долгих" циклов. 3. 2 РОНа для хранения CRC16. 4. Функция подсчёта CRC "на лету". 5. Функция записи в буфер записывает последними в буфер 2 байта CRC16. 6. Функция передачи данных подсчитывает CRC16 "на лету". Собственно проверка: 1. "Длинный" счётчик =0? Да. 2. РОНы контрольной суммы =0? Да. Резюме: данные "уехали" без проблем. CODE ;====================================================================== ============= ; ЗАДАЧА 7 - Передача фрейма данных в хост-компьютер по USART0 по протоколу ModBusRTU ;=============================================================================== ==== PLC_7: sbrs rFlagPLC, flPLC_7 rjmp Exit_PLC_7
cbr rFlagPLC, (1<<flPLC_0) ; Запретить приём по USART0 на время передачи sbrc rFlagUSART, flReady0 ; Начальная инициализация была? rjmp lbLoadTxD0 ; Да ;------------------------------------------------------------------- ; Инициализация функции передачи данных ldi rFuncL, N115200 ;1. Делитель частоты UBRR0H:UBRR0L = 0x0007 out UBRR0L, rFuncL ;2. Асинхронный режим UMSEL = 0 out UBRR0H, rZero ;3. Контроль чётности UPM1 = 1, UPM0 = 0 ldi rFuncL, 0xA6 ;4. Один стоп-бит USBS = 0 out UCSR0C, rFuncL ;5. Формат кадра 8бит UCSZ1 = 1, UCSZ0 = 1 lds rCounter0, pCountUSART0 ; Количество передаваемых байт данных ldi XL, low(pAdressUSART0) ; Буфер передатчика начинается с адре- ldi XH, high(pAdressUSART0) ; са УСО
sbi UCSR0B, TXEN0 ; Включить передатчик USART0! sbr rFlagUSART, (1<<flReady0) ; PLC инициализирована ;--------------------------------------------------------------------------- ; Загрузка байта данных для передачи lbLoadTxD0: cpse rCounter0, rZero ; Все байты фрейма загружены? rjmp lbFrame0 ; Нет rjmp lbEndTxD0 ; Да lbFrame0: sbis UCSR0A, UDRE0 ; Надо загрузить байт для передачи? rjmp Exit_PLC_7 ; Нет.
ld rdUSART0, X+ ; Загрузить передаваемый байт out UDR0, rdUSART0 ; Собственно загрузить байт данных для передачи dec rCounter0 ; Уменьшаем счётчик передаваемых байт фрейма cbi UCSR0A, UDRE0 ; Сбросить флаг требования загрузки sbr rFlagUSART, (1<<flCRC160) ; Установить флаг требования подсчёта CRC16 ;--------------------------------------------------------------------------- ; Окончание функции передачи данных lbEndTxD0: sbis UCSR0A, TXC0 ; Ожидание передачи последнего байта rjmp Exit_PLC_7 ;------------------------------------------------------------------- ; Сброс передатчика USART0 clr rFuncL out UCSR0B, rFuncL ;------------------------------------------------------------------- ; Проверка регистров CRC16 на ошибку cpse rCRC160L, rZero rjmp lbTxDError0 cpse rCRC160H, rZero rjmp lbTxDError0 rjmp lbExitTxD0 ;------------------------------------------------------------------- lbTxDError0: ; Обработка ошибки подсчёта CRC16 "на лету" sbr rErrInter, (1<<flCRC16T0xD) lbExitTxD0: sbi UCSR0A, TXC0 cbr rFlagUSART, (1<<flEmpty0)+(1<<flReady0)+(1<<flCRC160)+(1<<flFrame0) cbr rFlagPLC, (1<<flPLC_7); Выключить функцию передачи данных по USART0 sbr rFlagPLC, (1<<flPLC_0); Включить функцию приёма данных по USART0 Exit_PLC_7: nop
|
|
|
|
Сообщений в этой теме
admiral Гарантия того, что по USART все данные ушли Jan 14 2010, 10:27 Rst7 ЦитатаЕсли да, то получается, что после каждой пер... Jan 14 2010, 10:45 admiral Цитата(Rst7 @ Jan 14 2010, 14:45) По наук... Jan 14 2010, 11:29 Rst7 ЦитатаСпасибо, а если неизвестно последний это бай... Jan 14 2010, 11:32 Палыч Цитата(Rst7 @ Jan 14 2010, 13:45) По наук... Jan 14 2010, 11:38 Rst7 ЦитатаВыкручивался из этой ситуации сбросом TХC по... Jan 14 2010, 11:49 Палыч Цитата(Rst7 @ Jan 14 2010, 14:49) Но уж л... Jan 14 2010, 12:07  defunct Цитата(Палыч @ Jan 14 2010, 14:07) Кстати... Jan 14 2010, 12:33   Палыч Цитата(defunct @ Jan 14 2010, 15:33) Не з... Jan 14 2010, 13:04    Qwertty Цитата(Палыч @ Jan 14 2010, 16:04) Поясню... Jan 14 2010, 13:42    _Pasha Цитата(Палыч @ Jan 14 2010, 17:04) 1. Дан... Jan 14 2010, 13:59    defunct Цитата(Палыч @ Jan 14 2010, 15:04) Это-то... Jan 14 2010, 18:08     _Pasha Цитата(defunct @ Jan 14 2010, 22:08) Флаг... Jan 14 2010, 18:53      defunct Цитата(_Pasha @ Jan 14 2010, 20:53) 1) от... Jan 14 2010, 19:37       Qwertty Цитата(defunct @ Jan 14 2010, 22:37) А за... Jan 14 2010, 20:58     Палыч Цитата(defunct @ Jan 14 2010, 21:08) В си... Jan 15 2010, 08:12      defunct Цитата(Палыч @ Jan 15 2010, 10:12) Да и ... Jan 15 2010, 11:54       demiurg_spb Цитата(defunct @ Jan 15 2010, 14:54) В Mo... Jan 21 2010, 11:10        _Pasha Цитата(demiurg_spb @ Jan 21 2010, 15:10) ... Jan 21 2010, 11:32         demiurg_spb А я вот всё больше и больше склоняюсь к тому что э... Jan 21 2010, 12:03         demiurg_spb Цитата(_Pasha @ Jan 21 2010, 14:32) Никак... Jan 22 2010, 18:26        defunct Цитата(demiurg_spb @ Jan 21 2010, 13:10) ... Jan 21 2010, 17:28 V_G На мой взгляд, как раз широкое использование преры... Jan 14 2010, 12:43 Rst7 ЦитатаНа мой взгляд, как раз широкое использование... Jan 14 2010, 12:48 admiral Объясню ситуацию:
делаю устройство, т.к. питаться ... Jan 14 2010, 12:57 ILYAUL Цитата(admiral @ Jan 14 2010, 15:57) И во... Jan 14 2010, 15:16 defunct Цитата(admiral @ Jan 14 2010, 14:57) Прер... Jan 14 2010, 17:30 V_G Посмотрел на симуляторе - у меня флаг TXC сброшен ... Jan 14 2010, 13:31 Палыч Цитата(Rst7 @ Jan 14 2010, 15:48) Тут нем... Jan 14 2010, 13:48  Qwertty Цитата(Палыч @ Jan 14 2010, 16:48) Значит... Jan 14 2010, 13:57 SysRq Цитата(admiral @ Jan 14 2010, 15:57) Объя... Jan 14 2010, 17:44 Maik-vs RS485, скорости до 115200. Делаю так же: формирую ... Jan 14 2010, 19:03 HALFer admiral,
если "правильность" софта не пу... Jan 14 2010, 20:35 admiral Цитата(HALFer @ Jan 15 2010, 00:35) admir... Jan 18 2010, 07:31  Maik-vs Цитата(admiral @ Jan 18 2010, 10:31) Я та... Jan 20 2010, 12:35 SysRq Цитата(_Pasha @ Jan 14 2010, 21:53) 1) от... Jan 15 2010, 06:45 _Pasha Цитата(SysRq @ Jan 15 2010, 10:45) Если в... Jan 15 2010, 07:48 SysRq Цитата(_Pasha @ Jan 15 2010, 10:48) Объяс... Jan 15 2010, 08:02 _Pasha А кто как борется с коллизиями?
RXE всегда включен... Jan 15 2010, 09:23 Палыч Цитата(_Pasha @ Jan 15 2010, 12:23) А кто... Jan 15 2010, 09:43 V_G Цитата(_Pasha @ Jan 15 2010, 19:23) А кто... Jan 15 2010, 10:59 Александр Куличок ЦитатаЕсли же флаг сбрасывать при загрузке UDR, то... Jan 20 2010, 22:47 Maik-vs Цитата(Александр Куличок @ Jan 21 2010, 01... Jan 31 2010, 14:54 Александр Куличок Что ж тут непонятного. Время на передачу байта фик... Jan 22 2010, 20:18 _Pasha Цитата(Александр Куличок @ Jan 23 2010, 00... Jan 23 2010, 05:02  demiurg_spb Цитата(_Pasha @ Jan 23 2010, 08:02) Проще... Jan 29 2010, 18:26   _Pasha Цитата(demiurg_spb @ Jan 29 2010, 21:26) ... Jan 30 2010, 03:05    demiurg_spb Цитата(_Pasha @ Jan 30 2010, 06:05) 1. На... Jan 30 2010, 10:46     _Pasha Цитата(demiurg_spb @ Jan 30 2010, 13:46) ... Jan 31 2010, 05:24      demiurg_spb Цитата(_Pasha @ Jan 31 2010, 08:24) Поток... Jan 31 2010, 11:13 Александр Куличок Речь шла о флаге TXC. И о возможности отслеживания... Jan 31 2010, 21:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|