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 ---
Forum général sur le langage C !

Modérateur : Jérémy

un beau plantage avec une RTC DS1307
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1089
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » lun. 28 mai 2018 18:10

bonjour à tous,

:mur: 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");
    }
 }
 


exit
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
Administrateur du site
Messages : 2161
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » lun. 28 mai 2018 18:25

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é ! :langue:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

un beau plantage avec une RTC DS1307
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 848
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#3 Message par Gérard » mar. 29 mai 2018 09:09

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?
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

un beau plantage avec une RTC DS1307
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1089
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » mar. 29 mai 2018 12:20

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?



pour une table contenant 7 valeurs ( 7 jours de la semaine)
l'index de la table evolue de 0 à 6

un beau plantage avec une RTC DS1307
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1089
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » mar. 29 mai 2018 14:05

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?


:+1: Bien vu Gerard ! Merci !

oops 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
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 848
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#6 Message par Gérard » mar. 29 mai 2018 14:50

Si on se réfère aux Saintes Ecritures, dimanche est le 7e jour.

dehors!!
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

un beau plantage avec une RTC DS1307
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1089
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » mar. 29 mai 2018 18:29

Gérard a écrit :Si on se réfère aux Saintes Ecritures, dimanche est le 7e jour.

dehors!!



:!!: Ben ,NON,
humour!! 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;Tp26.2°C;Hu57.0%;E0=  511;Amp=0.00 ;EA2=   564 E1555;E3529;TMn1439;UB11.62V
Samedi
,26-05-18;23:59:04;Autoriz=0;Mode=0;Ppe=0;Ar=  0;Tp26.2°C;Hu57.0%;E0=  524;Amp=0.00 ;EA2=   564 E1555;E3526;TMn1439;UB11.62V
... etc 
Samedi
,26-05-18;23:59:59;Autoriz=0;Mode=0;Ppe=0;Ar=  0;Tp26.2°C;Hu57.0%;E0=  511;Amp=0.00 ;EA2=   565 E1551;E3525;TMn1439;UB11.59V
Dimanche
,27-05-18;00:00:02;Autoriz=0;Mode=0;Ppe=0;Ar=  0;Tp26.3°C;Hu57.0%;E0=  511;Amp=+0.0 ;EA2=   565 E1560;E3522;TMn=    0;UB11.66V
Dimanche
,27-05-18;00:00:05;Autoriz=0;Mode=0;Ppe=0;Ar=  0;Tp26.3°C;Hu57.0%;E0=  511;Amp=0.00 ;EA2=   565 E1558;E3529;TMn=    0;UB11.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
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 848
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#8 Message par Gérard » mar. 29 mai 2018 20:52

Il est pourtant écrit : "Le 7e jour tu te reposeras".


dehors!!
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

un beau plantage avec une RTC DS1307
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 423
Âge : 33
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#9 Message par venom » mer. 30 mai 2018 07:11

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.






@++
En fait tout est une question de BIT ? :-D

un beau plantage avec une RTC DS1307
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1089
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » mer. 30 mai 2018 10:11

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();

 


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité