Forum: Compiler & IDEs Software-TWI: enge Clock-Frequenz oder beliebige Zeiten?


von Alexander S. (knut740)


Angehängte Dateien:

Lesenswert?

Hallo,
ich möchte einen PCF8574 per Software-TWI ansprechen, weil ich die lt. 
Manual vorgesehenen Ports später nicht verwenden möchte.
Mein Problem: bei der Übermittlung der Adresse erhalte ich immer eine 
Bestätigung (Ack), aber leider auch dann, wenn ich eine falsche Adresse 
angebe.
Zugegeben, ich bin mit den Clock-Frequenzen ganz unbedarft umgegangen, 
außer den Prescaler auf 64 zu stellen, habe ich nichts weiter 
eingestellt.
Bei der Ack-Abfrage ist ein stabiler Zustand von CLK nötig, aber da wird 
von einer leeren Operation bis zu einer Millisekunde kein Unterschied 
gemacht, also ist es wohl nicht zeitkritisch.

Vielleicht enthält mein Testprogramm gravierende Fehler?
Es soll durch zwei LED's signalisieren, ob ein Ack gesendet wird.
Ob sich das vielleicht jemand mit besseren Kenntnissen als ich mal 
ansehen könnte? Wurde mir sehr helfen, weil ich einfach nicht sehe, was 
da falsch ist.

Vielen Dank schon mal!
Alexander

von Stefan (Gast)


Lesenswert?

Hallo,

ein Fehler der mir sofort auffällt ist, dass du SCL als auch SDA sowohl 
auf Low als auch auf High schaltest.
Lasse den Port-output immer auf Low und  schalte nur die Datenrichtung.
Überlasse das High-Signal den Pullup-Widerständen
Output ist dann Low und Input bedeutet High (bzw. bei SDA das was der 
Slave sagt)
Damit hast du dann ein anständiges "wired OR" wie es bei I2C verlangt 
wird!

von Alexander S. (knut740)


Angehängte Dateien:

Lesenswert?

Hallo Stefan

ich habe, wie Du geschrieben hast, weitgehend die Ports nicht mehr 
direkt geschaltet. An einigen Stellen, z.B. Adressübertragung, pulse() 
usw. geht es aber wahrscheinlich nicht anders.
Ist es wirklich so, daß ein Port, den ich als low schalte, durch den 
Pullup high wird? Wird die interne Stromsenke damit nicht fertig?
Bei i2cstart habe ich einfach nur die Ports als Ausgänge gesetzt, ob das 
richtig ist?

Gruß
Alexander

PS trotz der Änderungen ist das mißliche Verhalten geblieben.

von Leo H. (Gast)


Lesenswert?

Moin,

du musst die Pins für High-Pegel als Eingang (Tri-State) konfigurieren, 
ansonsten bleiben die ständig auf Low.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

es muss gehn, alles andere ist Mist !!!!

Probiers mal nach angehängtem Vorbild

von Alexander S. (knut740)


Lesenswert?

Stefan schrieb:
> Hallo,
>
> es muss gehn, alles andere ist Mist !!!!
>
> Probiers mal nach angehängtem Vorbild

Hallo Stefan
Hand aufs Herz - bist Du sicher, daß Deine Version wirklich 
funktioniert?
(mir erscheint es auch plausibel).
Da ich aber immer noch kein Ack bekomme, muß es doch an der Hardware 
liegen.
Ich hatte, bevor ich mich an das Forum gewandt habe, geprüft, ob die 
Eingangssignale SCL und SDA bis zum PCF8574 gelangen ( sie taten es) und 
auch zweimal die PCF's getauscht und dann vermutet, es läge an meinem 
verunglückten Testprogramm.
Aber nachdem auch mit Deiner korrigierten Version kein Ack kommt, bleibt 
nur noch weitere Suche an der Hardware. Vielleicht muß ich einen 
separaten Teststand aufbauen.
Also, ich suche weiter.

Viele Grüße
Alexander

von Rudolf (Gast)


Lesenswert?

Vorsicht, es gibt zwei Versionen vom PCF8574, die sich in ihrer Adresse 
unterscheiden. PCF8574 und PCF8574A!

von Alexander S. (knut740)


Lesenswert?

Rudolf schrieb:
> Vorsicht, es gibt zwei Versionen vom PCF8574, die sich in ihrer Adresse
> unterscheiden. PCF8574 und PCF8574A!

Ja, ich weiß, ich habe beide.
Ich hatte in meiner Verzweiflung schon mal eine Programmversion 
geschrieben, wo die Adressen von 0 bis 255 hochgezählt werden - hat aber 
auch nichts gebracht.
Vielen Dank und viele Grüße
Alexander

von Stefan (Gast)


Lesenswert?

Hallo,

ich hab die Version nicht selbst ausprobiert ob sie funktioniert oder 
nicht. Es sollte nur eine Vorlage dafür sein wie man die Signale SCL/SDA 
erzeugt (Stichwort: "wired OR").

Der I2C Bus hat aber auch noch weitere Stolpersteine.

Du verwendest z.B. in deinem Program die Adresse 124 für den PCF8574, 
dies ist aber, gleich wie du ihn beschaltest, keine gültige Adresse.
Sie muss laut Datenblatt lauten L,H,L,L,A2,A1,A0,R/W (das ist irgendwas 
zwischen 40h-4fh, entsprechend 64-79 Dezimal)

Ferner ist das Timing (Anzahl der NOPs) nicht unbeding für deine 
Hardware passend!!!

Und, Und ....

Ein bisschen musst du schon noch arbeiten !!!

Gruss Stefan

von Stefan (Gast)


Lesenswert?

Hallo,

noch eine Anmerkung noch zur Auswertung von SDA

  if( (PINC & (1<<SDA)) !=0) // ist SDA low ???

beachte (1<<SDA) !!!

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.