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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

La fonction Blink revisitée [Tutoriel]


Sujet :

Arduino

  1. #1
    Membre éprouvé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 499
    Points : 1 005
    Points
    1 005
    Par défaut La fonction Blink revisitée
    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
    Page sur Developpez : http://pbriand.developpez.com

  2. #2
    Membre régulier
    Homme Profil pro
    Retraité de l'électronique analogique
    Inscrit en
    Avril 2021
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité de l'électronique analogique

    Informations forums :
    Inscription : Avril 2021
    Messages : 45
    Points : 107
    Points
    107
    Par défaut
    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. #3
    Membre éprouvé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 499
    Points : 1 005
    Points
    1 005
    Par défaut
    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
    Page sur Developpez : http://pbriand.developpez.com

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 203
    Points : 11 654
    Points
    11 654
    Par défaut
    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.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 795
    Points : 5 628
    Points
    5 628
    Par défaut
    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 - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre expert
    Profil pro
    programmeur du dimanche
    Inscrit en
    Novembre 2003
    Messages
    836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : programmeur du dimanche
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2003
    Messages : 836
    Points : 3 550
    Points
    3 550
    Par défaut
    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).

  7. #7
    Membre éprouvé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 499
    Points : 1 005
    Points
    1 005
    Par défaut
    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
    Page sur Developpez : http://pbriand.developpez.com

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Jay M Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 742
    Points : 57 544
    Points
    57 544
    Billets dans le blog
    42
    Par défaut
    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...

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 795
    Points : 5 628
    Points
    5 628
    Par défaut
    oui c'est un registre un peu magique, c'est rappelé d'ailleurs dans le tuto.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Points : 89
    Points
    89
    Par défaut
    Exactly, my bad. Mon cerveau a converti en DDRB à cause du commentaire

Discussions similaires

  1. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  2. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  3. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo