Hallo, ich versuche nun schon seit 2 Wochen aus dem DS1307 vernünftige
Werte zu bekommen. Im Anhang befindet sich einmal das gesamte
Projekt(Den Code selbst hier rein zu schicken ergibt keinen Sinn, da er
auf mehrere Dateien verteilt ist). Der Atmega328p läuft mit 8MHz über
den internen Quarz (falls das für euch wichtig ist). An der Schaltung
liegt es nicht, diese habe ich bereits mehrfach geprüft und habe sie
auch von dritten prüfen lassen. Hängen tut der Code in der
1
i2c_start_wait()
(twimaster.c) wenn ich versuche die Werte auszulesen. Hängen genau tut
der Code genau an dieser Stelle
1
while(TWCR&(1<<TWSTO));
an der gewartet werden soll bis die Stoppbedingung durch ist und der
Bus wieder frei.
Jonas N. schrieb:> vielleicht helfen einen Lösungsansatz zu finden
Messe die Spannung an SCA und SDL. Sie müssen vor der ersten
Kommunikation schon auf HIGH sein. Und danach auch.
Überprüfe die beiden Leitungen mit einem Oszilloskop und zeige uns das
Bild.
Am einfachsten geht das, indem zu die Kommunikation nur einmal nach
einem Tastendruck versuchst und das Oszilloskop auf den Tastendruck oder
auf die fallende Flanke an SDA triggerst.
TWDR=slave_address<<1;// keine Ahnung, welche Adresse deine RTC hat
13
TWCR=(1<<TWINT)|(1<<TWEN);
14
while(!(TWCR&(1<<TWINT)));
15
if((TWSR&0xf8)!=0x18){
16
// Hier bitte eine Fehlermeldung ausgeben
17
}
18
19
// Sende STOP
20
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
Das sollte 9 Takte auf SCL erzeugen und ein Byte auf SDA übertragen. Das
ist mit einem digitalen Oszilloskop recht übersichtlich darstellbar.
Wenn die Slave Adresse richtig ist, sollte die RTC die Leitung SDA beim
9. Takt auf LOW ziehen.
Habs mal eben nach gebaut und funktioniert bei mir ohne Probleme.
Wen du dir absolut sicher bist dass du SCL und SDA über Widerstände auf
High ziehst und alles richtig verkabelt ist würde ich den DS1307 chip
austauschen wenns immer noch nicht klappt den atmega 328 tauschen
Ich habe in meinem fall nen Arduino uno genommen und nen DS1307 Chip.
Wenn ich die Pullup-Widerstände abziehe bekomme ich genau den von dir
beschriebenen Effekt dass er in
ok ich hab eben mal versucht einen quarz dran zu hängen, da ich leider
keinen mit 32.768kHz da hatte hab ichs mit nem anderen versucht und nun
hab ich das gleiche Problem wie du.
Habs jetzt mal an ein grove - ds1307 gehängt.
Auf dem Board ist ja nur der DS1307 Chip, ein quarz und 2 Pullup
Widerstände.
Funktioniert einwandfrei.
Hab mir mal nur die Sekunden ausgeben lassen.
Liegt also eindeutig nicht am Code.
Z.B. Max schrieb:> Ich habe in meinem fall nen Arduino uno genommen und nen DS1307 Chip.
Ohne Abblock-Kondensator an der Stromversorgung des IC ist alles
möglich. Den solltest du nicht weglassen.
Funktioniert der Chip überhaupt ohne Quarz?
Wie stehen die Fuses? Wie ist der Compiler konfiguriert? (boards.txt)
Wenn du bspw. auf externen Quarz gefused hast und da ist keiner, dann
schwingt garnichts.
Teilst du dem Compiler die falsche Frequenz mit, haut dein Timing nicht
hin (8 statt 16 Mhz, oder umgekehrt)
Das kann z.B. der Fall sein, wenn du das falsche Board in der IDE
auswählst 3,3 statt 5V Variante und umgekehrt.
C-hater schrieb im Beitrag #7484043:
> Jonas N. schrieb:>>> Der Atmega328p läuft mit 8MHz über>> den internen Quarz>> Und schon ist klar: Troll oder Vollidiot. Troll-Vermutung ist wohl> wahrscheinlicher.
Was ist denn das bitte für eine Ausdrucksweise?
Nicht jeder wird Allwissend geboren und wir haben alle verstanden was er
mit internen Quarz gemeint hat.
Deswegen ist man noch lange kein Vollidiot...
Steve van de Grens schrieb:> Das sollte 9 Takte auf SCL erzeugen und ein Byte auf SDA übertragen. Das> ist mit einem digitalen Oszilloskop recht übersichtlich darstellbar.> Wenn die Slave Adresse richtig ist, sollte die RTC die Leitung SDA beim> 9. Takt auf LOW ziehen.
Sieht das so in Ordnung aus?
ist HEX 0x40 in DEC 64 ?? evtl. führt das zum Problem ?
Wo ist denn jetzt überhaupt noch das Problem ? Du konntest doch die
Sekunden auslesen. Hast du ein 100nF (Abblockkondensator) hinzugefügt ?
Gruß
> ist HEX 0x40 in DEC 64 ?? evtl. führt das zum Problem ?
Hab ich korrigiert, hat aber dennoch nichts geändert.
> Wo ist denn jetzt überhaupt noch das Problem ? Du konntest doch die> Sekunden auslesen.
Nein konnte ich nicht, hab immer noch das Problem überhaupt nichts lesen
zu können.
> Hast du ein 100nF (Abblockkondensator) hinzugefügt ?
Ja
> das Terminal bleibt logischerweise schwarz
Ich würde generell am Programmbeginn ein 'hallo' einbauen, um Probleme
im Ausgabebereich ausschließen zu können.
Jonas N. schrieb:> Der Atmega328p läuft mit 8MHz über> den internen Quarz
hat intern kein Quarz!
Jonas N. schrieb:> Hier einmal die gesetzten Fuses und der Schaltplan.
warum schwindelst du?
Quarz ist auch nicht eingezeichnet
Jonas N. schrieb:> Versuche es morgen auch mal ohne den Quarz.
wo wird denn F_CPU gesetzt? Welchen I2C Clock nutzt du?
Ich durchsuche nun nicht den ganzen Code, irgendwo wird dein Fehler
sein.
Hallo,
nimm mal eine andere Lib für I²C oder DS1307 Modul.
sieht schonmal komisch aus, wenn die Header und C Datei nicht den selben
Namen haben (muss natürlich nichts heißen).
google einfach mal : "atmega328P IIC github" und probiere eine andere
aus.
Wenn du ganz einfach machen willst lad dir die Arduino IDE wähl da den
Atmega328P (UNO) aus und probiere ein Beispiel.
Hab auch keine Zeit komplett durch die Lib zu surfen.
Gruß
Joachim B. schrieb:> Jonas N. schrieb:>> Der Atmega328p läuft mit 8MHz über>> den internen Quarz>> hat intern kein Quarz!>> Jonas N. schrieb:>> Hier einmal die gesetzten Fuses und der Schaltplan.>> warum schwindelst du?> Quarz ist auch nicht eingezeichnet>> Jonas N. schrieb:>> Versuche es morgen auch mal ohne den Quarz.>> wo wird denn F_CPU gesetzt? Welchen I2C Clock nutzt du?> Ich durchsuche nun nicht den ganzen Code, irgendwo wird dein Fehler> sein.
Die Diskussion hatten wir gestern schon.
Er benutzen den internen Oszillator am ATMega328P
F_CPU wird auf 8000000 gesetzt.
Wir hatten den über den Quarz am DS1307 gesprochen, weil ich keinen
32,768 kHz da hatte hab ich mit nem 16Mhz versucht, was nicht von Erfolg
gekrönt war.
Deshalb hab ich seinen Code genommen und an nen Grove-DS1307 gehängt und
es hat funktioniert, woraus ich schließe dass es ein Hardware-Problem
ist.
Jonas N. schrieb:> Das ist übrigens die Ausgabe auf den SCL und SDA Leitungen, wenn er an> der While schleife, stehen geblieben ist.
Das wiederum kann garnicht sein, weil die While-Schleife
1
while(TWCR&(1<<TWSTO));
keinerlei weitere Ausgaben auf dem I²C enthält und demnach spätestens
nach etwas Zeit Ruhe auf dem Bus herrschen muss.
ISRs die pausenlos den I²C befeuern habe ich bei dir nicht gesehen.
Also: Entweder bleibt dein Programm an einer anderen Stelle hängen, und
nicht in der Schleife die du vermutest, oder dein Oszi-Bild ist Fake,
oder du hast noch geheime Zusatz-Hardware mit an dem Bus, von der du uns
nichts verraten hast.
Ok habs eben nochmal auf nem nackten 328p probiert.
1 zu 1 mit dem von dir geposteten Code(Bis auf meinen Versuch einen
Zeilenumbruch hinzubekommen "uart_puti(0x0A);" was leider nicht
funktioniert) und es funktioniert problemlos.
Es muss daher an deiner Hardware liegen.
Wie schaust du dir die daten am seriellen Port an?
Vielleicht gibt es da Probleme. Ich kenne mich mit dem Atmel Studio
nicht aus. gibt es da nen Seriellen Monitor?
> Wie schaust du dir die daten am seriellen Port an?> Vielleicht gibt es da Probleme.
Diese Vermutung hatte ich auch bereits, bekam aber als Antwort:
> Hast du dir den Code überhaupt angesehen? Wenn ja,> dann wüsstest du, dass es nicht an der Ausgabe liegen kann.
Jonas N. schrieb:> Leute, ich bekomme im Debugmode doch mit, dass er aus der einen Schleife> nicht mehr herauskommt
Das kann nicht sein. Laut deinem Oszi-Screenshot hast du innerhalb der
Schleife kontinuierlich Flankenwechsel auf SCL. Wenn du keine geheime
Troll-Hardware mit angeschlossen hast, müssen die vom ATMega kommen. Der
wiederrum wackelt garantiert nicht am SCL, wenn ihm das nicht
aufgetragen wird. Während er im Debugger gestoppt ist erst recht nicht.
Hast du evtl. den Strichpunkt nach
> Leute ...
Eine Frage von Wahrscheinlichkeit und Aufwand - zu Programmbeginn ein
'hallo' einbauen, den Debugmode abschalten und das Ganze laufen lassen:
kostet Sie vielleicht ein oder zwei Minuten. Was ist das schon
verglichen mit diesem Thread mit inzwischen 43 Beiträgen.
Zumindest verfahre ich so, wenn ich nicht mehr weiterweiss.
Z.B. Max schrieb:> Versuch einen> Zeilenumbruch hinzubekommen "uart_puti(0x0A);" was leider nicht> funktioniert)
Für einen Zeilenumbruch versuchs doch mal mit
Jonas N. schrieb:> Sieht das so in Ordnung aus?
Fast perfekt. Der einzige Haken ist, dass sich deine RTC nicht
angesprochen fühlt. Sie bestätigt die empfangene Slave Adresse nicht.
Also ist entweder die Slave Adresse falsch oder die RTC funktioniert
nicht.
Jonas N. schrieb:> Das ist übrigens die Ausgabe auf den SCL und SDA Leitungen, wenn er an> der While schleife, stehen geblieben ist.
Auch hier sieht man beim jeweils 9. Takt, dass deine RTC die Slave
Adresse nicht bestätigt.
Ich finde aber seltsam das dein Bild mindesten eine Wiederholung der
Adresse zeigt, obwohl das Programm nach deiner Aussage beim Fehler
hängen bleibt. Hast du noch einen Watchdog aktiviert, der dabei einen
Reset auslöst?
Ich habe mal die 9 Bits eingezeichnet.
Die 7 Bit Slave Adresse ist 1101000 (= 0x68, oder 104), was mit dem
Datenblatt des DS1307 überein stimmt.
Danach kommt das R/W Bit mit dem Wert 0, womit der Master mitteilt, dass
er in der folgenden Kommunikation schreibend auf den Slave zugreifen
will.
Danach sollte eigentlich das ACK kommen. Der Slave müsste beim 9.
Taktimpuls die SDA Leitung auf Low ziehen um zu signalisieren "hier bin
ich, bereit zur Kommunikation". Genau das fehlt in deinem Fall, der
Slave hat nicht bestätigt.
Vergleiche mit
https://de.wikipedia.org/wiki/I%C2%B2C#Takt_und_Zust%C3%A4nde_des_Busses
Ich tippe immer noch darauf, dass der Chip nicht funktioniert, weil der
Abblock-Kondensator an der Stromversorgung fehlt. Vielleicht auch, weil
der Quarz fehlt. Auf dem Steckbrett funktioniert der Oszillator außerdem
wahrscheinlich nicht, weil die Kontakte von dem Brett zu viel Kapazität
haben. Das wird wohl nur auf einer gelöteten Platine funktionieren
können.
Andere Bild:
Jonas N. schrieb:> Sieht das so in Ordnung aus?
Dieser Screenshot sieht doch nicht gut aus. Hier ist die 7 Bit Adresse
1010000, was nicht mit dem Datenblatt überein stimmt.
SPI Würde ich I2C immer vorziehen, da das Protokoll doch wesentlich
einfacher und auch eindeutiger ist. Auch wenn der I2C Chip irgendwann
mal laufen sollte.
MCP795W20
Enhanced Feature Battery-Backed SPI Real-Time Clock/Calendar
https://www.microchip.com/en-us/product/mcp795w20
Stefan F. schrieb:>> Auf dem Steckbrett funktioniert der Oszillator außerdem> wahrscheinlich nicht, weil die Kontakte von dem Brett zu viel Kapazität> haben. Das wird wohl nur auf einer gelöteten Platine funktionieren> können.
Habe mal den Quarz direkt an den Chip gelötet und erhalte nun endlich
eine Ausgabe. Die Werte, die ich derzeit bekomme, sind nur etwas
komisch. Die Zeitwerte gehen über 60 hinaus und springen auch sehr
stark.
Hast du den Abblock-Kondensator hinzugefügt und dafür gesorgt, dass die
Pins X1 und X2 nicht im Steckbrett stecken?
Hänge nochmal das Oszilloskop an den I²C Bus, so dass man die
Kommunikation sehen kann (zumindest die ersten 9 Takte).
Kondensator ist hinzugefügt und die Pins X1 und X2 stecken zwar im
Steckbrett, aber auf die ist der Quarz aufgelötet, sollte also passen.
Den Fehler bei den Sekunden konnte ich beheben, das war nur ein Fehler
in der Ausgabe, aber bei den Minuten gibt es noch Probleme: Wenn ich die
Minuten auf 59 stelle, springen sie nicht wieder auf 0, sondern auf 68.
Jonas N. schrieb:> Kondensator ist hinzugefügt und die Pins X1 und X2 stecken zwar im> Steckbrett, aber auf die ist der Quarz aufgelötet, sollte also passen.
Nein, sollte nicht passen. Denn die Kontakte des Steckbretts haben
typischerweise mehr als 10pF Kapazität, die den Oszillator belasten.
Dafür ist er nicht vorgesehen.
Wenn er trotzdem für einen kurzes Experiment halbwegs läuft, hast du
Glück. Den finalen Aufbau wirst du eh nicht auf Steckbrett machen, nehme
ich mal an.
Z.B. Max schrieb:> Was ist denn das bitte für eine Ausdrucksweise?> Nicht jeder wird Allwissend geboren und wir haben alle verstanden was er> mit internen Quarz gemeint hat.> Deswegen ist man noch lange kein Vollidiot...
Hat ja auch niemand behauptet. Die Schwerpunkt lag ganz eindeutig auf
"Troll". Ich habe nur auch die einzige rationale Alternative
aufgezeigt...