Forum: Mikrocontroller und Digitale Elektronik Alarmfunktion der RTC 8564


von matt (Gast)


Lesenswert?

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

von Erich F. (fler)


Lesenswert?

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

von Silvan K. (silvan) Benutzerseite


Lesenswert?

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.

von Erich F. (fler)


Lesenswert?

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

von Silvan K. (silvan) Benutzerseite


Lesenswert?

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.

von Erich F. (fler)


Lesenswert?

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?

von Silvan K. (silvan) Benutzerseite


Lesenswert?

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
[...]

von Erich F. (fler)


Lesenswert?

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

von Silvan K. (silvan) Benutzerseite


Lesenswert?

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?

von Erich F. (fler)


Angehängte Dateien:

Lesenswert?

Hallo
Anbei der Schaltplan.
Laut Osci bekomme ich kein ACK vom RTC.

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.