Comunicación PIC16F676 mediante infrarrojos

Así que he estado trabajando en este proyecto durante algún tiempo y me he topado con una pared ya que soy nuevo en el uso de pickit3 y el uso del lenguaje C no es mi fuerte. Básicamente, lo que estoy tratando de hacer es usar dos microcontroladores para comunicarse entre sí usando un infrarrojo. Logré programar el primer PIC que crea diferentes pulsos usando varias combinaciones de entrada usando 4 interruptores. Por ejemplo (0000 = 200 us pulso, 0001 = 250 us pulso). ahora, para el receptor, necesito capturar los pulsos y mostrarlos usando 4 LED (200us = 0000, 250us = 0001). el siguiente código es el código que hice para el primer microcontrolador. MI pregunta es cómo haría la parte receptora del código. Sé que debería usar Timer1 o Timer0 al leer las hojas de datos.

main(){

    ANSEL =0b000000;
    TRISC=0b110111;
    PORTC=0b000000;
    OSCCAL=0b11111;
while(1){


    if (RC0==0 && RC1==0 && RC2==0 && RC4==0){

              RC3=1;
              __delay_us(183);
              RC3=0;
              __delay_us(166);}

    else if (RC0==0 && RC1==0 && RC2==0 && RC4==1){

              RC3=1;
              __delay_us(229);
              RC3=0;
              __delay_us(196);}

    else if (RC0==0 && RC1==0 && RC2==1 && RC4==0){

              RC3=1;
              __delay_us(276);
              RC3=0;
              __delay_us(234);}

    else if (RC0==0 && RC1==0 && RC2==1 && RC4==1){

              RC3=1;
              __delay_us(322);
              RC3=0;
              __delay_us(264);}

    else if (RC0==0 && RC1==1 && RC2==0 && RC4==0){

              RC3=1;
              __delay_us(368);
              RC3=0;
              __delay_us(318);}

    else if (RC0==0 && RC1==1 && RC2==0 && RC4==1){

              RC3=1;
              __delay_us(415);
              RC3=0;
              __delay_us(348);}

    else if (RC0==0 && RC1==1 && RC2==1 && RC4==0){
             //500us
              RC3=1;
              __delay_us(460);
              RC3=0;
              __delay_us(385);}

    else if (RC0==0 && RC1==1 && RC2==1 && RC4==1){
              //550us
              RC3=1;
              __delay_us(508);
              RC3=0;
              __delay_us(415);}

    else if (RC0==1 && RC1==0 && RC2==0 && RC4==0){
              //600us
              RC3=1;
              __delay_us(555);
              RC3=0;
              __delay_us(500);}

    else if (RC0==1 && RC1==0 && RC2==0 && RC4==1){
              //650us
              RC3=1;
              __delay_us(600);
              RC3=0;
              __delay_us(530);}
    else if (RC0==1 && RC1==0 && RC2==1 && RC4==0){
              //700us
              RC3=1;
              __delay_us(646);
              RC3=0;
              __delay_us(568);}

    else if (RC0==1 && RC1==0 && RC2==1 && RC4==1){
              //750us
              RC3=1;
              __delay_us(694);
              RC3=0;
              __delay_us(600);}

    else if (RC0==1 && RC1==1 && RC2==0 && RC4==0){
              //800us
              RC3=1;
              __delay_us(738);
              RC3=0;
              __delay_us(650);}

    else if (RC0==1 && RC1==1 && RC2==0 && RC4==1){
              //850us
              RC3=1;
              __delay_us(785);
              RC3=0;
              __delay_us(680);}

    else if (RC0==1 && RC1==1 && RC2==1 && RC4==0){
              //900us
              RC3=1;
              __delay_us(828);
              RC3=0;
              __delay_us(718);}

    else if (RC0==1 && RC1==1 && RC2==1 && RC4==1){ 
               //950us
              RC3=1;           
              __delay_us(880);         
             RC3=0;
              __delay_us(750);}          
    }}
Espere la señal; Inicie el temporizador; Espere a que la señal se apague; Leer el temporizador; Calcule el intervalo de tiempo (o use prueba y error); Esto tomará todo el tiempo que tiene el PIC, así que comience a estudiar cómo iniciar y detener el temporizador usando interrupciones.
¿Por qué no usas el USART? para comunicarse entre los PIC. ¿Qué tan lejos está el enlace? Úselo como un control remoto de TV IR Tx/Rx con paridad para detectar algunos errores. Solo necesita usar 4 de 8 bits.
por ejemplo, portadora IR de ~38kHz y luego OOK con lógica negativa. Baja velocidad, largo alcance

Respuestas (2)

No necesita usar un temporizador de hardware, pero puede mejorar la resolución y precisión de la medición. El 16F676 tiene un temporizador de 16 bits (TMR1) con 'Gate Control' (/T1G) que puede proporcionar una resolución más alta que un bucle de tiempo de software típico.

Para que funcione de manera confiable, la resolución de tiempo debe ser lo suficientemente alta como para manejar la fluctuación de muestreo, la variación de la velocidad del reloj entre las MCU y el ruido en la señal recibida. TMR1 se puede sincronizar en Fosc/4, lo que brinda una resolución de 1us cuando se usa el oscilador interno de 4MHz, y su conteo máximo de 65535 es suficiente para medir directamente anchos de pulso de hasta ~65ms. /T1G acepta pulsos bajos activos, que su circuito detector IR debe estar configurado para que coincida.

Cómo usar la función de puerta TMR1 para medir el ancho de un pulso

Después de medir el ancho de pulso, lo compara con los valores que abarcan los anchos de pulso que desea detectar. Por ejemplo, para discriminar entre un pulso de 200us y 250us, los valores de comparación pueden ser 175us, 225us y 275us. 175us-225us se detectaría como 200us, 225us-275us sería 250us y cualquier otra cosa no sería válida.

Eche un vistazo al módulo CCP (captura, comparación, modulación de ancho de pulso). En el modo de captura, puede tomar el temporizador 1 de 16 bits de ejecución libre. Puede usar capturas sucesivas para calcular el tiempo entre las capturas en el firmware.

no creo que esta foto específica tenga ccp
¿¡ No crees que tiene uno!? Obviamente necesita leer la hoja de datos . Si no tiene un módulo CCP, entonces use un PIC que lo tenga, o conecte el evento al pin INT o use la interrupción en el cambio. En ambos métodos, haría la captura del temporizador 1 en el firmware, luego el resto es el mismo independientemente de que se haya capturado el temporizador 1.
Leí la hoja de datos y sí, no tiene un ccp. Investigué sobre los temporizadores y entiendo cómo funcionan. todo lo que pido es ayuda sobre cómo iniciar el código con los temporizadores. no puedo usar otra PIC