Forum: Mikrocontroller und Digitale Elektronik I2C mit PIC18F45K22 - Daten weg


von I2CPIC (Gast)


Lesenswert?

Hallo zusammen

Ich versuche mich gerade das erste mal an I2C, bin allerdings sehr 
verwirrt, da auch die Example Codes nicht zu funktionieren scheinen.

Ich nutze derzeit das easyPIC7 Dev. Board und die dazugehörige IDE 
mikroC PRO V6.4.0.

Es sind auch Beispielprogramme enthalten, nun folgendes Problem.

Hier der Ausschnitt des Codes, den es betrifft (1 zu 1 aus Example 
übernommen):
1
  I2C1_Init(100000);         // initialize I2C communication
2
  I2C1_Start();              // issue I2C start signal
3
  I2C1_Wr(0xA2);             // send byte via I2C  (device address + W)
4
  I2C1_Wr(0x2);              // send byte (address of EEPROM location)
5
  I2C1_Wr(0xAA);             // send data (data to be written)
6
  I2C1_Stop();               // issue I2C stop signal

Soweit ist ja alles auch in Ordnung. Bis ich mir die Datenübertragung 
auf einem Oszilloskop ansehe. Da wird nämlich das erste Byte korrekt 
versendet, die zwei weiteren lassen dann aber irgendwie auf sich warten.

Es ist gut zu erkennen, wie das erste Byte korrekt übertragen wird, die 
zwei weiteren allerdings auf sich warten lassen. Lediglich ein 
zweifacher Wechsel von Low -> High -> Low -> High ist zu erkennen. Die 
Dauer der Zustände entspricht jeweils einem Bit.

Entferne ich nun aber das versenden der zwei letzten Bytes, sprich 
wechsle den Code zu:
1
  I2C1_Init(100000);         // initialize I2C communication
2
  I2C1_Start();              // issue I2C start signal
3
  I2C1_Wr(0xA2);             // send byte via I2C  (device address + W)
4
  I2C1_Stop();               // issue I2C stop signal

Dann wird nach wie vor das erste Byte korrekt übertragen. Der 
Pegelwechsel welchen ich Zuvor noch hatte ist nun aber weg.

Leider kenne ich mich mit I2C nicht gut aus und finde auch nirgends im 
Internet eine wirklich gute Beschreibung dafür.

- Kann mir jemand bei dem Problem weiterhelfen?

- Kennt jemand vielleicht eine andere/bessere I2C Lib?

- Wäre es sinnvoll, einfach ein Soft I2C zu programmieren?

Vielen dank für eure Hilfe!

(Sorry dass keine Bilder im Anhang mit dran sind, mein KO erkennt den 
USB Stick heute irgendwie nicht. Vielleicht die funktion defekt, keine 
Ahnung..

von Bernd M. (bernd_m)


Lesenswert?

Das nächste Byte wird erst dann kommen, wenn die Gegenstelle das ACK 
sendet.
Um I2C zu verstehen, musst Du wohl die spec lesen.

von Max H. (hartl192)


Lesenswert?

I2CPIC schrieb:
> - Wäre es sinnvoll, einfach ein Soft I2C zu programmieren?
Wenn du die I²C Pins nicht für was anderes brauchst nicht, du kannst das 
HW. Modul mit deinem eigenen Code ansteuern, wenn du mit dem von microC 
nicht zufrieden bist. Ich habe bis jetzt immer mit der I²C-Lib von 
Microchip, die beim C18 dabei ist, gearbeitet und hatte keine Probleme, 
es war der gleiche PIC. Welchen Slave hast du am I²C hängen?

von Chris B. (dekatz)


Lesenswert?

Bernd M. schrieb:
> Ich nutze derzeit das easyPIC7 Dev. Board und die dazugehörige IDE
> mikroC PRO V6.4.0.

Die Jumper/DIP-Schalter auf dem Board richtig gesetzt um die 
I2C-Leitungen mit einem PullUp Widerstand zu beschalten?

von I2CPIC (Gast)


Lesenswert?

Geht ja flott hier!

Bernd M. schrieb:
> Das nächste Byte wird erst dann kommen, wenn die Gegenstelle das ACK
> sendet.
> Um I2C zu verstehen, musst Du wohl die spec lesen.

Okay. Gerade auch fündig geworden im Internet zum Thema ACK. Werde 
gleich mal nachmessen ob ich dieses ACK finde. Soweit ich das verstanden 
habe ist das ACK das 9te Bit, bzw. das erste Bit nach dem Datenbyte und 
wird durch einen Low Pegel signalisiert. Richtig?

Max H. schrieb:
> Ich habe bis jetzt immer mit der I²C-Lib von
> Microchip, die beim C18 dabei ist, gearbeitet und hatte keine Probleme,
> es war der gleiche PIC. Welchen Slave hast du am I²C hängen?

Mein Problem ist, eigentlich arbeite ich auch lieber mit MPLAB (XC 
Compiler). Da ich momentan aber nur das easyPIC zur Verfügung habe, 
bleibt mir kaum etwas anderes übrig da sich der uC sonst nicht 
Programmieren lässt. (Oder zumindest nichtmehr ganz so bequem)

An dem Slave hängt momentan ein EEPROM. (Das Standard Teil das schon auf 
dem Board vorhanden ist.)

Chris B. schrieb:
> Die Jumper/DIP-Schalter auf dem Board richtig gesetzt um die
> I2C-Leitungen mit einem PullUp Widerstand zu beschalten?

Ja, an die Pull-Up's habe ich gedacht. Erklärt sich ja eigentlich von 
selbst, da ich ja geschrieben habe dass ich einen Teil der Daten bereits 
richtig erkennen kann.

Gruss

von Stefan (Gast)


Lesenswert?

Die Demos die dabei sind funktionieren
nicht ?
Kann ich mir nicht vorstellen. Da mußt
du irgendwo einen Fehler gemacht haben.
Bei mir laufen die alle einwandfrei.

von Bernd M. (bernd_m)


Lesenswert?

Wenn ich das richtig sehe ist das EEPROM ein 24AA01?
Im Datenblatt von Microchip ist I2C hinteichend beschrieben (Seite 6 
ff).

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.