non riesco a venirne a capo...help

sto realizzando un progetto e ho questo lcd con modulo rtc ds1307 i2c che utilizzo con wire,
stampo data ora e mi va fuori scala(tipo secondi 70) così converto in hex e tutto apposto,dopodichè ho un menù dove posso modificare l’ora e quando invio l’ora la converte in esadecimale alterandone la cifra cosa sbaglio?

 //inizzializza la trasmissione partendo
  //dall'indirizzo 0x00
  Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();

  //richiedo 7 byte dal dispositivo con
  //indirizzo 0x68
  Wire.requestFrom(0x68, 7);
  //regupero i 7 byte relativi ai
  //corrispondenti registri
  byte Secondi = Wire.read();
  byte minuti = Wire.read();
  byte ore = Wire.read();
  byte Giorno = Wire.read();
  byte giorno_mese = Wire.read();
  byte mese = Wire.read();
  byte anno = Wire.read();

  Minuti = minuti;
  Ore = ore;

 if (p == 1) // ore
     {
       lcd.setCursor(14, 0); // ora
       char key = keypad.getKey();
       if (key == '*') {
         OreTemp--;
         f = 1;
         if (OreTemp < 00) OreTemp = 23;
       }
       if (key == '#')  {
         OreTemp++;
         f = 1;
         if (OreTemp > 23) OreTemp = 00;
       }
       if (f == 1)
       {
         t = TIMEWATCH; f = 0;
         lcd.setCursor(13, 0);
         if (OreTemp < 10) lcd.print("0");
         lcd.print(OreTemp);
       }

       if (key == 'A') {
         t = TIMEWATCH;
         p = 2;
       }
       if (key == 'B') {
         t = TIMEWATCH;
         p = 99;
       }
     }

     if (p == 2) // minuti
     {
       lcd.setCursor(17, 0);
       char key = keypad.getKey();
       if (key == '*') {
         MinutiTemp--;
         f = 1;
         if (MinutiTemp < 00) MinutiTemp = 59;
       }
       if (key == '#')  {
         MinutiTemp++;
         f = 1;
         if (MinutiTemp > 59) MinutiTemp = 00;
       }
       if (f == 1)
       {
         t = TIMEWATCH; f = 0;
         lcd.setCursor(16, 0);
         if (MinutiTemp < 10) lcd.print("0");
         lcd.print(MinutiTemp);
       }


       Serial.println (MinutiTemp);
       Serial.println (OreTemp);
       Serial.println ("pre");


       int OreTempConv = (OreTemp);
       int MinutiTempConv =(MinutiTemp);

       Serial.println (OreTempConv);
       Serial.println (MinutiTempConv);
       Serial.println ("post");

       Wire.begin();
       Wire.beginTransmission(0x68); 
       Wire.write((int)0);
       //specifico il tempo e la data


       Wire.write((byte)0x00); //1° byte SECONDI da 0x00 a 0x59
       Wire.write(MinutiTempConv); //2° byte MINUTI da 0x00 a 0x59
       Wire.write (OreTempConv); //3° byte ORE da 0x00 a 0x24
       Wire.write (byte(Giorno)); //4° byte GIORNO della settimana da 0x01 a 0x07
       Wire.write((byte)0x23); //5° byte GIORNO del mese da 0x00 a 0x31
       Wire.write((byte)0x04); //6° byte MESE da 0x00 a 0x12
       Wire.write((byte)0x20); //7° byte ANNO 0x00 a 0x99
       Wire.endTransmission();

In verità i dati nel DS1307 sono memorizzati in un formato diverso (... formato BCD, lo scopri leggendo il datasheet), per cui ti occorrono due routines di conversione da e verso BCD ...

// ------------------- decToBcd -------------------------

uint8_t decToBcd(uint8_t val) {
   return ( (val/10*16) + (val%10) );
}

// ------------------- bcdToDec -------------------------

uint8_t bcdToDec(uint8_t val) {
   return ( (val/16*10) + (val%16) );
}

... routines che devi usare nella lettura e scrittura dei valori seguendo le indicazioni appunto presenti nel datasheet.

Esempio:

byte Secondi = bcdToDec(Wire.read() & 0x7f);
byte minuti  = bcdToDec(Wire.read());
byte ore     = bcdToDec(Wire.read() & 0x3f);
...

Guglielmo

grazie funziona benissimo,adesso ho qualche problema con il day però credo che sia legato sempre a questo ora controllo..

gianzap:
grazie funziona benissimo,adesso ho qualche problema con il day però credo che sia legato sempre a questo ora controllo..

Attento a non confondere il byte che rappresenta il giorno della settimana (byte 0x03 - "day" : 1..7 dove 1 = domenica) con il byte che rappreenta la data (byte 0x04 - "date" : 1..31).

Guglielmo