PIC - Problema en la decodificación IR NEC en PIC12F675

0

Estoy usando PIC12F675 con OSC interno corriendo a 4MHz. Estoy usando la versión 6.6.2 del compilador MikroC Pro.

Para descodificar el protocolo NEC, no estoy usando el temporizador ni la interrupción. Utilicé el comando de demora para hacer que el código sea lo más simple posible con una propiedad de tiempo de espera y el código verifica la señal IR con una resolución de 50µs.

Estoy usando el temporizador 0 y la interrupción de cambio de pin para mi trabajo. Y necesito decodificar la señal IR de manera normal usando el pin GP3 (MCLR).

Mi programa funciona bien con PIC16F877A que se ejecuta con OSC externo a 16MHz. Pero cuando uso el mismo programa para PIC12F675 no funciona para mí.

He deshabilitado las funciones Pull-ups y MCLR pin para PIC12F675. Y utilizando el pin GP3 como entrada para el receptor IR.

Estoy usando el ejemplo de aquí .

A continuación se muestra mi programa para PIC16F877A. Por favor, ¿puede alguien ayudarme a resolver este problema para PIC12F675?

Gracias

Chayan

/* Pin Configuration */
#define IR_PIN                RB0_bit       /**< IR Signal Reception Pin.*/
#define LED_PIN               RC5_bit

unsigned long ir_code;
unsigned int address;
unsigned short command, inv_command;


short nec_remote_read() {

unsigned long count = 0, i;
// Check 9ms pulse (remote control sends logic high)
while ((IR_PIN == 0) && (count < 190)) {
count++;
delay_us(50);
}
if ( (count > 189) || (count < 120))     // NEC protocol?
return 0;

count = 0;
// Check 4.5ms space (remote control sends logic low)
while (IR_PIN && (count < 95)) {
count++;
delay_us(50);
}
if ( (count > 94) || (count < 30))       // NEC protocol?
return 0;

// Read code message (32-bit)
for (i = 0; i < 32; i++) {
count = 0;
while ((IR_PIN == 0) && (count < 14)) {
  count++;
  delay_us(50);
}
if ( (count > 13) || (count < 2))     // NEC protocol?
  return 0;

count = 0;
while (IR_PIN && (count < 40)) {
  count++;
  delay_us(50);
}
if ( (count > 39) || (count < 4))     // NEC protocol?
  return 0;

if ( count > 20)                      // If space width > 1ms
  ir_code |= 1ul << (31 - i);         // Write 1 to bit (31 - i)
else                                  // If space width < 1ms
  ir_code &= ~(1ul << (31 - i));      // Write 0 to bit (31 - i)
}
return 1;
}

void main()
{
TRISB0_bit = 1;
TRISC5_bit = 0;

while(1) { //Loop executed infinite times

//while (IR_PIN);                //Wait until IR pin falls
if (nec_remote_read()) {
address = ir_code >> 16;
command = ir_code >> 8;
inv_command = ir_code;

switch(command){
  case 0x48:
  LED_PIN = 1;
  break;
  case 0x80:
  LED_PIN = 0;
  break;
   }
  }
 }
}
    
pregunta Chayan Mistry

1 respuesta

1

El PIC12F675 requiere cuatro ciclos de oscilador para cada ciclo de instrucción. Esto significa que mientras se ejecuta a 4 MHZ, su ciclo de instrucción es de 1 uSeg por instrucción. Mire la lista de desensamblado de su compilador para ver cuántas instrucciones debe ejecutar su bucle while y creo que verá que está introduciendo y 20-25 uSeg adicionales a su retraso, dependiendo de dónde sale del bucle while.

Podría ejecutar el PIC12F675 más rápido, cambiar a un diseño controlado por interrupciones, o configurar y leer un contador para darle la sincronización correcta. Buena suerte!

    
respondido por el John Birckhead

Lea otras preguntas en las etiquetas