Pages: [1]   Go Down
Author Topic: Freeze lors d'un Serial.print  (Read 506 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

J'ai un souci avec mon programme qui freeze après un long moment de fonctionnement.

Avant de présenter du code, j'explique le programme en question:
J'ai un Arduino avec un DS18B20 + PCF8383 + SDcard 2Go + LED en sortie + SWITCH en entrée.

Le programme principale
- Désactive l'interruption int0
- Lit l'horloge RTC en i2c
- Lit la t° sur le bus 1wire
- "Affiche" date/heure + t° sur le port série.
- Ecrit les 2 chaines sur une carte SD
- Réactive l'INT0
- Se met en veille.

L'interruption est provoquée par la RTC toute les mn.

Cela fonctionne très bien pendant 2 jours dernièrement puis parfois cela freeze lors du Serial.print de la t°.
Il affiche les premiers caractères puis blocage.

Auriez vous une piste pour comprendre le problème.
Est ce que la fonction Serial.print rend la main après l'envoie des caractères au port série ou rend la main directement et l'envoie se fait par interruption ?

merci de votre aide.


Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3655
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'envoi n'est pas bloquant et se sert des interruptions, donc si tu ne le prévois pas effectivement ça peut poser des problèmes.

Avec ton code ça serait quand même bien plus facile de t'aider smiley-wink
Logged


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

Bonjour,

Sans le code on peut rien faire smiley-wink
Logged

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3565
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
L'interruption est provoquée par la RTC toute les mn.
L'interruption ne tombant que toutes les minutes,
    il n'y a pas de risque d'avoir une nouvelle interruptions pendant la gestion de l'interruption courante.
    le traitement que tu détailles ne prend pas une minute pour s'exécuter
donc pourquoi les masquer? C'est pas une bonne idée lorsqu'on fait des liaisons série.

Maintenant le problème se produisant sur une échelle de temps assez grande, je chercherai s'il n'y a pas une fuite mémoire. Ou alors il y a un processus que tu n'as pas décrit et qui tombe de manière asynchrone.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour ces réponse rapidse.

Voici le code: http://vesta.homelinux.free.fr/site/tmp/temp_logger.ino

Et voici le portion de code ou cela bloque:

Code:
// Lecture temperature
getTemp(temperature) ;
Serial.print(temperature);                 // Blocage à ce niveau
Serial.print("° ");

// Ecriture dans fichier log
cli() ;                                             // Je désactive les int. lors de l'écriture sur la carte SD (blocage ici ?)
sprintf(logline, "%s %s", time, temperature) ;
writedata2log(logline) ;
sei() ;

Je teste en moment sans cli()/sei().
Peut-être faut-il un flush avant de passer par l'écriture en SD ?
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je ne comprends toujours pas.

J'ai testé en rajoutant un Serial.flush() ; juste avant d'écrire sur la carte SD mais j'ai toujours des problèmes:

Code:
// Lecture date/heure
getDate(time) ;
Serial.print(time);
Serial.print( F("  ") );

// Lecture température
getTemp(temperature) ;
Serial.print(temperature);
Serial.print("° ");
Serial.flush() ; // Attends fin émission série.

// Ecriture dans fichier log
cli() ;
sprintf(logline, "%s %s", time, temperature) ;
writedata2log(logline) ;
sei() ;

// Réinit alarme INT0 à +5mn
setAlarm5mn() ;

En fait
- soit je bloque les interruptions avec cli/sei pendant la phase d'écriture sur la carte SD et j'ai des freezes
- soit je ne bloque pas les int et j'ai des erreurs d'ouverture ou d'écriture du fichier SD.

Mon interruption INT0 est bien désactivée, le Serial.flush attends normalement la fin de la sortie série, j'ai vérifié la conso. de la RAM.

Là, je ne vois plus ou est le problème.

« Last Edit: April 14, 2013, 07:33:09 am by Domos » Logged

Pages: [1]   Go Up
Jump to: