Forum: Mikrocontroller und Digitale Elektronik Bekomme kein Acknowledge vom Port Expander


von Remo (Gast)


Lesenswert?

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

von jürgen (Gast)


Lesenswert?

weiss nicht! ich habe keine ahnung von diesem Thema. sorry!

von sepp (Gast)


Lesenswert?

ich auch nicht!

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

in ASM, bist du irre? sry, die ausdruckweise xP

wieso nicht in C und fertige lib's verwenden?

von Remo (Gast)


Lesenswert?

Ist eine vorgabe dass ich es in ASM programmieren muss

von Falk B. (falk)


Lesenswert?

@ 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

von Remo (Gast)


Lesenswert?

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??

von Brunhilde (Gast)


Lesenswert?

Das Acknowledge kommt doch erst nachtem der 8. Clock auf LOW geht oder 
etwa nicht?

von Peter D. (peda)


Lesenswert?

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

von Remo (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Remo (Gast)


Lesenswert?

8051 assembler kenn ich auch ein bisschen würde ich warsch. auch 
verstehen

von Falk B. (falk)


Lesenswert?

@ 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

von Falk B. (falk)


Lesenswert?

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