Forum: Mikrocontroller und Digitale Elektronik PCF 8583 / I2C -Problem


von Sebastian Wille (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte an meinen AVR 2313 den Uhrenchip "PCF 8583" von Phillips 
anschließen (Clock an PortD/Pin2; Data an PortB/Pin0; Interrupt vorerst 
nicht angeschlossen).

Leider klappt das alles noch nicht so ganz. Also, wenn ich es recht 
sehe, kann ich Daten schreiben (Ack.-Bit = GND). Nur kann ich nichts 
auslesen! Oder besser gesagt: Der Chip zieht Data niemals herunter, egal 
bei welcher Adresse usw. Lege ich in dieser Phase "von Hand" Data auf 
GND klappts schon. Deshalb bin ich mir nicht sicher, daß es an dem 
Programm liegt.

Anderseits will auch ein Temp.-I2C-Baustein nicht laufen (gleiches 
Phänomen).

Kann mir jemand helfen?

Beim suchen, hab' ich gesehen, daß wolli_r den Chip schon länger 
einsetzt. Hast Du Tips für mich?

Am Anhang mein Programm.

Vielen Dank schonmal!!! :-)

   Sebastian

von Tom (Gast)


Lesenswert?

Hallo,

ich nutze den DS1307, mit Puffer-Batterie, läuft astrein mit kurzem 
Listing unter FASTavr, evtl. umsteigen.

Gruss
Tom

von Jens Fiedelak (Gast)


Lesenswert?

Hallo Sebastian,

hört sich an, als ob Du die SDA Leitung, bzw. den Pin nicht auf Eingang 
schaltest wenn Du Daten auslesen willst.

Gruß Jens

von hebel23 (Gast)


Lesenswert?

Hi Sebastian,

versuch es mal mit jeweils einem Pullup-Widerstand (10k oder so) für die 
beiden I²C-Leitungen.

von Sebastian Wille (Gast)


Lesenswert?

Hi,

danke erstmal für die Tips!

Ich habe allerdings sowohl an den Eingang als auch an die Pullups 
bereits gedacht.

Und einen anderen Chip will ich nicht verwenden (hab' schon ein paar 
PCFs gekauft).

Findet jemand noch 'nen Fehler im Programm?!?

Danke!

Sebastian

von thkaiser (Gast)


Lesenswert?

Hmmm... Ich hab Deinen Code nur so überflogen. Ich muß mal kramen, ich 
habe komplette I²C-Routinen irgendwo auf meiner Platte, ich mail sie Dir 
bei Gelegenheit.
Was mir auffiel:
Du ignorierst das ACK in der Routine write_byte. Das darfst Du, 
allerdings mußt Du trotzdem einen CLK-Impuls generieren, jedes Byte 
braucht 9 CLK-Impulse, auch wenn Du den ACK nicht verwendest. Weiter hab 
ich jetzt noch nicht durchgeschaut.
Dann noch als Tipp: Setze das Port-Bit des SDA und des SCL auf 0, und 
schalte mit den entsprechenden Bits des DatenRichtungsRegisters, 
allerdings invertiert. Beispiel:
sbi DDRB,sda = SDA auf 0
cbi DDRB,sda = SDA auf Tristate (über ext. Pull-up auf high).
Dies entspricht mehr den Spezifikationen des I²C-Bus. Mit Deiner Methode 
gehts zwar auch, aber Du mußt höllisch aufpassen, sonst gibts einen 
Crash auf dem Bus.

von thkaiser (Gast)


Lesenswert?

Hier der Code:

http://www.ft-fanpage.de/i2c.asm

Eh jetzt jemand rummeckert: Der Codeschnipsel ist 1. total aus dem 
Zusammenhang gerissen und 2. sicherlich nicht "schön" geschrieben. Ich 
habe irgendwann mal Assembler gelernt, als man Registern nicht per .def 
Namen geben konnte - und das ist halt drin bei mir, ich bin ein echter 
Register-Purist g
Die benutzten Register könnt ihr euch selber raussuchen - und auch 
behalten ;-)

Ehe ichs vergesse: Gerade I2C-Speicher (z.B. EEPROMs) wollen bei 
Lesezugriffen beim letzten Byte ein nACK. Die oben gezeigte Routine 
benutzt bei i2c_get_byte das Bit 0 von R27 zur Entscheidung, ob ACK oder 
nACK ausgegeben wird. In Bit 7 von R27 ist ein Fehler-Bit, das ggf. 
ausgewertet werden kann. Es wird durch nACK bei i2c_send_byte gesetzt.

Falls jemand interesse an einem Multimaster I2C-Code für den 2313 hat 
(läuft zu 100% im Interrupt.... Aber da garantiere ich für 
Null-Durchblick.

von thkaiser (Gast)


Lesenswert?

hmpf -".asm" ist wohl irgendwie reserviert.
http://www.ft-fanpage.de/i2c.asm_

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.