Forum: Mikrocontroller und Digitale Elektronik PCF 8583


von HDW (Gast)


Angehängte Dateien:

Lesenswert?

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.

von chris (Gast)


Lesenswert?

genau das selbe problem habe ich auch ! nur ich verwende den 16F877 !

bitte poste hier falls du eine lösung gefunden hast !

von Matthias (Gast)


Lesenswert?

Hi

I2C-EEPROM's können normalerweise I2C mit 400kHz. Der RTC kann das aber 
AFAIK nicht. Stimmt also eure Taktfrequenz?

Matthias

von chris (Gast)


Lesenswert?

ich ahb leider erst in einer woche zeit weiterzuprogrammiern.

meine taktfrequenz stimmt allerdings

von HDW (Gast)


Lesenswert?

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?

von Sven (Gast)


Lesenswert?

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

von Sebastian Wille (Gast)


Lesenswert?

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

von chris (Gast)


Lesenswert?

leiderhabe ich das programm nciht zuhause !

ich kann erst in ca. einer woche den quellcode posten bzw. sachen 
ausprobieren

von HDW (Gast)


Angehängte Dateien:

Lesenswert?

@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.

von HDW (Gast)


Lesenswert?

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

von HDW (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Sebastian Wille (Gast)


Lesenswert?

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

von HDW (Gast)


Lesenswert?

warum kann man denn nicht vom rtc empfangene byte einfach ausgeben? ist 
es nicht egal, wenn die vier oberen bit null sind?

von HDW (Gast)


Lesenswert?

(das mit den vier oberen bit war blödsinn.)

was meist du mit 2 bcd und normalem byte???

von Sebastian Wille (Gast)


Lesenswert?

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

von HDW (Gast)


Lesenswert?

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.

von Sebastian Wille (Gast)


Lesenswert?

Hi,

kein Problem! Klappt's nun?

Sebastian

von HDW (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

ja bitte, poste ihn !

von HDW (Gast)


Lesenswert?

noch was anderes. wie lange schreibt den der RTC?
wenn ich jetzt eine Uhrzeit einstellen will, wie lange muss ich dann 
warten?

von Sebastian Wille (Gast)


Lesenswert?

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

von HDW (Gast)


Lesenswert?

ich habe spontan einfach mal 10ms genommen.

die uhr läuft jetzt erst mal ohne datum, nur std, min und sec.
testweise.

von HDW (Gast)


Angehängte Dateien:

Lesenswert?

@chris: hier noch der quellcode.

Stunden, Minuten und Sekunden werden an ein normales LCD ausgeben.
Datum und Wecker habe ich bisher noch nicht ausprobiert.

von Tom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.