на самом деле ничего сложного в протоколе нет
по таймеру настроенному ровно на 72 кГц, происходит переключение туда сюда ноги со светодиодом.
таким образом я формирую 64 импульса , а потом жду еще 64 импульса не дергая ногой, так передаю 1 бит
первый бит имеет длину 32 импульса , он стартовый ,чтобы через период бита опрос тсопа был именно в серединке следующего значащего бита.
- Код: Выделить всё • Развернуть
;***********************************************************************
;*
;*
;*
;* Library infrared data resiving and transmitting
;*
;* file: ir_data.asm
;* developer: Nikitoz
;*
;* using TIMER0
;*
;* interrupt vector:
;* rjmp ir_timer (tim0 ovf)
;*
;*
;***********************************************************************
;*
;* Prototypes
;*
;* ir_send - послать байт из temp по ИК
;* ir_resive - при обнаружении сигнала на ноге TSOP принять байт
;* ir_resive_wait - одидать приема байтаи
;*
;*
;***********************************************************************
;.equ irport = portB
;.equ irled = 0
;.equ TSOPpin = pinD
;.equ TSOP = 3
.def takts = r18 ;количество полупериодов в пачке
.def bits = r19 ;счетчик битов в пачке
.def ir_dr = r20 ;резервный регистр данных
/*
ir_send:
push ir_dr
push takts ;эти байты можно незаморачиваясь использовать
push bits
push temp1
mov ir_dr, temp ;резервируем данные, там стартбит пока будет
in temp1, timsk ;сохранение в стеке текущих астроек таймера
push temp1
in temp1, tccr0
push temp1
ldi temp1, 1 ;инициализация таймера
out tccr0, temp1
ldi temp1, (1 << toie0)
out timsk, temp1
ldi takts, 192;96
clr bits
ldi temp, 1 ;стартовый бит еденица
sei
overprov:
cpi bits, 9
brne overprov
pop temp1 ;извлекаем из стека предыдущие настройки таймера
out tccr0, temp1 ;и инициализируем как было
pop temp1
out timsk, temp1
pop temp1 ;извлекаем из стека предыдущие значения локальных переменных
pop bits
pop takts
pop ir_dr
ret
;-----------------------------------
ir_timer:
ldi temp1, ir_long
out tcnt0, temp1
sbrs temp, 0 ;если в данных нулевой бит установлен то пляшем ,или сначала стартбит
rjmp pc + 7
cpi takts, 129;65 ;это чтобы первая половина колебалась, вторая молчала
brmi ir_timer_1
sbrs takts, 0 ;если нечетное то 0
sbi irport, irled
sbrc takts, 0 ;если четное то 1
cbi irport, irled
ir_timer_1:
dec takts ;если пачка кончилась то на следущий бит
brne end_ir_timer
inc bits ;следущий бит
clr takts;, 128 ;нормальные биты по 33 полупериода в пачке
lsr temp ;LSB вперед
cpi bits, 1 ;первый - старт бит
brne pc + 2
mov temp, ir_dr ;начиная со второго по счету бита данные
cpi bits, 9 ;конец посылки
brne pc + 5
clr temp ;включаем таймер
out timsk, temp
out tccr0, temp
cli ;запрещаем прерывания
end_ir_timer:
reti
*/
;-----------------------------------
ir_resive_wait: ;если старт бит ещё ожидается
sbic TSOPpin, TSOP
rjmp ir_resive_wait
ir_resive: ;если старт бит уже пришел
push temp1
ldi temp1, 8
ir_resive_1: ;прием бита
ldi YL, low ( 3552 ) ;( 1778 )
ldi YH, high ( 3552 ) ;( 1778 )
rcall delay_1mks
lsr temp
sbic TSOPpin, TSOP
cbr temp, 0x80
sbis TSOPpin, TSOP
sbr temp, 0x80
dec temp1
brne ir_resive_1
ldi YL, low ( 3552 ) ;( 1778 ) ;когда последний бит уже пинят в эфире ещё идёт посылка
ldi YH, high ( 3552 ) ;( 1778 ) ;на неё может отреагировать следующий цикл приема
rcall delay_1mks ;выжидаем пока передатчик не закончит вещать
pop temp1
ret
;-----------------------------------
вот временная диаграмма передачи символа "1" (0x31)