Boa tarde
Estou a tentar controlar o brilho de um led através de um comando de tv. O comando usa o protocolo RC5 da philips. Para receber o sinal estou a usar o TSOP 1736 que envia o sinal do comando para um atmega168 que está a funcionar a 8Mhz de frequência.
O brilho e controlado através de um sinal de PWM, que é enviado pelo pino 17.
O micro não consegue distinguir que tecla pressiono, assumindo sempre que o código que recebo é um 'zero', pressionando uma tecla qualquer.
O código foi feito por um colega meu, e supostamente funcionou, por isso não sei o que há de errado.
Estou a usar um comando de tv da mitsai, que funciona numa televisão philips, por isso o problema não estará no comando.
Alguém me pode ajudar?
Cumprimentos
#include <io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdio.h>
//Macros e constantes
//T=1.778 x 10^-3
#define ValorAlto() (bit_is_set(PIND,PD2))
#define ValorBaixo() (bit_is_clear(PIND,PD2))
#define Queimatempo() {while (flag==0);flag=0;}
#define Contador 17
#define BIT025 26 //1/4 de T
#define BIT05 51 //1/2 de T
#define BIT075 75 //3/4 de T
unsigned int Descodificar(void);
static volatile int flag;
ISR(TIMER0_COMPA_vect){
flag = 1;
}
unsigned char codigo;
unsigned int Descodificar(void){
unsigned char timer=0,i;
TCCR0A = TCCR0A|0b00000010;
TCCR0B = TCCR0B|0b00000010;
TIMSK0 = TIMSK0|0b00000010;
OCR0A = 17;
SREG = SREG|0b10000000;
PORTB=0x01; //É activado um led sempre que recebe um código. //Desta forma é possível verificar se está ou não a receber
while ( (ValorBaixo()) && (timer<51) ){
Queimatempo();
timer++;
} // Timer==50
if ((timer > 26) && (timer < 51)){
//Startbit correcto
while (timer < 75){ Queimatempo(); //1ªMetade 2ºbit
timer++; //Timer == 75
}
//Ler os 13 bits seguintes
codigo = 1;
for (i=0; i<13; i++){
codigo <<= 1;
if ( ValorAlto() ){
codigo |= 0x0001;
timer = 0;
while (ValorAlto() && (timer < 101) ) {
Queimatempo();
timer++;
}
}
else{
codigo &= ~0x0001;
timer = 0;
while (ValorBaixo() && (timer < 101) ) {
Queimatempo();
timer++;
}
}
if (timer==100) {
codigo = 0x0000; //Erro
break;
}
//Esperar 3/4 bit
for (timer=0;timer<75;timer++) Queimatempo();
}
}
else{
codigo = 0b000000;} //Erro,codigo invalido
PORTB=0x00; //Desliga o LED de forma a emitir somente quando está a //receber
return (codigo);
}
int main(void){
DDRD = 0b00000000;
PORTD = 0b11111111;
DDRB = 0b00001001;
PORTB = 0b00000000;
TCCR2A= 0b10000011;
TCCR2B= 0b00000001;
OCR2A = 0;
unsigned int timer;
while(1){
while ( ValorAlto() ); //Espera até mudar para a 2º //Parte 1º Bit
codigo = Descodificar();
switch(codigo){
case 0x57:
if(OCR2A!=0)
OCR2A=0;
else OCR2A=255;
break;
case 0x10:
if (OCR2A>240)
OCR2A=0xFF;
else OCR2A=(OCR2A+25);
break;
case 0x11:
if (OCR2A<20)
OCR2A=0;
else OCR2A=(OCR2A-25);
break;
case 0x01:
OCR2A=64;
break;
case 0x02:
OCR2A=128;
break;
case 0x03:
OCR2A=191;
break;
case 0x04:
OCR2A=255;
break;
}for (timer=0;timer<15000;timer++) Queimatempo();
}
}