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
Hallo, ich nutze den DS1307, mit Puffer-Batterie, läuft astrein mit kurzem Listing unter FASTavr, evtl. umsteigen. Gruss Tom
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
Hi Sebastian, versuch es mal mit jeweils einem Pullup-Widerstand (10k oder so) für die beiden I²C-Leitungen.
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
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.
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.
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.