Mi amigo y yo queremos diseñar un mando a distancia de aprendizaje universal, como este para el aprendizaje. Lo que queremos hacer básicamente es almacenar y reproducir los pulsos infrarrojos.
Queremos detectar señales de 36kHz, 38kHz y 40kHz. Una señal de 40kHz tendrá un periodo de 25 \$\mu\$ s.
Queremos utilizar un microcontrolador PIC de 8 bits, por ahora hemos seleccionado el PIC16F616, que funcionará con un oscilador de cristal de alta velocidad de 20MHz. Tenemos dos opciones disponibles:
- Utilice el
Interrupt On Change
módulo. - Utilice el modo de captura del módulo CCP.
La primera opción será la siguiente:
Supongamos que un registro está configurado como: unsigned char _10_us = 0;
. Este registro mantendrá el tiempo. El módulo TMR2 con el registro de periodo está configurado para crear una interrupción cada 10 \$\mu\$ sec. Cuando se produce una interrupción, se incrementará el _10_us
registrar y salir. Esto dará un tiempo máximo de 2,55mseg. Si se necesita medir más tiempo, se pueden utilizar registros adicionales como _1_ms
puede definirse e incrementarse según sea necesario.
Ahora, cada vez que se genere una interrupción por cualquier tipo de cambio (de alto a bajo o de bajo a alto), el programa anotará la hora actual, es decir, el valor de _10_us
registro. Después de un tiempo, cuando se genere la siguiente interrupción, el programa restará el valor guardado del _10_us
registro, y por lo tanto ahora el tiempo que se toma en el ínterin, con una unidad de 10 \$\mu\$ segundos.
Esta opción me hace rascarme la cabeza; la interrupción TMR2 se producirá aproximadamente cada 50 instrucciones. El manejo de la interrupción tomará unas 20 instrucciones. Me quedan 30 instrucciones para calcular y guardar el periodo en un array. ¿Funcionará este método?
La segunda opción será la siguiente:
Configure el modo de captura del módulo CCP para que genere una interrupción cuando se produzca un evento (high-to-low) en el pin CCP1. En la rutina de interrupción, establecerá una bandera para que una tarea en el programa pueda calcular (si es necesario) y guardar el valor de CCPR1H (probablemente no será necesario) y CCPR1L. Luego cambiaremos la configuración del modo de captura para que dispare la interrupción cuando se produzca un flanco bajo-alto. Y luego esperará al siguiente evento. No puedo estimar el rendimiento de este método ya que nunca lo he utilizado.
¿Otra opción?
Podemos utilizar un IC demodulador de infrarrojos como TSOP17xx serie. Eso resolvería nuestro problema por completo. Sin embargo, se me ocurren algunas preguntas.
Nuestro requisito de distancia de lectura no es mucho; 1 metro (~3 pies). Si seleccionamos un TSOP1738 que está destinado a trabajar en 38kHz, ¿cómo así ¿funcionará con señales de 36kHz y 40kHz?
La página 4 de la hoja de datos de la serie TSOP17xx muestra el gráfico "Dependencia de la frecuencia de la respuesta". Por lo que hemos entendido;
- 40kHz, que es ~1,053 de 38kHz, dará una sensibilidad relativa de ~0,6.
- 36kHz, que es ~0,95 de 38kHz, dará una sensibilidad relativa de ~0,65.
¿Qué significan estos valores? ¿Podemos usar un TSOP1738 y estar bien?