RAM d’horloge RV1805C3 sur plusieurs registres, comment ?

Bonjour

Je planche sur un dispositif pouvant déclencher des actions selon l’heure, le soleil, la lune..... Pour autonomiser l’arduino, il fallait aussi un RTC à basse consommation. Le PCF 8563 est parfait à cet égard ,( consommation 10 à 50 µA vs un DS1307 à 200µA en stand-by), mais je veux opter pour un RV1805C3 à la consommation dérisoire de 0.022 µA. Ce RTC a d’autres atouts dont :

  • la gestion d’un supercondensateur autorisant une autonomie de 170 jours,
  • la possibilité de couper l’alimentation de l’Arduino et des ses acolytes (LDO, bluetooth, esp8266,etc )
    et surtout

-512 OCTETS DE RAM.

Manuel d'application RV1805C3

Pour mon programme, cette RAM est une bénédiction . Cependant je ne sais pas la faire fonctionner pleinement.

En effet il y a quatre partitions de 64 octets de RAM d’abord, suivi de deux partitions de 128 octets de l’autre. Cependant ces partitions dépendent pour la première de 2 bits, la seconde de 1 bit de poids fort, dans le registre précédent.

VOIR LES DEUX IMAGES JOINTES

La librairie RV1805C3 Macro Yau (comme celle similaire de Adafruit) ne proposant qu’une seule adresse dans la fonction readBytes ou writeBytes, il en résulte qu’on ne peut utiliser que 64 octets (au lieu de 256) dans la première RAM et 128 (au lieu de 256 dans la seconde)

uint8_t RV1805C3::readByteFromRegister(uint8_t address) {
 uint8_t value = 0;

 _i2cPort->beginTransmission(RV1805C3_ADDRESS);
 _i2cPort->write(address);
 _i2cPort->endTransmission(false);

 _i2cPort->requestFrom(RV1805C3_ADDRESS, 1);
 value = _i2cPort->read();
 _i2cPort->endTransmission();

 return value;
}

bool RV1805C3::writeByteToRegister(uint8_t address, uint8_t value) {
 _i2cPort->beginTransmission(RV1805C3_ADDRESS);
 _i2cPort->write(address);
 _i2cPort->write(value);
 return (_i2cPort->endTransmission() == 0);
}

Je n’arrête pas de plancher mais je ne trouve pas de solution.

En effet la première adresse de mémoire étant 0x40, on perd d’entrée 64 octets
La seconde adresse idem, oblige à commencer à 0x80 et on perd 128 octets.
Comment peut-on simplement utiliser les 512 octets de la RAM ? Je sais modifier les registres , mais je bloque car je ne vois pas de solution pour les adresses de RAM en dessous de 0x40 et en dessous de 0x80 ? Un énorme casse-tête très au-delà de mes compétences et de mon imagination.

Merci infiniment de m’aider ou pour le moins de me diriger

je ne comprends pas trop la question?

Pour adresser un endroit particulier de la RAM, il faut donc "juste" définir les bons 3 bits de poids faible dans le registre 0x3F (XADS ou XADA)

