IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

La fonction Blink revisitée
Un tutoriel de Patrick BRIAND

Le , par bpy1401

29PARTAGES

10  0 
Bonjour à tous

Je vous propose un nouveau tutoriel : La fonction Blink revisitée

La fonction blink est l'exemple le plus connu de l'utilisation de la librairie Arduino, c'est même le premier code que l'on va tester sur une carte Arduino. Cet exemple utilise des fonctions de la librairie pinMode, digitalWrite et delay et ce tutoriel vous expliquera ce qu'il se cache derrière ces fonctions, l'impact qu'elles ont en termes de temps, ressources CPU et leurs inconvénients majeurs.

Enfin, le tutoriel va vous expliquer comment programmer directement les registres des port digitaux et un Timer 8 bits pour se passer de ces instructions.

Ce tutoriel a une limitation, il est dédié à la carte MEGA2560, il est donc à prendre avec précaution si vous voulez l'appliquer sur une autre carte Arduino.

Vous pouvez donc accéder à ce tutoriel ici

Bonne lecture

cours et tutoriels Arduino
Vous avez lu gratuitement 115 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de Jay M
Expert confirmé https://www.developpez.com
Le 21/06/2024 à 17:11
c'est clairement un sujet pour les experts et spécifique pour cette carte, donc autant y aller franchement et se débarrasser de la configuration Arduino qui prend aussi de la place et utiliser les commentaires pour expliquer le code...

Ce n'est pas très connu mais on n'est pas obligé de mettre setup() et loop() si on écrit soi-même son main() (sinon on dépend du main() arduino qui rajoutera plein de choses inutiles pour cet exemple)

Donc je propose "simplement":

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main() {
  DDRB |= 0b10000000; // Configuration de la pin 13 en sortie

  // Configurer le timer 1 pour déclencher une interruption toutes les secondes
  TCCR1A = 0;         // Configuration normale du timer 1
  TCCR1B = 0b1101;    // Prédiviseur de 1024
  TCNT1 = 0;          // Remettre le compteur à zéro
  OCR1A = 15624;      // Valeur de comparaison pour une interruption toutes les secondes
  TIMSK1 = 0b10;      // Activer l'interruption de comparaison A
  sei();              // on active les interruptions
  while (true);       // boucle infinie
  return 0;
}

ISR(TIMER1_COMPA_vect) {
  PINB = 0b10000000;  // Inverser l'état de la broche 13
}

==> on obtient alors en compilant dans l'IDE

Le croquis utilise 330 octets (0%) de l'espace de stockage de programmes. Le maximum est de 253952 octets.
Les variables globales utilisent 0 octets (0%) de mémoire dynamique, ce qui laisse 8192 octets pour les variables locales. Le maximum est de 8192 octets.

à tester sur wokwi:

https://wokwi.com/projects/401314696208107521

Par rapport à votre version on divise encore par plus de deux l'usage de la mémoire flash et on n'a aucun usage de la RAM pour des variables.
5  0 
Avatar de Vincent PETIT
Modérateur https://www.developpez.com
Le 21/06/2024 à 16:40
Bonjour,
Citation Envoyé par Bernard_68 Voir le message
Quel est aujourd'hui l'intéret d'entrer dans les entrailles d'un avr particulier alors de plus en plus d'utilisateur passent à des micro ARM32 ou ESP32 ?
Moi j'y vois quand même un intérêt et non des moindre, c'est qu'une fois la gymnastique comprise on peut changer de micro sans problème.

L'écosystème Arduino c'est bien mais vous êtes coincé avec les micros choisies pour vous. Le jour où il vous faut un micro bien précis et d'un autre fabricant, c'est fichu.

Dans cette discussion https://www.developpez.net/forums/d1...2l4-blink-led/ nous avons fait clignoter une LED sur un STM32 en attaquant les registres en C.
4  0 
Avatar de Bernard_68
Membre régulier https://www.developpez.com
Le 20/06/2024 à 21:35
Bonjour,

