PCF8574AP Problem

Gast #2586424
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
Gast #2586584
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.
Gast #2586743
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.
#2586777
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.
#2587040
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.
#2587042
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
Gast #2587482
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
}
Angehängte Dateien:
#2587586
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);
Gast #2587604
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?
#2587606
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren