Forum: Mikrocontroller und Digitale Elektronik DS1307 macht Probleme


von Gerhard H. (oderlachs)


Lesenswert?

Hallo Freunde !

Muss mal wieder mit 'ner Frage kommen, da ich sie mir nicht selber 
beantworten kann.
Wohlgemerkt, ich habe nicht hier sinnlos drauf los geschrieben, ohne 
mich vorher im Web auch hier im Forum zu belesen.
Vielleicht habe ich wieder den Fehler einen "Betriebsblinden" beim Code 
schreiben.

Beim Lesen eines Datenbytes mit ACK bleibt das Programm hängen:
1
/*====================================================================*/
2
/*                                                                    */
3
/*              Empfange Daten  m ACK                                 */
4
/*              TW_MR_DATA_ACK                                        */
5
/*                                                                    */
6
/*====================================================================*/
7
8
uint8_t TWI_Read_Databyte_Ack(void)
9
  {
10
    TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA);
11
    while (!(TWCR & (1<<TWINT)));
12
    while((TWSR & 0xF8) != TW_MR_DATA_ACK); // Check ACK  Fehler ??
13
    return TWDR;
14
  }

Wenn ich die zweite while Zeile auskommentiere geht das Programm weiter, 
aber das soll ja nicht der Ausweg sein.

Ich habe den Gesamtcode auf meiner Homepage:

http://oderlachs.de/code/AVR/AVR_RTC_Test.html

Auch werden mir bei ser. Ausgabe die Brotpreise von Wildwest angezeigt.

Das gesamte "UART-Gedöse" musste ich verwenden, um eine serielle 
Fehlerausgabe bei Bedarf zu haben.
Leider kann ich unter "Geany" (Linux) nicht eine extra uart.c/uart.h 
einbinden, darum alles in eine einzige Datei geschrieben, aber ich hoffe 
habe es gut kommentiert.

Vielleicht findet ja ein geübtes Augen den Teufelsfuß oder 
Gedankenfehler im Code?

Gruss und Danke

Gerhard

von 50c (Gast)


Lesenswert?

Gerhard H. schrieb:
> Leider kann ich unter "Geany" (Linux) nicht eine extra uart.c/uart.h
> einbinden, darum alles in eine einzige Datei geschrieben, aber ich hoffe
> habe es gut kommentiert.

...das kann ich mir nicht vorstellen! Wie sieht dein Makefile aus?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Gerhard H. schrieb:
> while((TWSR & 0xF8) != TW_MR_DATA_ACK); // Check ACK  Fehler ??
>     return TWDR;
>   }
>
> Wenn ich die zweite while Zeile auskommentiere geht das Programm weiter,
> aber das soll ja nicht der Ausweg sein.

 LOL.
 Natürlich.
 Wie wäre es mit IF-Abfrage, anstatt ewig in deiner While Schleife
 zu warten ?
1
    if((TWSR & 0xF8) != TW_MR_DATA_ACK); // Check ACK  Fehler ??

P.S.
 Und die erste While-Schleife kann man auch mit einer FOR-Schleife
 ersetzen - so bleibt dein Programm beim blockertem Bus nicht hängen.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Gerhard H. schrieb:
> Auch werden mir bei ser. Ausgabe die Brotpreise von Wildwest angezeigt.
1
    second =  BCD_To_Decimal(second & 0x7F);
2
    minute =  BCD_To_Decimal(minute & 0x7F);
3
    hour   =  BCD_To_Decimal(hour & 0x3F);

 So besser ?

von Gerhard H. (oderlachs)


Lesenswert?

Hallo Euch allen vielen Dank !

@50C :

Geany hat wohl eine eigene selbst erstellte Make-Datei, die es nutzt. 
Muss gestehen braucht nur wenige male vor langer Zeit eine selber zu 
schreiben.
Bin froh wenn ich nicht so viel tippen muss ;) Bin in Make Sachen auch 
nicht so firm...weil eben ich es fast nie gebraucht habe.

@Marc :

Ja warum while und nicht if ?
Für mich ist es einfach ne Sache des Programmierers, wie er den Code 
auslegt.
Natürlich hat beides Vor- und Nachteile. Übrigens läuft es jetzt auch 
mit der vorher sich sperrenden Zeile:

 "while((TWSR & 0xF8) != TW_MR_DATA_ACK);",

so wie es soll.

Zu BCD_To_Decimal, habe es mal nach Deinem Vorschlag geändert, nun nur 
noch "0" als Ausgabe.

Es ist ja mein erstes DS1307 Projekt, vielleicht mache ich auch noch 
Fehler in der Denkweise beim Schreiben oder Lesen von Registerwerten.

Gruss & Dank

Gerhard

: Bearbeitet durch User
von Gerhard H. (oderlachs)


Angehängte Dateien:

Lesenswert?

Hallo Freunde !

Da ich nicht mehr bearbeiten kann, noch einmal eine separate Antwort von 
mir.

Es geht jetzt, weiss der Kuckuck, vielleicht haben meine Schreib und 
Leseversuche den DS1307 etwas verwirrt, nach Batteriewechsel und neu 
Setzen der Zeit & Datum habe ich eine Korrekte Zeit und Datumsangabe. 
Lediglich der Wochentag stimmt nicht(siehe Anhang), aber das werde ich 
auch noch hinbekommen.

Ich danke Euch allen nochmal für die Mithilfe, das hat mich indirekt 
doch ein ganzes Stück weiter gebracht, weil man sich ja über Eure 
Antworten und Vorschläge Gedanken macht.

Mit besten Grüssen und grossem Dank !!

Gerhard

von Hmmm (Gast)


Lesenswert?

Gerhard H. schrieb:
> Lediglich der Wochentag stimmt nicht(siehe Anhang)

Vermutlich hast Du den nicht (richtig) gesetzt, das passiert nicht 
automatisch.

von Patrick H. (Firma: privat) (pathoff)


Lesenswert?

Hallo Gerhard,

> Es geht jetzt, weiss der Kuckuck, vielleicht haben meine Schreib und
> Leseversuche den DS1307 etwas verwirrt, nach Batteriewechsel und neu
> Setzen der Zeit & Datum habe ich eine Korrekte Zeit und Datumsangabe.
Ich hatte auch mal Probleme mit unzuverlässigen I2C-Zugriffen auf den 
DS1307, allerdings weil ich zum Testen keine Batterie eingelegt hatte 
und so der VBAT-Anschluss einfach offen blieb. Siehe auch 
Beitrag "DS1307 VBAT anschließen JA oder NEIN"
Dein "weiß der Kuckuck" erinnerte mich daran, obwohl ein offener 
VBAT-Anschluss ja bei dir offensichtlich nicht das Problem sein kann. 
Aber vielleicht war die alte Batterie nicht mehr Ok.

Gruß,
PatHoff

von Gerhard H. (oderlachs)


Lesenswert?

Danke PatHoff !

Ich glaube ich wäre in die selben Fussangeln getreten, sollte ich mal 
ohne Pufferbatterie was testen.

Man kann das Datenblatt gar nicht allzu oft studieren, man wird fast 
immer noch Unentdecktes finden.

Wäre mir bestimmt so gegangen, hätte ich den DS1307 Solo auf 'nem 
Steckbrettchen, habe aber nur fertige Module zur Hand, wo eigentlich 
auch immer eine Intakte Batterie drauf ist.

Mit den Erfahrungen von dieses Projekt hatte auch gleich ein 
wiederholtes Projekt mit einen I2C EEprom auf Anhieb geklappt.



Gruss & Dank

Gerhard

: Bearbeitet durch User
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.