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.
genau das selbe problem habe ich auch ! nur ich verwende den 16F877 ! bitte poste hier falls du eine lösung gefunden hast !
Hi I2C-EEPROM's können normalerweise I2C mit 400kHz. Der RTC kann das aber AFAIK nicht. Stimmt also eure Taktfrequenz? Matthias
ich ahb leider erst in einer woche zeit weiterzuprogrammiern. meine taktfrequenz stimmt allerdings
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
leiderhabe ich das programm nciht zuhause ! ich kann erst in ca. einer woche den quellcode posten bzw. sachen ausprobieren
@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.
Mache aus 2 BCD ein "normales Byte": ------------------------------------ .def temp1 = r16 ; Hilfsvariable .def data = r17 ; BCD-Codiertes Byte .def save1 = r19 ; Hilfsvariable 2 .def erg = r20 ; Ergebnis als normales Byte Multi_mit_10: mov temp1,data add data,temp1 add data,temp1 add data,temp1 add data,temp1 add data,temp1 add data,temp1 add data,temp1 add data,temp1 add data,temp1 ret HAUPTPROGRAMM: -------------- mov save1,data lsr data lsr data lsr data lsr data rcall Multi_mit_10 andi save1,0b00001111 add data,save1 mov erg,data Viel Spaß! Sebastian
warum kann man denn nicht vom rtc empfangene byte einfach ausgeben? ist es nicht egal, wenn die vier oberen bit null sind?
(das mit den vier oberen bit war blödsinn.) was meist du mit 2 bcd und normalem byte???
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
Ach so. da habe ich gar nicht dran gedacht, das in einem register im RTC 2 Daten stehen. 10er und 1er. Dumm von mir. danke.
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.
noch was anderes. wie lange schreibt den der RTC? wenn ich jetzt eine Uhrzeit einstellen will, wie lange muss ich dann warten?
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
ich habe spontan einfach mal 10ms genommen. die uhr läuft jetzt erst mal ohne datum, nur std, min und sec. testweise.
@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
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.