Table des matières:

Tutoriel assembleur AVR 1 : 5 étapes
Tutoriel assembleur AVR 1 : 5 étapes

Vidéo: Tutoriel assembleur AVR 1 : 5 étapes

Vidéo: Tutoriel assembleur AVR 1 : 5 étapes
Vidéo: AVR Assembly Tutorial: Part 1 (Basic Commands) 2024, Novembre
Anonim
Tutoriel 1 sur l'assembleur AVR
Tutoriel 1 sur l'assembleur AVR

J'ai décidé d'écrire une série de tutoriels sur la façon d'écrire des programmes en langage assembleur pour l'Atmega328p qui est le microcontrôleur utilisé dans l'Arduino. Si les gens restent intéressés, je continuerai à en publier un par semaine environ jusqu'à ce que je manque de temps libre ou que les gens arrêtent de les lire.

J'utilise Arch Linux et je travaille sur un atmega328p-pu configuré sur une maquette. Vous pouvez le faire de la même manière que moi ou vous pouvez simplement brancher un arduino sur votre ordinateur et travailler sur le microcontrôleur de cette façon.

Nous écrirons des programmes pour le 328p comme celui qui se trouve dans la plupart des arduino, mais vous devez noter que ces mêmes programmes et techniques fonctionneront également pour n'importe lequel des microcontrôleurs Atmel et plus tard (s'il y a un intérêt), nous travaillerons avec certains d'entre eux. les autres aussi. Les détails du microcontrôleur peuvent être trouvés dans les fiches techniques Atmel et le manuel du jeu d'instructions. Je les joins à cette instructable.

Voici ce dont vous aurez besoin:

1. Une planche à pain

2. Un Arduino, ou juste le microcontrôleur

3. Un ordinateur sous Linux

4. L'assembleur avra utilisant git: git clone https://github.com/Ro5bert/avra.git ou si vous utilisez ubuntu ou un système basé sur Debian, tapez simplement "sudo apt install avra" et vous obtiendrez à la fois l'assembleur avr et avrude. CEPENDANT, si vous obtenez la dernière version à l'aide de github, vous obtiendrez également tous les fichiers d'inclusion nécessaires, en d'autres termes, il contient déjà les fichiers m328Pdef.inc et tn85def.inc.

5. avrdude

L'ensemble complet de mes tutoriels assembleur AVR peut être trouvé ici:

Étape 1: Construire une planche de test

Construire une planche de test
Construire une planche de test

Vous pouvez simplement utiliser votre arduino et tout faire dans ces didacticiels à ce sujet si vous le souhaitez. Cependant, puisque nous parlons de codage en langage assembleur, notre philosophie est intrinsèquement de supprimer tous les périphériques et d'interagir directement avec le microcontrôleur lui-même. Alors ne pensez-vous pas que ce serait plus amusant de le faire de cette façon?

Pour ceux d'entre vous qui sont d'accord, vous pouvez retirer le microcontrôleur de votre arduino, puis commencer par construire un "Breadboard Arduino" en suivant les instructions ici:

Sur la photo, je montre ma configuration qui se compose de deux Atmega328p autonomes sur une grande maquette (je veux pouvoir garder le tutoriel précédent câblé et chargé sur un microcontrôleur tout en travaillant sur le suivant). J'ai configuré l'alimentation de manière à ce que le rail supérieur soit à 9V et que tous les autres soient à 5V du régulateur de tension. J'utilise également une carte de dérivation FT232R pour programmer les puces. Je les ai achetés et j'y ai mis des chargeurs de démarrage moi-même, mais si vous venez d'en retirer un d'un Arduino, tout va déjà bien.

Notez que si vous essayez cela avec un ATtiny85, vous pouvez simplement obtenir le programmeur Sparkfun Tiny ici: https://www.sparkfun.com/products/11801#, puis le brancher simplement sur le port USB de votre ordinateur. Vous devrez d'abord installer un chargeur de démarrage sur l'Attiny85 et le moyen le plus simple consiste simplement à utiliser l'IDE Arduino. Cependant, vous devrez cliquer sur le fichier et les préférences, puis ajouter cette URL de nouvelles cartes: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json qui vous permet d'installer le bootloader (si votre ATtiny85 n'en est pas déjà fourni.)

Étape 2: Installer l'assembleur et Avrdude

Vous pouvez maintenant télécharger et installer l'assembleur et avrdude à partir des liens donnés à la première étape de ce tutoriel. Il est probable que si vous avez déjà travaillé avec Arduino, vous avez déjà installé avrdude.

