Так получилось, что аппаратный УАРТ занят под другие нужды.
Необходимо отслеживать момент прихода массива данных с компа через программный УАРТ.
Поискал по нету прерывания для него, и что-то не нашёл. В главном цикле идёт основная программа, вычисления, реакция на кнопки, обработка других прерываний... Может кто-то сталкивался с подобным?
Прерывание на программный УАРТ
Сообщений 1 страница 8 из 8
Поделиться12012-04-21 22:46:07
Поделиться22012-04-21 22:59:03
Можно повесить прием данных на пин, отвечающий так же за внешнее прерывание (IntX).
Других вариантов что-то не вижу.
Поделиться32012-04-21 23:07:20
IntX тоже заняты...
Мега16, заняты все порты A,C,D.
На порте В заняты РВ2 и РВ3.
Итого не так уж и жирно. Только если на Мегу 128 переезжать...
Поделиться42012-04-22 10:12:28
Вообще суть прерывания порта реагировать не на что попало на входе, а на то когда пора забирать данные. Думаю зная скорость приема, можно настроить таймер просто на передергивание прерывания и подсчет принятых бит, когда количество равно пакету, то совершать действия (скажем выставлять бит) для дальнейшей обработки/чтения.
Поделиться52012-04-22 22:51:13
Вообще-то длина пакетов может быть разной...
Суть работы устройства такая - пока нет данных от ПК, оно работает автономно. При появлении данных оно должно просто принимать или в ответ на определённую команду от ПК передавать данные.
Наверное вариант от Mrshilov можно попробовать, только не очень представляю как это реализовать в коде.
Поделиться62012-04-22 23:28:57
Вот пример кода программного UART на прием. На INT2 (M16). Нормально работает, если не нет других прерываний,
которые могут помешать правильно зафиксировать начало старт-импульса
Dim Rdat As Byte 'признак "Принят новый байт"
Dim Rxda As Byte 'принятый байт
'------------------------------------------------------------
' ПОДПРОГРАММА ПРЕРЫВАНИЯ ПО НИЗКИМУ УРОВНЮ ДЛЯ ВХОДА INT2
'------------------------------------------------------------
'ПРИЕМ СИМВОЛА. НА ЧАСТОТЕ ГЕНЕРАТОРА 1.667 МГЦ НА ПОРТ PB3
'ПРИ СКОРОСТИ ПРИЕМА 9.6 KB - 173.3 ТАКТА НА БОД
'ПРИ СКОРОСТИ ПРИЕМА 19.2 KB - 86.7 ТАКТОВ НА БОД
'ПРИ СКОРОСТИ ПРИЕМА 38.4 KB - 43.3 ТАКТОВ НА БОД
$asm
Ext_int0:
Push R21 'сохраним регистры
In R21 , Sreg
Push R21
Push R22
Push R23
'12 ТАКТОВ ПОСЛЕ СПАДА УЖЕ ПРОШЛО
Ldi R22 , 23 'ЗАДЕРЖКА ДО 52 МКС
Ext_i1:
DEC R22
BRNE EXT_I1
'НАХОДИМСЯ В СЕРЕДИНЕ СТАРТ-БИТА
SBIC PINB, 2 'УБЕДИМСЯ, ЧТО СТАРТ-БИТ РАВЕН "0"
rjmp Ext_i5
LDI R21, 8 'ЧИСЛО ПРИНИМАЕМЫХ БИТ
Ext_i2:
LDI R22, 56 'ЗАДЕРЖКА ДО 104 МКС
Ext_i3:
DEC R22
BRNE EXT_I3
'-------
'НАХОДИМСЯ В СЕРЕДИНЕ ИНФОРМАЦИОННОГО БИТА
CLC 'УСТАНОВИТЬ ЗНАЧЕНИЕ CARRY
Sbic Pinb , 2 'РАВНЫМ ЗНАЧЕНИЮ ПРИНИМАЕМОГО БИТА
SEC
Ror R23 'ПРИНЯТЬ БИТ
DEC R21 'ПРОВЕРИМ БИТЫ
BRNE EXT_I2 'ЕСЛИ НЕ ВСЕ - ПОВТОРИМ ПРИЕМ
'-------
Ldi R22 , 30 'ЗАДЕРЖКА НЕМНОГО БОЛЬШЕ 52 МКС
Ext_i4: 'ДЛЯ ОКОНЧАНИЯ ПОСЛЕДНЕГО БИТА, КОТОРЫЙ
DEC R22 'МОЖЕТ БЫТЬ РАВЕН НУЛЮ И МОЖЕТ ВЫЗВАТЬ
BRNE EXT_I4 'НОВОЕ ПРЕРЫВАНИЕ
Sts {rxda} , R23 'ЗАПОМНИТЬ ПРИНЯТЫЙ БАЙТ
LDI R21 , 255
Sts {rdat} , R21 'ПОСТАВИТЬ ПРИЗНАК - ПРИНЯТЬ БАЙТ
Ext_i5:
POP R23
POP R22
POP R21
Out Sreg , R21
Pop R21
RETI
$end Asm
Return
'------------------------------------------------------------Поделиться72012-04-22 23:30:26
P.S. Для другого кварца константы задержек нужно пересчитать!
Поделиться82012-04-24 14:25:06
Ну а если через 1n4148 RxD к INT1 и уже программно смотреть, чье это прерывание?