Forum: Mikrocontroller und Digitale Elektronik PCF8574AP Problem


von Henrik E. (Gast)


Lesenswert?

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

von Henrik E. (Gast)


Lesenswert?

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.

von Jörg S. (joerg-s)


Lesenswert?

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?

von Henrik E. (Gast)


Lesenswert?

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.

von Joachim .. (joachim_01)


Lesenswert?

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

von H. P. Bolliger (Gast)


Lesenswert?

Der PCF 8574AP hat die Adresse 0x70, also hat die LCD-Adresse im Minimum 
den Wert 0xX2?

von Falk B. (falk)


Lesenswert?

@  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.

von Falk B. (falk)


Lesenswert?

@  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

von Henrik E. (Gast)


Lesenswert?

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.

von stm32_user (Gast)


Lesenswert?

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.

von Henrik E. (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Falk B. (falk)


Lesenswert?

@  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);

von Henrik E. (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@  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

von Henrik E. (Gast)


Lesenswert?

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