Après avoir installé avra, vous remarquerez qu'il y a un sous-répertoire qui l'accompagne appelé "sources" et à l'intérieur de ce répertoire se trouvent un tas de fichiers à inclure. Ce sont tous les microcontrôleurs que vous pouvez programmer avec avra. Vous remarquerez tout de suite qu'il n'y a pas de fichier pour le 328p que nous utilisons ici. J'en ai joint un. Le fichier doit s'appeler m328Pdef.inc et vous devez le placer dans le répertoire includes ou n'importe où ailleurs. Nous l'inclurons dans nos programmes en langage assembleur. Tout cela ne fait que donner à chacun des registres dans les noms de microcontrôleur de la fiche technique afin que nous n'ayons pas à utiliser leurs noms hexadécimaux. Le fichier d'inclusion ci-dessus contient des "directives pragma" car il a été conçu pour la programmation C et C++. Si vous en avez assez de voir l'assembleur cracher des plaintes "ignorer la directive pragma", allez simplement dans le fichier et supprimez ou commentez toutes les lignes commençant par #pragma

Bon, maintenant que vous avez votre microcontrôleur prêt, votre assembleur prêt et votre programmeur prêt, nous pouvons écrire notre premier programme.

Remarque: si vous utilisez l'ATtiny85 au lieu de l'ATmega328P, vous avez besoin d'un autre fichier d'inclusion appelé tn85def.inc. Je le joindrai également (notez que je devais l'appeler tn85def.inc.txt pour qu'Instructables me permette de le télécharger.) CEPENDANT, si vous avez l'assembleur avra de github, vous avez déjà ces deux fichiers avec. Je vous recommande donc de l'obtenir et de le compiler vous-même: git clone

Étape 3: Bonjour tout le monde

L'objectif de ce premier tutoriel est de construire le premier programme standard que l'on écrit lors de l'apprentissage d'un nouveau langage ou de l'exploration d'une nouvelle plate-forme électronique. "Bonjour le monde!." Dans notre cas, nous voulons simplement écrire un programme en langage assembleur, l'assembler et le télécharger sur notre microcontrôleur. Le programme allumera une LED. Faire clignoter une LED comme ils le font pour le programme normal Arduino hello world est en fait un programme beaucoup plus compliqué en langage assembleur et nous ne le ferons donc pas pour le moment. Nous allons écrire le code "bare bones" le plus simple avec un minimum de peluches inutiles.

Connectez d'abord une LED de PB5 (voir le schéma de brochage) qui est également appelée Digital Out 13 sur un arduino, à une résistance de 220 ohms, puis à GND. C'est à dire.

PB5 -- LED -- R (220 ohms) -- GND

Maintenant, écrire le programme. Ouvrez votre éditeur de texte préféré et créez un fichier appelé "hello.asm"

;bonjour.asm

; allume une LED qui est connectée à PB5 (digital out 13).include "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Start: rjmp Start

Ce qui précède est le code. Nous allons le parcourir ligne par ligne dans une minute, mais assurons-nous d'abord que nous pouvons le faire fonctionner sur votre appareil.

Après avoir créé le fichier, puis dans un terminal vous l'assemblez comme suit:

avra bonjour.asm

cela assemblera votre code et créera un fichier appelé hello.hex que nous pouvons télécharger comme suit:

avrdude -p m328p -c stk500v1 -b 57600 -P /dev/ttyUSB0 -U flash:w:hello.hex

si vous utilisez un arduino de la planche à pain, vous devrez appuyer sur le bouton de réinitialisation de l'arduino de la planche à pain juste avant d'exécuter la commande ci-dessus. Notez que vous devrez peut-être également ajouter un sudo devant ou l'exécuter en tant que root. Notez également que sur certains arduino (comme l'Arduino UNO), vous devrez probablement changer le débit en -b 115200 et le port -P /dev/ttyACM0 (si vous obtenez une erreur d'avrdude à propos d'une signature de périphérique invalide, ajoutez simplement un - F à la commande)

Si tout a fonctionné comme il se doit, vous aurez maintenant une LED allumée….. "Hello World!"

Si vous utilisez l'ATtiny85, la commande avrdude sera:

avrdude -p attiny85 -c usbtiny -U flash:w:hello.hex

Étape 4: Hello.asm ligne par ligne

Pour terminer ce tutoriel d'introduction, nous allons parcourir le programme hello.asm ligne par ligne pour voir comment cela fonctionne.

;bonjour.asm

; allume une LED qui est connectée à PB5 (sortie numérique 13)

Tout ce qui suit un point-virgule est ignoré par l'assembleur et donc ces deux premières lignes sont simplement des "commentaires" expliquant ce que fait le programme.

.include "./m328Pdef.inc"

Cette ligne indique à l'assembleur d'inclure le fichier m328Pdef.inc que vous avez téléchargé. Vous voudrez peut-être le mettre dans un répertoire de fichiers d'inclusion similaires, puis modifier la ligne ci-dessus pour qu'elle y pointe.

ldi r16, 0b0010000

