[Raspberry PI] Utilisez Raspi-ATtiny pour programmer facilement vos AVR

Cet article a été rédigé il y a 4 années ! Il commence à dater, mais n'est pas forcément obsolète.. Lisez-le en gardant cela en tête !
Bonjour, Je suis très content d’écrire cet article, car il s’agit du résultat de plusieurs heures de travail et d’optimisation du programme que je vous avait proposé il y a quelques mois, permettant la programmation des AVR Atmel. Cet article est un complément de mon premier article sur les AVR, que je vous conseille de lire http://leblogdekzl.fr/?p=900. Ce premier article avait pour but d’introduire les AVR, mais aussi de construire une carte de programmation d’AVR. Le lien avec le raspberry étant fait avec le programme raspi-attiny, permettant de générer des fichiers templates, compiler, uploader les programmes que vous écrivez. A présent l’idée est d’apprendre la programmation AVR et utiliser raspi-attiny pour écrire sur votre AVR. Je vais découper cet article en plusieurs parties, pour vous permettre de bien vous y retrouver. Si cela n’est pas encore fait, mettez à jour la version de raspi-attiny à l’aide de la commande :
raspi-attiny –upgrade
Puis mettez à jour le fichier /bin/raspi-attiny en modifiant les 2 lignes en début du programme. Ces 2 lignes sont très importantes, elles concernent l’identité de votre AVR. A savoir si vous utilisez un attiny25/45/85, il faudra mettre la signature correcte à savoir 25/45 ou 85.  

I) Les notions à connaitre sur microcontrolleur.

Les 3 grandeurs de base, dont il faut se souvenir, sont les registres PORT, DDR et PIN. Chacun a sa fonction.
  • Ce que l’on appelle PORT sur un AVR, ce sont les variables liants le composant programmable au monde réel ! Ce sont les valeurs logiques que prendrons les pattes métalliques de votre AVR.
  • DDR correspond au registre I/O, et permet de savoir si une patte est configurée en entrée ou en sortie
  • Enfin PIN correspond à l’état logique en temps réel de chacune des pattes de votre AVR.
 

1. Configuration des pins d’entrées/sorties (I/O) ?

D’abord, il faut indiquer si une patte doit être mise en sortie ou en entrée. Pour cela, on référence le registre DDR. DDR <– | DDB7 | DDB6 | DDB5 | DDB4 | DDB3 | DDB2 | DDB1 | DDB0 | Par exemple pour mettre en sortie la patte n°3, correspondant à PB3 (cf. ci-dessous), l’on indique ceci :
DDRB  |= (1 << DDB3);
Pour la mettre en entrée :
DDRB  &= ~(1 << DDB3);
  Sur un ATtiny25/45/85, il n’y a qu’un registre PORT : Le PORTB. Il s’agit d’une sorte de tableau, dont les cases sont réservées. PORTB <– | PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |  

2. Comment faire passer une patte de à 1 ou à 0 ?

Pour mettre un 1 logique dans une case, par exemple la case PB2, il vous suffira de faire cela :
PORTB |= (1 << PB2)
Et pour un 0 logique sur le port PB2, le code sera :
PORTB &= ~(1 << PB2)
  A partir de la vous pouvez presque tout faire ! Il vous manque plus que de savoir comment vérifier l’état d’une patte.    

3. Vérifier l’état actuel d’une patte

Considérez cette commande comme un booléen, elle renverra 1 ou 0 si la patte de l’attiny est à l’état haut ou bas.
PINB & (1 << PB2)

II) Utilisation des macros : pour un code plus lisible

Maintenant que je vous ai présenté les bases du microcontrolleur, je vais vous apprendre un super trick, qui vous simplifira grandement l’utilisation des AVR : les macros. Vous avez le choix d’utiliser ces commandes pas très sexy dans votre code, tel que :
PINB & (1 << PB2) PORTB &= ~(1 << PB2) …
Ou sinon d’utiliser les macros que j’ai rajouter dans raspi-attiny. Lorsque vous démarrer un projet, lancez toujours la commande
raspi-attiny –empty programme.c
Il s’agit d’un générateur permettant la création d’un fichier type pour la programmation de vos AVR. Dans ces fichiers, j’y ai inclus de base :
  • La bibliothèque de base des AVR
  • Les délais en millisecondes
  • La structure de base main() d’un programme.
  • Des macros, au nombre de 3.
