Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino ISP ATmega328P

Oscillateur interne

    24 avril 2020 à 21:36:05

    Bonjour,

    Etant actuellement dans le domaine du réseau informatique, j'ai toujours eu une attirance pour le fonctionnement "réel" des appareils électroniques, chose qui est invisible au yeux d'un administrateur réseau puisque tout est soft. J'ai donc toujours eu plus ou moins l'envie de comprendre le fonctionnement d'un appareil électronique.

    C'est donc en partant de cette envie que l'idée d'utiliser deux cartes Arduino que j'avais gagné à un concours robotique durant mes années lycée m'est venue.
    Mon but était simple : Programmer des petites bricoles au plus bas niveau possible, donc sans utiliser les surcouches Arduino.

    Après quelques lignes basiques en assembleur, l'envie d'utiliser l'ATmega328P sans la carte Arduino Uno R3 m'est venue. J'ai donc téléversé le sketch ArduinoISP sur mon Arduino Uno pour flasher l'ATmega328P.

    Le flash réussi avec un petit programme permettant simplement de faire clignoter une led mais une fois l'ATmega328P sur la breadboard, rien ne se passa. Je me suis donc dit que le problème venait du microcontrôleur qui était paramétré pour utiliser un oscillateur externe de 16MHz (celui de la carte Arduino), et n'ayant aucun oscillateur sous la main, cela ne pouvait pas fonctionner.

    Suite à ça j'ai donc modifié les "fuses bits" pour utiliser l'oscillateur interne du microcontrôleur avec avrdude, et l'histoire se finit ici :D. Après un message de succès me disant que les bits ont bien été modifié, avrdude n'arrive plus à reconnaître le microcontrôleur :

    avrdude: Device signature = 0x000000 (retrying)

    Voici la commande que j'utilise :

    avrdude -p m328p -P /dev/ttyUSB0 -c avrisp -b 19200 -B8000 -v

    Bien évidemment, des tutos sont disponibles sur internet concernant la programmation de microcontrôleurs AVR avec une carte arduino, une breadboard et un oscillateur, seulement ces tutos ne me semblent pas adaptés à mon cas puisque mon microcontrôleur utilise l'oscillateur interne.

    Vous l'auriez sûrement remarqué, mes connaissances en électroniques ont bien diminué depuis mes année lycée, là où elles n'étaient pas extraordinaires non plus. Je ne viens donc pas vers vous pour une solution miracle mais pour des problèmes de compréhension du fonctionnement de l'ATmega328P et notamment sur l'ISP :

    • A quoi sert la broche SCK de l'ISP si l'ATmega utilise l'oscillateur interne ?
    • Le fait qu'avrdude ne puisse reconnaître le microcontrôleur vient-il du fait que ma carte arduino utilisée comme programmateur fonctionne en 16Mhz (???)
    • Quelle est cette histoire de condensateur sur la broche RESET ?
    • Et tout autre notion qui m'empêche de comprendre pourquoi je ne peux actuellement pas flasher mon ATmega328P.

    Il est évident que je ne cherche pas non plus quelqu'un qui me ferait un cours complet d'électronique. N’hésitez pas à rester vague si vous le souhaitez, je ferais mes recherches en fonction des réponses que j'obtiens.

    Merci par avance à tout ceux qui accepterons d'apporter leur aide :)

    • Partager sur Facebook
    • Partager sur Twitter
    Le peu que je sais, c'est à mon ignorance que je le dois.
      25 avril 2020 à 15:16:14

      Hello,

      -- SCK / MISO / MOSI c'est un bus SPI. Ton oscillateur interne règle la fréquence de fonctionnement de ton Arduino, mais pas du bus SPI ... C'est comme ton port série qui tourne à 9600bauds et ton processeur qui tourne à 2Ghz : ça n'a pas de lien direct.

      -- Ton problème peut venir de beaucoup de choses 

      -- Le condo sur la broche reset et pour maintenant la ligne RESET à l'état bas pendant un temps minimum. Quand tu mets ton arduino sous tension, ça permet de faire une initialisation correcte. C'est un classique.

      • Partager sur Facebook
      • Partager sur Twitter
        25 avril 2020 à 22:28:50

        Bonjour,

        Quelles valeurs de fuse bits as tu utilisées ?

        Si tu as activé debugWire (bit DWEN), désactivé la programmation SPI (SPIEN) ou désactivé la broche reset (RSTDISBL), la programmation de ta puce n'est plus possible avec un programmateur série, il faut un programmateur dit "HVPP" (high voltage parallel programmer).

        Si tu as juste sélectionné l'oscillateur externe par erreur, sans en avoir un, je crois qu'il suffit de changer de version de ArduinoISP pour une qui simule l'horloge sur une des broches de l'arduino qu'il n'y a plus qu'à connecter à la puce (https://github.com/adafruit/Adafruit_Learning_System_Guides/tree/master/ArduinoISP).

        -
        Edité par alexisdm 25 avril 2020 à 22:30:07

        • Partager sur Facebook
        • Partager sur Twitter
          28 avril 2020 à 12:21:08

          raoullevert a écrit:

          Hello,

          -- SCK / MISO / MOSI c'est un bus SPI. Ton oscillateur interne règle la fréquence de fonctionnement de ton Arduino, mais pas du bus SPI ... C'est comme ton port série qui tourne à 9600bauds et ton processeur qui tourne à 2Ghz : ça n'a pas de lien direct.

          -- Ton problème peut venir de beaucoup de choses 

          -- Le condo sur la broche reset et pour maintenant la ligne RESET à l'état bas pendant un temps minimum. Quand tu mets ton arduino sous tension, ça permet de faire une initialisation correcte. C'est un classique.


          Merci pour ta réponse.

          C'est comme ton port série qui tourne à 9600bauds et ton processeur qui tourne à 2Ghz : ça n'a pas de lien direct.

          Oui seulement il y a un lien entre les deux non (SPI et processeur) ? A moins que le bus SPI ait un accès direct aux différentes mémoires ? De ce que j'ai vu et compris, le fonctionnement du bus SPI se base sur un buffer. Il y ajoute donc les données reçues puis le processeur se charge de le mettre dans la mémoire choisie ?

          Le condo sur la broche reset et pour maintenant la ligne RESET à l'état bas pendant un temps minimum.

          De ce que j'ai compris aussi, la broche RESET du bus SPI correspond aussi à la broche SELECT SLAVE. Cette entrée permet au master de choisir le ou les slaves en mettant cette entrée à l'état bas. J'en déduis donc que l'arduino met directement cette broche à l'état bas, je ne vois donc pas l’intérêt de forcer cet état avec un condo.
          A moins que ce ne soit pas la broche SELECT SLAVE ?

          alexisdm a écrit:

          Bonjour,

          Quelles valeurs de fuse bits as tu utilisées ?

          Si tu as activé debugWire (bit DWEN), désactivé la programmation SPI (SPIEN) ou désactivé la broche reset (RSTDISBL), la programmation de ta puce n'est plus possible avec un programmateur série, il faut un programmateur dit "HVPP" (high voltage parallel programmer).

          Si tu as juste sélectionné l'oscillateur externe par erreur, sans en avoir un, je crois qu'il suffit de changer de version de ArduinoISP pour une qui simule l'horloge sur une des broches de l'arduino qu'il n'y a plus qu'à connecter à la puce (https://github.com/adafruit/Adafruit_Learning_System_Guides/tree/master/ArduinoISP).

          -
          Edité par alexisdm 25 avril 2020 à 22:30:07

          J'ai seulement modifié le "Low fuse byte" avec la valeur 0xF5... ??? (Je ne suis plus du tout sûr de moi, j'ai mit les 4 premiers bits à 1 et ceux permettant de choisir l'oscillateur à une valeur que j'avais trouvé en cherchant sur internet, permettant de choisir l'oscillateur interne).

          Merci à toi aussi pour ton aide.

          -
          Edité par krunche 28 avril 2020 à 12:32:24

          • Partager sur Facebook
          • Partager sur Twitter
          Le peu que je sais, c'est à mon ignorance que je le dois.
            28 avril 2020 à 15:07:20

            Hello,

            Un condo sur la broche de sélection de l'esclave, je ne vois pas l'intérêt. Au pire tu aurais une résistance de rappel  (Pull-Up), et ce type de résistance est intégrée sur les sorties du GPIO en interne.

            Pour les bits de programmation, effectivement @alexisdm pose les bonnes question !

            • Partager sur Facebook
            • Partager sur Twitter
              28 avril 2020 à 16:39:07

              krunche a écrit:

              J'ai seulement modifié le "Low fuse byte" avec la valeur 0xF5... ??? (Je ne suis plus du tout sûr de moi, j'ai mis les 4 premiers bits à 1 et ceux permettant de choisir l'oscillateur à une valeur que j'avais trouvée en cherchant sur internet, permettant de choisir l'oscillateur interne).

              Il y a un calculateur de fusibles là: http://www.engbedded.com/fusecalc/. Par contre, il ne t'avertira pas si tu modifies incorrectement un des bits que j'ai cités (les 3 bits de poids fort du "high fuse"), mais leurs valeurs par défaut, quand tu as sélectionnée la puce, sont déjà correctes.

              0xF5 pour le "low fuse" correspond bien à l'utilisation de l'horloge externe et pas interne comme tu le souhaites, tu as donc besoin de la version d'ArduinoISP dont j'ai donné le lien pour fournir un signal d'horloge à ta puce et corriger le problème.



              • Partager sur Facebook
              • Partager sur Twitter
                28 avril 2020 à 16:43:19

                raoullevert a écrit:

                Hello,

                Un condo sur la broche de sélection de l'esclave, je ne vois pas l'intérêt. Au pire tu aurais une résistance de rappel  (Pull-Up), et ce type de résistance est intégrée sur les sorties du GPIO en interne.

                Pour les bits de programmation, effectivement @alexisdm pose les bonnes question !


                Je ne vois pas l'intérêt non plus. Je ne sais pas si je m'exprime clairement :euh:.

                Voici un bus ISP :

                De ce que j'ai lu, et je pense être sûr d'avoir compris, la broche RESET que l'on trouve sur les arduino (au niveau de l'ISP et au niveau de la sortie 10) et la broche de sélection de l'esclave. Et comme tu l'as dit : Un condo sur la broche de sélection de l'esclave, je ne vois pas l'intérêt.

                alexisdm a écrit:

                krunche a écrit:

                J'ai seulement modifié le "Low fuse byte" avec la valeur 0xF5... ??? (Je ne suis plus du tout sûr de moi, j'ai mis les 4 premiers bits à 1 et ceux permettant de choisir l'oscillateur à une valeur que j'avais trouvée en cherchant sur internet, permettant de choisir l'oscillateur interne).

                Il y a un calculateur de fusibles là: http://www.engbedded.com/fusecalc/. Par contre, il ne t'avertira pas si tu modifies incorrectement un des bits que j'ai cités (les 3 bits de poids fort du "high fuse"), mais leurs valeurs par défaut, quand tu as sélectionnée la puce, sont déjà correctes.

                0xF5 pour le "low fuse" correspond bien à l'utilisation de l'horloge externe et pas interne comme tu le souhaites, tu as donc besoin de la version d'ArduinoISP dont j'ai donné le lien pour fournir un signal d'horloge à ta puce et corriger le problème.

                Il va donc falloir que je comprenne comment fonctionnent ces bytes :D. Je test ça et te donne un retour !

                Merci

                -
                Edité par krunche 28 avril 2020 à 16:46:49

                • Partager sur Facebook
                • Partager sur Twitter
                Le peu que je sais, c'est à mon ignorance que je le dois.
                  28 avril 2020 à 18:46:16

                  Le condo entre la broche Reset et la masse, c'est bien celui indiqué pour le sketch ArduinoISP ? 

                  Parce qu'il sert seulement à empêcher que l'ouverture du port série côté PC par avrdude, ne réinitialise l'arduino qui contient ArduinoISP, parce que ça ferait repasser cet arduino par le bootloader, ce à quoi avrdude ne s'attend pas.

                  Les arduinos ont un circuit qui fait qu'ils se réinitialisent automatiquement quand le PC ouvre le port série, en transformant le passage de la broche DTR du port série de l'état haut à l'état bas en impulsion courte à l'état bas sur la broche reset. Le condensateur qu'on demande d'ajouter "court-circuite" ce circuit de réinitialisation.

                  -
                  Edité par alexisdm 29 avril 2020 à 9:32:23

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 avril 2020 à 0:48:27

                    ok alexidsm ... merci pour l'info.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Arduino ISP ATmega328P

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown