Paso 3: Software
El enlace de software se enumera a continuación. Aunque está dirigido para el 12F683, fácilmente es portado a versiones más grandes de la PIC. Sobre todo requiere cambiar nombres como TRISIO TRISA y GPIO a PORTA. Usted también tendrá que cambiar la línea que identifica la versión de PIC (lista =) y el archivo de inclusión, pero los
cambios intuitivos. La línea __CONFIG también necesite ajustar sólo porque uno o dos de las etiquetas utilizadas se deletrean diferentemente en algunos de los archivos de inclusión. Sólo asegúrese de que el PIC que uso tiene un pasador que permite una entrada de interrupción externa (generalmente denominada EXT).
Que cambie el pin de control del LCD, este programa tiene un par de diferencias básicas de la simple en episodio 1. En particular, utiliza un manejador de interrupción para que las ubicaciones de memoria definida para el reinicio del programa y el inicio del manejador de interrupción se han añadido. El vector de reset (dirección 0) tiene una simple instrucción GOTO salta al inicio real del programa. Esto es necesario porque el controlador de interrupción comienza siempre en la dirección 4. Un capricho que he encontrado es que el programa MPE X IDE que compila el código no GOTO saltar directamente a una declaración del BANKSEL. Es por ello que la primera instrucción en "Principal" es una NOP. La rutina de "Init" también incluye instrucciones para utilizar el reloj interno de 8 MHz en lugar del reloj de 4 MHz por defecto. Esto también significa que las rutinas de retardo deben tener valores diferentes que en las rutinas del episodio 1.
La rutina LCD_Init se adhiere bastante a la secuencia de inicialización especificado para el chip de 1602. La rutina de LCD_Line1 muestra "Comando de dirección" en la línea 1. La rutina LCD_Line2 configura para escribir los códigos recibidos de IR a la línea 2 de la pantalla LCD. Línea 2 obtiene sobrescribe cada vez que se recibe un nuevo mensaje de IR.
El corazón del código de captura del mensaje de IR está dentro del controlador de interrupción. Recordar el esquema que hemos conectado la salida de datos serie del receptor de IR a la entrada de interrupción externa del PIC. Esto nos permite sincronizar con el comienzo del mensaje y para decodificar cada bit de datos midiendo simplemente anchuras de pulso. La entrada de interrupción externa se establece a interrumpir en el borde descendente que indica siempre un comienzo poco. La rutina de interrupción comprueba Timer1 para ver cuánto tiempo ha sido desde la última interrupción y luego restablezca el temporizador. Podríamos medir los pulsos diferentes exactamente pero el enfoque perezoso funciona bastante bien. Como vimos en el apartado anterior, el impulso de start es fácilmente identificable, pero los bits de datos se diferencian por el espacio de tiempo después de los bits de datos. Midiendo desde el borde descendente al borde de caer, incluimos la broca y el espacio tiempo. De esa manera no tenemos que ser muy precisos cuando anchuras de pulso de prueba. Dado que se establece la frecuencia de reloj del PIC a 8 MHz, Timer1 se incrementa cada 500ns. Para simplificar el software ignoramos los 8 bits más bajos del Timer1 (127us máximo) y sólo prueba los 8 bits superiores. Cada cuenta en los parte superiores 8 bits equivale a 128us. Un bit de datos "0" tendrá un recuento superior a 5 pero menos de 9 y un bit de datos "1" tendrá doble ese rango. Es por ello que las cuentas en el software se establecen en 6 un poco de datos "0" y 12 para un bit "1" de datos. La comprobación de bit de start es para un conteo mayor de 24 (sobre 3 MS). No es muy precisa pero muy eficaz.
La rutina Main_Lp1 es donde los bits de datos decodificados por la rutina de interrupción se embalan en los cuatro bytes esperados. La llamada a Make_ASCII se envía un nibble a la vez de cada byte y el valor numérico de 0-15 convierte en un carácter legible de 0-F. Utiliza un proceso de pulido que permite a un programador construir una tabla de búsqueda y luego fije el contador de programa para saltar en el lugar apropiado en la tabla. Cada posición de la tabla es una instrucción return de subrutina especial (RETLW) que lleva un valor literal especificado en el registro W a la rutina llamada. Después de los cuatro bytes se han recibido y enviado a la pantalla hay una llamada a LCD_Line2 para restablecer el puntero de la pantalla en espera del siguiente mensaje de IR. No incluye un comando para borrar la pantalla porque el siguiente mensaje sólo sobreponen a los lugares de visualización actual.