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

Masque de bit pour registre
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » mer. 30 déc. 2020 10:33 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

J'aimerais connaitre votre méthode pour effectuer une opération sur un registre de RTC. LA RTC utilise le circuit MCP7951 ( DS en haut du post) .
Ma méthode fonctionne, mais je la trouve longue et tirée par les cheveux. J'entrevois une solution plus propre mais je ne trouve pas. Peut être suis-je trop prés du mur :mur:

Je dois incrémenter les jours de la semaine qui vont de 1 à 7 du registre . Ces jours sont dans les bit 0-2 du registre.
Sans titre.jpg


Donc pour résumé je dois garder les bit 3,4,5 intact , les bits 6 et 7 ne sont utilisés, et je dois incrémenter la valeur des bits 0,1 et 2 .

Voila ma portion de code pour lire en SPI les valeurs du registre, les modifiées et les ré-injecter dans le registre.

Code : Tout sélectionner

 unsigned int tempo, tempo2;
  SPI_Set_Active(SPI2_Read, SPI2_Write);    // J'active le SPI2
  delay_us(1);

  //----- Je lis le jour de la semaine
  CS = 0;
  SPI2_Remappable_Write(READ);
  SPI2_Remappable_Write(DAY_REGISTER);
  tempo = SPI2_Remappable_Read(0) ;// je recupere la valeur du registre
  tempo2= (tempo & 0x07);            // J'isole les 3 bit des jours a incrementer
  tempo = (tempo & 0x38);             // J'isole les 3 bit a garder
  tempo2++;                          // je rajoute un jour en hexa car il ne dépasse pas 9
  tempo2 = (tempo2 & 0x07);// Je re-filtre pour suprrimer le bit 3 si jamais il est passé à 1
  if (tempo2 == 0) tempo2 = 1; // si à 0, je force à 1
  tempo = tempo | tempo2;    // J'assemble mes 2 valeurs individuelles en une seule
  CS = 1;

  CS = 0;     //Ecriture du jour de la semaine dans le registre
  SPI2_Remappable_Write(WRITE);
  SPI2_Remappable_Write(DAY_REGISTER);
  SPI2_Remappable_Write (tempo);
  CS = 1;
  delay_us(1);


C'est purement par curiosité , pour ne pas passer à coté d'une méthode peut être plus simple !

Merci à vous
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Masque de bit pour registre
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » mer. 30 déc. 2020 11:58 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Ceci, pas forcément plus court après compilation :

Code : Tout sélectionner

  if ((tempo & 0x07) != 0x07) tempo++;
  else tempo = tempo & 0x39;

Dans ton cas tu peux remplacer :

Code : Tout sélectionner

  tempo2 = (tempo2 & 0x07);
  if (tempo2 == 0) tempo2 = 1;
par :

Code : Tout sélectionner

  if (tempo2 == 0x08) tempo2 = 1;

Masque de bit pour registre
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » mer. 30 déc. 2020 15:48 lien vers la Data-Sheet : Cliquez ici

Merci ! et bien vu !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Masque de bit pour registre
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#4 Message par Gérard » lun. 4 janv. 2021 21:46 lien vers la Data-Sheet : Cliquez ici

Petite question : pourquoi ne pas utiliser la DS3231 qui a une base de temps intégrée compensée en température?
C'est plus précis qu'un quartz externe.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Masque de bit pour registre
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#5 Message par pspic » mar. 5 janv. 2021 13:13 lien vers la Data-Sheet : Cliquez ici

Jérémy a écrit :J'aimerais connaitre votre méthode pour effectuer une opération sur un registre de RTC. LA RTC utilise le circuit MCP7951 ( DS en haut du post) .
Ma méthode fonctionne, mais je la trouve longue et tirée par les cheveux. J'entrevois une solution plus propre mais je ne trouve pas. Peut être suis-je trop prés du mur :mur:


Bonjour,
Voici la procédure que j'utilise pour lire une RTC DS3231M en Mikrobasic:

Code : Tout sélectionner

sub procedure Lecture_Date_Heure()
  I2C1_Start()                           ' Issue start signal
  I2C1_wr(0xD0)                       ' Addresse RTC  0xD0
  I2C1_wr(0)                          ' Start à l'adresse 0
  I2C1_Start()                        ' start
  I2C1_wr(0xD1)                   ' Addresse de lecture 0xD1
  seconds = I2C1_Rd(1)            ' Read seconde byte
  minutes = I2C1_Rd(1)            ' Read minute byte
  hours = I2C1_Rd(1)              ' Read heure byte
'=====================================================================
 Njs  = I2C1_Rd(1)               'Read N° jour byte (N° du jour de la semaine)
'=====================================================================
 _day = I2C1_Rd(1)               ' Read jour
 _month = I2C1_Rd(1)             ' Read N° jour/mois byte}
  Yb = I2C1_Rd(0)                 ' Read dizaine unité an byte
  Yh = 32                            ' 32 = $20
  I2C1_Stop()                     ' Issue stop signal}
end sub

Masque de bit pour registre
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » mar. 5 janv. 2021 13:50 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,
Gérard a écrit :Source du message Petite question : pourquoi ne pas utiliser la DS3231 qui a une base de temps intégrée compensée en température?
C'est plus précis qu'un quartz externe.


Car j'avais un module RTC5 qui trainait dans mes tiroirs. Rien de plus. La DS3231 est effectivement très performantes aussi !
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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