Fiz um controle Infrared com dois PIC's (TX e RX), baseado no protocolo SIRC da Sony, utilizando a frequência de 38KHz para a portadora do Transmissor e PWM por software.
Testei com dois PIC's 16F628A e funcionou mais ou menos, por isso, resolvi pedir ajuda dos amigos aqui do fórum para as seguintes questões:
1) Com os PIC's 16F628A hora os LEDs no receptor são acionados e outras vezes não, ou seja, fica intermitente. Minha dúvida é a seguinte será que pode ser o Receptor Infrared TSOP1738 que está sem o Shield e está recebendo alguma interferência da luz solar ou não tem nada haver?
2) Outro problema é que não consigo fazer funcionar com o PIC12F675 como transmissor (PWM por software utilizando o mesmo código pro PIC 16F628A). Queria saber onde está o erro no código. Porque não funciona com o PIC 12F.
Abaixo mais detalhes do projeto e uma porção do código fonte (compilador CCS)
- Código: Selecionar todos
* BASEADO NO PROTOCOLO SIRC (SONY)
* INTERRUPÇÃO EXTERNA
* BITS DE COMANDO: 8 BITS
* START = 2400US
* BIT "1" = 1200US
* BIT "0" = 600US
ROTINA DE ENVIO DO BIT DE START (MODULADO COM PORTADORA DE 38KHz)
cpp code
void ir_send(unsigned int code)
unsigned char i = 0;
/*------ ENVIO START --------*/ ENVIO PRIMEIRO O BIT DE START PWM POR SOFTWARE
for (i=0;i<93;i++){
output_high(pin_B3);
delay_us(9);
output_low(pin_B3);
delay_us(2);
}
delay_us(600);
ROTINA PARA ENVIAR O BIT 0 e o BIT 1 (8 BITS) - MODULADO COM PORTADORA DE 38KHz
cpp code
void ir_send (unsigned int code)
while ( j < 8 ) {
#bit first = code.0 // associa o bit 0 à variável first
// Transmitimos un 1
if (first) { //Verifica se é 0 ou 1. Se for 1 envia o protocolo relativo ao bit 1
for (i=0;i<47;i++){
output_high(pin_B3);
delay_us(9);
output_low(pin_B3);
delay_us(2);
}
delay_us(600);
}
// Transmitimos un 0
else { //Se for 0 envia o protocolo relativo ao bit 0
for (i=0;i<23;i++){
output_high(pin_B3);
delay_us(9);
output_low(pin_B3);
delay_us(2);
}
delay_us(600);
}
code >>= 1; //Desloca os bits para a esquerda
j++;
_________________________________________________________________
ENVIO DO CÓDIGO DA TECLA PRESSIONADA (8 BITS)
cpp code
while (true){
if (!TECLA1){
#define code 0b00000001
ir_send(code);
j=0;
}
if (!TECLA2){
#define code 0b00000011
ir_send(code);
j=0;
}