Interpretar trenes de pulsos de un receptor infrarrojo

Hola gente, vuelvo al tema. Ya solucionado el tema de la adquisicion de datos del sensor, paso a comentarles mi nuevo problemita



En ésta imagen se pueden ver dos señales que son del mismo botón. Cada vez que apreto un botón alternan unos bits del principio (rectángulo amarillo). Me explico mejor: si apreto el botón una vez aparece la primer señal, si apreto de nuevo aparece la siguiente, si apreto de nuevo vuelve la primer señal y así sucesivamente (creo que se llaman bits de toggle).

Como notarán cada ciclo son 2 bits, esto se debe a que en algunos botones, lo único que cambiaba en la señal era la duración de algún semiciclo (por ejemplo: en el asterisco azul de la imagen hay un bit (1 en este caso), pero hay otro botón que lo único que cambia es la duración de ese semiciclo.

La barrita verde marca que de ese bit para adelante son los comandos (bit 11).

En la imagen se puede ver que la señal tiene 21bits, sin embargo la mitad de los botones tienen 19bits. (el control remoto es de la placa "Asus My Cinema 7131").

asus%20my%20cinema%203.jpg


Éste es el código que funciona bien leyendo botones que emiten señales de 19bits (también lee los de 21bits pero se come los ultimos dos bits).

Código:
#include <16F84A.h>

#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)

int bit[21], i;

void main() {

      set_tris_a(0);
      set_tris_b(0x10);

      for(i=0;i<21;i++) {
         bit[i]=0;
      }
      i=0;
      while(1) {
            do {
               while(input(PIN_B4));
               delay_us(1200);

               if(!input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;

               while(!input(PIN_B4));

               delay_us(950);
               if(input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;
            }while(i<18); // no se porque si pongo i<19 no sale en la primer pulsada del botón, como q lee un bit menos.

            if(i==18) {
               output_bit(PIN_A2,bit[11]); // primer bit del comando
               output_bit(PIN_A3,bit[12]);
               output_bit(PIN_B0,bit[13]);
               output_bit(PIN_B1,bit[14]);
               output_bit(PIN_B2,bit[15]);
               output_bit(PIN_A1,bit[16]);
               output_bit(PIN_A0,bit[17]);
               output_bit(PIN_B7,bit[18]); // siempre en 0 pq el while es i<18 y no i<19
               output_bit(PIN_B6,bit[19]); // siempre en 0 pq el while es i<18 y no i<21 (en este codigo no leeo los comandos de 21bits enteros)
               output_bit(PIN_B5,bit[20]); // siempre en 0 pq el while es i<18 y no i<21 (en este codigo no leeo los comandos de 21bits enteros)
               delay_ms(250);
               output_bit(PIN_A2,0);
               output_bit(PIN_A3,0);
               output_bit(PIN_B0,0);
               output_bit(PIN_B1,0);
               output_bit(PIN_B2,0);
               output_bit(PIN_A1,0);
               output_bit(PIN_A0,0);
               output_bit(PIN_B5,0);
               output_bit(PIN_B6,0);
               output_bit(PIN_B7,0);

               for(i=0;i<21;i++) {
                  bit[i]=0;
               }
               i=0;
            }
      }
}


Éste es el código que debería leer tanto 19bits como 21bits, pero no funciona (por algún motivo no sale de un while).

Código:
#include <16F84A.h>

#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)

long ticks=0;
int bit[21], i, seconds=0;

#INT_TIMER0
void int_timer() {
      set_timer0(156);
      if (++ticks == 10000) {
         seconds++;
         ticks=0;
      }
}

void main() {

      set_tris_a(0);
      set_tris_b(0x10);
      
      setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
      set_timer0(156);
      
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_TIMER0);

      for(i=0;i<21;i++) {
         bit[i]=0;
      }
      i=0;
      while(1) {
            while(input(PIN_B4));
            do {
               delay_us(1200);
               
               if(!input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;

               while(!input(PIN_B4));

               delay_us(950);
               if(input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;
               ticks=0;
               seconds=0;
               set_timer0(156);
               while(input(PIN_B4) || seconds < 1); // aparentemente no sale nunca de éste while
               if(seconds >= 1) {
                  bit[19]=0;
                  bit[20]=0;
                  i=21;
               }
            }while(i<21);

            if(i==21) {
               output_bit(PIN_A2,bit[11]); // primer bit del comando
               output_bit(PIN_A3,bit[12]);
               output_bit(PIN_B0,bit[13]);
               output_bit(PIN_B1,bit[14]);
               output_bit(PIN_B2,bit[15]);
               output_bit(PIN_A1,bit[16]);
               output_bit(PIN_A0,bit[17]);
               output_bit(PIN_B7,bit[18]); 
               output_bit(PIN_B6,bit[19]);
               output_bit(PIN_B5,bit[20]);                          
               delay_ms(250);
               output_bit(PIN_A2,0);
               output_bit(PIN_A3,0);
               output_bit(PIN_B0,0);
               output_bit(PIN_B1,0);
               output_bit(PIN_B2,0);
               output_bit(PIN_A1,0);
               output_bit(PIN_A0,0);
               output_bit(PIN_B5,0);
               output_bit(PIN_B6,0);
               output_bit(PIN_B7,0);
               
               for(i=0;i<21;i++) {
                  bit[i]=0;
               }
               i=0;
            }
      }
}
 
tengo la señal de control para un infrarrojo para controlar un minisplit pero no se como generar la señal portadora de 38khz.
uso el pic16f690. este es el código en c de la señal de control en MPLABX.
Código:
void onoff() {
    PORTCbits.RC0=0;
    PORTCbits.RC0=1;
    __delay_ms(9);
    PORTCbits.RC0=0;
    __delay_ms(4.5);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    for (int i=1;i<=5;i++) {
       PORTCbits.RC0=1;
       __delay_us(600);
       PORTCbits.RC0=0;
       __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    }
    for (int i=1;i<=11;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    }
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_us(500);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    for (int i=1;i<=10;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_us(500);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    for (int i=1;i<=38;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=3;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    }
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    for (int i=1;i<=6;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    } ...
 
dios mio cuantos Delay!!!
bueno si ya sale la señal como deberia ahora lo que debes hacer es generar una señal de 38khz con un timer y sacarla por algun pin del micro las sumas externamente y deberia de funcionar
 
Atrás
Arriba