Hi zusammen Also ich verwende einen PCF8574 und habe eine Frage zum Acknowledge Ich habe schon Werte am Port Expander ausgegeben die ich auch Programmiert hatte, jedoch fehlt mir der Acknowledge vom PCF8574... Byte wurde an PE gesendet und der Wert wird auch ausgegeben. Nun definiere ich die Datenleitung während dem High-Status des Clocks als Eingang um ja das Acknowledge vom PE empfangen zu können. Code: bsf PORTB,2 ; Clock auf High setzen bsf STATUS, RP0 movlw b'00000010' movwf TRISB bcf STATUS, RP0 ; Daten-Port als Eingang definiert bcf PORTB, 2 ; Clock auf Low Jetzt sollte ich doch das Acknowledge empfangen können oder? Als Controller verwende ich einen PIC16F627
weiss nicht! ich habe keine ahnung von diesem Thema. sorry!
in ASM, bist du irre? sry, die ausdruckweise xP wieso nicht in C und fertige lib's verwenden?
Ist eine vorgabe dass ich es in ASM programmieren muss
@ Remo (Gast) >definiere ich die Datenleitung während dem High-Status des Clocks als >Eingang um ja das Acknowledge vom PE empfangen zu können. Das darfst du nicht! SDA darf nur geänsert werden, wenn SCL auf LOW liegt. Sonst kann es passieren, dass eine START oder STOP Bedingung generiert wird. Also ERST SDA auch HIGH, DANN SCL auf HIGH, dann SDA prüfen. [[Port-Expander PCF8574]] MFG Falk
wenn du meinst ich solle vor dem 8. Clock die Leitung auf High setzen damit der Port Expander die Leitung auf 0 herunterziehen kann für das acknowledge, dann kann ich ja nur 7 Bits senden??
Das Acknowledge kommt doch erst nachtem der 8. Clock auf LOW geht oder etwa nicht?
Remo wrote:
> wenn du meinst ich solle vor dem 8. Clock die Leitung auf High setzen
Nein!
Beim I2C wird niemals etwas auf high gesetzt, es ist ein wired-OR Bus.
Der SDA-Pin wird einmalig (nach dem Reset) auf low gesetzt.
Um ein low-Bit zu senden, wird dann das Richtungsbit auf Ausgang
gesetzt.
Um ein high-Bit zu senden oder etwas zu lesen, wird das Richtungsbit auf
Eingang gesetzt.
Das gleiche gilt natürlich auch für den SCL-Pin.
Und es werden immer 9 Takte erzeugt, 8 für das Byte und ein 9-ter für
das ACK/NACK.
Man sollte sich einfach mal das Datenblatt eines I2C-Chips anschauen, da
steht das alles ganz ausführlich drin.
Peter
Kannst du mir vielleicht kurz beschreiben wie ich das in einem Programm realisieren muss in assembler? Das Datenblatt hab ich ausführlich studiert und auch schon einiges ausprobiert aber ich kann mit dem KO immernoch kei ACK feststellen. Brauche vielleicht ein kleines Beispiel wie ich das machen könnte
Remo wrote: > Kannst du mir vielleicht kurz beschreiben wie ich das in einem Programm > realisieren muss in assembler? Nein. Mit PIC-Assembler kenne ich mich nicht aus, ist mir zu umständich. Ich kann nur 8051/AVR-Assembler und C. Peter
@ Peter Dannegger (peda) >Beim I2C wird niemals etwas auf high gesetzt, OK, hab mich schlecht ausgedrückt. Ich meinte implizit, dass der Master SDA auf Tristate setzen muss, was per Pull-Up zu HIGH wird (wenn kein anderer SDA auf LOW hält). > es ist ein wired-OR Bus. Ich würde das eher als Wired-AND bezeichnen. MfG Falk
@ Remo (Gast) >Kannst du mir vielleicht kurz beschreiben wie ich das in einem Programm >realisieren muss in assembler? Kenn mich in PIC-ASM auch nicht aus, ist mir zu gruselig ;-) Im Prinzip so. SCL ist LOW nach dem 8. Datenbit SDA wird auf Eingang geschaltet kleine Pause SCL wird auf Eingang geschaltet und durch den Pull-Up auf HIGH gezogen kleine Pause SDA lesen, signalisiert ACK. Mfg Falk
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.