Étape 5: Pousser ' n Pop
Il y a quelques « générales but inscrit uniquement » que nous avons à notre disposition et une fois qu’ils sont utilisés il n’y a pas plus. Alors c’est bien pratique de les utiliser seulement pour quelques variables qui sont utilisées comme périphérique de stockage temporaire dont vous avez besoin pour la lecture et l’écriture, aux ports et SRAM avec, ou bien ceux que vous aurez besoin dans les sous-routines partout et donc de programmation vous les nommez. Donc ce que j’ai fait, maintenant que nous avons initialisé et sont d’apprendre à utiliser la pile, est de passer par le code et trouver les registres d’usage général nommé qui servent uniquement à l’intérieur d’une sous-routine unique ou interruption et nulle part ailleurs dans le code et les remplacement par un de nos registres en temp et un push et un pop de la pile. En fait, si vous regardez le code écrit pour les microcontrôleurs plus petits, ou si vous retournez dans le temps à quand toutes les puces sont plus petites, vous verrez que quelques registres à usage général qui devait être utilisée pour tout, donc vous ne pouvait pas simplement stocker une valeur là-dedans et laisser seul puisque vous étiez sûr d’avoir besoin de ce registre pour d’autres choses. Ainsi vous verrez Pushin ' et un Poppin ' partout dans le code. Peut-être je devrais ont distingué nos registres à usage général temp AX et BX comme un humble Bravo à ces jours passés.
Un exemple aidera à rendre cela plus clair.
Avis qu’interruption complète ADC_int nous utilisons un généraliste s’inscrire dans notre conversion analogique/numérique que nous avons nommé buttonH que nous avons utilisés pour charger la valeur d’ADCH et comparez-le avec notre table de correspondance d’analogue aux conversions de presse bouton. Nous n’utilisons que ce registre de buttonH au sein de la sous-routine ADC_int et nulle part ailleurs. Pour remédier à cela, nous utiliserons notre temp2 variable que nous utilisons comme une variable temporaire que nous pouvons utiliser dans n’importe quel sous-routine donné et rien en dehors de cette sous-routine (c'est-à-dire la valeur que nous lui donnons en ADC_int ne sera pas utilisée n’importe où ailleurs) n’affectera pas sa valeur.
Autre exemple : dans notre macro de retard. Nous avons un registre, nous avons nommé « millisecondes », qui contient notre délai en millisecondes. Dans ce cas, il apparaît dans une macro, et nous rappeler que les travaux de la macro de manière que l’assembleur place le code de macro ensemble à l’endroit du programme où il est appelé. Dans ce cas, nous tenons à vous débarrasser de la variable « millisecondes » et remplacez-le par un des nos variables temporaires. Dans ce cas je vais le faire un peu différemment pour vous montrer comment même si la valeur de la variable va être nécessaires ailleurs nous pouvons encore l’utiliser à l’aide de la pile. Donc au lieu de millisecondes, nous utilisons "temp" et afin que nous ne bousiller d’autres choses qui utilisent également la valeur de temp nous commençons simplement la macro « retard » en « poussant » temp sur la pile, puis nous les utilisons au lieu de millisecondes, et puis à la fin de la macro nous "pop" sa valeur précédente de la pile.
Le résultat net est que nous avons « emprunté » temp et temp2 pour une utilisation temporaire et ensuite restaurés à leurs valeurs précédentes lorsque nous avons terminé.
Après avoir apporté cette modification, voici la routine d’interruption de ADC_int :
ADC_int: push temp ; save temp since we modify it here push temp2 ; save temp2 lds temp2,ADCH ; load keypress ldi ZH,high(2*numbers) ldi ZL,low(2*numbers) cpi temp2,0 breq return ; if noise triggers don't change 7segnumber setkey: lpm temp,Z+ ; load from table and post increment clc cp temp2,temp ; compare keypress with the table brlo PC+4 ; if ADCH is lower, try again lpm 7segnumber,Z ; otherwise load keyvalue table inc digit ; increment the digit number rjmp return ; and return adiw ZH:ZL,1 ; increment Z rjmp setkey ; and go back to top return: pop temp2 ; restore temp2 pop temp ; restore temp reti
Notez que le fonctionnement de la pile est que le premier est le dernier arrêt. Tout comme une pile de papiers. Vous voyez que dans nos deux premières lignes, nous poussons la valeur de temp sur la pile, puis nous poussons temp2 sur la pile, puis nous les utilisons pour d’autres choses dans la sous-routine, et enfin nous restaurer à leurs valeurs précédentes à nouveau en première popping temp2 off (puisque c’est le dernier d'entre eux a poussé dessus en haut de la pile et sera le premier que nous pop faire marche arrière) et puis surgissent Temp.
Si par la suite, nous allons toujours utiliser cette méthode. La seule fois où que nous désignera en fait un registre pour autre chose qu’une variable temp est lorsque nous allons en avoir besoin dans le monde. Par exemple, le registre appelé « débordements » est celui que nous utilisons en différents endroits dans le programme et donc nous aimerions lui donner un nom. Bien sûr nous pourrions toujours utiliser la façon dont nous l’avons fait avec le temp et temp2 puisque nous restaurerait sa valeur après que nous sommes fait. Mais qui aurait spaghettify choses trop. Ils sont nommés pour une raison et nous avons temp et temp2 déjà désigné pour ce poste.