Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Прерывание на программный УАРТ

Сообщений 1 страница 8 из 8

1

Так получилось, что аппаратный УАРТ занят под другие нужды.
Необходимо  отслеживать момент прихода массива данных с компа через программный УАРТ.
Поискал по нету  прерывания для него, и что-то не нашёл. В главном цикле идёт основная программа, вычисления, реакция на кнопки, обработка других прерываний... Может кто-то сталкивался с подобным?

0

2

Можно повесить прием данных на пин, отвечающий так же за внешнее прерывание (IntX).
Других вариантов что-то не вижу.

0

3

IntX тоже заняты...
Мега16, заняты все порты A,C,D.
На порте В заняты РВ2 и РВ3.
Итого не так уж и жирно. Только если на Мегу 128 переезжать...

0

4

Вообще суть прерывания порта реагировать не на что попало на входе, а на то когда пора забирать данные. Думаю зная скорость приема, можно настроить таймер просто на передергивание прерывания и подсчет принятых бит, когда количество равно пакету, то совершать действия (скажем выставлять бит) для дальнейшей обработки/чтения.

0

5

Вообще-то длина пакетов может быть разной...
Суть работы устройства такая - пока нет данных от ПК, оно работает автономно. При появлении данных оно должно просто принимать или в ответ на определённую команду от ПК передавать данные.
Наверное вариант от Mrshilov можно попробовать, только не очень представляю как это реализовать в коде.

0

6

Вот пример кода программного 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
'------------------------------------------------------------

0

7

P.S. Для другого кварца константы задержек нужно пересчитать!

0

8

Ну а если через 1n4148 RxD к INT1 и уже программно смотреть, чье это прерывание?

0