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

Gestion d'un RTC ds3231 en I2C (prg de lecture pour affichage sur LCD)
francknvs
Membre
Membre
Messages : 20
Enregistré en : septembre 2017
Localisation : Paca-toulon

#1 Message par francknvs » sam. 4 nov. 2017 19:57

Bonsoir à tous,
Apres avoir terminé la gestion d'un LCD en i2c, comme promis je me suis attaqué au RTC (ds3231)
Le controle et la gestion du protocole par pic en maitre, ne me pose aucun probleme...en revanche, j'ai bcp de mal avec la lecture des registres secondaire du RTC.
Sur la DS, on nous dit que les secondes par exemple sont codées en BCD sous format decimal 8 bit
b7 à b4---> concerne les dizaines
b0 à b3---> concerne les unités
exemple:
24 secondes de tps reel serait codé en bcd dans le registre h00 (seconde) de la façon suivante 0010|0100 soit 0xh24 en hexa ou d'36 en decimal
si je mets cette valeur en hexa dans ma fonction putch(0x24)...mon afficheur m'indique que je suis millionnaire!!!! avec $
normal vous me direz, la valeur hexa correspondante à la bcd affiche le caractere $ associé issu de la table ASCII
Mon compilateur HI-TECH ne comprend pas cette fonction que vs mentionnez touts (et moi d'ailleur, non en fait...)

Code : Tout sélectionner

secondes = Bcd2Dec(secondes);   // Conversion de BCD en décimal pour l'afficheur    


pour ma par, j'aurai plutot fais une conversion de type bcd to hexa sur chaque quartet reçus à l'issue de la lecture du registre avant affichage
soit 24 secondes--->bcd du RTC =>0010|0100
1/Je m'attaque au dizaine du registre seconde avec
RTC>>4--->0000|0010
j'ai bien 0x02 en hexa auquel je rajoute 0x30
ainsi ma variable concernant les dizaines= 0x32 qui correspond bien au caratere 2 de ma table ASCII
2/Je m'attaque aux unités avec un masque de 0x0f
RTC&0x0f=>0010|0100 & 0000|1111= 0000|0100
j'ai bien 0x04 en hexa auquel je rajoute 0x30
ainsi ma variable concernant les unités= 0x34 qui correspond bien au caratere 4 de ma table ASCII
....je putch( variable) chaque variable à leur position d'affichage sur lcd

est ce correcte????

par avance merci

Gestion d'un RTC ds3231 en I2C (prg de lecture pour affichage sur LCD)
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 967
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#2 Message par paulfjujo » sam. 4 nov. 2017 20:33

Oui, c'est correct ..

La transformation en decimal n'est utile que si on veut faire un traitement specifique dans une application donnée..
test si on atteint un temps donné, plus facile en decimal qu'en BCD natif

Gestion d'un RTC ds3231 en I2C (prg de lecture pour affichage sur LCD)
francknvs
Membre
Membre
Messages : 20
Enregistré en : septembre 2017
Localisation : Paca-toulon

#3 Message par francknvs » sam. 4 nov. 2017 21:04

merci paul pour ta réponse
ainsi je ne vois l'interet de devoir faire ceci
valeurDec=((valeurRTC>>4)*10)+(valeurRTC&0x0f);

à devoir "s'ennuyer à multipier par 10 puis faire un ajout de la valeur masquée

voilà pourquoi je ne récupère jamais une fonction toute faite tombant du nid...meme si parfois j'ai une envie irresistible de me telecharger le compilateur mikroC comme la plupart d'entre-vous sur le site ( j'aime bien et j'ai besoin de comprendre ce qui est fait...)

me reste plus qu'à creer une une fct Bcd_to_Hexa... :mur:
du genre:

unsigned char valeurHex_Digit2;
unsigned char valeurHex_Digit1;

valeurHex_Digit2=((valeurBCD>>4)) + 0x30//----> position et fct putch
valeurhexa_Digit1=(valeurBCD&0x0f) + 0x30//----> position et fct putch


ou qqc comme ça

Gestion d'un RTC ds3231 en I2C (prg de lecture pour affichage sur LCD)
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 967
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#4 Message par paulfjujo » dim. 5 nov. 2017 15:21

bonjour à tous,

modif pour preparation Affichage time et Date ( en MikroC)

Code : Tout sélectionner





extern char time
[]="00:00:00";
extern char date[]="00/00/00";  

 void BCD_To_Ascii
(unsigned char cc,unsigned char * px)
 {
 *(px)=(cc>>4) + 48;
 *(px+1)=(cc & 0x0F) +48;
 *(px+2)=0;
 }


void Refresh_display_date_Time(void)
{
     second=read_ds1307(0);
     minute=read_ds1307(1);
     heure =read_ds1307(2);
     jS=read_ds1307(3);
     jour=read_ds1307(4);
     mois=read_ds1307(5);
     Annee=read_ds1307(6)

/*   version initiale utilisée :
     time[0]=((heure >> 4) & Dec2Bcd(03)) + 48;  // LCD Display 10 HOUR
     time[1]=(heure & 0x0f)+48;  // LCD Display HOUR
     time[3]=((minute >> 4) & Dec2Bcd(07)) + 48;  // LCD Display 10 MINUTE
     time[4]=(minute & 0x0f)+48;  // LCD Display MINUTE
     time[6]= ((second >> 4) & Dec2Bcd(07)) +48;  // LCD Display 10 SECOUND
     time[7]= (second & 0x0f)+48;  // LCD Display SECOUND

     date[0]=((jour >> 4) & Dec2Bcd(07)) + 48; // LCD Display DAY
     date[1]=(jour & 0x0f)+48;   // LCD Display 10 DAY
     date[3]=((mois >> 4) & Dec2Bcd(07)) + 48; // LCD Display MONTH
     date[4]=(mois & 0x0f)+48;  // LCD Display 10 MONTH
     date[6]=((Annee>> 4) & Dec2Bcd(07)) + 48;  // LCD Display YEAR
     date[7]=(Annee & 0x0f)+48;  // LCD Display 10 YEAR
 */
 // new version
     BCD_To_Ascii(heure,time) ;   time[2]=':';
     BCD_To_Ascii(minute,time+);  time[5]=':';
     BCD_To_Ascii(second,time+6);   time[8]=0;
     BCD_To_Ascii(jour,date); date[2]='-';
     BCD_To_Ascii(mois,date+3); date[5]='-';
     BCD_To_Ascii(Annee,date+6); date[8]=0;
     }
    


 ce qui donne un code plus concis ...
:+1: Merçi Frank pour ta remarque
    
     Re-Lecture RTC
     05-11-17 14:37:24

Nota : le bit 6 de l'Heure n'est pas génant en mode 24H00, car à Zero


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités