collapse

* Links de Robótica

* Posts Recentes

Compras Aliexpress por senso
[Hoje às 14:40]


É possivel construir automaticamente a pcb? - isis proteus por edeweld
[Hoje às 10:23]


Ligar 2 sensores na mesma porta de 5v por SerraCabo
[22 de Maio de 2017, 21:56]


BOMER (2017) por msr
[22 de Maio de 2017, 17:11]


Apagar E2PROM X28C64P-25 por LVirtual
[22 de Maio de 2017, 16:43]


Vídeo sobre construção de um suporte para uma câmara por TigPT
[22 de Maio de 2017, 10:11]


Fazer seceretária por Kristey
[22 de Maio de 2017, 08:54]


Número de bits por jm_araujo
[21 de Maio de 2017, 22:44]


Kit de condensadores que dá jeito ter por edeweld
[21 de Maio de 2017, 18:34]


Medir corrente 0.1A - 5A por beirao
[21 de Maio de 2017, 15:37]

Autor Tópico: Controlar um led com comando de TV  (Lida 1443 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();
   }
}