Hallo, ich habe mir einen kleinen I2C Bus mit PCF8583 und ATMega8 aufgebaut. Am RTC hängt ein 32kHz Quarz und 22pF gegen Masse dran (wie auch im Datenblatt dargestellt). Die Ansprache des mitintegrierten Ram funktioniert ohne Probleme. Allerdings komme ich mit der Uhrenfunktion schon nicht klar. In das Control-Register (Adresse: 0) habe ich 0 reingeschrieben, so müsste er eigentlich laufen, tut er auch, aber viel zu schnell (es stimmt schon, dass die Sekunden 0..9 und die 10 Sekunden jeweils getrennt in Hi und Lo Byte gezählt werden? Ich habe nämlich auch schon anderes gesehen!) 10 RTC-Sekunden dauern ungefähr 6 reale Sekunden... Das hat doch dann nix mehr mit trimmen zu tun, oder? Kann es sein, dass die RTC kaputt ist, oder ist wahrscheinlich der Quarz nicht richtig? Der hat leider keine Beschriftung, hab ihn aber beim lokalen Händler so gekauft... Über Hilfe würde ich mich freuen, Daniel
Hallo Daniel Wenn ich das Datenblatt lese sehe ich einen Kondensator vom Pin OSCI nach Plus und nicht nach Masse. Bei mir hab ich 15pF nach +5V und die Uhr läuft recht genau. Gruß Eddi
Den Kondensator hatte ich zunächst komplett übersehen - es lief zwar, aber reichlich ungenau. Wenn's genau sein soll, dann Trimmkondensator.
Also ich hab jetzt den Kondensator auf den Pluspol umgelötet... (vielen Dank für den Hinweis!) Leider besteht das Problem weiterhin. Das Control-Register an Adresse 0 programmiere ich mit 0, den Rest lasse ich wie er ist. Trotzdem läuft die Uhr um einiges zu schnell. für 10 RTC-Sekunden benötigt sie ungefähr 5,4 reale Sekunden... Könnte das noch an etwas anderem liegen als an dem Quarz? Ich habe leider keinen Frequenzzähler, um die Quarzfrequenz nachzuprüfen. Vielen Dank, Daniel
Schwer etwas anderes dazu zu sagen als "bei mir funktioniert es". Ein paar Sekunden am Tag falsch, ungetrimmt. Diese Uhrenquarze haben eine recht markante Bauform. Andere Werte in dieser Bauform gibt es im üblichen Handel so gut wie nicht. Control=0 ist ok, wobei man während des Einstellens der Zeit auf 0x80 gehe sollte, Definitiv kein Programmfehler?
In Deiner Schaltung sehe ich keinen Elko (10µF) zwischen Pin 8 und Pin 4 vom PCF8583. Fehlt der etwa ?
Einen Elko würde ich da lieber nicht verwenden, hat keinen Sinn dessen Selbstentladung mit Batterien zu finanzieren. Aber einen 100nF Keramik-Kondensator halte ich für sinnvoll - sollte ohnehin an jedes IC dran.
<<Einen Elko würde ich da lieber nicht verwenden, hat keinen Sinn dessen Selbstentladung mit Batterien zu finanzieren.>> Ich dachte der 1. April kommt erst noch !
@Michael: Missverständnis? Daniel hatte ein paar Tage vorher nach der Beschaltung vom 8583 mit Batterie/wasauchimmer. gefragt. Meine Antwort waren 2 Dioden und eine kleine Lithiumzelle. Ich ging davon aus, dass er dies realisiert hat. Da ergibt ein Elko keinen Sinn, der reduziert dann nur die Lebensdauer der Batterie.
Wie kommmen wir eigentlich auf die Batterie? Den einzigen Kondensator, den ich erwähnt habe war der am Quarz und das waren doch 22pF? Die RTC an sich hab ich jetzt mit einem Goldcap über eine Diode gepuffert, der wiederum (derzeit noch) von einem Spannungsteiler aus zwei Widerständen geladen wird, aber natürlich ist der RTC wiederum über eine Diode (gegen entladen des Cap) an Vcc. (Ist das nicht gut so?) Aber meine Frage war wieso denn der RTC ca 2x so schnell läuft wie die Realität;-) Ob damit irgendjemand was dazu weiß. Vielleicht hängt das ganze aber auch mit meinem I2C-Problem zusammen?? (siehe http://www.mikrocontroller.net/forum/read-1-169407.html) Mittlerweile bekomme ich es nämlich nicht mehr hin den 8583 ordentlich anzusprechen... Schöne Ostern noch! Daniel
Also hier wäre mal die Grundschaltung (wenigstens SDA und SCL sind richtig verbunden, da bin ich mir sicher): PCF8574 ST24C02 Pullups PCF8583 ATMega--+-------+------------+------+-------------+ | | PCF8574 Und hier die Beschaltung des PCF 8583: VCC + 200Ohm | VCC .|___|-VCC | + | _ --- | ||___|-GND --- | | 200Ohm | V V '-------. - - - | __ | | +[/ |___| '---------o| |o--|<-------[|-GND - ---------o| |o- [\ '-------' .o| |o-SCL GoldCap )o|__|o-SDA | | | === GND (created by AACircuit v1.28.5 beta 02/06/05 www.tech-chat.de) 32678 Hz. Der Kondensator hat 22pF und der GoldCap 3,3F. Ich habe 5V Versorgungsspannung. Ich hab mal mein aktuelles Testprogramm angehängt... Vielleicht gibts da ja einen Fehler (die I2C Routinen sind von ATMEL (Appnote 315) ich habe nur die Namen geändert). Viele Grüße, Daniel
Ist der Goldcap allergisch auf 4,5V? Die können doch normalerweise 5,5V. Was also spricht gegen VCC | V - __ | _ -o| |o--o---|___|---. -o| |o- |+ -o| |o- === -o|__|o- /-\ | | === GND (created by AACircuit v1.28.5 beta 02/06/05 www.tech-chat.de)
Oder, um auf die Frage nach einem Kondensator zurückzukommen. Ein weiterer Elko ist da freilich sinnlos. SDA/SCL haben aber schon je einen Pullup dran (z.B. 4K7)? VCC + | | V 1N4148 - | __ | _ -o| |o----o--|220|--. -o| |o- | | -o| |o- | |+ -o|__|o- --- === --- /-\ 3.3F |100n | Goldcap 5.5V | | === === GND GND (created by AACircuit v1.28.5 beta 02/06/05 www.tech-chat.de)
Also mein Goldcap soll maximal 2,5 V bekommen, daher der Spannungsteiler, der wird aber bald durch einen Spannungsregler ersetzt... Die Pullups sind zwischen dem Seriellen EEPROM und dem RTC angebracht. Ist das ok? Oder müssten die am Ende der Leitung sein? Dürfte doch eigentlich nix ausmachen... Grüße, Daniel
Misch mich jetzt auch mal hier ein! Will auch bald mit dem PCF8583 arbeiten! @Daniel Haste die Pullups an VCC von der ganzen Schaltung oder an VCC vom PCF8583 (diese ist ja dank deinen Dioden n bissel kleiner). Könnte ja sein das der PCF8583 nicht damit klar kommt, wenn an SCL und SDA höhere Spannung anliegt als seine Versorgungsspannung ist?
Hallo, also die Pullups sind an "normales" VCC aber der PCF hat im Normalbetrieb über die Diode ja auch 5 V nur wenn der Strom ausgeschalten wird erhält er 2,5 V vom Goldcap. Der Spannungsunterschied kommt höchstens noch dadurch zustande, dass eine Diode vor den Vcc Eingang geschaltet ist. Das wäre auf jeden Fall mal ein Versuch wert das ohne die zu machen... Grüße, Daniel
Ok Jungs, vielen vielen Dank für die Hilfe! Ich hatte in die TWI_Master.h so abgeändert, dass ich auch den Prescaler einstellen konnte, leider habe ich vergessen diesen Effekt aus dem TWSR-Register in der Interrupt Routine rauszumachen... ist ja klar, dass das nicht funktioniert... so wurden natürlich immer falsche Statuscodes behandelt! Blödheit tut weh! Ich habe mindestens 10 Std. daran gesessen den Fehler zu suchen, weil ich meine "kleine Codeänderung" schon wieder vergessen hatte... Ich hoffe ich lerne daraus... Ich versuche ja immernoch die "Null-Fehler-Produktion" einzuführen... Wie macht ihr das eigentlich? Wieviel Zeit geht bei euch für die Fehlersuche drauf? Braucht ihr das überhaupt? Viele Grüße, Daniel
@Daniel Zitat "Ich hatte in die TWI_Master.h so abgeändert, dass ich auch den Prescaler einstellen konnte, leider habe ich vergessen diesen Effekt aus dem TWSR-Register in der Interrupt Routine rauszumachen... ist ja klar, dass das nicht funktioniert... so wurden natürlich immer falsche Statuscodes behandelt! Hää??? Was ist damit gemeint? Kann man so einen Baustein nicht in den Sockel setzen und erwarten dass er läuft?
Ja aber ich wollte doch die Geschwindigkeit des TWI einstellen, dies funktioniert über Prescaler und noch ein Register. Leider wird der Prescaler in den Original-Dateien von Atmel nicht verwendet und ist daher Null... Ich habe ihn aber anders gesetzt, weil ich die Geschwindigkeit nicht so hoch brauche... Aber gleichzeitig wird das Register für den Prescaler auch noch für den Statuscode verwendet, der wiederum in der Interruptroutine verwendet wird um das weitere Vorgehen zu bestimmen... Irgendwie schon blöd!
@daniel Was du da beschreibst stammt doch aus dem Prozessor, wieso läuft dadurch die Uhr schneller?
@Casper: Ne das war nicht darauf bezogen, ich habe nur versucht, weil mein TWI-Bus nicht richtig funktioniert hat, einfach mal die Geschwindigkeit zu reduzieren. Aber abgesehen davon geht die Uhr immer noch zu schnell, ich werde mir nochmal alle Komponenten nachbestellen und dann auf Fehlersuche gehen... Viele Grüße, Daniel
Such mal im 8052.com Forum. Da war irgendwas über einen buggy RTC, wenn man den zu oft ausliest, spinnt der. Man soll ihn wohl nur einmal je s auslesen. Könnte der 8583 gewesen sein. Ich weiß schon, warum ich mir solchen Unsinn spare und einfach einen Timerinterrupt zum Zeitzählen nehme. Kostet wenig Code und Rechenzeit und funktioniert immer auf Anhieb. Und nen Timerinterrupt hat man meistens eh schon laufen (Tasten entprellen usw.). Peter
" Da war irgendwas über einen buggy RTC, wenn man den zu oft ausliest, spinnt der. Man soll ihn wohl nur einmal je s auslesen. Könnte der 8583 gewesen sein. " Früher hatte ich Probleme beim zu schnellen Auslesen mit einem 'C552; dann hatte hier jemand (im letzten Jahr) berichtet, daß wäre kein Problem mehr. Dennoch würde ich die Abfragefrequenz auf <100/sek. halten. Probieren, neue Bauteile würde ich nicht bestellen.
Danke für den guten Tipp, aber auch wenn ich in der Abfrageschleife eine lange Pause einbaue geht die Uhr mehr als 2mal zu schnell! Vielleicht habe ich einfach den Chip beim löten gebraten...;-) Oder der Kondensator ist falsch. Werd erstmal den Kondensator ersetzen... Irgendwann wird es schon gehen... Jetzt habe ich auch wenigstens ein Display am Controller, dann muss ich die sekunden nicht mehr mitzählen...;-) Viele Grüße, Daniel
Also... so ein Display hat schon deutliche Vorteile... Die Uhr scheint jetzt relativ genau zu gehen. Aber auch nur weil ich sie im Moment nur jede Stunde einmal abfrage. Jede Sekunde scheint absolut zu viel zu sein, dann läuft sie rasend schnell. Naja für meine Zwecke reicht das jetzt. Ich werde dann sowieso den Alarm und den Interupt verwenden. das funktioniert dann hoffentlich! Vielen Dank für die Tipps!! Daniel
Hab zufällig gerad die Probleme von Daniel mit dem PCF8583 nachvollzogen. also von vorn: Hab mir den I²C mit PCF8583 aufgebaut und gestartet, lief alles ohne Probleme, die Uhr wird ständig in einer Endlosschleife ausgelesen und läuft auch sehr genau. Nun dachte ich mir, da es ja blöd ist, wenn ich die Spannung abschalte, das dann die Uhr immer gelöscht wird, also GoldCap her - natürlich extra-groß :) mit 10F jedoch nur 2,5 V. Hab mir dann einen Spannungsteiler 2*330 genommen um daraus die 2,5V aus den 5V zu erzeugen. Bis hier hin funktionierte auch alles noch einwandfrei. Jedoch etlädt sich der GoldCap ja jetzt noch über die Wiederstände, also 3 Dioden rein. Stinknormale 4148er. Eine von der mitte der beiden Wiederstäde zum GoldCap (kommen jetzt nur noch 2,2V an) eine von dort weiter zum PCF VDD(Pin8) und eine von 5V an PCF VDD(Pin8). Jetzt lief die Uhr merklich schneller. Ca. 20Sek in 15 realen Sekunden. Hab nun die Spannung nachgemessen, am Pin8 des PCF kommen nur noch 4,3V an. Also alle Dioden gegen Schottky (BAT42) getauscht, jetzt kommen ca. 4,5 V an und die Uhr läuft wieder mit normaler Geschwindigkeit. Vielleicht hilft das ja bei dir auch ? gruß Thomas
Wobei Schottky-Dioden einen gegenüber Siliziumdioden sehr viel höheren Sperrstrom haben. Ist hier aber mit max. 0,5µA wohl noch akzeptabel. Stellt sich mir aber die Frage, ob 2,5V Goldcaps beim 8583 wirklich die sinnvollste Lösung sind. Lithiumzellen sind auch mit Fassung nicht grösser, liefern Strom für Jahre und sind noch dazu billiger.
ich hab mir das bis jetzt nur auf nem Steckbrett zusammengehauen, einfach nur um zu sehen ob es klappt... :) Was bedeutet der höhere Sperrstrom ? ist das der Strom, der in Sperr-Richtung fließt ? gruß Thomas
Ja. Der 8583 frisst im Standby 2µA. In der Schaltung sind dann 2 Dioden gesperrt und erhöhen den Entladestrom vom Goldcap um jeweils max. 0,5µA.
Der Vollständigkeit halber: Bei 100°C liegt der maximale Sperrstrom bei 100µA. Also besser kühl halten.
also: bei mir läuft das teil mit der 3 V li-Batterie CR2032, einen kondensator an der stromversorgung brauchst du unbedingt, habe selbst merkwürdige effekte beobachtet ohne einen kondensator. ein normaler 10 Mikrofarad hat nicht den strom erhöht, kann aber noch kommen... sekunden: auslesen der adresse 2 minuten: adr 3 stunden: adr4 & 0x3F klappt seit jahren, der zeitfehler hält sich in grenzen... finde der chip ist etwas zu teuer. gruss michael
Kondensator ja, aber keinen Elko verwenden sondern einen keramischen (100nF).
Diese Anweisungen werden ausgeführt, um einen Alarm mit Interrupt zu programmieren. Könne mir jemand mal sagen, ob das normalerweise so funktionieren müsste? [...] messageBuf[0]=DevRTC+TWIWrite; messageBuf[1]=0x08; messageBuf[2]=0b10010000; // Alarm löst interrupt aus, kein Timer, täglicher Alarm! messageBuf[4]=0b00000000; // keine 100stel Sekunden messageBuf[5]=(min & 0b11110000);// alarm jede minute! sekundenregister messageBuf[6]=std; // minuten messageBuf[7]=messageBuf[4]; // stunden TWISend(messageBuf,8); messageBuf[0]=DevRTC+TWIWrite; messageBuf[1]=0x0; messageBuf[2]=0b00000100; // Starten TWISend(messageBuf,3); [...] Vielen Dank, Daniel
Hab vergessen zu erwähnen. Bei mir funktioniert es so nicht, aber vielleicht sollte es ja funktionieren... Vielen Dank, Daniel
Hallo euer problem mit der spannung ligt wohl darin das der IC mit 4v versort wird aber die i²c leitungen 5v haben........
@Condor war das 'ne Frage oder hast du das als Erklärung geschrieben ?
und wie umgehe ich das Problem der Spannungsdifferenz? Die Diode muss da drin sein...
in die I²C leitungen gehören noch widerstände zusammen mit den pullup geben die so eine art spannungsteiler....
Hallo Condor! Sorry, dass ich so lange für die Antwort gebraucht habe. Wie müssen die Widerstände dann da rein? Von SDA/SCL nach Minus oder direkt an den jeweiligen Port? Wie würde ich die dann berechnen? ich habe jetzt Pullups von 4k7 Ohm. Vielen Dank, Daniel
Ok also mein Problem war schlussendlich folgendes: Der Oszi wird ja mit Vdd verbunden. Natürlich habe ich das allgemeine Vdd genommen und nicht das individuelle Vdd, daher war nicht die Spannungsdifferenz zu den I2C Leitungen wichtig (das steht ja auch so im Datenblatt), sondern die Differenz zum Oszilator. Und das führte dazu, dass der schneller lief. Viele Grüße, Daniel
Danke, das war auch bei mir die Lösung: Trimmer an das richtige Vdd und schon stimmt der Takt (1Hz an INT). Gruß Jens
Der alte Hans schrob:
>Ein 'Danke' ist ja meist gern gesehen, aber nach achteinhalb Jahren?
Warum denn nicht? Bei einer Silberhochzeit ist ein "Danke" sogar nach
25 Jahren angebracht.
;-)
MfG Paul
Nun, Herr Bauman, da kann ich nicht mitreden, so lange hat's noch keine mit mir ausgehalten.
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.