Si vous mettez en 0x3F comme il faut les 2 bits XADS (choix d'un banc de 64 octets parmi 4) vous pouvez lire ou écrire en envoyant une commande pour l'adresse 0x40 (et 63 octets suivants)

Si vous mettez comme il faut le bit XADA (choix d'un banc de 128 octets parmi 2) vous pouvez lire ou écrire en envoyant une commande pour l'adresse 0x80 (et 255 octets suivants)

(cf chapitres 4.29 et 4.2.10 dans votre doc pour lire des data)

Salut

Il y a deux blocs de RAM, et l'accès se fait par pages.

40h - 7Fh – Standard RAM (4 pages de 64 octets)

Il faut écrire 00 à 11 dans les bits XADS du registre de contrôle 3Fh.
00 : première page
01 : deuxième page
10 : troisième page
11 : quatrième page
Ensuite il faut lire ou écrire à l'adresse 40 à 7F

80h - FFh – Alternate RAM (2 pages de 128 octets)
Il faut écrire 0 ou 1 dans le bit XADA du registre de contrôle 3Fh.
0 : première page
1 : deuxième page
Ensuite il faut lire ou écrire à l'adresse 80 à FF
Cela te donne accès à 2 pages de 128 octets.

Ce qui fait bien 512 octets au total.

@+

Merci de tout cœur J_M_L et hbachetti

C'est ce que je suspectais. Donc les fonctions read ou writeBytes de la librairie ne sont pas adaptées, il faut que j'y ajoute des conditions pour faire évoluer les bits de XADA et XADS. Avec l'ajout d'une variable première adresse et un compteur lors des opérations cela ne devrait pas être compliqué je pense.

Je me remets au travail, d'abord en repensant mon code car dans l'immédiat, avec les bits XADA et XADS à zéro du reset, les read et writeBytes démarrent pour la Standard RAM à 64 , comme si le bit XADS était à 01 et idem pour l'alternate RAM qui démarre à 127 comme si le bit XADA était à 1.

Je vais donc d'abord forcer ces bits à zéro dans la fonction reset et tester.

Merci infiniment pour votre gentillesse et votre compétence, je quitte une grande solitude, pour une allégresse à passer cet obstacle.

il vous suffit d'écrire une fonction de lecture et une d'écriture qui prend une adresse entre 0 et 511 (donc sur 2 octets) et c'est dans ces fonctions que vous effectuez les petites manips magiques.

vous pouvez même insérer ça dans la librairie comme évolution :slight_smile:

Merci,

Je vois que vous êtes sans l'air de le dire, en train asticoter la librairie. Indéniablement, il y a deux librairies qui sont des copier-coller et dérivent amplement de RTC.lib. Pas mal de travail à adapter ces librairies. Je ne peux me targuer de le tenter mais je peux amener les éléments pour l'améliorer afin que l'on puisse opter pour un RTC RV1805 au lieu des sempiternels DS 1307 et 3231 qui ont tous les tutos à en être fossilisés et qui datent tragiquement. Mais honneur aux précurseurs.

Bonjour
En dépit de vos excellents conseils et quelques semaines de tests tous azimuts je ne parviens pas à opter pour un registre (0x40 standard memory ) ou l’autre( 0x80 alternate memory).
J’’utilise cette fonction pour orienter l’écriture de l’adresse


int enableRAM (byte sector, uint8_t address , byte partition) {
uint8_t value = rtc.readByteFromRegister(0x3F);
value = partition;
if (sector == 0x40 ) { // Standard RAM
if (address > 127 ) { value ++; address -= 64; }
}
if ( sector == 0x80 ){ // Alternate RAM
if (address <128 ) { value = 0x4; address += 128;}
}
rtc.writeByteToRegister( 0x3F, value );
return address;
}


Néanmoins si j’entre des données, elles se stockent dans les DEUX registres. En pratique il faudrait que je fasse mon deuil d’un des registres et n’utiliser que 256 bits au lieu de 512, fâcheux.
Précisions :
Quand j’adresse une donnée :

  1. Je modifie d’abord la valeur du registre pivot, le registre 0x3F
    si adresse entre 0x40 et 0x80 ,je change la partition dans le registre 0x3F
    0 (0000 0000) pour XADS 00,
    1 (0000 0001) pour XADS 01,
    2 (0000 0010) pour XADS 10
    3 (0000 0011) pour XADS 11 (NB, elle ne fonctionne pas, renvoie à 0.)
    de même si adresse >0x80, je change la partition dans le registre 0x3F
    0 (0000 0000) pour XADA 0 (et dans la foulée XADS 00)
    4 (0000 0100) pour XADA 1 (et dans la foulée XADS 00)
  2. Puis j’indique l’adresse
    soit l’adresse est entre 64 et 127 (registre 0x40)
    soit l’adresse est entre 128 et 255 (registre 0x40)
    Il en résulte que mes données s’inscrivent dans les deux registres.
    Exemples de résultats :
  3. Adresse 64 partition 0 (XADS 00) . => Registre 0x3F 0000 0000
    l’adresse s’inscrit bien dans la première partition du registre 0x40
    mais aussi dans la première partition du registre 0x80 à l’adresse 128.
    Lecture du registre 0x3F : 0000 0000
    2 Adresse 192 partition 0. => REGISTRE 0X3F 0000 0000
    L’adresse s’inscrit bien dans la première partition du registre 0x80
    Mais aussi dans la partition 2 du registre 0x40, adresse 64.
    Lecture du registre 0x3F : 0000 0010
    Tout se passe donc ainsi :
  • Si mon adresse est entre 64 et 127 elle s’inscrit en plus dans le registre 0x80 comme adresse + 64.
  • Si mon adresse est entre 127 et 255, elle s’inscrit aussi dans le registre 0x40 : partition 0, comme adresse – 64, partition 1 deux fois -64, partition 2 trois fois -64.
    Les options XADS et XADA ne sont pas mutuellement exclusives mais je ne comprends pas ce + ou moins 64 pour les adresses dans l’autre registre. J’en perds mon latin et en désespoir de cause (et de neurones) je me permets de solliciter votre savoir et votre générosité.
    Merci infiniment. JB