Forum: Mikrocontroller und Digitale Elektronik DS1307 und Mega8


von Andre H. (andre01)


Lesenswert?

Hallo,
ich habe da ein kleines Problem mit meinem Mega8 und dem RTC.
Ich Programmiere erst seit kurzem in C und auf dem AVR. Nun habe ich das 
alles soweit das ich einen DS 1307 über die Hardware TWI auslesen kann. 
Die anzeige via LCD klappt auch. So nun möchte ich den RTC auch die 
richtige Uhrzeit mitteilen. Dafür habe ich mir eine kleines Menue 
gemacht durch das ich mit drei Tasten gehen kann.
Im Set Time Menue lese ich einmal die Uhrzeit ein und packe jeden Teil 
der Uhrzeit ( hh,mm,sec ) in eine variable. Blinkende Cursor steht im 
display und mit Tastendruck lasse ich die z.b. Stundenvariable erhöhen ( 
time.hour++ )
klappt eigentlich auch. Nur die Sache ist das die Stunden irgendwann 
anfangen zuspringen, meine es werden mal zahlen ausgelassen und gezählt 
wird über 30 in der Anzeige. Denke mir mal das es damit zusammen hängt 
das die zeit die ich aus dem RTC lese BCD kodiert ist und ich sie zum 
Anzeigen in ein HEX zahl umwandel um sie dann per itoa auf das Display 
zu bringen.

Nun zur Frage wie mache ich das denn nun am besten mit dem Zeitstellen?
Muß ich eine Variable in Hex hochzählen und sie dann wieder in eine BCD 
wandeln und sie zum DS1307 schicken? Wenn ja wie wandle ich am 
einfachsten eine HEX in eine BCD ?

Gruß Andre

von Kai E. (kai20)


Lesenswert?

Hallo Andre,

ich würde die Daten aus der DS1307 RTC auslesen und dann nach dezimal 
wandeln. In deinem Programm kannst du diesen Werte dann verrechnen.

Wenn du die Werte wieder in die RTC schreiben moechtest, wandle einfach 
DEC nach BCD zurueck und fertig.

Hier habe ich noch zwei Routinen zur Umwandlung gefunden :

unsigned char bcd2dec(unsigned char bcd){
  return (((((bcd)>>4) & 0x0F) * 10) + ((bcd) & 0x0F));
}

unsigned char dec2bcd(unsigned char dec){
  return ((((dec)/10)<<4)|((dec)%10));
}

Grüße,
Kai

von Andre H. (andre01)


Lesenswert?

Danke
werde ich gleich mal Testen...

Gruß André

von Andre H. (andre01)


Lesenswert?

Irgendwie klappt das nicht...
bis zur 10 geht es. dann springen die zahlen im Display wieder...
Hat jemand vielleicht mal einen beispiel in C wie man den DS1307 stellt.

Gruß André

von Kai E. (kai20)


Lesenswert?

Hallo nochmal,

ich hatte es damals so geloest :

/*---------------------------------------------------------------------- 
----*/
void write_DS1307(unsigned char adr, unsigned char daten)
{
   start();
   out(DS1307_ADDR&0xFE);
   out(dec2bcd(adr));
   out(dec2bcd(daten));
   stop();
}
/*---------------------------------------------------------------------- 
----*/
unsigned char read_DS1307(unsigned char adr)
{
   unsigned char val;

   start();
   out(DS1307_ADDR&0xFE);           /* LSB=0 => write */
   out(dec2bcd(adr));

   start();
   out(DS1307_ADDR|0x01);           /* LSB=1 => read */
   val=bcd2dec(readbyte());
   stop();
   return(val);
}

Gruß,
Kai

von Andre H. (andre01)


Lesenswert?

Noch mal ne Frage:
ich habe nun folgenden code gebaut:
1
uint8_t dec = 00110011;
2
3
-snip-
4
5
if (debounce(&PINB, PB4))             // Falls Taster an PIN PB4 gedrueckt
6
    {
7
    lcd_clrscr();         // clear lcd
8
    bcd2hex(dec);         // BCD to hex convert
9
    lcd_gotoxy(5,0);      // xy position on LCD
10
    hex2bcd(dec);         // hex to bcd convert
11
    dec++;                // inkrement dec
12
13
-snip-
14
15
void bcd2hex (uint8_t y)              
16
{
17
  
18
  y = ((((y >> 4) & 0x0F) * 10) + (y & 0x0F));
19
  if (y < 10 )                  // wenn kleiner 10 dann ...
20
  {  
21
    lcd_putc (0x30);      // ...null anzeigen
22
    itoa_lcd (y);
23
  }
24
  else
25
    itoa_lcd (y);
26
}
27
28
29
//
30
void hex2bcd(char dec)
31
{
32
  ((((dec)/10)<<4)|((dec)%10));
33
  itoa_lcd(dec);
34
}


Anfangsanzeige im Display ist 09  und  9.
Drücke ich den Taster wird dec erhöht die Anzeige im display ändert 
sich.
beim
        bcd2hex   hex2bcd
1. druck  10        10
2.        11        11
3         12        12
...
7         10        16
...
8         16        22
9         17        23
und das geht weiter die zweite Anzeige ( hex2bcd )  wird immer brav um 
einen erhöht je tasten druck.
nach      25        31
springt die Anzeige wieder auf
          20        32
was wird denn da falsch gerechnet?
Ich sehe da gerade nicht ganz durch was ich da falsch mache?!?

Das bcd2hex müßte eigentlich korrekt funktionieren, denn damit 
funktioniert die Umwandlung und anzeige der BCD-zeitinformationen des 
ausgelesen DS1307 auf dem Display

Gruß
Andre

von p_greendale (Gast)


Lesenswert?

Mojen,
ich hab im moment auch ziemliche probleme mit der Zeit vom DS1307. 
Inzwischen hab ich n zweites Datenblatt gefunden (gibt eines von maxim 
und eins vn dallas) , im letzteren steht in der Bitaufschluesselung 
drin, dass bit5 vom Stundenbyte fuer die zehnerstelle verantwortlich 
ist. Muss man also wahrscheinlich gesondert verwenden. Hab bisher nur 
noch nicht die zeit gehabtm mir das anzusehen. MfG.
Peter

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.