ldi signifie "charge immédiate" et dit à l'assembleur de prendre un registre de travail, r16 dans ce cas, et d'y charger un nombre binaire, 0b00100000 dans ce cas. Le 0b devant indique que notre nombre est en binaire. Si nous voulions, nous aurions pu choisir une autre base, telle que l'hexadécimal. Dans ce cas, notre nombre aurait été 0x20 qui est hexadécimal pour 0b0010000. Ou nous aurions pu utiliser 32 qui est la base 10 décimale pour le même nombre.

Exercice 1: essayez de changer le nombre dans la ligne ci-dessus en hexadécimal, puis en décimal dans votre code et vérifiez que cela fonctionne toujours dans chaque cas.

L'utilisation du binaire est cependant la plus simple en raison de la façon dont les ports et les registres fonctionnent. Nous discuterons plus en détail des ports et des registres de l'atmega328p dans les futurs tutoriels, mais pour l'instant, je dirai simplement que nous utilisons r16 comme "registre de travail", ce qui signifie que nous allons simplement l'utiliser comme variable que nous stockons nombres. Un "registre" est un ensemble de 8 bits. Cela signifie 8 points qui peuvent être 0 ou 1 (`off' ou `on'). Lorsque nous chargeons le nombre binaire 0b0010000 dans le registre en utilisant la ligne ci-dessus, nous avons simplement stocké ce nombre dans le registre r16.

sur DDRB, r16

Cette ligne indique au compilateur de copier le contenu du registre r16 dans le registre DDRB. DDRB signifie "Data Direction Register B" et configure les "broches" sur PortB. Sur la carte de brochage du 328p, vous pouvez voir qu'il y a 8 broches étiquetées PB0, PB1, …, PB7. Ces broches représentent les "bits" de "PortB" et lorsque nous chargeons le nombre binaire 00100000 dans le registre DDRB, nous disons que nous voulons que PB0, PB1, PB2, PB3, PB4, PB6 et PB7 soient définis comme broches d'ENTRÉE car ils ont 0 est en eux, et PB5 est défini comme une broche de SORTIE puisque nous avons mis un 1 à cet endroit.

sortie PortB, r16

Maintenant que nous avons fixé les directions des broches, nous pouvons maintenant définir les tensions sur celles-ci. La ligne ci-dessus copie le même nombre binaire de notre registre de stockage r16 vers PortB. Cela règle toutes les broches sur 0 volt, sauf la broche PB5 sur HIGH qui est de 5 volts.

Exercice 2: Prenez un multimètre numérique, branchez le fil noir à la terre (GND) puis testez chacune des broches PB0 à PB7 avec le fil rouge. Les tensions sur chacune des broches correspondent-elles exactement à la mise de 0b0010000 dans PortB ? S'il y en a qui ne le sont pas, pourquoi pensez-vous que c'est le cas ? (voir la carte des broches)

Début:

rjmp Démarrer

Enfin, la première ligne ci-dessus est une "étiquette" qui étiquette un endroit dans le code. Dans ce cas, étiqueter cet endroit comme "Démarrer". La deuxième ligne indique « saut relatif au début de l'étiquette ». Le résultat net est que l'ordinateur est placé dans une boucle infinie qui ne cesse de revenir au début. Nous en avons besoin parce que nous ne pouvons pas laisser le programme se terminer ou tomber d'une falaise, le programme doit simplement continuer à fonctionner pour que la lumière reste allumée.

Exercice 3: supprimez les deux lignes ci-dessus de votre code afin que le programme tombe d'une falaise. Ce qui se produit? Vous devriez voir quelque chose qui ressemble au programme "blink" traditionnel utilisé par Arduino comme leur "hello world!". Pourquoi pensez-vous qu'il agit de cette façon? (Pensez à ce qui doit arriver lorsque le programme tombe d'une falaise…)

Étape 5: Conclusion

Si vous êtes arrivé jusqu'ici, félicitations ! Vous pouvez maintenant écrire du code assembleur, l'assembler et le charger sur votre microcontrôleur.

Dans ce tutoriel, vous avez appris à utiliser les commandes suivantes:

ldi hregister, nombre charge un nombre (0-255) dans un demi-registre supérieur (16-31)

out ioregister, le registre copie un numéro d'un registre de travail vers un registre d'E/S

rjmp label saute à la ligne du programme étiquetée par "label" (qui ne peut pas être à plus de 204 instructions - c'est-à-dire un saut relatif)

Maintenant que ces bases sont éliminées, nous pouvons continuer à écrire du code plus intéressant et des circuits et dispositifs plus intéressants sans avoir à discuter des mécanismes de compilation et de téléchargement.

J'espère que vous avez apprécié ce tutoriel d'introduction. Dans le prochain didacticiel, nous ajouterons un autre composant de circuit (un bouton) et développerons notre code pour inclure les ports d'entrée et les décisions.

Conseillé: