Aller au contenu


Photo
- - - - -

[Résolu] Programme mal exécuté sur ATtinyX5


8 réponses à ce sujet

#1 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 172 messages
  • Gender:Male
  • Location:Aquitaine,Gironde
  • Interests:Tout

Posté 12 septembre 2020 - 01:53

Salut,

 

Voila mon souci:

J'ai créé un programme pour ATtiny25/45/85 mais celui ci ne fonctionne pas dessus.

Par contre, ce meme programme sur une Mega tourne comme prévus..

 

Programme ATtiny :

#define PinFan 4    // Pin ventilateur
#define PinLed 0    // Pin led

float resistance;     // Valeur de la resistance ajustable
int valbrute;   // Valeur LM35
float temperatureC;   // Valeur ajusté en °c
int blinktime;      // Compteur de clignotement
int lastdelay;      // Compteur de temps de clignotment


void setup() {

  pinMode (PinFan, OUTPUT);
  pinMode (PinLed, OUTPUT);
}


void loop() {
  
      // Acquisition de la temperature
  valbrute = analogRead (A0);        
  temperatureC = valbrute * (5.09/1023.0*100.0);
  
      // Acquisition de la valeur de la resistance variable
 resistance = analogRead (A3);
 resistance = resistance / 10.23 ;
 

  TempDisplay();  // Execute TempDisplay

  
  if (temperatureC >= resistance)   // Controle automatique du ventilateur
  { digitalWrite (PinFan, HIGH);  }
  
  else
  { digitalWrite (PinFan, LOW);   }
  
  delay(15000-lastdelay);
  lastdelay = 0 ;
}


void TempDisplay () {               // Affichage de la temperature par 10° par clignotement de led
  blinktime = temperatureC / 10 ;

  while (blinktime >= 1)
  { digitalWrite(PinLed,HIGH);
  delay(500);
  digitalWrite(PinLed, LOW);
  delay(500);
  lastdelay = lastdelay + 1000;
  --blinktime;
  }
  
}


Programme Mega:

#define PinFan 4    // Pin ventilateur
#define PinLed 2    // Pin led

float resistance;     // Valeur de la resistance ajustable
int valbrute;   // Valeur LM35
float temperatureC;   // Valeur ajusté en °c
int blinktime;      // Compteur de clignotement
int lastdelay;      // Compteur de temps de clignotment


void setup() {
Serial.begin(9600);
  pinMode (PinFan, OUTPUT);
  pinMode (PinLed, OUTPUT);
}


void loop() {
  
      // Acquisition de la temperature
  valbrute = analogRead (A0);        
  temperatureC = valbrute * (5.09/1023.0*100.0);
  
      // Acquisition de la valeur de la resistance variable
 resistance = analogRead (A3);
 resistance = resistance / 10.23 ;

Serial.print("Temp=");
Serial.println(temperatureC);
delay(500);
Serial.print("Resistance=");
Serial.println(resistance);
delay(500);


  TempDisplay();  // Execute TempDisplay

  
Serial.print("Lastdelay=");
Serial.println(lastdelay);
delay(500);
  
  if (temperatureC >= resistance)   // Controle automatique du ventilateur
  { digitalWrite (PinFan, HIGH);
  Serial.println("Fan On");
delay(500);}
  
  else
  { digitalWrite (PinFan, LOW); 
  Serial.println("Fan OFF");
delay(500);  }
  
  delay(15000-lastdelay);
  lastdelay = 0 ;
}


void TempDisplay () {               // Affichage de la temperature par 10° par clignotement de led
  blinktime = temperatureC / 10 ;

  while (blinktime >= 1)
  { digitalWrite(PinLed,HIGH);
  delay(500);
  digitalWrite(PinLed, LOW);
  delay(500);
  lastdelay = lastdelay + 1000;
  --blinktime;
  }

}

Sortie moniteur série Mega :

 

moniteur.JPG

 

J'ai tester d'autre sortie analogique sur l'ATiny pour le capteur de t°, mais ça ne change rien.

La led devant indiqué la temperature (un on/off par 10°c) clignote bien, mais plus de fois qu normalement possible. Le max possible est de 10 (100°/10=10) mais elle clignote jusqu'à 23 fois !

 

Merci pour votre aide ;)

 

 

 

 


 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 856 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 12 septembre 2020 - 03:35

Commence par faire un simple blink  1 fois par seconde sur ton atiny et vérify que la fréquence du blink se fait bien à cette fréquence.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#3 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 172 messages
  • Gender:Male
  • Location:Aquitaine,Gironde
  • Interests:Tout

Posté 16 septembre 2020 - 11:47

Alors voila:

Le problème est que la pin utilisé pour le capteur de t° sert aussi de reset. Il est possible et nécessaire de désactiver le reset pour ce servir de l'ADC dans de bonne condition.

La data de l'ATtiny indique qu'en dessous de ~0.9v appliqué sur la pin, cela active le reset. Manque de bol, le capteur envoyant 10mv/°c on reste toujours en dessous de cette valeur.

Pour décelé le problème, j'ai ajouter dans le setup() une série de clignotement spécifique de la led . Et comme setup() n'est lu qu'une seule fois lors de la mise sous tension, si cette sequence s’exécute plusieurs fois, c'est que le MCU reboot.

 

Et donc deux solutions:

-Une soft en désactivant le reset

-Une hard en changeant le capteur t° d'I/O

 

 

Contrairement à ce que la plupart des personnes diront, désactiver le reset permettra toujours de programmer le MCU, il faudra juste changé de méthode et utilisé un programmeur haut voltage.


 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 856 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 17 septembre 2020 - 12:04

Alors voila:

Le problème est que la pin utilisé pour le capteur de t° sert aussi de reset. Il est possible et nécessaire de désactiver le reset pour ce servir de l'ADC dans de bonne condition.

 

Du coup cette remarque : 

 

 

J'ai tester d'autre sortie analogique sur l'ATiny pour le capteur de t°, mais ça ne change rien.

 

 

 

 

 

Induisait en erreur ! =)
Changer le pin corrige le problème ! Cool de voir que le problème est réglé !


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#5 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 172 messages
  • Gender:Male
  • Location:Aquitaine,Gironde
  • Interests:Tout

Posté 17 septembre 2020 - 12:11

Oui, effectivement, je ne sait pas ce que j'ai foutue  :drag_10:

 

Edit: hum je pense que j'avais du le connecté sur la pin qui n'a pas d'ADC.... Je ne me ferai plus avoir !


 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#6 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 168 messages
  • Gender:Male

Posté 17 septembre 2020 - 06:33

Et comme setup() n'est lu qu'une seule fois lors de la mise sous tension, si cette sequence s’exécute plusieurs fois, c'est que le MCU reboot.

Il y a un moyen d'exécuter le setup() plusieurs fois, je ne sais pas si cela va t'aider, mais on ne sait jamais.

 

Tout au début de ton programme en première ligne, tu mets la fonction suivante :

     void(* resetFunc) (void) = 0;
 
N'importe où dans le programme et quelque soit la manière, tu peux appeler cette fonction pour faire un "pseudo" Boot et donc re-exécuter le setup().
Attention, ce n'est pas un vrai Boot. Cela permet simplement de se repositionner à la première ligne du programme.
 
Au début de la fonction setup(), tu mets delay(500);
 
Dans la fonction loop(), moi, j'appuie sur un bouton pour déclencher la fonction, ça donne ça :
     if (! digitalRead(0)) resetFunc();


#7 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 650 messages
  • Gender:Male

Posté 17 septembre 2020 - 06:21

Je rajouterais une 3ième possibilité : te débrouiller pour que la valeur lue sur le pin soit plus grande que 0.9V. Par exemple en utilisant un ampli-op en additionneur pour ajouter un offset constant



#8 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 856 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 17 septembre 2020 - 11:40

 

Il y a un moyen d'exécuter le setup() plusieurs fois, je ne sais pas si cela va t'aider, mais on ne sait jamais.

 

Tout au début de ton programme en première ligne, tu mets la fonction suivante :

     void(* resetFunc) (void) = 0;
 
N'importe où dans le programme et quelque soit la manière, tu peux appeler cette fonction pour faire un "pseudo" Boot et donc re-exécuter le setup().
Attention, ce n'est pas un vrai Boot. Cela permet simplement de se repositionner à la première ligne du programme.
 
Au début de la fonction setup(), tu mets delay(500);
 
Dans la fonction loop(), moi, j'appuie sur un bouton pour déclencher la fonction, ça donne ça :
     if (! digitalRead(0)) resetFunc();

 

 

 

En fait il ne souhaitait pas activer plusieurs fois le setup il a juste mis le clignotement dans le setup 1 fois, et s'est  servi du fait que normalement le clignotement devait se faire une seule et unique fois dans le setup et jamais ailleurs dans son code pour débuger et voir que son setup s'appelait en boucle car sa carte subissait un vrai reset =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#9 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 168 messages
  • Gender:Male

Posté 18 septembre 2020 - 06:31

En fait il ne souhaitait pas activer plusieurs fois le setup il a juste mis le clignotement dans le setup 1 fois, et s'est  servi du fait que normalement le clignotement devait se faire une seule et unique fois dans le setup et jamais ailleurs dans son code pour débuger et voir que son setup s'appelait en boucle car sa carte subissait un vrai reset =)

Oui, j'avais bien compris.

Mon idée était de pouvoir provoquer un faux setup() et ainsi avoir le moyen de simuler le bug à condition d'avoir une idée de son origine, comme une baisse de tension, par exemple.





Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users