UART

 

Команда Стартовый
маркер
Адрес
передатчика
Адрес
приемника
OCH OCL DB1 DB2 DB3 DB4 Стоп
маркер 
Контрольная
сумма
TELE 55 00 01 00 20 00 00 0A 66 AA 90
WIDE 55 00 01 00 40 00 00 0A 00 AA D6
FAR 55 00 01 01 00 00 00 0A 66 AA AF
NEAR 55 00 01 02 00 00 00 00 66 AA B8
STOP 55 00 01 00 00 00 00 00 00 AA 1F

 

OCH Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
(byte 4) 0 0 0 0 0 Focus
Auto
Focus
Near
Focus
Far

 

OCL Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
(byte 5) 0 Wide
(Zoom out)
Tele
(Zoom in)
Down Up Left Right "0" - PTZ
Command


.def tmp1 =r19 ;Оперативный регистр 1
.def tmp2 =r20 ;Оперативный регистр 2

;Установка векторов прерывания
.org 0 ;В эту точку процессор попадает после сброса
rjmp start

.org URXCaddr ;В эту точку процессор попадает
rjmp Receive_Int ;при возникновении прерывания RXC

.org 20
;Инициализация:

start: ldi tmp1,LOW(RAMEND) ;Установка стека
out spl,tmp1

ldi tmp1,0b00011000 ;Инициализация UART
out UCR,tmp1 ;TXEN=1,RXEN=1,СРH9=0,TXB8=1
ldi tmp1,25 ;9600 бит/c при fclk=4МГц
out UBRR,tmp1

sbi UCR,RXCIE ;Разрешение прерывания от RXC
sei ;Разрешение всех разрешенных прерываний

;Основной цикл:
Loop:

rjmp Loop

;ПП обработки прерывания при поступлении очередного байта в
;приемник UART

Receive_Int:
push tmp1
in tmp1,sreg
push tmp1

in tmp1,UDR ;Считать байт из регистра данных приемника

sbic USR,ORR ;Eсли были потери информации между двумя
rjmp qq ;последними байтами
rjmp in1
qq:

rjmp endr

in1: ;Иначе, проверка принятого байта
cpi tmp1,$55 ;Если это заголовок нового сообщения('*'),
brne rrr1

rrr1:

endr: pop tmp1; ;Восстановить из стека значения регистров
out sreg, tmp1
pop tmp1
reti
 

Яндекс.Метрика