Paso 4: Interrupciones de teclado
Quería hacer uso de la interrupción PORTB interrupción cambio de oprimir cualquier tecla. Para ello, una interrupción de la costumbre tuvo que ser creado en Flowcode, para esa dirección de PORTB y datos es configurar correctamente antes y después de cada interrupción de teclado. Una interrupción es generada cada vez que un botón es presionado o liberado. La rutina de interrupción solo responde cuando se presiona una tecla.
INTERRUPCIÓN PERSONALIZADO
Código de habilitación
PORTB = 0b00001110;
TRISB = 0b11110001;
INTCON. RBIE = 1;
intcon2. RBIP = 1;
intcon2. RBPU = 1;
rcon. IPEN = 0;
Código del controlador
Si (intcon & (1 << RBIF))
{FCM_%n();
PORTB = 0b00001110;
TRISB = 0b11110001;
WREG = portb;
clear_bit (intcon, RBIF);
}
Se encontraron problemas
Durante una interrupción, la rutina de servicio de interrupción debe sin condiciones, llamar a cualquier otro macro que podría utilizarse en algún lugar en el resto del programa. Esto llevará eventualmente a pila problemas de desbordamiento, como la interrupción puede ocurrir al mismo tiempo que el programa principal está en la misma subrutina. Esto es también identificado como un grave ERROR por Flowcode cuando se compila el código.
En el código de la costumbre del teclado debajo de GetKeyPadNumber, hay tal llamada a la macro Delay_us, que causa un desbordamiento de pila. Para superar esto, he quitado el comando Delay_us(10) y lo reemplazó con 25 líneas de "wreg = porta;" comandos. Este comando Lee PORTA y coloca su valor en el registro W, sólo para conseguir algo de retraso. Este comando se compilarán en una sola instrucción similar al ensamblador movf porta, 0. El reloj de 10MHz utilizado en el proyecto, cada instrucción será 400ns, y para obtener una demora en 10us, necesitaba 25 de estas instrucciones.
Nota sobre la segunda línea de la figura 3: código de aduana GetKeypadNumber, que el comando original de delay_us(10) ha sido desactivado con "/ /". Debajo de esto, he añadido mi 25 "wreg = porta;" comandos para obtener un nuevo retraso de 10us. No hay llamadas a todas las macros en el código Keypad_ReadKeypadNumber, la macro de teclado ahora puede utilizarse dentro de una rutina de servicio de interrupción.
Cabe señalar que los componentes de teclado Flowcode y eBlocks no utiliza las resistencias de pull-up estándar en las líneas de entrada. En cambio, utiliza resistencias de pull-down de 100K. Debido a alguna interferencia encontrada en el teclado durante el desarrollo, las resistencias de 100 K fueron sustituidas por 10 K, y todas las resistencias de 10 K sustituido con 1 K 5. El teclado fue probado para trabajar correctamente con puntas de 200mm.