Étape 4: Clavier interruptions
J’ai voulu recourir à l’interruption PORTB sur interruption de changement sur n’importe quel touche. Pour ce faire, une interruption de la coutume a dû être créée dans Flowcode, afin d’assurer cette direction PORTB et données sont mises en place correctes avant et après chaque interruption du clavier. Une interruption est générée chaque fois qu’un bouton est pressé, ou relâché. La routine d’interruption répond uniquement lorsqu’une touche est enfoncée.
INTERRUPTION PERSONNALISÉE
Code d’activation
PORTB = 0b00001110 ;
trisb = 0b11110001 ;
intcon. RBIE = 1 ;
intcon2. RBIP = 1 ;
intcon2. RBPU = 1 ;
rcon. IPEN = 0 ;
Code du gestionnaire
Si (intcon & (1 << RBIF))
{FCM_%n() ;
PORTB = 0b00001110 ;
trisb = 0b11110001 ;
Wreg = portb ;
clear_bit (intcon, RBIF) ;
}
Problèmes trouvés
Pendant une interruption, la routine d’interruption du service ne doit en aucun cas, appeler n’importe quel autre macro qui peut-être être utilisée quelque part dans le reste du programme. Cela conduira finalement à empiler les problèmes de débordement, comme l’interruption peut se produire en même temps que le programme principal est aussi dans la sous-routine même. C’est également identifiée comme une grave erreur de Flowcode lorsque le code est compilé.
Dans le code coutumier du clavier sous GetKeyPadNumber, il y a un tel appel à la macro Delay_us, qui provoque un débordement de pile. Pour y remédier, j’ai supprimé la commande Delay_us(10) et l’a remplacé avec 25 lignes de « wreg = porta; "commandes. Cette commande lit PORTA et place sa valeur dans le registre W, juste pour avoir quelque retard. Cette commande est compilée en une seule instruction similaire à assembleur movf porta, 0. Pour l’horloge de 10MHz utilisée dans le projet, chaque instruction sera 400ns, et pour obtenir un retard 10us, j’ai eu besoin de 25 de ces instructions.
Note sur la deuxième ligne de la Figure 3: GetKeypadNumber du Code personnalisé, que la commande de delay_us(10) original a été désactivée avec "/ /". Dessous, j’ai ajouté mon 25 « wreg = porta; "commandes pour obtenir un nouveau délai de 10us. Aucun appel à toutes les macros à l’intérieur de la Keypad_ReadKeypadNumber un code personnalisé, la macro clavier permet désormais à l’intérieur d’une routine d’interruption du service.
Il est à noter que les composants Flowcode clavier et eBlocks n’utilise pas les résistances de pull-up standard sur les lignes d’entrée. Au lieu de cela, il utilise des résistances de menu déroulant 100K. En raison des interférences trouvés sur le clavier au cours du développement, les résistances de 100 K étaient tous remplacés avec 10 K, et toutes les résistances de 10 K par 1 K 5. Le clavier a été testé pour fonctionner correcte avec conduit de 200mm.