Hi!
ich hab mit einem DS1307Z und einem Atmega164P eine RTC gebaut. Das
Programm für die Uhr habe ich vor einiger Zeit schon auf einem M8
betrieben (aus dem Internet), funktioniert also.
Mein Problem ist nun, dass das Uhrzeit und Datum jeweils mit 00.00.00
angezeigt werden und sich sonst nichts weiter tut. Ich habe keine Ahnung
woran das liegen könnte, wie gesagt auf einem M8 funktioniert alles
einwandfrei.
Der Atmega164 wird mit einem 8Mhz Quarz betrieben. Ich hatte die
vermutung, dass die Taktquelle vllt irgendwo falsch eingestellt ist und
der qC dann nicht richtig uber I²C mit dem ds1307 kommunizieren kann.
Hier habe ich jetzt aber auch schon alle möglichen Einstellungen durch
und bin mir eigentlich sicher, dass alle richtig sind.
Gruß Sebastian
Hier noch der Quellcode:
1
$regfile = "m164pdef.dat"
2
$prog &HFF , &HFF , &H99 , &HFF ' generated. Take care that the chip supports all fuse bytes.
selbst wenn ich andere quellcodes aus dem internet probiere funktioniert
es nicht. es wird alles auf dem display angezeigt, nur die uhr bleibt
bei 00.00.00 stehen. das datum genauso.
woran kann ich denn erkennen, dass der uC überhaupt mit dem ds1307
kommuniziert?
Nabend,
Bascom ist nicht meine Welt, aber schau dir mal die Funktion vom Bit
"CH"
im Register 00 an.
Datenblatt Seite 8.
Desweiteren sollten die Statusmeldungen der I2C Funktionen ausgewertet
werden, alles andere ist Blinflug.
MfG
Deine IF-Anweisung ist so nicht richtig nutzbar.
>If _day = 1 And _month = 1 And _year = 0 Then ' 01.01.00 = keine Daten
Der RTC arbeitet ja mit BCD-Werten.
Ein frischer RTC hat demnach nicht 0 oder 1, sondern 255er Werte im
Speicher.
255 ist ja dezimal , du bekomst jedoch BCD 001001010101
Da also deine IF-Anweisung nie durchlaufen wird , wird somit auch das
Controlregister nicht gesetzt , was am Ende eine unvollständige
Initialisierung ist.
Auch deine LCD Ausgabe ist äußerst suboptimal mit dem ständigen CLS
Da das Format in der Länge immer gleich ist, reicht ein
Aktualisieren/Überschreiben völlig aus - ich nehm an das dein Display
derzeit schön sekundenweise flackert.
habe ich das bit auf "0" gesetzt. wie schon gesagt funktioniert das
leider immer noch nicht.
wie meinst du das mit den staturmeldungen? bin bei i2c noch nicht so
ganz fit ;)
BoomBoomMagic schrieb:> Deine IF-Anweisung ist so nicht richtig nutzbar.>>>If _day = 1 And _month = 1 And _year = 0 Then ' 01.01.00 = keine Daten>> Der RTC arbeitet ja mit BCD-Werten.> Ein frischer RTC hat demnach nicht 0 oder 1, sondern 255er Werte im> Speicher.> 255 ist ja dezimal , du bekomst jedoch BCD 001001010101>> Da also deine IF-Anweisung nie durchlaufen wird , wird somit auch das> Controlregister nicht gesetzt , was am Ende eine unvollständige> Initialisierung ist.>> Auch deine LCD Ausgabe ist äußerst suboptimal mit dem ständigen CLS> Da das Format in der Länge immer gleich ist, reicht ein> Aktualisieren/Überschreiben völlig aus - ich nehm an das dein Display> derzeit schön sekundenweise flackert.
Danke für den Hinweis, werde ich gleich mal nachgucken;) ja flackern tut
das display momentan, habe aber die anzeige nur schnell dahin getippt,
wollte erstmal nur die uhr wieder zum laufen bringen. komischerweise hat
es auch mit der if-bedingung auf meinem atmega8 so funktioniert
gruß sebastian
Jetzt seh ich gerade erst welchen RTC du nutzt ..... hatte erst DS1337
gelesen ,
Deiner ist ja nur der DS1307 ;-)
Da ist die Initialisierung eh völlig falsch , da du ja nicht das BIT7
gesetzt hast , das der RTC loslegen soll
&B10000000 - ohne SQW
&B10010000 - mit SQW
BoomBoomMagic schrieb:> Jetzt seh ich gerade erst welchen RTC du nutzt ..... hatte erst> DS1337> gelesen ,> Deiner ist ja nur der DS1307 ;-)>> Da ist die Initialisierung eh völlig falsch , da du ja nicht das BIT7> gesetzt hast , das der RTC loslegen soll>> &B10000000 - ohne SQW>> &B10010000 - mit SQW
also du meinst
Ich habe von diesen DS1307 und DS1337 hunderte programmiert ....
guck Dir mal den Code auf dieser Seite an wie dort Initialisiert wurde.
Das ist eines von vielen vielen Beispielen .
http://hühnerklappe-diy.de/zeitschaltuhr.html
Der Code ist zwar mit Eingabe und weiteren Funktionen , spielt aber
keinen Walzer , geht ja nur um die Initialisierung.
Sebastian schrieb:> quatsch, die variablen in der if-bedingung sind in der funktion> "getdatetime" doch schon aus dem bcd-wert abgewandelt worden
auch dann sind die Werte bei einem frischen RTC niemals 1
hmm, ich erkenne in der initialisierung zu deinem programm da nicht
wirklich einen unterschied. vllt erklärst du ihn mir ja mal etwas
genauer
mein programm kann an sich ja nicht so falsch sein, sonst hätte es auf
dem anderen controller doch gar nicht funktioniert oder sehe ich das
falsch? wenn doch wo liegt der unterschied, außer das ich die taktrate
und ein paar pins an den anderen uC angepasst habe...? habe mittlerweile
auch schon 3 andere codes aus dem internet probiert, bei allen die
gleichen symptome. also muss das problem doch eigentlich ein viel
grundlegenderes sein?
gruß sebastian
Mal eine ganz banale Frage am Rande .....
hast Du auch die 3V Batterie/Knopfzelle am DS1307 angeschlossen ?
Sind die beiden Pullups (4K7) an den Pins SCK + SDA ?
Sebastian schrieb:> hmm, ich erkenne in der initialisierung zu deinem programm da nicht> wirklich einen unterschied. vllt erklärst du ihn mir ja mal etwas> genauer
Naja, .... der Code ist jetzt allgemein äußerst unglücklich ausgedacht.
Du hast eine DO LOOP in der alle 200ms mittels GETDATETIME vom RTC
die Zeit ausgelesen wird.
Dann nutzt du INT0 um vom RTC das SQW als Sekundenzähler nehmen zu
können.
Somit würde nach 5x GETDATETIME ein Konflikt entstehen , da
codetechnisch der Aufruf GETDATETIME kommt und per SQW ein Interrupt
anliegt.
Wobei .... ALLE Pins am RTC sind aktiv low !
Das heißt sie werden alle mittels 4K7 Pullup auf high gesetzt.
Demnach müßte dein INT auf Falling reagieren , nicht auf Rising.
Zur Initialisierung gehört zum Einen das das Bit 7 vom Controlregister
auf 1 gesetzt wird um den internen Takt des RTC zu aktivieren , zum
Anderen auch das Bit 4 um den SQW Ausgang aktiv zu schalten.
Desweiteren muß das Bit 7 der Sekunden auf 0 gesetzt sein und gesendet
werden.
Das erfolgt in der Regel , in dem man pauschal eine Zeit beim Starten
vorgibt.
DU liest ja gleich aus , da passiert ja so nix.
Grammatisch ist das ja alles soweit ok, nur ..... es ist halt einfach
nicht rund ...
wenn dann noch die externe Beschaltung nicht korrekt ist , hakt es an
verschiedene Ecken.
Sebastian schrieb:> Config Sda = Portc.1> Config Scl = Portc.0
da es auf einem mega8 lief, schau mal ob im BASCOM auch diese Ports so
in der IDE angegeben sind, bei mir waren andere Ports eingestellt ergo
RTC funzt nicht, nach der korrektur alles ok.
Sebastian schrieb:> gibt es eine möglichkeit wie ich sehen kann, ob uC und ds1307 mit> einander kommunizieren? oszi hab ich keins hier.
Ja, in dem Du die Rückgabewerte Deiner Funktionsaufrufe überprüfst.
Also nicht nur
tuwas()
sondern eher so:
if (tuwas()) errorhandling()
Voraussetzung: tuwas() gibt bei Erfolg eine 0 zurück, bei Mißerfolg !=0
Errorhandling kann man dann z.B. über eine RS232 Ausgabe auf den PC
machen oder einfach eine LED an einem Port anschalten.
Hast Du auch die DS1307 nach Datenblatt beschaltet? Liegt Strom an?
I2C-Adresse der DS1307 korrekt eingetragen?
Wenn die DS1307 hardwaremäßig nicht korrekt läuft dann sollte das
I2cstart eine Fehlermeldung zurückgeben.
Pete K. schrieb:> lg eine 0 zurück, bei Mißerfolg !=0> Errorhandling kann man dann z.B. über eine RS232 Ausgabe auf den PC> machen oder einfach eine LED an einem Port anschalten.>> Hast Du auch die DS1307 nach Datenblatt beschaltet? Liegt Strom an?> I2C-Adresse der DS1307 korrekt eingetragen?>> Wenn die DS1307 hardwaremäßig nicht korrekt läuft dann sollte das> I2cstart eine Fehlermeldung zurückgeben.
danke, aber das wäre jetzt zu einfach gewesen;)
Pete K. schrieb:> Sebastian schrieb:>> gibt es eine möglichkeit wie ich sehen kann, ob uC und ds1307 mit>> einander kommunizieren? oszi hab ich keins hier.>> Ja, in dem Du die Rückgabewerte Deiner Funktionsaufrufe überprüfst.> Also nicht nur> tuwas()> sondern eher so:> if (tuwas()) errorhandling()>> Voraussetzung: tuwas() gibt bei Erfolg eine 0 zurück, bei Mißerfolg !=0> Errorhandling kann man dann z.B. über eine RS232 Ausgabe auf den PC> machen oder einfach eine LED an einem Port anschalten.>> Hast Du auch die DS1307 nach Datenblatt beschaltet? Liegt Strom an?> I2C-Adresse der DS1307 korrekt eingetragen?>> Wenn die DS1307 hardwaremäßig nicht korrekt läuft dann sollte das> I2cstart eine Fehlermeldung zurückgeben.
ah, interessant. die interne Variabel ERR liefert aber "0" also "kein
Fehler zurück"
BoomBoomMagic schrieb:> Sebastian schrieb:>> hmm, ich erkenne in der initialisierung zu deinem programm da nicht>> wirklich einen unterschied. vllt erklärst du ihn mir ja mal etwas>> genauer>> Naja, .... der Code ist jetzt allgemein äußerst unglücklich ausgedacht.> Du hast eine DO LOOP in der alle 200ms mittels GETDATETIME vom RTC> die Zeit ausgelesen wird.> Dann nutzt du INT0 um vom RTC das SQW als Sekundenzähler nehmen zu> können.> Somit würde nach 5x GETDATETIME ein Konflikt entstehen , da> codetechnisch der Aufruf GETDATETIME kommt und per SQW ein Interrupt> anliegt.>> Wobei .... ALLE Pins am RTC sind aktiv low !> Das heißt sie werden alle mittels 4K7 Pullup auf high gesetzt.> Demnach müßte dein INT auf Falling reagieren , nicht auf Rising.>> Zur Initialisierung gehört zum Einen das das Bit 7 vom Controlregister> auf 1 gesetzt wird um den internen Takt des RTC zu aktivieren , zum> Anderen auch das Bit 4 um den SQW Ausgang aktiv zu schalten.> Desweiteren muß das Bit 7 der Sekunden auf 0 gesetzt sein und gesendet> werden.> Das erfolgt in der Regel , in dem man pauschal eine Zeit beim Starten> vorgibt.>> DU liest ja gleich aus , da passiert ja so nix.> Grammatisch ist das ja alles soweit ok, nur ..... es ist halt einfach> nicht rund ...> wenn dann noch die externe Beschaltung nicht korrekt ist , hakt es an> verschiedene Ecken.
den interrupt und SQW habe ich vorerst komplett abgeschaltet um den von
dir beschriebenen konflikt erstmal auszugrenzen. Die benötigten bits
werden alle gesetzt. wie genau meinst du
> Das erfolgt in der Regel , in dem man pauschal eine Zeit beim Starten> vorgibt.>> DU liest ja gleich aus , da passiert ja so nix.
?
BoomBoomMagic schrieb:> Mal eine ganz banale Frage am Rande .....> hast Du auch die 3V Batterie/Knopfzelle am DS1307 angeschlossen ?> Sind die beiden Pullups (4K7) an den Pins SCK + SDA ?
Batterie ist dran und 4k7 pullups an sck, sda und sqw
Danke schonmal für weitere hilfe, auch wenn es immer noch nicht
funktioniert habe ich immerhin dank euch schon ein paar nützliche sachen
dazu gelernt;)
gruß sebastian
BoomBoomMagic schrieb:> Mal ne andere Frage :>> Warum bist du vom mega8 auf nen mega164 umgestiegen ?> Laut Code ist ja nur ein 20X2 Display dran und ein RTC.
für mein neues projekt brauchte ich ne HW-PWM mehr, mehr speicher und
nen weiteren port ;)
wie gesagt weil die uhr als nicht läuft hab ich den quellcode erstmal
nur darauf beschränkt, damit nicht möglicherweise noch der rest vom
programm bei der fehlersuche mitspielt. für die rtc alleine hätte ich
natürlich beim m8 bleiben können