Partage
  • Partager sur Facebook
  • Partager sur Twitter

"Plantage" Attiny85

Sujet résolu
    19 septembre 2019 à 11:22:07

    Bonjour à tous,

    J'ai fais un petit montage pour pouvoir piloter une horloge DEHO sans horloge mère.

    A la base, un Arduino Uno envoie une impulsion toute les minutes à un pont en H pour avoir, en sortie, un coup une impulsion positive, et le coup d'après une impulsion négative.

    J'utilise le quartz interne de l'arduino pour la base de temps.

    Ce montage fonctionne parfaitement.

    Ensuite, J'ai tenté de miniaturiser ma carte en remplaçant l'Arduino par un ATtiny85 (avec exactement le même programme).

    Cela fonctionne quelques minutes, puis on dirait que l'ATtiny85  "plante".

    Certaines fois, je n'ai que des impulsions négatives, certaines fois il n'y a plus du tout d'impulsion et d'autre fois encore, une sortie reste activée en permanence. 

    A chaque fois, il me suffit de couper l'alim et de la remettre pour redémarrer normalement.

    Je vous joint le schéma de mon montage ainsi que le code de l'ATtiny85.

    Quelqu'un pourrait il m'aiguiller sur la source du problème?

    Merci d'avance.

    CYRIL.

    Schéma du montage

    /* ---------------- Programme pour AtTiny 85 ------------------------*/
    
    int S0 = 0; //Sortie pour une led indiquant les impulsions (toutes les 2 secondes)
    int S1 = 1; //Sortie pour une led indiquant les impulsions de sortie (toutes les minutes)
    int S2 = 2; // déclaration sortie 2
    int S3= 3;//Sortie sens 1 -PIN 2
    int S4 = 4;// Sortie sens 2 - PIN3
    int compt =0; // Variable pour compteur
    int nbrImpulsion = 30; //Nombre d'impulsion à comptabiliser
    int memoire =0; // Variable pour mémoriser la dernière sortie utilisée : 0 = la
    dernière impulsion était sur S4
    unsigned long tempsEcoule=0;
    unsigned long temps = 0;
    int i=0;
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(S0,OUTPUT);
      pinMode(S1,OUTPUT);
      pinMode(S2,OUTPUT);
      pinMode(S3,OUTPUT);
      pinMode(S4, OUTPUT);
      //Serial.begin(115200);
    }
    
    void loop() {
    
      temps=millis();
    
      // PULL DOWN
      digitalWrite(S0,LOW);
      digitalWrite(S1,LOW);
      digitalWrite(S2,LOW);
      digitalWrite(S3,LOW);
      digitalWrite(S4,LOW);
    
      if(temps - tempsEcoule >= 2000) //Toutes les 2000ms
      {
        tempsEcoule=temps;
    
       //Active la led pour indiquer les impulsions
       digitalWrite(S0,HIGH);
       delay(200);
       digitalWrite(S0,LOW);
    
       compt++;//Incrémente le compteur
    
      // Serial.println("compteur : " + String(compt));
      //Serial.println();
    
      if(compt==nbrImpulsion)
      {
        digitalWrite(S1, HIGH);
        switch (memoire)
       {
         case 0:
           digitalWrite(S3, HIGH);//Active la sortie S3
           delay(500);
           digitalWrite(S3,LOW);//Désactive la sortie S3
           memoire=1;
           //Serial.println("Impulsion1");
           break;
         case 1:
           digitalWrite(S4, HIGH);//Active la sortie S4
           delay(500);
           digitalWrite(S4,LOW);//Désactive la sortie S4
           memoire=0;
           // Serial.println("Impulsion2");
           //Serial.println();
           break;
        }
    
        digitalWrite(S1,LOW);
        compt=0;
      }
     }
     if(temps<tempsEcoule)
     {
       tempsEcoule=0;
     }
    }



    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2019 à 13:44:46

      Bonjour,

      Peut-être que tu devrais ajouter des condensateurs de filtrage sur l'entrée et la sortie du régulateur.

      Normalement tu es toujours censé avoir un condensateur entre VCC et GND d'un microcontrôleur, parce que les commutations (interne et des broches), peuvent provoquer des chutes de tension transitoires et si elles sont trop importantes, le µC se réinitialise.

      PS: La façon dont tu gères millis() introduit un décalage qui peut s'accumuler dans le temps (déjà que l'horloge de l'attiny/atmega n'est pas précise, ça ajoute encore de un peu d'imprécision). Tu devrais faire ça: 

      if(temps - tempsEcoule >= 2000) //Toutes les 2000ms
      {
          tempsEcoule += 2000;

      pour maintenir le passage dans le if "précisément" toutes les 2000ms. Mais utiliser une horloge temps réel externe (ex: DS3231) serait bien mieux.

      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2019 à 8:50:49

        Bonjour Alexisdm,

        Tout d'abord, merci pour ta réponse rapide.

        J'essaie les modifs que tu me conseilles ce matin.

        Je te dirais si c'est bon.

        • Partager sur Facebook
        • Partager sur Twitter

        "Plantage" Attiny85

        × 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