Hallo,
ich versuche gerade über den Portexpander PCF8574AP 8 LED's einfach aus-
bzw. anzuschalten.
Dazu habe ich die Dioden wie folgt beschaltet:
+3,3V --- Vorwiderstand --- LED --- PCF8574AP
Beim Start meines Gerätes sind die LED's alle aus und die Pins des
Portexpanders alle HIGH.
Sobald ich aber den Befehl (aus der Atmel Library, XMega128A1):
TWI_MasterWrite(&twiMasterC,0x70,0xFF,1);
ausführe, werden alle Ports LOW geschaltet und die LED's leuchten.
Ich habe doch aber über den Befehl alle Pins HIGH gesetzt.
Wenn ich verschiedene andere Bytes sende, dann leuchten die LED's wie
sie wollen.
Habt ihr eine Idee, wie es dazu kommt?
Grüße
Hendrik
Habe etwas rumprobiert und mal ein paar Daten gesammelt.
Bytes gesendet||Pin7 bis Pin0 am PCF 8574AP
0000 0001||11000110
0000 0010||11000001
0000 0100||01001111
Der I²C Bus Funktioniert, da ich damit auch ein Display bediene.
Kann mir das echt nicht erklären.
Hendrik E. schrieb:> Habe etwas rumprobiert und mal ein paar Daten gesammelt.> Bytes gesendet||Pin7 bis Pin0 am PCF 8574AP> 0000 0001||11000110> 0000 0010||11000001> 0000 0100||01001111
Ist das reproduzierbar oder Zufall?
Jörg S. schrieb:> Hendrik E. schrieb:>> Habe etwas rumprobiert und mal ein paar Daten gesammelt.>> Bytes gesendet||Pin7 bis Pin0 am PCF 8574AP>> 0000 0001||11000110>> 0000 0010||11000001>> 0000 0100||01001111> Ist das reproduzierbar oder Zufall?
Ja die Belegungen sind zwar falsch aber immer die selben.
>TWI_MasterWrite(&twiMasterC,0x70,0xFF,1);>ausführe, werden alle Ports LOW geschaltet und die LED's leuchten.>Ich habe doch aber über den Befehl alle Pins HIGH gesetzt.
Ehh? Das ist doch richtig so. Der Portpin arbeitet als Open-Collector
besser gesagt, als Open Drain. Am Ausgang sind zwei Transistoren die
wechselweise ein-und ausschalten. Wenn du ein High wegschickst, kommt
das High am Gate des n-Kanal MOSFET des Portpins an und schaltet diesen
ein. Dadurch liegt jetzt Masse am Portpin und die LED leuchtet. Würdest
du jetzt ohne Vorwiderstand, zB via Taster +5V auf den Portpin geben,
würde der n-Kanal Mosfet durchbrennen...
Schau dir mal Fig.9 Simplified schematic diagram of each I/O
von
http://www.nxp.com/documents/data_sheet/PCF8574.pdf
an.
@ Hendrik E. (partysan)
>Der I²C Bus Funktioniert, da ich damit auch ein Display bediene.>Kann mir das echt nicht erklären.
Kann es sein, dass die Funktion NICHT einfach die Bytes rausschickt,
sondern irgendweine interne Datenformumg macht, weil sie für die
Displayansteuerung gedacht war?
Ein Oszi gibt schnell Auskunft.
@ Joachim ... (joachim_01)
>>TWI_MasterWrite(&twiMasterC,0x70,0xFF,1);>>ausführe, werden alle Ports LOW geschaltet und die LED's leuchten.>>Ich habe doch aber über den Befehl alle Pins HIGH gesetzt.>Ehh? Das ist doch richtig so.
Nö, eben nicht. Die LEDs sind ja LOW aktiv verschaltet. Ein 0xFF
schaltet die IOs aber auf HIGH.
>Der Portpin arbeitet als Open-Collector>besser gesagt, als Open Drain. Am Ausgang sind zwei Transistoren die>wechselweise ein-und ausschalten.
Naja, nicht wirklich. Es gibt nur einen schaltbaren Transistor, der
zieht auf LOW. Der andere ist immer an, er wirkt als schwacher Pull-Up
Widerstand.
http://www.mikrocontroller.net/articles/Port-Expander_PCF8574>du jetzt ohne Vorwiderstand, zB via Taster +5V auf den Portpin geben,>würde der n-Kanal Mosfet durchbrennen...
Davon war nie die Rede. Der Op hat es schon richtig angeschlossen. Nur
scheint die I2C Kommunikation ein Problem zu haben.
MfG
Falk
H. P. Bolliger schrieb:> Der PCF 8574AP hat die Adresse 0x70, also hat die LCD-Adresse im Minimum> den Wert 0xX2?
Das Display hat die Adresse 0xDE.
Falk Brunner schrieb:> Ein Oszi gibt schnell Auskunft.
Das das Display die Daten richtig empfängt gehe ich nicht davon aus.
Ein Oszilloskop habe ich gerade nicht.
Hendrik E. schrieb:> Das das Display die Daten richtig empfängt gehe ich nicht davon aus.> Ein Oszilloskop habe ich gerade nicht.
Zeig doch mal die Sourcen.
Also wie gesagt benutze ich die unveränderte Atmel Library für den
I2C/TWI (Anhang).
Habe das ganze jetzt an einen anderen I2C/TWI gehängt, wo ausschließlich
der PCF8574AP dran hängt. Ganz kurze Kabel zur Übertragung habe ich auch
mal ausprobiert, ansonsten etwa 10cm Kabel. Die Situation bleibt
unverändert.
Initialisiert wird das ganze mit:
1
#define NUM_BYTES 4 //Defining number of bytes in buffer
Falk Brunner schrieb:> Stars und Sternchen, nicht nur in Showbuis gelegentlich problematisch.> Probier mal das.> uint8_t dummy=0xFF;> TWI_MasterWrite(&twiMasterC,PORTEXPAND_1_ADDR, &dummy, 1);
Unglaublich das war es!
Vielen Dank für den Tipp.
Aber warum verursacht das Ganze diesen Fehler, könnte mir das jemand
erklären?
@ Hendrik E. (partysan)
>Aber warum verursacht das Ganze diesen Fehler, könnte mir das jemand>erklären?
Das steht in jedem C-Buch.
dummy ist eine Variable
&dummy ist die ADRESSE der Variable
In dem Funktionsprototypen steht
uint8_t * writeData,
es wird ein ZEIGER (Adresse) auf die zu schreibenden Daten gefordert.
In deinem falschen Aufruf hast du 0xFF übergeben. Die Funktion hat
darauf die Daten von Adresse 0xFF geschrieben, dort steht irgendwas
zufälliges drin. Ein guter Compiler hätte wenigstens ne Warnung erzeugt,
wegen falschem Parametertyp. Aber die hast du wahrscheinlich ignoriert.
MfG
Falk
Danke für deine Hilfe!
Ich denke ich habe es jetzt verstanden.
Apropos C-Buch, hast du zufällig eine Literaturempfehlung für mich (im
Bezug auf Mikrocontroller und C).
Grüße
Hendrik