rsdias escreveu:Preciso fazer um controle remoto com pic estou usando PIC12F675 programando em assembly, porém preciso saber como faço para medir pulsos de entrada em um unico Pino (receptor) -como identifico o sinal enviado, e como envio este sinal também em um unico pino (transmissor). Agradeço se alguem puder me ajudar.
Todos os pinos do PIC tem interrupção, isso vai te ajudar bastante...
Primeiro você tem que escolher um padrão de infravermelhos, existem muitos, os mais famosos são SONY SIRC ou Philips RC5/6, existem outros, a Sharp tem o seu, a NEC também...
Mas por uma questão de padrão procure usar ou o SIRC ou o RC5/6
Antes de mais nada, você precisa escolher e entender um dos protocolos, este site é repleto de informação:
http://www.sbprojects.com/knowledge/ir/ir.htm
SIRC
http://www.sbprojects.com/knowledge/ir/sirc.htm
RC5
http://www.sbprojects.com/knowledge/ir/rc5.htm
Escolhido o protocolo, escolhe-se também a frequência 36KHz ( RC5/6 ) ou 40KHz ( SIRC ) esta escolha é fundamental, pois terá impacto no seu receptor e logo, no seu alcance.
A maioria dos receptores tem frequência de 38KHz (TSOPxxxx por exemplo), para os testes iniciais, pegue qualquer um ( de TV, DVD etc.. tem muitos para vender por ai)
E o controle remoto do protocolo que você quer (vamos começar pelo receptor)
Ligue o TSOP em qualquer IO do 12F675, por que todos tem interrupção de mudança de estado.
Agora vamos supor que você escolheu o SIRC, veja como funciona os bits dele, o BIT 1 tem 1.2ms de modulação ligada e 0.6ms de modulação desligada e para o BIT 0 0.6 ms ligada e 0.6ms desligada.
Vimos que o que difere é o 1 tempo de modulação.
Fazendo a rotina.
Crie um registrador:
tempoBit
Quando o seu pic notificar mudança de estado no IO trate a interrupção e set um flag, pelo MAIN entre na rotina (call ou goto, tanto faz, prefira call neste caso, logo mais te digo por que...) NÃO CHAME A ROTINA DENTRO DA INTERRUPÇÃO!!!
Faça assim:
- Código: Selecionar todos
btfss IR_IN ; Testa o bit
retlw .255 ; É zero, retorna, tem que ser 1
CALCULA_TEMPO_BIT
incf tempoBit,f
call delay10us ; crie um delay de 10us!
btfss IR_IN
goto TRATA_BIT ; Fim de sinal, checa tempo de bip
goto CALCULA_TEMPO_BIT ; Ainda há sinal, teste novamente
TRATA_BIT
; aqui tem-se o valor do bit em 1, este valor é 10
;vezes menor que tempo de bit real, por que usamos um delay de 10ms
;sem falar do tempo de instrução
: Tolerância de bit
; 1 de 1ms( até 1.4 ms
; 0 de .4ms até .8ms
; faça subtrações
; São 4 ifs
; se estiver dentro do tempo de bit 1 é 1 se dentro de tempo 0 é 0
; retoro por retlw 0 para bit 0 e 1 para bit 1
; Depois chame um delay de 600ms e ignore o segundo pulso, por que ele nunca muda.
;
; Você tera uma rotina de contabiliza bit e uma de contabiliza byte
; A contabiliza byte chama a contabiliza bit que vai retornando bit a bit o recebido
; faça o teste do que retorna em work ( 0 ou 1 )
; pode fazer um andwf com a sua variável de byte e depois faça um rrf,f (pois começa pelo lsb) quando encher 8 bits
; chame o próximo byte, são 12,15 ou 20 bits, depende do protocolo.
; se retornar .255 que é erro, aborte e comece denovo...