collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Controlar um led com comando de TV  (Lida 3544 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline A_neves

  • Mini Robot
  • *
  • Mensagens: 8
Controlar um led com comando de TV
« em: 15 de Agosto de 2011, 20:29 »
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();
   }
}