Команда | Стартовый маркер |
Адрес передатчика |
Адрес приемника |
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