Étape 5: logiciels
Les liens de logiciels sont répertoriées ci-dessous. Même si elles sont ciblées pour les 16F1847, ils sont facilement portés d’autres versions de l’image. Vous devrez modifier la ligne qui identifie la version PIC (liste =) et le fichier INCLUDE, mais ceux sont les changements intuitives. Les lignes __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. Les exigences plus grandes sont assez ports i/o et suffisamment de mémoire programme 16 bits capacité d’adressage indirecte.
Comme nous l’avons vu dans la description de l’écran LCD, il a la capacité d’abordées dans un mode parallèle ou un mode série. En mode parallèle, il peut être soit un 4-bit ou une interface de 8 bits à l’instar de l’écran LCD de 1602. Étant donné que j’avais besoin de mettre à niveau la photo pour obtenir la capacité d’adressage indirecte nécessaire, j’ai fini avec assez i/o lignes faire facilement une interface parallèle 8 bits. J’ai aussi créé une version que fonctionne avec la Maj inscrire l’interface que j’ai détaillé Episode 1. Les deux fichiers d’assembly sont incluses ci-dessous.
Il y a quelques autres différences significatives entre les 16F1847 et les photos anciennes nous utilisons. Tout d’abord, l’oscillateur interne dans les vieilles photos seulement passerait à 8 Mhz. Cela a été plus que suffisamment rapide pour ces projets peu mais c’est toujours agréable d’avoir une petite puissance supplémentaire disponible si vous avez besoin d’elle. Oscillateur interne de la 16F1847 peut aller jusqu'à 16 Mhz ses propres et jusqu'à 32 Mhz en sacrifiant une des capacités internes. Une autre différence importante est qu’il y a une tonne de nouveaux registres dans le 16F1847 ce qui signifie que certains de ceux que nous avons besoin ne sont pas en Bank0 ou Bank1. Cela le rend plus important de s’assurer que nous avons la Banque correcte sélectionnée lorsque vous accédez à des registres. Un nouvel ensemble de registres que nous n’utilisons pas ici mais qui peut être très pratique sont les registres LATA et Banff. Ce sont des registres de verrou qui détiennent la dernière valeur qui a été écrit à PORTA ou PORTB. Vous pouvez lire que le LAT enregistre directement si vous voulez faire une opération de lecture / écriture modifier. Vous remarquerez également qu’il y a deux lignes « _CONFIG ». C’est parce que toutes les nouvelles options nécessitent deux registres de configuration. Il est très important de s’assurer que vous obtenez les bonnes options associées auprès du registre de configuration droite car MPLAB ne signalera pas cela comme une erreur. J’ai appris que la manière forte.
Le sélecteur illustré dans le schéma est lu au moment de l’initialisation pour déterminer si le texte doit être affiché ou l’image graphique. Changer l’interrupteur alors que l’appareil est sous tension ne passera pas à l’affichage des autre. Vous devez mettre hors tension, changer l’interrupteur, puis allumez à nouveau. N’oubliez pas, c’est juste une installation de la démo. Les routines appelés d’affichage du texte sont fondamentalement les mêmes que nous avons utilisé pour l’écran LCD de 1602. La première différence est que nous avons quatre routines pour quatre lignes au lieu de deux. La deuxième différence est que les adresses de départ pour les lignes sont légèrement différentes.
Le mode graphique requiert que nous utilisons le jeu d’instructions « prolongée ». Sons effrayants, mais il n’est pas vraiment. Ce qui est en fait un peu plus difficile, c’est comment nous abordons la mémoire graphique. La première différence est que nous nous penchons sur la mémoire comme une matrice, donc nous avons besoin d’envoyer les coordonnées verticales et horizontales de la mémoire pour écrire à. La spécification parle verticales et horizontales des adresses mais c’est peut-être un peu confus. En effet, vertical correspond à la ligne et horizontal correspond à la colonne. Étant donné que nous envoyons un octet à la fois, il y a 16 octets par ligne, ce qui équivaut à 128 bits (pixels). Il y a un total de 64 lignes mais la mémoire d’affichage n’est pas totalement contigue. Il est divisé en deux moitiés supérieures et inférieures, chacun contenant 32 rangs de 16 colonnes. La partie supérieure des demi-colonnes commencent toujours par adresse 80h. La partie inférieure des demi-colonnes commencent toujours par adresse 88h. L’adresse de lignes de 80h à 9Fh dans les deux moitiés. Vous pouvez avoir des ennuis, essaie d’envoyer une adresse de colonne autre que 80 h donc la méthode sécuritaire est toujours écrire une ligne complète de 16 octets. Si vous essayez d’écrire juste une partie d’une ligne, vous devrez envoyer deux octets de données par adresse. La logique de LCD stocke 16 bits par emplacement de mémoire.
En interne, l’écran LCD s’incrémente automatiquement l’adresse horizontal (colonne) chaque fois qu’il reçoit les données et réinitialisera automatiquement revenir à 80h ou 88h selon laquelle la moitié de l’écran, nous vous écrivons pour. L’adresse vertical (ligne) ne sera pas automatiquement incrémenté. Le logiciel a besoin de garder une trace de l’adresse de la ligne réelle, mais il suit également le nombre d’octets écrits par ligne afin qu’il sache quand mettre à jour l’adresse de ligne. Dans notre exemple, nous envoyons une ligne complète de données et ensuite envoyer une mise à jour d’adresse lorsque nous changeons pour une nouvelle ligne. Nous utilisons également l’adresse de la ligne pour savoir à quel moment réinitialiser les adresses pour la partie inférieure la moitié de l’écran.
Nous l’avons vu plus tôt que nous avons défini chaque ligne de données hexagonal avec la directive « données ». Dans ce cas les données seront réellement écrit dans la mémoire de programme lorsque nous programmer la puce. C’est un peu différent que nos méthodes précédentes de l’utilisation des tables de choix où nous avons utilisé les commandes « RETLW » pour renvoyer la valeur désirée. Dans notre exemple actuel, nous voulons simplement lire un emplacement mémoire spécifique si nous allons utiliser une autre forme d’adressage indirect pour y arriver. C’est une des autres raisons pour utiliser une puce PIC plus récente. Il fournit plus de seulement 8 bits adressage indirect. Le logiciel de l’échantillon a fait deux tables graphiques, chacune nécessitant 1 octet k d’espace mémoire programme. Pour modifier l’affichage de graphiques, vous aurez besoin de changer réellement les deux lignes de code dans la routine de « Do_Graph » pour pointer vers « Picture1 » ou « Image2 ».
Une chose importante à garder à l’esprit lorsque vous créez le graphique des tableaux de données dans notre exemple de programme est qu’ils doivent commencer sur une limite de page (xx00h) et doivent contenir exactement 1024 octets. Chaque table est étiqueté séparément et donné une adresse de départ spécifique (l’instruction de CODE). Alors que chaque définition de CODE est une étiquette, ce n’est pas l’étiquette que nous utilisons dans le programme. Les étiquettes utilisées dans le programme sont « Picture1 » et « Image2 » qui précèdent directement leurs lignes respectives des données.