[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
В процедуры обработки прерываний приема и передачи вставляю перезагрузку регистра Compare и разрешаю прерывание от отловленного таймаута. МК разные, даже на С куски будут выглядеть по-разному, поэтому привожу пример на квазиязыке:
UARTINT:
ClearTimeoutFlag ;0 - идет обмен
ReadTimerToReg ;Читаю текущее значение таймера
AddTimeoutValueToReg ;TimeoutValue выбираю не менее 4-х межбайтовых интервалов
MoveRegToCompareReg ;Через TimeoutValue сработает Compare Match
EnableCompareMatchInterrupt
ProcessUARTByte
ReturnFromInterrupt
COMPAREINT:
SetTimeoutFlag ;1 - обмен закончен
DisableCompareMatchInterrupt ;До следующего прерывания UART
ReturnFromInterrupt
В этой реализации плохо то, что TimeoutFlag сбрасывается не сразу, как пошла передача/прием, а по окончанию байта, но зато не тратятся лишние ноги. Когда ног не жалко, TxD и RxD заводятся на свободные входы прерываний (или через "или" на один вход), тогда TimeoutFlag переключается уже в самом начале приема/передачи. Этот TimeoutFlag удобно назначить на ногу порта для мониторинга/управления обменом, а если немного усложнить его обработку (по-разному обработать ReceiveUART и TransmitUART), то можно получить полноценные сигналы арбитража RS485.
В том или ином виде использую этот подход в множестве изделий, результаты безукоризненные. А идея, собственно, та же, что и озвучена ув. AlexD и ZAlex - перезапускаемый одновибратор. Жаль только, что у автора вопроса нет свободных прерываний :(((
E-mail: info@telesys.ru