LOCODUINO

Forum de discussion
Dépôt GIT Locoduino
Flux RSS

vendredi 24 septembre 2021

37 visiteurs en ce moment

L’assembleur (4)

Programmation du microcontrôleur

. Par : Christian

DIFFICULTÉ :

Dans cet article, nous quittons la théorie pour passer à la pratique, ce qui est toujours plus agréable. Nous nous étions arrêtés à l’élaboration d’un programme Blink en assembleur. Mais ce que nous avons là n’est qu’un fichier texte et il est temps maintenant de transformer ce texte en langage binaire. Pour cela, il nous faut un programme d’assemblage. Et ensuite, il nous faudra un programmateur pour effectuer le téléchargement des octets dans la mémoire programme d’une carte Uno.

Programme d’assemblage

Il n’y a pas de bons ouvriers sans de bons outils ; l’IDE d’Arduino est un petit programme qui joue très bien son rôle et qui a contribué au succès des cartes Arduino. Son principal avantage est qu’il est très simple d’utilisation car il ne propose que l’essentiel pour parvenir à programmer une carte à microcontrôleur. Mais si vous lisez ces lignes, c’est que vous avez envie d’aller plus loin et un outil plus sophistiqué s’impose.

Je vous recommande d’utiliser Microchip Studio 7 (anciennement appelé Atmel Studio 7 si vous voulez chercher des tutos sur internet). Ce logiciel (qui n’est actuellement disponible que sous Windows [1]) propose tous les outils nécessaires au développement de programmes pour les puces Microchip (anciennement Atmel), que ce soit en langage C/C++ ou bien en assembleur [2]. Il propose également un mode simulateur qui permet d’essayer le programme sans le téléverser sur la carte et en utilisant un logiciel de simulation s’exécutant sur le PC et reproduisant le fonctionnement du microcontrôleur. Ceci permet de surveiller de près les valeurs de registres ou des variables en mémoire et d’exécuter le programme instruction par instruction. Enfin, il existe de nombreux tutos permettant de prendre en main ce logiciel très populaire parmi les bricoleurs avancés.

Rendez-vous sur le site de Microchip (www.microchip.com) dans la catégorie « Tools and software » pour télécharger « Microchip Studio IDE for AVR and SAM Devices ». Vous avez deux options de téléchargement selon que vous disposez ou non d’internet pendant l’installation. Avant d’installer le programme, pensez à mettre à jour votre système d’exploitation, puis faites l’installation qui ne pose pas vraiment de problème.

La vidéo suivante (en français) vous permettra de prendre en main ce logiciel pour programmer en assembleur :

Le site de Microchip propose également des tutos pour prendre en main Studio 7 ainsi que de la documentation qu’il est toujours bon d’avoir sous la main.

Vous êtes maintenant prêt à développer des programmes pour la série de puces AVR, ARM ou pour les cartes Arduino. Ouvrez un nouveau projet en assembleur pour MCU ATmega328P et reportez le programme que vous avez écrit avec l’article L’assembleur (3) dans la fonction main.asm de votre projet. En utilisant le menu Build > Build solution, vous transformez votre texte en langage binaire et vous pouvez voir que ce programme n’occupe que 34 octets de « CSEG » (Code Segment ou encore mémoire programme »). Lors de ce processus, un fichier .hex au format d’Intel a été généré : il se trouve dans le répertoire « Output Files » et c’est ce fichier qui va servir à programmer le MCU. Mais pour cela, il vous faut un programmateur.

Note : les projets de Studio 7 sont stockés dans Documents > Atmel Studio > 7.0 et le fichier .hex est dans un répertoire appelé Release dans le projet concerné.

Programmateur

Les puces de Microchip/Atmel peuvent être programmées en mode ISP (In System Programming) ; il suffit donc de se procurer un programmateur ISP. On en trouve à des prix raisonnables sur internet et Microchip en propose également un : l’Atmel-ICE pour une centaine d’euros (Figure 1)

Figure 1
Figure 1
Programmateur Atmel ICE (source Microchip).

Une solution alternative pour ceux qui ne veulent pas faire l’achat d’un programmateur est d’utiliser le bootloader présent dans le microcontrôleur de la carte Arduino pour transférer le code binaire depuis Studio 7. La vidéo suivante (en anglais) montre comment faire :

Personnellement, j’ai suivi la procédure à la lettre et cela a fonctionné du premier coup, et c’est comme cela que j’ai pu commencer à utiliser Studio 7.

Téléversement

Une fois équipé d’un programmateur ou de la solution décrite plus haut, il est facile de télécharger (téléverser si on garde le terme de l’IDE) le code binaire dans la mémoire programme du MCU de la carte.

Une autre solution consiste à utiliser le fichier hexadécimal au format Intel généré par Studio 7 et le logiciel avrdude utilisé en mode console, comme nous l’avons expliqué dans l’article Programmer vos Arduino avec un fichier hexadécimal.

Comme vous le constatez, ce ne sont pas les solutions qui manquent pour remplacer l’IDE d’Arduino par un logiciel plus performant et réellement dédié au développement de logiciel pour microcontrôleur.

Conseils à ceux qui veulent développer en assembleur

C’est en forgeant qu’on devient forgeron et c’est aussi en programmant qu’on devient programmeur. Bien évidemment, ce que nous avons évoqué jusqu’à présent est nettement insuffisant pour faire de vous d’excellents programmeurs en assembleur. Le mieux est donc de vous y mettre et pour cela, voici quelques conseils.

Commencer vos séances de programmation en ayant ouvert la datasheet du MCU que vous voulez programmer, ainsi que la documentation du logiciel Studio 7 (ou de votre autre solution de développement si vous en préférez une autre). Ainsi, vous aurez sous la main les bonnes informations pour vous sortir d’affaire.

Il ne suffit pas de connaître le jeu d’instructions pour savoir programmer ; il y a de nombreuses techniques de programmation décrites dans les ouvrages spécialisés et comme pour toutes disciplines, il faudra les découvrir et les assimiler. Parmi ces techniques, on peut citer les nombreuses possibilités d’adressage de l’espace mémoire (il n’y a qu’à regarder les possibilités du jeu d’instructions), la gestion de la pile, la gestion des sous-programmes, etc.

N’hésitez pas à faire des essais pour découvrir vos outils, soyez curieux pour explorer les différents menus de Studio 7. Faites également des essais sur vos programmes pour trouver les solutions les plus efficaces en termes de compacité, rapidité, efficacité.

Rappelez-vous que si vous programmez en assembleur, vous êtes seul et que c’est à vous de penser à l’essentiel (alors que la solution langage C et IDE effectuait beaucoup de choses qui étaient ainsi transparentes pour vous). Par exemple, lorsque vous appelez un sous-programme, il peut être nécessaire de sauvegarder sur la pile certaines valeurs des registres de travail (instruction PUSH) et de les restaurer ensuite (instruction POP) ; le logiciel d’assemblage ne le fera pas à votre place. Pensez aussi que toute valeur sauvegardée doit être restaurée, car si vous oubliez, vous aurez corrompu votre pile et le programme ne s’y retrouvera pas !

Enfin, pour programmer en assembleur, il faut parfois oublier la façon de coder des langages évolués, comme le C auquel nous sommes habitués. Par exemple, si nous voulons écrire directement dans le port D d’une carte Uno : en C, il suffit d’écrire l’instruction sous la forme PORTD = 0b11011101 ; et en utilisant le binaire, on voit bien ce qu’on fait. En assembleur, cela ne fonctionne pas pour deux raisons :
- l’assembleur a une syntaxe qui n’est pas celle du C.
- écrire dans ce qui apparaît comme une variable (PORTD) nécessite de charger la valeur dans un registre avant de l’écrire en mémoire puisqu’il n’existe pas en assembleur d’instruction permettant directement d’écrire une valeur en mémoire. Il faut donc faire de cette manière (dans cet exemple, charger un registre de travail avec la valeur binaire puis copier le contenu du registre sur le PORT en utilisant l’instruction OUT).

Conclusion

Programmer en assembleur demande un important travail intellectuel et demande aussi beaucoup de temps pour la mise au point et le débogage d’un programme. C’est à ce prix qu’on peut obtenir une compacité accrue du code binaire ou une meilleure efficacité du timing d’une fonction.

La véritable question à se poser est : est-ce bien nécessaire ? Par exemple, si on programme un chenillard sur un ATtiny45 comme cela a été fait dans l’article Le microcontrôleur ATtiny45 (3), le code occupe 750 octets de mémoire programme soit 18%. On est loin de la limitation et passer en assembleur ne présente aucun intérêt, d’autant que si on était à court de place en mémoire, on pourrait passer à un ATtiny85. Sur le plan de l’efficacité, on ne gagnerait rien non plus puisque le programme passe son temps à attendre (délai de 50 ms, ce qui est énorme par rapport au temps pour allumer ou éteindre les différentes LED) ; une fois de plus, programmer ce chenillard en assembleur n’a aucun intérêt.

C’est donc dans les cas de projets très pointus que vous aurez besoin de programmer en assembleur, ou bien tout simplement parce que cela vous plaît et que ça représente un nouveau challenge dans votre connaissance des microcontrôleurs.

Nous venons de jeter les bases nécessaires pour apprendre à programmer en assembleur. Beaucoup reste à faire pour maîtriser toutes les ressources des microcontrôleurs (timers, ADC, interfaces de communication, etc.). Nul doute que dans l’avenir, d’autres articles viendront compléter cette série. En attendant, à vous de vous entraîner un peu : pourquoi pas programmer le chenillard dont nous parlions plus haut ? Juste pour le fun, évidemment !

[1Les utilisateurs sous Mac OS ou Linux pourront utiliser l’IDE pour programmer en assembleur comme nous le démontrerons dans un article ultérieur.

[2L’assembleur de Studio 7 est limité aux microcontrôleurs 8 bits AVR, mais le développement en C/C++ est possible pour les microcontrôleurs de la série ARM.

1 Message

Réagissez à « L’assembleur (4) »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Programmation »

Comment gérer le temps dans un programme ?

La programmation, qu’est ce que c’est

Types, constantes et variables

Installation de l’IDE Arduino

Répéter des instructions : les boucles

Les interruptions (1)

Instructions conditionnelles : le if … else

Instructions conditionnelles : le switch … case

Comment concevoir rationnellement votre système

Comment gérer l’aléatoire ?

Calculer avec l’Arduino (1)

Calculer avec l’Arduino (2)

La compilation d’un projet Arduino

Les structures

Systèmes de numération

Les fonctions

Trois façons de déclarer des constantes

Transcription d’un programme simple en programmation objet

Ces tableaux qui peuvent nous simplifier le développement Arduino

Les chaînes de caractères

Trucs, astuces et choses à ne pas faire !

Processing pour nos trains

Arduino : toute première fois !

Démarrer en Processing (1)

TCOs en Processing (1)

TCOs en Processing (2)

Comment réussir son projet Arduino

Passage à niveau géré par Arduino (1)

Passage à niveau géré par Arduino (2)

Passage à niveau géré par Arduino (3)

Passage à niveau géré par Arduino (4)

Passage à niveau géré par Arduino (5)

Du sketch à l’exécutable

Programmer vos Arduino avec un fichier hexadécimal

Le monde des objets (1)

Le monde des objets (2)

Le monde des objets (3)

Le monde des objets (4)

Les pointeurs (1)

Les pointeurs (2)

Les Timers (I)

Les Timers (II)

Les Timers (III)

Les Timers (IV)

Les Timers (V)

Bien utiliser l’IDE d’Arduino (1)

Bien utiliser l’IDE d’Arduino (2)

Piloter son Arduino avec son navigateur web et Node.js (1)

Piloter son Arduino avec son navigateur web et Node.js (2)

Piloter son Arduino avec son navigateur web et Node.js (3)

Piloter son Arduino avec son navigateur web et Node.js (4)

Les derniers articles

L’assembleur (8)


Christian

L’assembleur (7)


Christian

L’assembleur (6)


Christian

L’assembleur (5)


Christian

L’assembleur (4)


Christian

L’assembleur (3)


Christian

L’assembleur (2)


Christian

L’assembleur (1)


Christian

Programmer vos Arduino avec un fichier hexadécimal


Christian

Du sketch à l’exécutable


Christian

Les articles les plus lus

L’assembleur (1)

Les Timers (I)

Les interruptions (1)

L’assembleur (6)

Calculer avec l’Arduino (1)

Instructions conditionnelles : le if … else

L’assembleur (3)

L’assembleur (4)

Comment gérer le temps dans un programme ?

Ces tableaux qui peuvent nous simplifier le développement Arduino