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

Masque de bit pour registre

https://ww1.microchip.com/downloads/en/DeviceDoc/MCP7951X-MCP7952X-Battery-Backed-SPI-RTCC-20002300C.pdf

Forum général sur le langage C !

Modérateur : Jérémy

Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Masque de bit pour registre

Messagepar Jérémy » mer. 30 déc. 2020 10:33

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

satinas
Expert
Expert
Messages : 1498
Enregistré en : novembre 2015

Masque de bit pour registre

Messagepar satinas » mer. 30 déc. 2020 11:58

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;

Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Masque de bit pour registre

Messagepar Jérémy » mer. 30 déc. 2020 15:48

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

Avatar de l’utilisateur
Gérard
Expert
Expert
Messages : 1940
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

Masque de bit pour registre

Messagepar Gérard » lun. 4 janv. 2021 21:46

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.

pspic
Passionné
Passionné
Messages : 357
Enregistré en : septembre 2017
Localisation : 68

Masque de bit pour registre

Messagepar pspic » mar. 5 janv. 2021 13:13

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

Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Masque de bit pour registre

Messagepar Jérémy » mar. 5 janv. 2021 13:50

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 7 invités