comunicación PIC16F676 usando infrarrojo

0

He estado trabajando en este proyecto durante algún tiempo y me he topado con un muro desde que soy nuevo en el uso de pickit3 y el lenguaje C no es mi fuerte. Básicamente, lo que estoy tratando de hacer es usar dos microcontroladores para comunicarse entre sí mediante un infrarrojo. Pude 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 visualizarlos 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 del código del receptor. Sé que debo usar Timer1 o Timer0 después de leer las hojas de datos. pero no he podido resolver algo incluso usando otros ejemplos en los que las personas usan estos contadores / temporizadores.

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);}          
    }}
    
pregunta FABIAN RUBIO

2 respuestas

0

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

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

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

Después de medir el ancho del pulso, lo comparas con los valores que encierran los anchos del pulso que deseas detectar. Por ejemplo, para discriminar entre un pulso de 200us y 250us, los valores de comparación podrían ser 175us, 225us y 275us. 175us-225us serían detectados como 200us, 225us-275us serían 250us, y cualquier otra cosa sería inválida.

    
respondido por el Bruce Abbott
-1

Observe el módulo CCP (captura, comparación, modulación de ancho de pulso). En el modo de captura, puede capturar el temporizador 1 de 16 bits de funcionamiento libre. Puede usar capturas sucesivas para calcular el tiempo entre las capturas en el firmware.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas