Pages: [1]   Go Down
Author Topic: Initialisation variable intempestif  (Read 1561 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
j'ai utilisé ce code (pris sur le site mon club elec) pour compter les impulsions d'une led.
Il fonctionne bien sauf qu'à chaque fois que je connecte le moniteur série il reinitialise la variable "comptageImpulsion" à 0

Avez vous une idée de pourquoi cela fait cela ?



Code:
// --- Inclusion des librairies ---
#include <SD.h>
// --- Déclaration des constantes utiles ---

// --- Déclaration des constantes des broches E/S numériques ---

const int brocheSDCardSelect=4;

// --- Déclaration des constantes des broches analogiques ---


// --- Déclaration des variables globales ---

volatile int comptageImpulsion=0; // variable accessible dans la routine interruption externe 0
int test; // Variable utilisée pour tester valeur renvoyée par fonctions SD Card

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
File file; // objet file
File root; // objet root pour le répertoire racine

// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---

// ------- Initialisation fonctionnalités utilisées ------- 

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

//---- initialise l'utilisation de la carte mémoire SD en mode SPI 
pinMode(10, OUTPUT); // met la broche 10 (SS) en sortie (nécessaire avec module ethernet)
digitalWrite(10, HIGH); // mais désactive le  circuit intégré W5100 du module ethernet!

  //----- initialisation de la carte SD -----
  Serial.println("Initialisation de la SD card...");

  pinMode(10, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

  test=SD.begin(brocheSDCardSelect); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

  if (test!=true) { // si initialisation n'est pas réussie
    Serial.println("Echec initialisation!"); // message port Série
  }
  else { // si nitialisation réussie
    Serial.println("Initialisation reussie !"); // message port Série

  //----- affiche le contenu du répertoire

  root = SD.open("/"); // ouvre la SD Card à la racine

  Serial.println("Repertoire racine ouvert !");
  }

attachInterrupt(0, gestionINT0, RISING); // attache l'interruption externe n°0 à la fonction gestionINT0()
// mode déclenchement possibles = LOW, CHANGE, RISING, FALLING


// ------- Broches en sorties numériques ------- 

// ------- Broches en entrées numériques ------- 

// ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques ------- 

// ------- Initialisation des variables utilisées ------- 

} // fin de la fonction setup()
// ********************************************************************************

////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

  //---- crée fichier en écriture ---
  file = SD.open("data.txt", FILE_WRITE); // ouvre le fichier en écriture
  // NB : le fichier est créé si il n'existe pas !

  //---- test si fichier dispo en écriture
  if (!file) { // si fichier pas dispo

    Serial.println ("Erreur ouverture fichier !");

  } // fin if

  else { // si le fichier existe et est ouvert

    Serial.println ("Fichier pret pour ecriture !");

    //----- Ecriture dans le fichier au format CSV -----

    // premiere ligne du fichier CSV - entete avec liste des champs
    file.println("Nbreimpulsion;Millis");

    Serial.println ("Enregistrement en cours :");

      // valeur deuxieme champ
      file.print(comptageImpulsion), file.print(';');

      // valeur quatrieme champ
      file.print(millis());

      // le dernier champ doit se terminer par un saut de ligne +++
      file.println();

     
     file.close(); // ferme le fichier
    Serial.println("Fin enregistrement !"); 
    Serial.println("Fermeture fichier !"); 
    delay(60000);
  } // fin else

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************


// ////////////////////////// FONCTIONS DE GESTION DES INTERRUPTIONS ////////////////////

// ------------------- fonction de gestion l'interruption externe n°0 (broche 2) ----------------
// cette fonction est appelée à chaque fois que l'interruption a lieu selon le mode configuré (LOW, CHANGE, RISING, FALLING)

void gestionINT0() {// la fonction appelée par l'interruption externe n°0

comptageImpulsion=comptageImpulsion+1; // Incrémente la variable de comptage

//---- affiche le nombre d'impulsions sur le port série
Serial.print("Nombre impulsions = ");
Serial.println(comptageImpulsion);


  }
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ce n'est pas ton code, c'est la carte Arduino.
A chaque fois que tu ouvres le port série, il y a une liaison (signal DTR) qui effectue un reset de la carte.
Suivant le type de carte Arduino, ce comportement peut être supprimé plus ou moins facilement.

Par exemple pour la UNO, regarder ici http://arduino.cc/en/Main/ArduinoBoardUno
paragraphe : Automatic (Software) Reset

Quote
The Uno contains a trace that can be cut to disable the auto-reset. The pads on either side of the trace can be soldered together to re-enable it. It's labeled "RESET-EN". You may also be able to disable the auto-reset by connecting a 110 ohm resistor from 5V to the reset line; see this forum thread for details.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 313
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est pareil sur le Duemilanove.
Il y a apparemment deux versions de cartes Duemilanove, avec ou sans cette piste à couper pour désactiver l'auto-reset (la mienne a cette piste).

Logged


Belguim (Messancy)
Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

    Si tu ne veut pas bricoler sur ta carte, utilise un autre terminal qui te permettra de ne pas envoyer de reset a ta carte.
    Regarde ici http://skyduino.wordpress.com/2012/02/11/terminalbpp-le-logiciel-a-avoir-absolument/ un terminal utilisé et expliqué par skywodd.
« Last Edit: July 11, 2012, 03:38:29 am by albertrand » Logged

« Ungibus et Rostro » (De bec et d'ongles)


Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 313
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Très intéressant ce terminal, merci!
Jusqu'à maintenant j'utilisais Putty en mode terminal+fichier de log (avec Baretail comme analyseur de fichier de log) mais je vais jeter un oeil à celui-là.
Logged


Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1395
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ce reset est lié au terminal de l'IDE, quand j'utilise un soft maison pour discuter avec la carte arduino, aucun reset, ni à l'ouverture ou fermeture du port série du PC. c'est dommage, car on upload le programme, ça ferme automatiquement le terminal de l'IDE s'il est ouvert, et quand on relance le terminal, ça reset l'arduino... c'est un peu abusif, je trouve... de même, changer la vitesse de transmission du terminal reset la carte... L'utilisation du port série sur PC (ouverture, reconfiguration...) ne gêne absolument pas l'arduino, il ne recevra bien les données que si côté PC on est à la même config...
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ce reset est lié au terminal de l'IDE, quand j'utilise un soft maison pour discuter avec la carte arduino, aucun reset, ni à l'ouverture ou fermeture du port série du PC. c'est dommage, car on upload le programme, ça ferme automatiquement le terminal de l'IDE s'il est ouvert, et quand on relance le terminal, ça reset l'arduino... c'est un peu abusif, je trouve... de même, changer la vitesse de transmission du terminal reset la carte... L'utilisation du port série sur PC (ouverture, reconfiguration...) ne gêne absolument pas l'arduino, il ne recevra bien les données que si côté PC on est à la même config...

Dans ce cas là, n'est il pas possible de le désactiver par défaut et de ne l'activer qu'à la demande plutôt que de mettre une capa ou couper une piste ?
Logged

- 1 mega 2560
- 1 Raspeberry Pi (en pré-commande)
- Quarante douze PC
- beaucoup de volonté, pas beaucoup de temps.
- Ma religion : OpenSour

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 313
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai vu sur un forum que placer un condensateur de 1 à 2 uF entre la broche Reset et GND désactive l'auto-reset.
Il est ainsi plus facile de le réactiver si on en a besoin.
Logged


Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1395
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le problème, c'est qu'on a besoin de l'auto-reset pour l'upload... (enfin, sauf si on veut se faire hiéch avec le bouton reset et la souris en même temps...)

Donc la seule solution, c'est un terminal externe, d'autant plus que ce n'est pas forcément incompatible avec l'IDE...
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3230
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pourquoi ne pas mettre un cavalier sur cette piste ?
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Faraday Member
**
Karma: 33
Posts: 5049
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pourquoi ne pas mettre un cavalier sur cette piste ?
Salut JF

[HUM]
C'est pour éviter les problemes intempestifs lorsque tu développe un programme au petit matin  et que tu ne sais plus si le cavalier c'est zero ou un smiley-mr-green
dixit :

Quote
Un cavalier, qui surgit hors de la nuit
Court vers l'aventure au galop
Son nom, il le signe à la pointe de l'épée
D'un Z qui veut dire Zéro
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3230
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Alors un BP et lorsque tu veux que le reset se fasse tu tiens le bouton appuyé  smiley-lol

C'est le masque de Zéro...
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

c'est dommage, car on upload le programme, ça ferme automatiquement le terminal de l'IDE s'il est ouvert, et quand on relance le terminal, ça reset l'arduino... c'est un peu abusif, je trouve... de même, changer la vitesse de transmission du terminal reset la carte...
Oui mais non !
Cette procédure a un but bien précis !

Lors d'un upload il faut utiliser le port série, comme il s'agit d'une ressource systéme celle ci ne doit pas être ouvert par un autre programme !
-> l'ide ferme donc le serial monitor si celui ci est ouvert (et si un autre programme utilise le port il y aura une erreur).

Lors d'un upload le bootloader doit être appelé pour charger le programme, pour cela la seule solution est de déclencher un reset
-> l'ide déclenche donc un reset en envoyer un "1" logique sur la broche DTR du port série.

A la fin de l'upload le bootloader doit être quitter proprement (celui ci vérifie si le redémarrage est lié au watch-dog, ou à un reset hardware ou software)
-> l'ide reset donc l'arduino à la fin de l'upload pour que celui ci redémarre ensuite proprement

Quand tu ouvre le serial monitor la librairie RxTx qui gére les ports série en java envoi automatiquement un signal sur DTR -> reset
-> la team arduino à juger cela normal, afin que le programme démarre en même temps que le serial monitor

Quand tu change la vitesse du port cela équivaut pour la librairie RxTx à fermer / réouvrir le port -> ouverture -> reset
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci à tous pour vos réponses je vais utiliser le terminal proposé plus haut :-)
Logged

Pages: [1]   Go Up
Jump to: