Un problème de plus à l'utilisation de la RAM rtc DS1307

Bonjour

Ram sauvegardée nativement ? FRAM

on ne parle pas souvent des FRAM I2C (RAM ferroelectrique)

ici un module avec une puce FRAM de Fijitsu
(8ko d’après l’annonce mais la doc de la puce MB85RC256V annonce 32ko)

https://fr.aliexpress.com/item/1005001581663125.html?spm=a2g0o.productlist.0.0.190d6dd4fqXasR&algo_pvid=df31ea21-3f01-413b-8f38-49d003907928&algo_expid=df31ea21-3f01-413b-8f38-49d003907928-3&btsid=0b0a182b16201387310306254e7f8c&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

clone d’un ‘breakout’ d’Adafruit :
https://www.adafruit.com/product/1895

… endurance respectable…

Bonjour à tous

Petit résumé de la situation actuelle: un pas en avant, deux pas en arrière :rage:

Et ça, ce n’est pas tout à fait la première fois que ça m’arrive.

Ayant mes deux “sections” vérifiées et fonctionnelles (côté rtc et côté RAM), je décide de me créer une version unique dont les procédures seront à recopier dans mon programme en cours de développement, déjà très avancé, pour

1- remplacer la rtc 3231 par 1307;

2- inclure la RAM sauvegardée.

Plein succès pour la rtc, qui se “laisse faire”, et je commence à ajouter la fonction RAM copiée depuis le 1307_ram.ino qui fonctionnait de son côté, et, sans aller trop loin, je sauve et je compile pour voir si je n’ai pas une erreur.

Là, c’est la catastrophe! Le message d’erreur est déjà connu de moi, il s’incruste de plus en plus et me déroute.

Arduino : 1.8.13 (Windows Store 1.8.42.0) (Windows 10), Carte : "Arduino Uno"

C:\Users\Guy\AppData\Local\Temp\ccqErCcw.ltrans0.ltrans.o: In function `setup':

B:\__Arduino_tests\Tests_ds1307\Master_2\rtclib-1-master\examples\softrtc/softrtc.ino:13: undefined reference to `DateTime::DateTime(char const*, char const*)'

C:\Users\Guy\AppData\Local\Temp\ccqErCcw.ltrans0.ltrans.o: In function `RTC_Millis::begin(DateTime const&)':

sketch/RTClib.h:79: undefined reference to `RTC_Millis::adjust(DateTime const&)'

C:\Users\Guy\AppData\Local\Temp\ccqErCcw.ltrans0.ltrans.o: In function `loop':

B:\__Arduino_tests\Tests_ds1307\Master_2\rtclib-1-master\examples\softrtc/softrtc.ino:17: undefined reference to `RTC_Millis::now()'

B:\__Arduino_tests\Tests_ds1307\Master_2\rtclib-1-master\examples\softrtc/softrtc.ino:33: undefined reference to `DateTime::get() const'

B:\__Arduino_tests\Tests_ds1307\Master_2\rtclib-1-master\examples\softrtc/softrtc.ino:36: undefined reference to `DateTime::get() const'

B:\__Arduino_tests\Tests_ds1307\Master_2\rtclib-1-master\examples\softrtc/softrtc.ino:36: undefined reference to `DateTime::DateTime(long)'

collect2.exe: error: ld returned 1 exit status

exit status 1

**Erreur de compilation pour la carte Arduino Uno**

J’ai débranché, rebranché, rebooté, relancé … rien n’y fait.

J’ai repris mes sources à partir du .zip, y compris tout ce qui fonctionnait et qui, à présent, n’est soit disant plus adapté à un uno.

A tout hasard, j’ai repris le scanner “officiel” celui qui affiche quels composants i2c répondent. Lui fonctionne et me retrouve bien mes deux adresses occupées par le 1307, les 0x68 et 0x50.

Je soupçonne que c’est le genre de problème auquel vous avez tous été confrontés et pour lequel vous connaissez la “parade”

Qu’en pensez-vous?

Il te manque une librairie

Il te manque une librairie

Il n’est pas impossible que le message d’erreur ne corresponde plus au sketch fautif.J’ai passé en revue tous ceux du zip et il se peut que ce soit inadapté.

C’est la conclusion ( … pas uno … ) qui est commune à tous.

Là je remets le code qui fonctionnait hier et qui refuse aujourd’hui:

// Test_01_1307.ino 2 mai 2021 Lecture date/heure sur SD1307

#include<Wire.h>
#include "RTClib.h"  // les guillemets pour placer la .lib dans le dossier .ino


RTC_DS1307 RTC ;
void printDateTime ( DateTime dateTime ) ;

void setup ()
{
  // put your setup code here, to run once:
  Serial.begin( 115200 ) ;
  Wire.begin () ;
  RTC.begin () ;
}

void loop ()
{
  // put your main code here, to run repeatedly:
  if ( Serial.available () > 0 )
  {
    int instruct = Serial.read () ;
    switch (instruct)
    {
      case'D':
        {
          DateTime now = RTC.now () ;
          printDateTime(now);
          break;
        }
    //  case'S':
    //    {
    //      RTC.set ( RTC_MONTH , 6 ) ;
    //      RTC.set ( RTC_HOUR , 16 ) ;
    //      break;
    //    }
    }
  }
  // delay ( 5000 ) ;
}
void printDateTime ( DateTime dateTime )
{
  Serial.print(dateTime.year(), DEC);
  Serial.print('/');
  Serial.print(dateTime.month(), DEC);
  Serial.print('/');
  Serial.print(dateTime.day(), DEC);
  Serial.print(' ');
  Serial.print(dateTime.hour(), DEC);
  Serial.print(':');
  Serial.print(dateTime.minute(), DEC);
  Serial.print(':');
  Serial.print(dateTime.second(), DEC);
  Serial.println();
}

La partie répondant au S ne fonctionnant pas, elle est neutralisée.

Son message d’erreur est

Arduino : 1.8.13 (Windows Store 1.8.42.0) (Windows 10), Carte : “Arduino Uno”

C:\Users\Guy\AppData\Local\Temp\cct1eJb4.ltrans0.ltrans.o: In function `loop’:

B:__Arduino_tests\Tests_ds1307\Test_01_1307/Test_01_1307.ino:28: undefined reference to `RTC_DS1307::now()’

collect2.exe: error: ld returned 1 exit status

exit status 1

Erreur de compilation pour la carte Arduino Uno

Comment une librairie peut-elle disparaître lors de l’ajout de code, et ne plus réapparaître en supprimant l’ajout. Car c’est ça qui m’est arrivé.

Dans ma progression (jusqu’au crash), les messages correspondaient à des fautes de syntaxe. Le crash a fait apparaître le **Erreur de compilation pour la carte Arduino Uno.
**

Est-ce que la bonne librairie est bien présente dans ton répertoire projet?

Est-ce que la bonne librairie est bien présente dans ton répertoire projet?

Maintenant que je sais à quoi servent les guillemets, j’y veille.

Oui, il est là.

Poursuivant mes recherches, et passant en revue toutes mes sauvegardes, je tombe sur un sketch d’hier plugrtc.ino, auquel j’ai associé un .txt de commentaires. Il fonctionnait, et il fonctionne lui, toujours. Au reset ou au démarrage, il affiche sur le moniteur la date et l’heure de l’horloge.

En testant d’autres plugrtc.ino, ils ne fonctionnent pas. Ce sont d’autres sources, d’autres provenances avec des librairies différentes.

Je découvre que des ino de même nom, peuvent être différents voire très différents, non interchangeables.

Je ne suis pas habitué à cette “philosophie”. :slightly_frowning_face:

Il y a même des bibliothèques différentes qui portent le même nom.
Il n’y a pas vraiment d’organisme centralisateur, il faudrait une fondation pour cela. Elle a failli exister, mais elle est restée à l’état de promesse.
Les bibliothèques téléchargées avec le gestionnaire de bibliothèque de l’IDE sont ok, mais comme chacun est libre d’écrire et de publier ce qu’il veut cela peut être le foutoir.

Bonjour à tous

Je me croyais à l’abri des surprises, mais non, et toujours avec le même composant qui me résiste, le bougre. :rage:

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. :slightly_frowning_face:

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. :hammer_and_wrench:
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.

Regarde bien les exemples joints à la librairie.
Tu remplis le buffer mais tu ne l’écris pas.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.