Hallo
Ich habe gestern ein EEPROM über I2C angesteuert. Das funktionierte nach
einigen Startschwieriigkeiten ganz gut.
Ich möchte nun die REAL TIME CLOCK PCF 8583 ansteuern.
Das Protokoll ist ebenfalls I2C.
Das Programm, vom EEPROM habe ich ein wenig modifiziert, um die RTC
auszulesen.
Ich möchte nun z.B. das Sekunden-Register auf Adreese 02 im RTC lesen.
Dazu übernehme ich zunächst den Bus. Schreibe dann die Slave Adresse,
dann die Adresse, die ich ansprechen will, das neue Starsignal, dann
nochmal die Slaveadresse mit 1 als LSB (zum lesen) und empfange dann die
Daten. Obwohl vom Empfangen keine Rede sein kann.
Das Byte aus dem RTC soll dann am PORTB des PIC 16F876 ausgegeben
werden. Es kommt aber der Anfangszustand von B'00000000' am PORTB an.
Der PIC 16F876 hat eine hardware-Unterstüzung für I2C.
Das I2C EEPROM habe ich damit lesen und beschreiben können.
Worauf müsste ich prinzipiell bei der Ansteuerung der RTC achten?
Der Quellcode ist im Anhang.
Am Interupt PIN des PCF8583 liegt das 1Hz-Signal vor.
Ja, meine ist auch auf 100kHz.
Ob man den PIC 16F876 oder ..77 verwendet ist eigentlich hierbei egal.
@chris: vielleicht postest du auch mal deinen quellcode.
Anschlüsse des RTC:
PIN 1 Oszl1; + 22p Trimmkon. auf +5V
PIN 2 OSZIL2
PIN 3 GND --> Slave Adresse 1010 00 0 R/W
PIN 4 GND
PIN 5 SDA
PIN 6 SCL
PIN 7 INT, frei, alle 1s auf GND gezogen; Uhr arbeitet also
PIN +5V
Wie sieht das mit dem Control Register aus?
Im Datenblatt steht, dass es beim reset mit 0x00h beschrieben ist. Also
solte die uhr automatisch anlaufen.
Das Control-Register habe ich nicht beschrieben.
@chris: hast du schon mal ein Register vorher beschrieben z.B. das
Std.Register?
Hallo HDW und chris!
Meines Wissens muß beim PCF 8583 am Anfang ein enable-Bit gesetzt
werden, damit er losläuft. Sonst werden keine Sekunden gezählt. Das Bit
ist das MSB im Sekunden-Register, wenn ich nicht irre.
Könnte es daran liegen?
Sven
Hi,
ich habe ein funktionsfähiges Beispiel für den AVR2313.
Für die "I2C-Unit" schau Dir doch mal meinen Beitrag "I2C-Problem" vor 2
Tagen (etzter Eintrag + Downlaod) an!
Notfalls poste ich auch mal mein Ansteuerungsprogramm.
Sebastian
@Sven: es ist richtig, dass es EnableBits gibt. Im DS 1302 liegt dieses
im Sekunden-Register und muss auch direkt nach dem Start beschrieben
werden.
Im PCF 8583 liegen die Enable-Bits im Control-Register. Diese sind laut
Datenblatt (in Anhang) jedoch automatisch auf Null.
Die Uhr müsse also zählen.
Ich werde jetzt vorsichtshalber das Control-Register mit 0x00h
beschreiben und danch das Minuten-Register mit einem sinnvollen Wert
beschreiben und diesen dann wieder auslesen.
So, ich habs jetzt.
Also: im Datenblatt wird behauptet, dass das Control-Register mit den
Enable-Bits beim reset auf 0x00h ist und dass so die Uhr anläuft.
Das ist aber NICHT so! Das Control-Register musste ich erst zu Beginn
komplett zurücksetzten (auf 0x00h).
Dann beim Lesen des Sekunden-Registers steht im Datenblatt, dass nach
der ersten Slave-Adreese und der Wortadresse nur eine Startbedingung her
muss. Hier musste ich aber den Bus zuerst wieder freigegeben.
Toll, wie man sich auf Datenblätter der hersteller verlassen kann.
na ja, jedenfalls läufts jetzt
ich habe das jetzt mal am lcd angeschlossen.
Ich habe jedoch probleme bei der darstellung.
Um Register am Lcd ausgegeben zu können, muss die auszugebene zahl
zuerst in zehener und einer aufgeteilt werden und nach ASCII konvertiert
werden. die zehenr und einer werden dann nacheinander am lcd ausgegeben.
es werden aber alle zahlen, die einen hexadecimalen anteil haben, nicht
angezeigt.
die uhr sprint also nach 9 zur direkt 16. nach 25 direkt zu 32, nach 41
zu 47 etc.
diese zahlen enthalten die Buchstaben A-F, wenn man sie hexedacimal
schreibt.
Was mich jetzt nur stört ist, dass doch am PCF 8583 die Daten im
BCD-Foramt anliegen. dieses sollte doch dann richtig vom unterprogramm
"hexdec" umgewandelt werden können.
Quellcode ist im anhang.
Hi,
die Minuten sind z.B. so aufgebaut:
AAAABBBB (die "2 BCD")
die A's stehen für die 10 Minuten die B's Minuten.
Mein Programm sichert erst mal das Minuten-Byte (data) in das Register
"save1".
Dann schiebt es die oberen vier Bit nach unten (4x lsr).
Nun stehen die 10 Minuten direkt als Byte da. Dann addiere ich zu diesem
Byte 9x das BYte an sich (also x10 gesamt). Nun stehen die 10 Minuten im
Klartext da( z.B. 5x10 = 50).
Nun addiere ich zu diesem Wert einfach noch die reinen Miuten (per andi
die oberen 4 Bits der Sicherung löschen + add-Verknüpfen).
Fertig.
Sebastian
Sicher, sicher.
Ich habe das im PIC etwas anders gemacht.
Zuerst Kopie in zwei temp. Register.
1er-Register: obere 4 Bit gelöscht.
10er-Register: untere 4 Bit gelöscht, 4 obere Bit nach unten rotiert.
auf C-Flag aufgepasst (muss hier Null sein).
Danach 10er 10mal in anderes Register addiert und 1er addiert. Dann das
Ergebnis in ASCCI umgewandelt und dann einzeln am LCD ausgegeben.
Wäre bestimmt interessant zu wissen, wie lange ich noch nach dem Fehler
gesucht hätte. Aber es gibt ja noch Leute, die einem z.T. das Denken
abnehmen.
Ich bedanke mich.
@chris: wenn du den fertigen Quellcode haben willst,poste ich ihn gerne
mal.
Hi,
ich habe bei I2C-Protokoll Warte-Pausen von 1ms, das klappt prima. Aber
ich glaube sogar 0,1ms gingen noch ohne Probleme. Scheint wohl für's
schreiben gut zu reichen.
Sebastian
@chris: hier noch der quellcode.
Stunden, Minuten und Sekunden werden an ein normales LCD ausgeben.
Datum und Wecker habe ich bisher noch nicht ausprobiert.
Hallo Zusammen,
ich habe gerade versucht die Sekunden-Minuten-Stunden des
RTC-auszugeben. Dabei ist mir aufgefallen dass wenn ich die empfangenen
Daten mit printf am Bildschirm anzeigen lasse muss ich den Wert in Hex
übertragen damit die Sekunden und Minuten von 0-59 angezeigt wird.
Werden die Daten der einzelnen Register in HEX übertragen?
Gruß
TOM