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);}
}}
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.
pedro
Tony Estuardo EE75
Tony Estuardo EE75