O Código do RC-5 está contido a partir do label IRC5A, e ocupa somente 19 instruções, recebendo o comando do controle remoto e postando nos pinos da porta B. No caso de usar o AtTiny teria que mudar os pinos de porta utilizados aqui. Somente 19 instruções, até hoje eu não vi nenhum outro código para decodificar RC-5 que tenha 19 instruções ou menos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
;============================================; ; receptor e decoder protocolo rc-5 (IR) ; ; author: wagner lipnharski ; e-mail: wagner@ustr.net ; data: outubro 25 2013 ; atmel avr atmega8 ; clock interno 8MHz ; ______ ; | __ | ; | | | | ; | | | | tsop 1238 ; | | | | (tsop12 38kHz) ; |_|__|_| ; | | | ; | | | ; - + out ; ; modulo receptor infrared ; pino digital (out) conectado em portd, 6 ; ;=============================================; .include "m8def.inc" ; ;---------------------------; .def temp = r16 ; .def rxdatal = r18 ; low .def bits = r20 ; .def temph = r21 ; .def templ = r22 ; ;---------------------------; .cseg ; .org $000 ; ;---------------------------; reset: rjmp start ; ; ; aqui vetores de interrupcao ;---------------------------; start: ldi temp, low(ramend) ; setup do stack out spl, temp ; endereço low ldi temp, high(ramend) ; out sph, temp ; endereço high ;---------------------------; sbi acsr, 7 ; disable analog comparator ;---------------------------; ser temp ; temp = 0xff out ddrb, temp ; portb como saida out portb, temp ; portb = 0xff out portd, temp ; portd como saida out ddrd, temp ; portd = 0xff cbi ddrd, 6 ; pino portd.6 como entrada cli ; disable qualquer interrupt ;===========================; irc5a: sbic pind, 6 ; modulo ir na porta.d.6 - salta a proxima se baixo rjmp pc-1 ; continua alta, volta a testar ldi r31, 40 ; contador de 0x2800 ate zero, em 4.752ms clr r30 ; subiw r31:r30, 1 ; decrementa os 16 bits brne pc-1 ; <> zero, volta uma e continua decrementando ldi bits, 11 ; onze bits irc5b: sec ; "c" (carry) bit 1 sbis pind, 6 ; pula a proxima se modulo IR = 1 clc ; se nao pulou, modulo ir esta baixo, carry=0 rol rxdatal ; Rotate Left Carry bit para dentro do Rxdatal ldi r31, 14 ; contador de tempo de 1.728ms. r31:r30=0x0e00 subiw r31:r30, 1 ; decrementa os 16 bits brne pc-1 ; volta 1 se bits baixos ainda nao zero dec bits ; passou mais um bit do frame IR brne irc5b ; se ainda nao os onze, volta e pega o proximo bit ; ; aqui o reg rxdatal contém os bits do infrared. ; pode-se mandar para uma porta, lcd, etc. ; andi rxdatal, 0x3f ; filtra os seis bits do comando recebido. out portb, rxdatal ; aqui a porta b mostra o comando rjmp irc5a ; vai novamente para pegar a proxima transmissao IR .exit |