www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS1307 und Mega8


Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai Eichhorn (kai20)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke
werde ich gleich mal Testen...

Gruß André

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: Kai Eichhorn (kai20)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch mal ne Frage:
ich habe nun folgenden code gebaut:

uint8_t dec = 00110011;

-snip-

if (debounce(&PINB, PB4))             // Falls Taster an PIN PB4 gedrueckt
    {
    lcd_clrscr();         // clear lcd
    bcd2hex(dec);         // BCD to hex convert
    lcd_gotoxy(5,0);      // xy position on LCD
    hex2bcd(dec);         // hex to bcd convert
    dec++;                // inkrement dec

-snip-

void bcd2hex (uint8_t y)              
{
  
  y = ((((y >> 4) & 0x0F) * 10) + (y & 0x0F));
  if (y < 10 )                  // wenn kleiner 10 dann ...
  {  
    lcd_putc (0x30);      // ...null anzeigen
    itoa_lcd (y);
  }
  else
    itoa_lcd (y);
}


//
void hex2bcd(char dec)
{
  ((((dec)/10)<<4)|((dec)%10));
  itoa_lcd(dec);
}


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

Autor: p_greendale (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.