Tutoriel d’assembleur AVR 9 (5 / 7 étapes)

É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.

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 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 10

Tutoriel d’assembleur AVR 10

Bienvenue au didacticiel 10 !Désolé, qu'il a fallu si longtemps pour sortir cette nouvelle tranche mais c'est un moment assez intense de l'année. En tout cas, ici c'est !Nous avons parcouru un long chemin et vous êtes probablement déjà assez compéten
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