Bonjour à tous
Je me croyais à l'abri des surprises, mais non, et toujours avec le même composant qui me résiste, le bougre. 
J'ai "à peu près" résolu mes problèmes d'heure, mais c'est la RAM qui me porte souci, car elle semble n'avoir, de la RAM, que le nom. 
J'ai trouvé, sur le net, des sketches de démo qui permettent de la mettre en œuvre, j'ai créé mes routines à inclure dans mon programme pour l'exploiter, et voilà que mes vérifications ne collent pas à la réalité.
Ayant enregistré des valeurs dans la RAM, je les rappelle dans une autre application, et j'ai la (mauvaise) surprise de constater que rien n'est mémorisé, tout est à zéro.
Pour simplifier, ma "démonstration", j'ai allégé le sketch initial pour n'y laisser que l'enregistrement de 56 octets, contenant les valeurs décimales de 0 à 55, et que je contrôle avant de sortir.
Voilà le sketch, qui commence d'ailleurs par montrer le contenu initial de la RAM, qui logiquement, lors d'un second lancement, devrait avoir conservé ses valeurs:
// DS1307_RAM_record_only.ino Enregistrement et contrôle unique
// Copyright (C)2016 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
int cpt ; // compteur
#include <DS1307.h>
DS1307_RAM ramBuffer;
DS1307 rtc(SDA, SCL);
void setup()
{
// Setup Serial connection
Serial.begin(115200);
// Uncomment the next line if you are using an Arduino Leonardo
//while (!Serial) {}
// Initialize the rtc object
rtc.begin();
}
void bufferDump(char st[])
{
Serial.write(st);
Serial.println("");
for ( cpt = 0 ; cpt < 56 ; cpt ++)
{
Serial.print("0x");
Serial.print ( ramBuffer.cell [ cpt ] , HEX ) ;
Serial.print(" ");
if ( cpt % 20 == 0 ) Serial.print ( "\n" ) ;
}
Serial.println("");
Serial.println("--------------------------------------------------------");
}
void comment(char st[])
{
Serial.println("");
Serial.print("---> ");
Serial.write(st);
Serial.println("");
Serial.println("");
}
void loop()
{
// Lecture initiale
Serial.println("\nCette fonction ne va enregister que 56 octets");
bufferDump("Initial buffer");
Serial.println("Cette fonction ne va enregister que 56 octets");
comment("Remplissage RAM par 56 nombres");
for ( int i = 0 ; i < 56 ; i ++ )
ramBuffer.cell [ i ] = i ;
// relecture après l'enregistrement
bufferDump("Relecture après enregistrement");
Serial.println("Ceci laisse bien supposer que l'enregistrement en RAM est effectif.");
Serial.println("***** Fin de la démo *****");
while ( 1 ) {} ;
}
et voilà ce que je lis sur le moniteur:
Cette fonction ne va enregister que 56 octets
Initial buffer
0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
--------------------------------------------------------
Cette fonction ne va enregister que 56 octets
---> Remplissage RAM par 56 nombres
Relecture après enregistrement
0x0
0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xA 0xB 0xC 0xD 0xE 0xF 0x10 0x11 0x12 0x13 0x14
0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28
0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37
--------------------------------------------------------
Ceci laisse bien supposer que l'enregistrement en RAM est effectif.
***** Fin de la démo *****
Je m'attends donc à disposer de ces valeurs pour le futur.
J'ai allégé le programme d'écriture, sur un autre sketch, qui ne pratique que la lecture, et me montre ce que contient la RAM.
// DS1307_RAM_read_only.ino ne fait que la lecture des 56 octets de RAM
// Copyright (C)2016 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
int cpt ; // compteur
#include <DS1307.h>
DS1307_RAM ramBuffer;
DS1307 rtc(SDA, SCL);
void setup()
{
// Setup Serial connection
Serial.begin ( 115200 ) ;
// Uncomment the next line if you are using an Arduino Leonardo
// Initialize the rtc object
rtc.begin();
}
void bufferDump ( char st [] )
{
Serial.write ( st) ;
Serial.println ( "" ) ;
for ( cpt = 0 ; cpt < 56 ; cpt ++ )
{
Serial.print("0x");
Serial.print ( ramBuffer.cell [ cpt ] , HEX ) ;
Serial.print ( " " ) ;
if ( cpt % 20 == 0 ) Serial.print ( "\n" ) ;
}
Serial.println("");
Serial.println("--------------------------------------------------------");
}
void comment(char st[])
{
Serial.println("");
Serial.print("---> ");
Serial.write(st);
Serial.println("");
Serial.println("");
}
void loop ()
{
Serial.println ( "\nCette fonction lit 56 octets de la RAM" ) ;
bufferDump ( "Contenu initial" ) ;
Serial.println ( "***** Fin de la démo de Lecture *****" ) ;
while ( 1 ) {} ;
}
Et sa lecture:
Cette fonction lit 56 octets de la RAM
Contenu initial
0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
--------------------------------------------------------
***** Fin de la démo de Lecture *****
J'ai le sentiment qu'il y a une manipulation/instruction/commande/... que je ne fais pas et qui ne me donne pas un accès réel à ma RAM.
La relecture lors de l'enregistrement est conforme à l'attente, mais ne l'est plus en réalité.
Je n'exclus pas qu'il y ait un mécanisme similaire à celui de la fonction horloge.
Je pensais que l'on avait un accès "direct" aux registres de l'horloge (les huit premiers octets), mais la réalité n'est pas celle-ci. Il faut lancer une opération qui me paraît encore un peu mystérieuse, pour que le i2c puisse rapatrier les véritables valeurs de l'horloge et donc, probablement, de la RAM, si le "mécanisme" est similaire.
Merci à ceux qui savent de me mettre le doigt dessus. 
Dans le sketch que je comptais inclure dans mon application, c'est le même sketch, avec un seul setup () qui comporte les deux sections, celle d'un enregistrement de quatre valeurs qui seront rendues décroissantes, et de la fonction de lecture pour vérifier que la mémorisation est effective, et qu'elle progresse bien. Tout cela pour dire que je n'ai pas de lancement de sketch entre un enregistrement et sa vérification.