Quel est aujourd'hui l'intéret d'entrer dans les entrailles d'un avr particulier alors de plus en plus d'utilisateur passent à des micro ARM32 ou ESP32 ?
Ce travail sur les registres des avr est très formateur pour comprendre le fonctionnement d'un microcontroleur.
Je le concède très volontiers et je l'ai fait à titre personnel à une époque où Arduino n'avait que la Uno et la Mega.

Ce travail devrait être préfacé avec une mise en garde : il ne s'applique que pour un microcontroleur particulier.
Je crains qu'un "non-encore-connaisseur" croit que c'est vrai pour tous les microcontroleurs.

Porter ce travail sur les microcontroleurs récents sera difficile. Les microcontroleurs récents sont bien plus complexes qu'un avr.
Ce travail n'est même pas applicable dirrectement sur le micro de la UNO R3 qui est le micro avr le plus répandu dans le catalogue Arduino (atmega 328p = Uno, nano, pro-mini).
La Uno n'a pas les mêmes registres ni le même nombre de timers, ni le même dombre d'interruptions que la Mega.
La lecture de la datasheet s'imposera pour transposer sur un micro 328p.

Documentation :
AVR : une datasheet, avec des exemples en C, de 400 à 500 pages à lire,
ARM32 ou ESP32 (qui n'est pas un ARM) ; c'est deux documents de plus de 1000 pages chacun, et sans exemples -> les auteurs partent du principe que le lecteur est un professionnel et ils ne vont pas perdre du temps à lui macher le travail.

Les fonctions delay() et micro(), comme toutes les autres fonctions du framework arduino, n'ont pas le même code sur Avr, sur ARM et sur ESP32.
Je ne suis même pas sur que le code pour un ARM-Microchip et pour un ARM-STM32 sera le même.
Ce qui est vrai pour une famille de micro sera faux pour les autres.
Les fonctions écrites par Wiring/Arduino sont très conservatrices et prévoient des contrôles en cas de "bétises utilisateur" au détriment de la performance.
Rien ne prouve qu'STMicro et/ou Espressif ne priviligient pas la performance. Selon les tests que j'ai fait sur ESP32 il n'y a pas beaucoup de différence entre digitalWrite et l'utilisation des registres. On est loin du rapport 30 sur Wiring/Arduino.

Microchip continu de livrer des atmega328p pour les anciens projets mais n'accepte plus de commandes pour les nouveaux projets.
Situation classique d'un produit dont la fin de vie est enclenchée.
Certes, il n'y a toujours pas d'annonce publique de fin de vie pour d'autres avr, il y a quand même la disparition de certains boîtiers, ce qui n'est pas bon signe.

Il y a un atmega 328PB, mais il n'exite aucun bootloader Arduino et toujours pas d'adaptation du framework pour utiliser peinement ce micro.
Arduino a refusé d'investir du temps sur ce micro 328 PB parce qu'Arduino avait d'autres projets.
C'est ce qui explique qu'Arduino abandonne les arv avec la nouvelle UNO R4 et des nouvelles nano.

En conclusion :
Bon article mais mise en garde nécessaire.
3  0 
Avatar de Fagus
Membre expert https://www.developpez.com
Le 21/06/2024 à 17:57
Bel article pédagogique.

Intellectuellement c'est intéressant.
ça peut avoir un intérêt pour des petits microcontrôleurs sur piles boutons (ex des objets de jeu).
ça illustre aussi un problème historique du C, à savoir que les macro sont difficiles à déboguer et ne sont pas analysées statiquement comme le reste du code, ce qui explique probablement pourquoi arduino a décidé d'écrire un code générique qui s'adapte à chaque carte au run time. (Alors qu'en nim on peut écrire des "macros" en code ordinaire qui permettent d'écrire clairement en haut niveau mais qui compilera en manipulations de registres sur chaque carte. Mais, langage sans sponsor industriel).
3  0 
Avatar de bpy1401
Membre éprouvé https://www.developpez.com
Le 21/06/2024 à 19:09
Bonsoir à tous

Je pense que, si Arduino a développé cette couche logicielle, c'est uniquement pour faciliter la programmation de ce type de carte. En faisant une abstraction du matériel, le développeur ne se soucis que de son application, et n'a pas besoin de savoir comment fonctionne le Micro. Ca ouvre la porte à plein de développeurs qui n'ont pas cette connaissance, et du coup augmente le nombre de clients potentiels et c'est ce qui a, en parti, fait son succès.

L'autre avantage, c'est d'avoir un code presque portable d'une carte à une autre.

Pour les initiés à l'automobile, Arduino ressemble au principe AUTOSAR mais évidemment en beaucoup plus petit. Les équipementiers automobiles et constructeurs ne développent que l'applicatif, et les fondeurs de microcontrôleurs, de capteurs ou d'actionneurs vous fournissent la couche logicielle qui fait l'abstraction du matériel (ce que l'on appelle le BSW ou Basic software).

Bonne soirée et merci pour commentaires
3  0 
Avatar de f-leb
Responsable Arduino et Systèmes Embarqués https://www.developpez.com
Le 22/06/2024 à 12:03
Bonjour,

Citation Envoyé par _Froggy_ Voir le message
Ce serait pas plutôt un XOR à la ligne 17 ?
Non, pas pour ce registre. Ici, c'est l'écriture d'un 1 qui provoque la bascule, l'écriture d'un 0 est sans effet

13.2.2 Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn...
3  0 
Avatar de bpy1401
Membre éprouvé https://www.developpez.com
Le 21/06/2024 à 15:49
Bonjour Bernard_68

Merci pour tes commentaires

Ce travail devrait être préfacé avec une mise en garde : il ne s'applique que pour un microcontrôleur particulier.
Au début du tutoriel il est indiqué que le tutoriel est dédié à cette carte.

Après je fais ce tutoriel pour des non professionnels, principalement pour ceux qui considère la carte Arduino comme un hobbit ou des étudiants. Cette carte, pour moi, est bien pour les débutants car elle n'est pas trop complexe et elle offre plein de possibilité. SI j'avais eu cette carte au début de ma carrière, je l'aurais considéré comme une roll royce des cartes à base de micro controleurs

Et pour finir, je n'ai que cette carte sous la main, dans le futur, j'investirais peut être dans une autre carte plus évoluée.

Bonne journée
2  0 
Avatar de _Froggy_
Membre régulier https://www.developpez.com
Le 22/06/2024 à 10:58
Citation Envoyé par Jay M Voir le message


Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main() {
  DDRB |= 0b10000000; // Configuration de la pin 13 en sortie

  // Configurer le timer 1 pour déclencher une interruption toutes les secondes
  TCCR1A = 0;         // Configuration normale du timer 1
  TCCR1B = 0b1101;    // Prédiviseur de 1024
  TCNT1 = 0;          // Remettre le compteur à zéro
  OCR1A = 15624;      // Valeur de comparaison pour une interruption toutes les secondes
  TIMSK1 = 0b10;      // Activer l'interruption de comparaison A
  sei();              // on active les interruptions
  while (true);       // boucle infinie
  return 0;
}

ISR(TIMER1_COMPA_vect) {
  PINB = 0b10000000;  // Inverser l'état de la broche 13
}
Ce serait pas plutôt un XOR à la ligne 17 ?

----

Sinon l'AVR présente toujours aujourd'hui énormément d'avantages :
- Facilité d'intégration/apprentissage
- Format DIP (cela parait con, mais tout le monde n'ai pas capable de souder du SOIT ou du FDN)
- Facilité de débogage
- Rapidité de compilation
- Encore valable pour une majorité des applications iOT qui demandent rarement de la puissance CPU et/ou de la RAM.

Le coût n'est par contre pas concurrentiel, vu que c'est grosso modo les mêmes pour toutes les puces. Le problème principal reste la mémoire qui peut se révéler trop limité.
1  0 
Avatar de Jay M
Expert confirmé https://www.developpez.com
Le 22/06/2024 à 15:07
oui c'est un registre un peu magique, c'est rappelé d'ailleurs dans le tuto.
0  0 
Avatar de _Froggy_
Membre régulier https://www.developpez.com
Le 22/06/2024 à 16:38
Exactly, my bad. Mon cerveau a converti en DDRB à cause du commentaire
0  0