Qu’est-ce que des macros ? Il s’agit de fonctions constantes, avec des paramètres. qui s’écrivent de manière très compact. Il s’agit de l’équivalent en terme de fonctions des variables constantes pour les variables. Dans cette structure de base se trouvent :
  • SET_MODE(PB, MODE), permettant de sélectionner le mode de fonction d’un PBx. A savoir mode INPUT ou OUTPUT
  • READ_INPUT(PB), permettant de lire la valeur d’une broche (pin, patte,.. appelez ça comme vous voulez !). Après avoir été mise en mode INPUT biensur.
  • WRITE_OUTPUT(PB, VALUE), permettant de donner une valeur (0 ou 1) à une broche de votre AVR.
Je trouve ces macros, très pratique car cela permet de rendre la programmation des AVR beaucoup plus instinctive, car personnellement je ne me souviens jamais de la bonne syntaxe pour configurer les broches et je me trompe souvent d’ailleurs !! 🙂

III) Exemple de programmes

1. Faire clignoter une LED

Beaucoup de personnes en parlent, je pense aussi que c’est un bon début pour commencer, voici le programme pour pouvoir faire clignoter une led à 1Hz.
wget http://partage.gauss-it.net/raspberrypi/atmel/ledblink.c raspi-attiny ledblink.c
Branchez simplement une led avec une résistance sur la broche PB3 + branchement Vcc et GND et c’est parti !  

2. Faire un bouton avec témoin lumineux

Deuxième exemple de programme, un simple bouton branché sur la broche PB2 et une LED + R sur la broche PB3.
wget http://partage.gauss-it.net/raspberrypi/atmel/bouton-temoin.c raspi-attiny bouton-temoin.c
   

Conclusion,

Petit à petit la programmation AVR se simplifie pour programmer depuis votre raspberry. J’espère que vous saurez trouver l’intérêt de mon travail dans vos projets. Et que mes exemples vous auront permis de mieux comprendre 🙂 N’hésitez pas si vous avez des questions, des remarques ou des pistes d’amélioration.

2 réponses à “[Raspberry PI] Utilisez Raspi-ATtiny pour programmer facilement vos AVR

  1. Bonjour,
    Je viens de suivre ton tuto, et merci, ca m’a bien aider 😉
    Le blinky.c fonctionne bien, mais j’essais de le modifier pour allumer la led lorsque j’envoi un signal depuis le pi.
    Je met donc ma pin 2 (PB3) en input, et j’écoute l’état, ce dernier est relié a une gpio du pi (en output) et je switch l’état à la mimine :
    #define BROCHE_IN DDB3
    #define IN PB3
    #define BROCHE_LED DDB4
    #define LED PB4

    int main(void) {
    SET_MODE(BROCHE_IN, "INPUT");
    SET_MODE(BROCHE_LED, "OUTPUT");
    while(1) {
    if (READ_INPUT(IN)) {
    WRITE_OUTPUT(LED, "HIGHT");
    } else {
    WRITE_OUTPUT(LED, "LOW");
    }
    _delay_ms(10);
    }
    return 0;
    }

    Le programme compile bien et s’upload sans problème sur mon ATtiny45

    sudo gpio -g mode 17 out
    sudo gpio -g write 17 1 // >> La LED devrait s’allumer, mais non…

    J’ai testé un autre programme ou la resistance pull-up était activé, et lui marche…
    Une idée du souci ?

    Merci
    Ben

    1. Salut ! Le problème peut venir d’ailleurs, mais il y a une faute d’orthographe dans l’instruction du if : HIGHT
      Est-ce que ça résout le problème ? 🙂
      Sinon hésite pas à reporter on va trouver le pb 😉

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *