Hallo, ich will die RTC 8564 von Epson in Betrieb nehmen. Uhrzeit stellen und lesen funktioniert schon problemlos, aber anscheinend habe die Konfiguration der Alarmfunktion noch nicht verstanden. Wenn ich z.B. um 17.02 einen Alarminterrupt bekommen will, setze ich im Kontrollregister 2 das Bit 1 (AIE). Bei Minuten und Stundenalarm stelle ich die Zeit ein und setze das AE-Flag: writeiic(0x01,0x02); writeiic(0x09,(2 | 0x80)); writeiic(0x0A,(17 | 0x80)); Ich bekomme aber weder einen Interrupt auf dem Oszi, noch wird das AF gesetzt. Was mache ich falsch? matt Datenblatt: http://www.epsondevice.com/www/PDFS/epdoc.nsf/WE_rtc/4E5D74F3C1258E4049256A7F0003BAB0?OpenDocument
Hallo Dein Beitrag ist schon etwas älter aber vielleicht hast du nun schon deine lösung. Ich möchte auch einen rtc8564JE in betrieb nehmen jedoch habe ich das Problem das ich keine antwort vom RTC bekomme. Nun bin ich mir nicht sicher ob ich einen SW-Fehler habe oder ob mein IC tot ist. Ich schreibe zuerst 0x02 auf die adresse 0xA2 und dann lese ich 7byte ein. Aber wie gesagt keine Antwort. Der IC ist noch im Jungfräulichen zustand damit meine ich, das ich noch keine zeit auf den RTC geschrieben habe. Aber er sollte dann von 00:00:00 weglaufen oder? Könnte mir hier jemand helfen? Der Master ist ein Xmega128A1
Erich Floh schrieb: > Dein Beitrag ist schon etwas älter aber vielleicht hast du nun schon > deine lösung. Der Beitrag ist von 2004, dass heißt er ist brandaktuell! ;-) Ich hab das Datenblatt mal überflogen. Hast du dir in dem Datenblatt die Erklärung zum I²C Bus durchgelesen? Du musst zuerst die Adresse der RTC auf den Bus schreiben und dann die Registeradresse und zum Schluss die Daten.
Hallo Ja gelesen hätte ich jedoch habe ich trotzdem keinen erfolg. Hier der Code villeicht habe ich etwasübersehen. RTC_ADDR ist A2 void rtc_auslesen(TWI_Master_t *twi) { uint8_t start_adresse[1]; start_adresse[0]=0x00; start_adresse[1]=0x02; // Leseadresse nach RTC schreiben TWI_MasterWrite(&twiMaster,RTC_ADDR,start_adresse,2); while (twiMaster.status != TWIM_STATUS_READY) { /* Wait until transaction is complete. */ } // Datum,Uhrzeit aus RTC TWI_MasterWriteRead(&twiMaster,RTC_ADDR,0,0,7); //TWI_MasterWriteRead hier read! while (twiMaster.status != TWIM_STATUS_READY) { /* Warten bis complete. */ } rtc_buf.sekunde = rtc_bcd_to_hex(twiMaster.readData[0]); //sek rtc_buf.minute = rtc_bcd_to_hex(twiMaster.readData[1]); //minute rtc_buf.stunde = rtc_bcd_to_hex(twiMaster.readData[2]); //stunde rtc_buf.w_tag = rtc_bcd_to_hex(twiMaster.readData[3]); //tag in der Woche rtc_buf.tag = rtc_bcd_to_hex(twiMaster.readData[4]); //tag rtc_buf.monat = rtc_bcd_to_hex(twiMaster.readData[5]); //monat rtc_buf.jahr = rtc_bcd_to_hex(twiMaster.readData[6]); //jahr
Erich Floh schrieb: > uint8_t start_adresse[1]; > start_adresse[0]=0x00; > start_adresse[1]=0x02; Fehler 1:
1 | uint8_t start_adresse[2]; //2 statt 1 |
2 | start_adresse[0] = 0x00; |
3 | start_adresse[1] = 0x02; |
Fehler 2: Erich Floh schrieb: > TWI_MasterWriteRead(&twiMaster,RTC_ADDR,0,0,7); Ich denke daran liegt es: Wenn ich das richtig interpretiere schickt die Funktion zuerst die Adresse der RTC auf den Bus, dann die Adresse des Registers, und liest dieses dann aus. RTC_ADDR ist die Adresse der RTC und die erste Null die Adresse des Registers. Poste bitte mal die Funktionsdefinition.
Hallo void rtc_auslesen(TWI_Master_t *twi) // DS1338 auslesen und Datum und Uhrzeit speichern { uint8_t start_adresse[1]; start_adresse[0]=0x00; start_adresse[1]=0x02; // Leseadresse nach RTC schreiben // TWI_MasterWrite(&twiMaster,RTC_ADDR,start_adresse,2); +++Hier wird die SlaveAdresse und StartRegister 2 Byte geschrieben // while (twiMaster.status != TWIM_STATUS_READY) { /* Wait until transaction is complete. */ // } TWI_MasterWriteRead(&twiMaster,RTC_ADDR,0,0,7); //TWI_MasterWriteRead hier read! while (twiMaster.status != TWIM_STATUS_READY) { /* Wait until transaction is complete. */ } ++Hier wird SlaveAdresse,0 sendedaten, 0 SchreibLänge,7 Leselänge) In diesem Fall wird bei dieser Funktion nicht geschrieben sondern nur gelesen. Ich habe das datenblatt abermald durchgesehen aber ich denke es liegt nicht an der SW sondern am IC. Mir ist noch bekannt von Irgend einem RTC das man ein bit setzen muss damit er lauft sonst steht er. Ist das bei dem auch so?
Fehler gefunden - es liegt an der Software: http://www.e-lab.de/downloads/DOCs/RTC8564.pdf Da hätte ich früher dran denken müssen: unten auf Seite 8 steht, dass das Bit 0 in der Adresse der RTC sich ändert, je nach dem, ob du schreiben oder lesen willst. Also: lesen: 0b10100011 (0xA3) schreiben: 0b10100010 (0xA2)
1 | #define READ 0x01
|
2 | #define RTC_ADDR 0xA2
|
3 | [...]
|
4 | TWI_MasterWriteRead(&twiMaster, RTC_ADDR|READ ,0,0,7); |
5 | [...]
|
Hallo Nein das ist nicht der Fehler. Das ist in der TWI_writeRead funktion enthalten. Je nachdem Welche Transaktion durchgeführt wird wird das 8. bit 0 oder 1 gesetzt. mfg
Erich Floh schrieb: > Nein das ist nicht der Fehler. > Das ist in der TWI_writeRead funktion enthalten. > Je nachdem Welche Transaktion durchgeführt wird wird das 8. bit 0 oder 1 > gesetzt. Mist. Es hätte so einfach sein können. Erich Floh schrieb: > Mir ist noch bekannt von Irgend einem RTC das man ein bit setzen muss > damit er lauft sonst steht er. Das hab ich wohl überlesen. Dieses Bit existiert. "Stop" im "Control 1" Register (Adresse 0x00). Wenn ich das richtig sehe überschreibst du das Register in der Funktion TWI_MasterWrite() aber mit 0x00. Also sollte die RTC laufen. Wie hast du denn die RTC angeschlossen?
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.