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.
Der PCF 8574AP hat die Adresse 0x70, also hat die LCD-Adresse im Minimum den Wert 0xX2?
@ 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
|
2 | #define CPU_SPEED 32000000 //CPU speed 32MHz
|
3 | #define BAUDRATE 100000 //BAUDRATE 100kHz
|
4 | #define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)//Baudrate Register Settings
|
5 | #define PORTEXPAND_1_ADDR 0x70
|
6 | |
7 | |
8 | TWI_Master_t twiMasterC; //TWI master module |
9 | |
10 | void initPeripheryTWI(){ |
11 | TWI_MasterInit(&twiMasterC,&TWIC,TWI_MASTER_INTLVL_LO_gc,TWI_BAUDSETTING); //Initialize TWI master |
12 | }
|
13 | //TWIC Master Interrupt vector
|
14 | ISR(TWIC_TWIM_vect) |
15 | {
|
16 | TWI_MasterInterruptHandler(&twiMasterC); |
17 | }
|
und gestartet mit:
1 | void LED_OFF(){ |
2 | |
3 | TWI_MasterWrite(&twiMasterC,PORTEXPAND_1_ADDR,0xFF,1); |
4 | |
5 | }
|
@ Hendrik E. (partysan) > * twi_master_driver.h (6 KB, 3 Downloads) | Codeansicht >void LED_OFF(){ > TWI_MasterWrite(&twiMasterC,PORTEXPAND_1_ADDR,0xFF,1); >}
1 | bool TWI_MasterWrite(TWI_Master_t *twi, |
2 | uint8_t address, |
3 | uint8_t * writeData, |
4 | uint8_t bytesToWrite); |
Stars und Sternchen, nicht nur in Showbuis gelegentlich problematisch. Probier mal das.
1 | uint8_t dummy=0xFF; |
2 | TWI_MasterWrite(&twiMasterC,PORTEXPAND_1_ADDR, &dummy, 1); |
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
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.