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
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
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é
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.