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 !!!


Bien vu Gerard !

ce qui cause PAUL & MIKE à ce sujet.