Tutoriel d’assembleur AVR 10 (3 / 10 étapes)

Étape 3: Test de l’écran

Maintenant que nous avons déménagé notre affichage à 4 chiffres à son propre Conseil d’administration, nous avons besoin de le tester pour vérifier qu’il fonctionne (et de corriger les problèmes inévitables). Cela signifie que nous voulons écrire un pilote simple qui affichera juste un certain nombre et vérifier tous les segments sur chaque chiffre. Une fois que nous sommes convaincus que tout fonctionne comme il faut puis nous peuvent travailler sur notre code de communication.

La façon dont nous allons écrire le code de test est afin que nous puissions continuer à l’utiliser plus tard en ajoutant simplement les routines de communication. Nous copier notre code de 4 chiffres-affichage du dernier tutorial et supprimer tous les trucs qui avait à voir avec l’ADC, puisque nous n’utiliser que plus. Nous avons également changé les broches de l’anode afin qu’ils utilisent PC0 par PC3 puisqu’elle fait de câblage et de codage plus facile.

Je joins le code et une image du fonctionnement de l’écran externe.

J’ai pas besoin d’aller à travers tous le code ligne par ligne, puisque c’est pour la plupart des modifications simples des choses que nous avons déjà fait. Cependant, il y a une chose, que je tiens à souligner.

Nous allons finalement besoin d’afficher des chiffres de 0000 à 9999 sur notre écran à 4 chiffres. Cela signifie que nous avons besoin de place pour 10 000 numéros. Toutefois, un registre de 8 bits ne va que jusqu'à 255. Donc nous allons avoir besoin de plus de bits consacrés au numéro nous souhaitons afficher. Nous allons faire un rapide calcul pour savoir combien de bits, que nous allons avoir besoin. Chaque chiffre est une puissance de 2 et nous voulons donc voir quelle puissance de deux nous donne 10 000. Pour cela, nous utilisons le « logarithme népérien » :

2 ^ x = 10000
x ln (2) = 4 ln(10)
x = 4 ln(10)/ln(2) = 13.288

Cela me dit que pour afficher 10000, nous devons plus de 13 bits. Donc si j’utilise 14 bits puis je vais avoir plus qu’assez. Comme un chèque (ou venez de le faire en premier lieu si vous ne pensez pas math est amusant), il suffit d’aller au « math est un plaisir » site automatique convertisseur ici :

http://www.mathsisfun.com/binary-Decimal-hexadecim...

et figurer dehors en convertissant tout simplement. Vous y trouverez que 14 chiffres peuvent afficher des nombres jusqu'à 16383 et 13 chiffres seulement jusqu'à 8191. Notre calcul est donc correct, que nous avons besoin de plus de 13 chiffres et moins de 14. Donc nous utilisons 14. En fait, 9999 en binaire est : 0b10011100001111 qui est de 14 bits, mais n’a pas besoin de toutes ces sur.

Bon, pour inscrire de la façon dont nous résoudre le dilemme d’avoir besoin de plus de 1 consiste à utiliser 2 d'entre eux. Cela nous donne 16 bits et est par conséquent beaucoup d’afficher n’importe quel nombre Qu'on jette à l’affichage à 4 chiffres.

Mais quand nous envoyons les nombres à travers notre interface de communication, qu'ils seront au format binaire. Comment est-ce nous convertir un nombre binaire en décimales à afficher ? C’est pas presque aussi facile qu’on pourrait penser à première vue. Nous allons le comprendre.

Nous commençons par un nombre compris entre 0 et 9999 et nous voulons les 4 chiffres de ce nombre, afin que nous puissions les afficher. Il n’y a pas de fonction en langage assembleur qui va faire que pour nous alors que nous devons faire un nous-mêmes. Le numéro commence par un nombre binaire de 2 octets. Permet de l’appeler X pour l’instant. Nous aimerions comprendre chaque chiffre à son tour, du plus élevé au plus bas. La façon dont nous trouvons le plus haut est comme ce schéma de code :

chiffres = 0
départ :
X > 1000 ?
OUI :
X = X - 1000
chiffres ++
Goto début :
NON :
Retour à chiffres

Comme vous pouvez le voir, cela semble assez simple. On décolle juste 1000 un à la fois et chaque fois que nous augmentons la valeur du "chiffre". Une fois que X n’est donc plus plus grand que 1000 nous aurons le nombre 1000 stockées dans "digit" et nous le retourner. Cela nous donnera le premier numéro de notre écran. Alors nous pouvons faire la même chose que ci-dessus à la valeur résiduelle de X sauf avec 100 au lieu de 1000 et ceci nous obtiendra le nombre de 100, puis nous faire encore une fois avec quelques dizaines et enfin lorsqu’il n’y a pas quelques dizaines à gauche, le montant restant dans le X se situera entre 0 et 9, et donc ce sera notre dernier chiffre. Voilà donc comment nous pouvons obtenir nos 4 chiffres.

Cependant ! C’est pas aussi simple en langage d’assemblage ! Une énorme clé est jetée dans ce plan en raison du fait que nous avons besoin de deux octets pour représenter notre numéro de 14 chiffres binaires. Comment nous soustrayons 1000 ? En termes de 2 octets, 1000 est représenté par 0b0000001111101000 et vous voyez que certaines d'entre elles est dans le premier octet et certaines d'entre elles est dans le deuxième octet. Ainsi, au lieu de X = X-1000, nous pourrions écrire X comme les deux octets XH et XL ainsi que X = XH:XL et ensuite faire notre soustraction comme suit :

XH = XH - high(1000)
XL = XL - low(1000)

Cela semble assez simple droit ? Eh bien, il est encore pire ! Supposons que nous avons commencé avec X = 2001 et nous trouvons notre premier chiffre (2) en soustrayant de 1000. Nous allons voir comment cela fonctionne :

Nous testons X et trouver qu’il est > 1000 et donc nous soustraire, depuis 2001 = 0b0000011111010001 en binaire notre soustraction fonctionnerait comme suit (mettant les numéros) :

XH = high(0b0000011111010001) - high(0b0000001111101000)
XL = low(0b0000011111010001) - low(0b0000001111101000)

qui devient

XH = 0b00000111 - 0b00000011 = 7-3 = 4
XL = 0b11010001 - 0b11101000 = 209-232 = - 23

Nous avons un problème ! L’octet de poids faible ne contient-elle pas assez pour manipuler la soustraction ! Si vous pensez que ce n’est pas un problème étant donné que le langage assembleur peut gérer des négatifs, mais il ne peut gérer jusqu'à -128 et il y aura certainement des moments où le résultat de la soustraction de la XL est plus négatif que celle. Alors, que faisons-nous ?

Eh bien, la façon dont nous traitent de cela est la même manière que nous le faisons en toute soustraction de la 5e année. Nous avons besoin de prendre l’un des chiffres de XH. N’oubliez pas que chaque chiffre binaire en XH est en fait égal à 256. Nous faisons cela avec la commande « sbc » qui soustrait avec carry.

Puis, une fois que nous avons réussi à se débarrasser de la 1000 nous passer à la 100 ' s et faire la même chose. Dans ce cas, nous avons le même problème que nous aurons besoin d’emprunter de l’octet haut de 1 jusqu'à ce que notre résultat est moins de 256 donc nous continuons à utiliser le sbc à subract l’octet haut.

Enfin, quand on arrive aux dizaines et les taches de la 1 que nous n’avons plus à vous soucier d’emprunt des chiffres plus et les choses sont plus simples, nous pouvons soustraire tout le registre grave.

Donc, maintenant que vous voyez comment nous sommes obligés de faire choses jetez un oeil sur le code et vous devriez maintenant être en mesure de comprendre comment il fonctionne. Notez qu’il y a certaines choses que nous devions faire pour afficher des nombres entre 768 et 999. Pouvez-vous penser pourquoi cela peut être ? En tout cas, nous commençons en lui donnant simplement un numéro à afficher de sorte que nous pouvons tester notre affichage. Nous allons simplement utiliser 9876. Plus tard, nous aimerions que le nombre à venir depuis un autre microcontrôleur via l’interface de communication 2 fils.

Exercice 1: Comprendre comment fonctionne le fragment de code ci-dessous.

Voici le code explicit que j’ai utiliser pour la conversion de deux octets binaires décimales pour l’affichage de chiffres :

 loadCash: ; this computes the digit for each 7-seg of the display<br>cli ; disable interrupts while loading digits<br>push playercashH ; store high byte of playercash<br>push playercashL ; store low byte of playercash<br>ldi tempH,high(1000) ; set tempH:L to 1000<br>ldi tempL,low(1000) <br>rcall computeDigit ; find the 3rd digit<br>mov digit3,digit ; store the new 3rd digit<br>ldi tempH,0 ; set tempH:L to 100<br>ldi tempL,100 <br>rcall computeDigit ; find the 2nd digit<br>mov digit2,digit ; store the new 2nd digit<br>ldi tempH,0 ; set tempH:L to 10<br>ldi tempL,10 <br>rcall computeDigit ; find the 1st digit<br>mov digit1,digit ; store the new 1st digit<br>mov digit0,playercashL ; remaining is 0th digit<br>pop playercashL ; restore low byte of playercash<br>pop playercashH ; restore high byte of playercash<br>sei ; re-enable interrupts<br>ret 
 computeDigit: ; interrupts are already disabled while here<br> clr digit compareHigh: cpi playercashH,0 ; if both playercashH brne PC+3 cpi playercashL,0 ; and playercashL are zero then done breq returnDigit cp playercashH,tempH ; otherwise continue brlo returnDigit ; if less then move to next power of 10 brne PC+3 ; if high is greater then subtract cp playercashL,tempL ; if highs are equal and lows are less, brlo returnDigit ; then playercash is less so move to next power of 10 clc sub playercashL,tempL ; otherwise subtract power of 10 sbc playercashH,tempH ; otherwise subtract power of 10 inc digit ; and increment the current digit rjmp compareHigh ; and go back up to test again returnDigit: ; digit will now be the one to display in this spot ret 

Ensuite, nous allons introduire quelque chose de nouveau--communications TWI.

Articles Liés

Tutoriel d’assembleur AVR 11

Tutoriel d’assembleur AVR 11

Bienvenue au didacticiel 11 !Dans ce bref didacticiel, nous allons enfin construire la première partie de notre projet final.La première chose que vous devriez faire est d'aller à la toute dernière étape de ce tutoriel et voir la vidéo. Puis revenez
Tutoriel d’assembleur AVR 1

Tutoriel d’assembleur AVR 1

J'ai décidé d'écrire une série de tutoriels sur la façon d'écrire des programmes de langage d'assemblage pour le Atmega328p qui est le microcontrôleur utilisé dans l'Arduino. Si les gens restent intéressées, je vais continuer à mettre un une semaine
Tutoriel d’assembleur AVR 8

Tutoriel d’assembleur AVR 8

Bienvenue au didacticiel 8 !Dans ce bref didacticiel, nous allons prendre un peu d'une déviation de l'introduction de nouveaux aspects de la programmation en langage assembleur pour montrer comment déplacer nos composants de prototypage pour un circu
Tutoriel d’assembleur AVR 6

Tutoriel d’assembleur AVR 6

Bienvenue au didacticiel 6 !Tutoriel d'aujourd'hui sera un court où nous mettrons au point une méthode simple pour transmettre des données entre un atmega328p et un autre à l'aide de deux ports qui les relient. Nous puis prendre dés rouleau de tutori
Tutoriel d’assembleur AVR 9

Tutoriel d’assembleur AVR 9

Bienvenue au didacticiel 9.Aujourd'hui nous allons montrer comment piloter un afficheur 7 segments, mais aussi un affichage à 4 chiffres à l'aide de notre code en langage assembleur ATmega328P et AVR. Ce faisant cela que nous allons devoir prendre de
Tutoriel d’assembleur AVR 2

Tutoriel d’assembleur AVR 2

Ce tutoriel est une continuation de "tutoriel d'assembleur AVR 1"Si vous n'avez pas passé par 1 tutoriel, vous devez arrêter maintenant et faire celui-là en premier.Dans ce tutoriel, nous allons poursuivre notre étude de programmation en langage
Tutoriel d’assembleur AVR 7

Tutoriel d’assembleur AVR 7

Bienvenue au didacticiel 7 !Aujourd'hui nous allons voir la première comment faire pour nettoyer un clavier et ensuite montrer comment utiliser les ports d'entrée analogiques pour communiquer avec le clavier.Nous ferons cela en utilisant les interrup
Tutoriel d’assembleur AVR 5

Tutoriel d’assembleur AVR 5

Aujourd'hui nous allons regarder de plus près aux divers emplacements mémoire dans le microcontrôleur Atmega328p et voir si nous pouvons mieux comprendre comment les choses sont stockés, où ils sont stockés et comment les pointeurs et les tables de r
Tutoriel d’assembleur AVR 4

Tutoriel d’assembleur AVR 4

Bienvenue au didacticiel numéro 4 !Dans ce tutoriel, nous allons construire un circuit qui simulera l'enroulement des deux dés. Ensuite, nous allons tout d'abord écrire un programme de force brute qui fait le travail. Puis nous permettra de simplifie
Tutoriel d’assembleur AVR 3

Tutoriel d’assembleur AVR 3

Bienvenue au didacticiel numéro 3 !Avant que nous commencions, je tiens à faire un point philosophique. N'ayez pas peur d'expérimenter avec les circuits et le code que nous construisons dans ces tutoriels. Changer les câbles près, ajouter de nouveaux
MRETV - vidéo, stéréo Sound et beaucoup plus d’un Arduino standard !

MRETV - vidéo, stéréo Sound et beaucoup plus d’un Arduino standard !

MRETV - vidéo, stéréo Sound et beaucoup plus d'un Arduino standard !Maintenant mis à jour pour Arduino 1.6.6 novembre 2015 !Utiliser seulement deux résistances et deux diodes pour générer la vidéo plein écran. Texte 47 x 29 de 8 x 8 caractères, doubl
Comment charger des programmes à un Arduino UNO de Atmel Studio 7

Comment charger des programmes à un Arduino UNO de Atmel Studio 7

Dans ce court Instructable, nous allons apprendre à charger un programme à une carte Arduino UNO utilisant Atmel Studio au lieu de l'IDE Arduino. Cela est utile lorsque vous avez besoin élaborer un programme à l'aide de plusieurs fonctions avancées o
Star Trek sonnette Hack

Star Trek sonnette Hack

J'ai toujours été un fan de la Star Treks et comme tel, j'étais très excité lorsque mon colocataire ramené un panneau la comm série style Star Trek original. Je n'avais jamais vu l'un d'entre eux, mais une recherche rapide nous a pris sur le site de
Carte de développement pour microcontrôleurs Attiny84

Carte de développement pour microcontrôleurs Attiny84

Il s'agit d'une carte de développement pour microcontrôleur Attiny84. Tha Attiny84 puce possède 11 broches adressables avec l'IDE Arduino, 8k de mémoire flash pour le stockage de programme et 512 octets de mémoire vive disponible pour les variables d