Forum: Mikrocontroller und Digitale Elektronik DS1307 und BCD


von Dave (Gast)


Lesenswert?

Hallo,

habe Problem bei RTC DS1307.

Ich schreibe eine Zeit auf den RTC und versuche diese wieder auszulesen. 
Die Zeiten (Sekunden) machen aber Sprünge.


Ich glaube das liegt daran, dass die ausgelesenen Register in BCD 
ausgegeben werden und noch in int gewandetl werden müssen, oder?

Hier der verwendete Code:

1
//DS1307 Configuration
2
#define DS1307  0x68       // Adresse des DS1307 ist 0x68
3
4
#define SECOND    0b01011001  // Sekunden auf 59 einstellen
5
#define MINUTE    0b00110101  // Minuten auf 33 einstellen
6
#define HOUR    0b00000100  // BIT6=24h-Einstellung; BIT4,5 entsprechen Stunden Zehner,
7
                  // BIT0-3 entsprechen Stunden Einer
8
#define DAY      0b00000111  // WochenTag entspricht 7 (Festlegung noch treffen)
9
#define DATE_DAY  0b00100100  // Datum Tag entspricht 24
10
#define DATE_MONTH  0b00010001  // Monat entspricht 11, BIT7=Jahrhundert=0
11
#define DATE_YEAR  0b00100010  // Jahr entspricht 22
12
13
int main(void)
14
{
15
16
  char seconds[3];
17
  char minutes[3];
18
  char hours[3];
19
20
  //Initialisiere I²C
21
  i2c_init();
22
23
    ret = i2c_start((DS1307<<1)+I2C_WRITE);        // set device address and write mode
24
    _delay_ms(50);                // sicherheitshalber warten
25
  if ( ret ) 
26
  {
27
        //wenn bei I2C ein Fehler auftritt: Meldung Error an LCD
28
       i2c_stop();
29
       lcd_string("I2C Error!");
30
                                 
31
    }
32
  else 
33
  {
34
// Zeit einstellen:
35
  i2c_start((DS1307<<1)+I2C_WRITE);
36
    i2c_write(0x00);            // ab Adresse 0x00 schreiben
37
  
38
    i2c_write(SECOND);            // Adresse 0x00 (Sekunden) beschreiben  
39
        
40
    i2c_write(MINUTE);            // Adresse 0x01 (Minuten) beschreiben      
41
          
42
    i2c_write(HOUR);            // Adresse 0x02 (Stunden) beschreiben          
43
44
    i2c_write(DAY);              // Adresse 0x03 (Wochentag)  beschreiben  
45
          
46
    i2c_write(DATE_DAY);          // Adresse 0x04 (Datum Tag)  beschreiben  
47
      
48
    i2c_write(DATE_MONTH);          // Adresse 0x05 (Monat) beschreiben
49
                  
50
    i2c_write(DATE_YEAR);          // Adresse 0x06 (Jahr) beschreiben  
51
52
  i2c_stop();                               // I2C Übertragung beenden, Bus freigeben
53
54
while (1)
55
 {
56
57
// Zeit komplett auslesen:
58
59
  i2c_start((DS1307<<1)+I2C_WRITE);          // warte bis I2C frei ist und schreibe dann
60
          
61
    i2c_write(0x00);                        // bei Adresse 0x00 anfangen
62
      
63
    
64
      i2c_start((DS1307<<1)+I2C_READ);
65
    
66
    read_seconds   = i2c_readAck();         // Adresse 0x00 (Sekunden) auslesen        
67
        
68
    read_minutes   = i2c_readAck();         // Adresse 0x01 (Minuten) auslesen        
69
          
70
    read_hours    = i2c_readAck();      // Adresse 0x02 (Stunden) auslesen
71
    
72
    read_day    = i2c_readAck();    // Adresse 0x03 (Wochentag) auslesen
73
  
74
    read_date     = i2c_readAck();    // Adresse 0x04 (Datum Tag) auslesen
75
  
76
    read_months    = i2c_readAck();      // Adresse 0x05 (Monat) auslesen         
77
        
78
    read_years     = i2c_readNak();       // Adresse 0x06 (Jahr) auslesen            
79
  
80
  i2c_stop();                               // I2C Übertragung beenden, Bus freigeben
81
82
  lcd_setcursor(0,2);
83
  itoa(read_seconds,seconds,10);
84
  itoa(read_minutes,minutes,10);
85
  itoa(read_hours,hours,10);
86
87
  lcd_string(hours);
88
  lcd_string(":");
89
  lcd_string(minutes);
90
  lcd_string(":");
91
  lcd_string(seconds);
92
 }
93
}

von Dave (Gast)


Lesenswert?

Ich bin hier im Forum auf eine Funktion gestoßen, mit der ich BCD in DEZ 
wandeln kann. Das Einbinden der Funktion führt allerdings noch nicht zum 
gewünschten Erfolg. Die Uhr zählt immernoch falsch. 0 1 2 3 4 5 6 8 9 10 
11 12 13 14 16 17 18

Es fehlen immer einzelne Sekunden.
1
unsigned char bcd2dec(unsigned char bcd){
2
  return (((((bcd)>>4) & 0x0F) * 10) + ((bcd) & 0x0F));
3
}

Ich versuche die Funktion gerade zu verstehen und anhand eines Bsp. 
nachzuvollziehen.

Ich habe z.b. als BCD 0000 0111 (entspricht Dez 7).

(0000 0111)>>4       //alles um 4 nach rechts verschieben --> (0000 
0000)
(0000 0000) & 0x0F   //Vergleichen müsste liefern --> (0000 0000)
(0000 0000) * 10     // Ergebnis --> (0000 0000)

(0000 0000) + ((0000 0111) & 0x0F)

(0000 0111) & (0000 1111) // Ergebnis -->(0000 0111) also Dez 7

Damit ergibt sich dez 0 + dez 7  = 7

von Dave (Gast)


Lesenswert?

Fehler gefunden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.