Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
un beau plantage avec une RTC DS1307
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous,
Ce post pour critiquer ma façon de programmer
j'avance sur mon projet d'arrosage automatique .. lié à des plages horaires,
info primaire provenant d'une RTC DS1307
voila que aujourdh'ui je redemarre mon proto et apres relecture de la RTC
le programme commence à afficher des lignes de points sur le terminal ......
65536 points exactements .. avant de continuer comme si de rien n'etait .
( d'habitude un plantage est plus franc )
comme je piste tout sur le terminal.. je vois qu'il me manque le numero du jour ..soit Lundi
mais la date et heure sont OK ..
Init RTC DS1307
Re-Lecture RTC DS1307 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
..... j'ai ecorté le listing .. car 65536 caracteres !!!
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ28/05/18 13:25:48
Int PWM1 10bits at 1000Hz on RC2
Plus loin dans le programme, si j'active le mode bavard,
j'ajoute en fait dans les infos vues sur le terminal, la date et heure RTC ( + le jour !!)
et là , ça repart pour 65536 caracteres ..
En verifiant mon programme, je vois que la seule source de plantage
est justement mon numero de jour jS
qui sert d'index dans une table ou sont les libelles des jours de la semaiae Dimanche,Lundi,Mardi ...
si jS > 6 ça part dans les choux !
contre mesure :
et surtout , rajout test valeur de jS dans la saisie MAJ RTC .
La conclusion :
des qu'on manipule une variable servant d'index dans une table, il faut en controler les limites
surtout si celle ci vient de l'exterieur .. d'un clavier sujet à un errare humanum est .
Comme quoi, on reste toujours débutant .. et le fameux dicton de jeremy s'applique bien ici
sic:
C'est en faisant des erreurs, que l'on apprend le mieux !!!
Ce post pour critiquer ma façon de programmer
j'avance sur mon projet d'arrosage automatique .. lié à des plages horaires,
info primaire provenant d'une RTC DS1307
voila que aujourdh'ui je redemarre mon proto et apres relecture de la RTC
le programme commence à afficher des lignes de points sur le terminal ......
65536 points exactements .. avant de continuer comme si de rien n'etait .
( d'habitude un plantage est plus franc )
comme je piste tout sur le terminal.. je vois qu'il me manque le numero du jour ..soit Lundi
mais la date et heure sont OK ..
Init RTC DS1307
Re-Lecture RTC DS1307 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
..... j'ai ecorté le listing .. car 65536 caracteres !!!
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ28/05/18 13:25:48
Int PWM1 10bits at 1000Hz on RC2
Plus loin dans le programme, si j'active le mode bavard,
j'ajoute en fait dans les infos vues sur le terminal, la date et heure RTC ( + le jour !!)
et là , ça repart pour 65536 caracteres ..
En verifiant mon programme, je vois que la seule source de plantage
est justement mon numero de jour jS
qui sert d'index dans une table ou sont les libelles des jours de la semaiae Dimanche,Lundi,Mardi ...
Code : Tout sélectionner
volatile unsigned short second,minute,heure,jS,jour,mois,Annee;
const code char Jour0[]="Dimanche";
const code char Jour1[]="Lundi";
const code char Jour2[]="Mardi";
const code char Jour3[]="Mercredi.";
const code char Jour4[]="Jeudi";
const code char Jour5[]="Vendredi";
const code char Jour6[]="Samedi";
const code char * JourSemaine[]={Jour0,Jour1,Jour2,Jour3,Jour4,Jour5,Jour6};
si jS > 6 ça part dans les choux !
contre mesure :
Code : Tout sélectionner
UART1_Write_CText(" Re-Lecture RTC DS1307 ");
Refresh_display_date_Time() ;
if (jS<7)
UART1_Write_CText(JourSemaine[jS]);
else
UART1_Write_CText(" Erreur Jour Semaine! ");
UART1_Write_Text(date); UART1_Write_CText(Blancs);
UART1_Write_Text(time);
CRLF1();
et surtout , rajout test valeur de jS dans la saisie MAJ RTC .
Code : Tout sélectionner
void MAJ_RTC()
{ int m,i,j;
m=2; // passe par dessus "U;"
// U;24;08;17;4;17;36#
//ou
// // U;24;08;17;04;17;36#
j=0;
//Status=0;
RC1IE_bit = 0;
*(Buffer1+Index1)=0;
if ((Index1<21)&&(Index1>18))
{
UART1_Write_CText(" Index1 = ");
WordToStr(Index1,CRam1);
UART1_Write_Text(CRam1);
CRLF1();
for (i=2;i<Index1;i++)
{
if(Buffer1[i]==';')
{
Buffer1[i]=0;
DateTime[j]=atoi(Buffer1+m);
m=i+1;
j++;
}
}// for i
// ne pas oublier le dernier!
DateTime[j]=atoi(Buffer1+m);
jour=DateTime[0];
mois=DateTime[1];
Annee=DateTime[2];
jS=DateTime[3]; // jour de la semaine
if (jS>6)
{
jS=0; // dimanche par defaut !
UART1_Write_CText("\r\nErreur sur Jour Semaine jS. OK\r\n");
}
heure=DateTime[4];
minute=DateTime[5];
write_DS3231(0,0x00); //Reset second to 0 sec. and stop Oscillator
write_DS3231(1,Dec2Bcd(minute)); //write min
write_DS3231(2,Dec2Bcd(heure)); //write hour
write_DS3231(3,Dec2Bcd(jS)); //write day of week
write_DS3231(4,Dec2Bcd(jour)); // write date
write_DS3231(5,Dec2Bcd(mois)); // write month
write_DS3231(6,Dec2Bcd(Annee)); // write year 2014
write_DS3231(7,0x10); // Sortie SQW 1Hz
// write_DS3231(7,0x11); // Sortie SQW 4096 Hz
// write_DS3231(7,0x12); // Sortie SQW 8192 Hz
// write_DS3231(7,0x13); // Sortie SQW 32768 Hz
UART1_Write_CText("\r\nEcriture dans DS3231... OK\r\n");
}
else
{
UART1_Write_CText("\r\n Rappel format de cde : \"U;24;08;17;04;17;36#\" \r\n");
UART1_Write_CText(" pour 24 Aout 2017 Jeudi 17H36\r\n\r\n");
}
}
La conclusion :
des qu'on manipule une variable servant d'index dans une table, il faut en controler les limites
surtout si celle ci vient de l'exterieur .. d'un clavier sujet à un errare humanum est .
Comme quoi, on reste toujours débutant .. et le fameux dicton de jeremy s'applique bien ici
sic:
C'est en faisant des erreurs, que l'on apprend le mieux !!!
un beau plantage avec une RTC DS1307
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour Paul ,
Merci pour ce petit retour d’expérience !!!
C'est vrai que l’encapsulation de certaines variables est toujours bien quand c'est possible. Surtout quand cette variable détermine tout le programme qui suit !
Je connais des plantes qui vont être au frais cet été !
Merci pour ce petit retour d’expérience !!!
C'est vrai que l’encapsulation de certaines variables est toujours bien quand c'est possible. Surtout quand cette variable détermine tout le programme qui suit !
Je connais des plantes qui vont être au frais cet été !
un beau plantage avec une RTC DS1307
un beau plantage avec une RTC DS1307
un beau plantage avec une RTC DS1307
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
paulfjujo a écrit :Gérard a écrit :Bonjour à tous,
Je viens de penser à un truc, la RTC compte de 1 à 7 pour les jours de la semaine pas de 0 à 6.
Est ce que ça a une incidence?
Bien vu Gerard !
Bon dieu ,mais c'est bien sur !
comme dirait l'inspecteur Bourel !
Je viens de relire la Datasheet Date Range 01.. 07
Depuis que je me sers de ces RTC DS1037, je n''utilisais pas l'affichage des jours de la semaine,
en fait , c'est depuis que j'ai rajouté le mode Bavard. (qui rajoute en entete , le jour de semaine, + date et heure).
sinon sur le LCD je n'affiche que la Date et Heure.
... et il a fallu que je j'attende le lundi pour que ça plante !
et effectivement il faudrait faire jS=DateTime[3]-1 ; //
ce qui cadre bien ensuite l'index de la table de 0 à 6
sur une routine DS1307 plus ancienne j'avais utilisé un Switch ..
mais avec ecriture du jour semaine , systematique ..
et là ,no problemo
Code : Tout sélectionner
void Refresh_display_date_Time()
{
second=read_ds1307(0);
minute=read_ds1307(1);
heure =read_ds1307(2);
jS=read_ds1307(3)-1;
jour=read_ds1307(4);
mois=read_ds1307(5);
Annee=read_ds1307(6);
switch(jS)
{// weekday display
case 0 : UART1_Write_CText("Dim ");
break;
case 1 : UART1_Write_CText("Lun ");
break;
case 2 : UART1_Write_CText("Mar ");
break;
case 3 : UART1_Write_CText("Mer ");
break;
case 4 : UART1_Write_CText("Jeu ");
break;
case 5 : UART1_Write_CText("Ven ");
break;
case 6 : UART1_Write_CText("Sam ");
break;
}
bien que ce sujet a soulevé pas mal de doute
par rapport au demmarage de la semaine avec 0=Dimanche ( coté USA)
voir http://forum.arduino.cc/index.php?topic=406505.0
je vais donc, en conséquence, corriger mes routines actuelles RTC DS1307 ( et DS 3231) .
Nota: l'UART comme pisteur / debuger de programme .. ça sert !
==================================
un peu de disgression sur le sujet :
Comme quoi, un bug peut surgir d'un programme, uniquement dans des conditions tres precises ..
...de quoi renverser une passante avec une voiture sans conducteur
à quel pourcentage sont testés les programmes d'un véhicule autonome ?
Je me souviens d'une machine de production qui s'arretait completement apres 32767M de film produit...
because: un mot 16 bit signé.. au lieu d'un 16 bits non signé utilisé dans l'automate ..
Probleme surgit apres 4 ans d'utilisation , avec des longueurs produites inferieures à 32767M
Bon on a quand meme pu aller sur la lune avec un programme de > 60 000 lignes
( mais avec plein de commutateur MANU/AUTO)
Il faut peut etre que nous y pensions tous un peu ..
Rajouter des solutions de repli ..
Modifié en dernier par paulfjujo le mar. 29 mai 2018 16:54, modifié 1 fois.
un beau plantage avec une RTC DS1307
un beau plantage avec une RTC DS1307
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Gérard a écrit :Si on se réfère aux Saintes Ecritures, dimanche est le 7e jour.
Ben ,NON,
ce qui cause PAUL & MIKE à ce sujet.
si je force la RTC avec jS=07 soit le 26 mai 2018 (un samedi) .. à 23H59
le lendemain
j'ai bien Dimanche !
Code : Tout sélectionner
RTC Update : U;26;05;18;07;23;59#
Index1 = 20
Ecriture dans DS1307... OK
Samedi,26-05-18;23:59:01;Autoriz=0;Mode=0;Ppe=0;Ar= 0;Tp= 26.2°C;Hu= 57.0%;E0= 511;Amp=0.00 ;EA2= 564 E1= 555;E3= 529;TMn= 1439;UB= 11.62V
Samedi,26-05-18;23:59:04;Autoriz=0;Mode=0;Ppe=0;Ar= 0;Tp= 26.2°C;Hu= 57.0%;E0= 524;Amp=0.00 ;EA2= 564 E1= 555;E3= 526;TMn= 1439;UB= 11.62V
... etc
Samedi,26-05-18;23:59:59;Autoriz=0;Mode=0;Ppe=0;Ar= 0;Tp= 26.2°C;Hu= 57.0%;E0= 511;Amp=0.00 ;EA2= 565 E1= 551;E3= 525;TMn= 1439;UB= 11.59V
Dimanche,27-05-18;00:00:02;Autoriz=0;Mode=0;Ppe=0;Ar= 0;Tp= 26.3°C;Hu= 57.0%;E0= 511;Amp=+0.0 ;EA2= 565 E1= 560;E3= 522;TMn= 0;UB= 11.66V
Dimanche,27-05-18;00:00:05;Autoriz=0;Mode=0;Ppe=0;Ar= 0;Tp= 26.3°C;Hu= 57.0%;E0= 511;Amp=0.00 ;EA2= 565 E1= 558;E3= 529;TMn= 0;UB= 11.64V
avec usage de jS-1 comme indice 1-1=0 premier jour=Dimanche
et ma table
Code : Tout sélectionner
const code char Jour0[]="Dimanche";
const code char Jour1[]="Lundi";
const code char Jour2[]="Mardi";
const code char Jour3[]="Mercredi.";
const code char Jour4[]="Jeudi";
const code char Jour5[]="Vendredi";
const code char Jour6[]="Samedi";
const code char * JourSemaine[]={Jour0,Jour1,Jour2,Jour3,Jour4,Jour5,Jour6};
Code : Tout sélectionner
void Affiche_Horodatage(unsigned char Condition)
{
if (Condition==1)
{
if ((jS<8) && (jS>0))
{
UART1_Write_CText(JourSemaine[jS-1]);
UART1_Write(',');
}
UART1_Write_Text(date);
UART1_Write(';');// UART1_Write_CText(Blancs);
UART1_Write_Text(time);
UART1_Write(';');// UART1_Write_CText(Blancs);
}
}
un beau plantage avec une RTC DS1307
un beau plantage avec une RTC DS1307
Bonjour à tous,
Merci pour l'info. Il est vrai qu'en programmation j'ai toujours appris en commençant à 0 jamais à 1.
Je suis entrain de bosser sur une ds3231. J'essaie d'afficher le résultat via UART.
@++
Merci pour l'info. Il est vrai qu'en programmation j'ai toujours appris en commençant à 0 jamais à 1.
Je suis entrain de bosser sur une ds3231. J'essaie d'afficher le résultat via UART.
@++
un beau plantage avec une RTC DS1307
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
venom a écrit :Je suis entrain de bosser sur une ds3231. J'essaie d'afficher le résultat via UART.
J'utilise miantenant celle ci dans mon projet Horloge 60leds...
La DS3231 est tres semblable à la DS1307
la plus grosse difference que j'ai trouvé est dans l'init de la sortie SQW ( si on veut s'en servir !)
utilisée dans mon cas pour l'avance 60 leds de mon horloge PIC18
avec le correctif, concernant le jour de la semaine jS ( variant 1 à 7)
mais à utiliser comme indice
indice=jS-1;
pour acceder à une table contenant les Jours de la semaine
exemple:
const code char Jour0[]="Dimanche";
const code char Jour1[]="Lundi";
const code char Jour2[]="Mardi";
const code char Jour3[]="Mercredi.";
const code char Jour4[]="Jeudi";
const code char Jour5[]="Vendredi";
const code char Jour6[]="Samedi";
const code char * JourSemaine[]={Jour0,Jour1,Jour2,Jour3,Jour4,Jour5,Jour6};
UART1_Write_CText(JourSemaine[jS-1]);
l'init RTC ...
j'utilise une entree PIC pour un eventuel forcage , pour la 1ere fois, ou si remplacement de la pile.
car alors, il peut y avoir n'importe quoi dans les registres du DS3231.
et peut causer un plantage dans l'application !
sinon
on relit simplement le contenu de celle ci
Code : Tout sélectionner
UART1_Write_CText(" Init RTC DS3231: \r\n");
I2C1_Init(400000);
// specifique à DS3231 , activation sortie SWQ 1Hz
// datasheet page 13
//Active-Low Interrupt or Square-Wave Output. This open-drain pin requires an external pullup resistor connected
// to a supply at 5.5V or less. This multifunction pin is determined by the state of the INTCN bit in the Control
// Register (0Eh). When INTCN is set to logic 0,
// this pin outputs a square wave and its frequency is determined by RS2 and RS1 bits 0 0 = 1Hz
// Bit 6: Battery-Backed Square-Wave Enable (BBSQW). When set to logic 1 with INTCN = 0 and VCC < VPF,
// this bit enables the square wave.
// mis à 1 pour toujours avoir la pulse 1Hz avance des secondes
//registre de Control :
// adresse 7 6 5 4 3 2 1 0
// 0Eh /EOSC BBSQW CONV RS2 RS1 INTCN A2IE A1IE
UART1_Write_CText(" Active sortie SQW=1Hz: \r\n");
write_DS3231(0x0E,0b01000000); // batterie LIRC2032 4,4V
if(RTC_Forcee==0) // RC0 input
{
UART1_Write_CText( "init RTC par defaut ");
write_DS3231(0,0x50); //Reset second to 0 sec. and stop Oscillator
write_DS3231(1,0x59); //write min
write_DS3231(2,Dec2Bcd(14)); //write hour
write_DS3231(3,0x02); //write day of week
write_DS3231(4,0x01); // write date
write_DS3231(5,0x05); // write month
write_DS3231(6,Dec2Bcd(18)); // write year 2018
}
else
{
UART1_Write_CText(" Re-Lecture RTC ");
}
Refresh_Date_Time() ;
Display_Date_Time() ;
CRLF1();
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 51 invités