Compilation et upload d’un programme sur l’AVR Atmel M1280


Salut tout le monde ! Aujourd’hui, on parlera un peu de programmation embarquée 🙂 Je vais vous présenter l’AVR M1280, c’est un microcontrôleur que j’utilise en cours. Ce n’est pas un tuto qui explique comment ca fonctionne, mais plus un récapitulatif qui liste où se trouve quoi. Parce qu’avec les milliers de variables et de bits différents qu’il existe là dessus, c’est un gros bordel. Du coup, ne comptez pas comprendre comment tout ça fonctionne à l’aide de mon article, désolé 🙁

Descreamer :

Ça va faire deux mois que je fais ce genre de choses. Mon expérience dans le domaine et donc nulle et ma compréhension du sujet loin d’être parfaite. Ainsi, il important de ne pas considérer le contenu suivant comme sûr !

Si vous décelez des erreurs, ou avez des précisions supplémentaires à ajouter, je vous invite à m’en faire part. Merci 😉

Deux façons différentes pour envoyer des programmes sur la board existent, et du coup pour changer le driver de l’AVR. Enfin, je dis « deux », mais il y en a peut-être plus… J’en connais deux en tout cas, et je vais vous en parler. 🙂 La première est de passer par le port prévu pour (appelé “on board programmer port”) et la seconde via le port de « configuration » ( port JTAG). J’ai indiqué où ils se situent sur la platine sur la photo ci-dessous.

Utilisation du “On board programmer” port.

C’est la façon basique et commune d’installation des drivers. Celle à privilegier, normalement, dans tous les cas qui ne sont pas en rapport avec la configuration même de la platine.

Comment compiler un programme sous Linux à destination du microcontrôleur et l’envoyé sur celui-ci ? On procède en trois étapes : la première consiste à cross-compiler notre fichier .c pour être compatible avec le processeur AVR (le binaire crée ne sera donc pas exécutable sur notre ordinateur). Pour cela on utilise avr-gcc. On n’oubliera pas de bien précisé le type de microcontrôleur que nous ciblons avec l’option -mmcu. C’est principalement pour avoir les bonnes déclarations des variables. Dans un second temps, avr-objcopy convertira le programme obtenu en Intel HEX. À quoi ça sert ? Apparemment il faut que ça soit en ihex pour effectuer le fransfert… Ouais j’avoue, c’est bizarre, mais sans ça, ça ne marche pas. On fera avec. Et au final, maintenant qu’on a notre fichier bien comme il faut, il ne reste plus qu’à l’envoyer sur notre cher microcontrôleur ! Pour cela, on utilisera le programme avrdude. Dans mon cas, je passe par un port USB, le mode de communication est donc usbasp. En résumé, on doit faire ça :

avr-gcc programme.c -o programme.hex -mmcu=atmega1280
avr-objcopy -0 ihex programme.hex programme.ihex
avrdude -c usbasp -p m1280 -U flash:w:programme.ihex:i

Utilisation de “l’AVR Dragon” via le port JTAG.

C’est un peu la porte des coulisses de la platine en fait. Celle qu’on utilise, par exemple pour travailler sur les autres puces disponibles sur la platine que notre AVR M1280. Par exemple, celle qui est permet a l’ordinateur de reconnaitre la board et d’envoyer des programmes dessus via celle-ci (la façon vue précédemment) 😀

Oui, j’ai en fait réussi à « casser » les programmes de « gestion interne » de la platine… Je ne peux plus passer par la première façon temps que je n’ai pas réinstallé les drivers du composant. Ne me demandez pas comment j’ai fait, je n’en ai aucune idée.

Donc, comment uploader par Dragon et le port JTAG ? La compilation du fichier reste la même. Il suffit en fait de modifier l’option -c de avrdude pour faire indiquer que nous utilisons l’interface de Dragon via le port JTAG à la place du port USB simple. Ainsi, le mode de transfert usbasp est à remplacer par dragon_jtag. La deuxième subtilité se trouve dans l’option -P qu’il faut rajouter. Elle permet en fait de savoir vers où l’ordinateur doit envoyer le programme. En effet, avec -c on indique que Dragon est connecté à la board via le port JTAG, mais on indique pas comment Dragon communique avec l’ordinateur vu que c’est un module à part, extérieur à la platine. 😀

En résumé, on obtien ceci :

avrdude -c dragon_jtag -p m1280 -P usb -U flash:w:soft.hex:i

Et si, par le plus grand des hasards, vous avez une erreur du genre :

avrdude: ser_open(): can’t set attributes for device « /dev/parport0 »: Inappropriate ioctl for device
avrdude: ser_send(): write error: Bad file descriptor

C’est que vous avez oublié cette fameuse option -P, et que du coup, avrdude utilise le port par défaut, à savoir le port parallèle à la place des ports USB !