Étape 3: logiciel
Le lien du logiciel est répertorié ci-dessous. Alors qu’il est visé pour le 12F683, il est facilement porté à plus grandes versions de l’image. Pour la plupart il nécessite un changement des noms comme TRISIO TRISA et GPIO à PORTA. Vous devrez également modifier la ligne qui identifie la version PIC (liste =) et le fichier INCLUDE, mais ceux qui sont
changements intuitives. La ligne __CONFIG devez également peaufiner tout simplement parce qu’un ou deux des étiquettes utilisées soient orthographiés différemment dans certains des fichiers INCLUDE. Assurez-vous juste que la photo que vous utilisez a une broche qui permet une entrée d’interruption externe (habituellement appelée EXT).
Autres que la broche de commande LCD change, ce programme a quelques différences fondamentales de celle simple dans l’épisode 1. En particulier, il utilise un gestionnaire d’interruption pour les emplacements de mémoire définie pour le programme de réarmement et le début du gestionnaire d’interruption ont été ajoutés. Le vecteur de réinitialisation (adresse 0) a une simple instruction GOTO pour sauter le début réel du programme. C’est nécessaire parce que le gestionnaire d’interruption commence toujours à l’adresse 4. Un caprice, que j’ai trouvé, c’est que le programme MPE X IDE qui compile le code n’aime pas un GOTO saut directement à une déclaration de BANKSEL. C’est pourquoi la première instruction dans « MAIN » est un NOP. La routine « Init » comprend également des instructions pour utiliser l’horloge interne de 8 MHz au lieu de l’horloge de 4 MHz par défaut. Cela signifie aussi que les routines de retard doivent avoir des valeurs différentes que celles dans les routines de l’Episode 1.
La routine LCD_Init adhère assez bien à la séquence d’initialisation spécifiés pour la puce de 1602. La routine LCD_Line1 affiche « Adresse/commande » sur la ligne 1. La routine LCD_Line2 met en place pour écrire les codes IR reçus pour la ligne 2 de l’écran LCD. Ligne 2 obtient écrasée à chaque fois qu'un nouveau message de IR est reçu.
Le cœur du code IR message capture est à l’intérieur du gestionnaire d’interruption. N’oubliez pas du schéma que nous avons branché la sortie de données série du récepteur IR à l’entrée d’interruption externe du PIC. Cela nous permet de synchroniser avec le début du message et de décoder chaque bit de données en mesurant simplement des largeurs d’impulsion. L’entrée d’interruption externe est réglée pour interrompre sur le front descendant qui indique toujours un bit de départ. La routine d’interruption vérifie Timer1 pour voir combien de temps il a été depuis la dernière interruption et puis réinitialise le minuteur. Nous pourrions mesurer les impulsions diverses exactement, mais l’approche paresseux fonctionne très bien. Comme nous l’avons vu dans la section précédente, l’impulsion de démarrage est facilement identifiable, mais les bits de données sont différenciées par l’espace de temps après les bits de données. Par la mesure front descendant à front descendant, nous incluons la fraise et l’espace temps. De cette façon, que nous n’avons pas à être trop précis lors du test de largeur d’impulsion. Étant donné que la fréquence d’horloge PIC est fixée à 8 MHz, Timer1 incrémentera chaque 500ns. Pour simplifier le logiciel, nous ignorons les 8 bits de poids faible du Timer1 (127us maximum) et juste tester les 8 bits supérieurs. Chaque chef d’accusation dans les supérieurs 8 bits est égal à 128us. Un bit de données « 0 » aura un nombre supérieur à 5, mais moins de 9 et un bit « 1 » les données auront double cette gamme. C’est pourquoi les chefs d’accusation vérifiés dans le logiciel sont mis à 6 pour un peu de données « 0 » et 12 pour un peu de données « 1 ». La vérification de bit de départ est pour un nombre supérieur à 24 (plus de 3 ms). Pas trop précis, mais très efficace.
La routine Main_Lp1 est où les bits de données décodées par la routine d’interruption sont emballés dans les quatre octets attendus. L’appel à Make_ASCII est envoyé un grignotement au moment de chaque octet et convertit la valeur numérique de 0 à 15 en un caractère lisible de 0.-f. Il utilise un procédé lisse qui permet à un programmeur construire une table de choix et puis mettre le compteur de programme à sauter dans l’emplacement approprié dans le tableau. Chaque emplacement de la table est une instruction return sous-routine particulière (RETLW) qui transporte une valeur littérale spécifiée dans le registre W retour à la routine. Après que tous les quatre octets ont été reçus et envoyés à l’écran il y a un appel à LCD_Line2 pour réinitialiser le pointeur affichage en prévision du prochain message IR. Il n’inclut pas une commande pour effacer l’affichage car le prochain message écrasera tout les emplacements d’affichage actuel.