mikrocontroller.net

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


Autor: Remo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jürgen (Gast)
Datum:

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

Autor: sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich auch nicht!

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in ASM, bist du irre? sry, die ausdruckweise xP

wieso nicht in C und fertige lib's verwenden?

Autor: Remo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eine vorgabe dass ich es in ASM programmieren muss

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Remo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Brunhilde (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Remo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Remo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8051 assembler kenn ich auch ein bisschen würde ich warsch. auch 
verstehen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.