Forum: Mikrocontroller und Digitale Elektronik PCF8574 Ein-/Ausgänge


von Pat F. (breaker87)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein kleines Problem mit meinem IO-Expander (PCF8574).
Ich verwende ihn in einer Schaltung für 4 Ein- (Optokopller) und 4 
Ausgänge (Darlington Treiber --> Relais). (siehe Anhang)

Ich kann Daten sowohl lesen, als auch schreiben, das Problem ist aber, 
dass beim Lesen die Ausgänge kurzzeitig alle auf low geschalten werden. 
Ich weiß nicht woran das liegt. Die Kommunikation läuft per Soft-I2C auf 
einem STM32 (ja, ich weiß dass der auch I2C Hardware hat).

Hier mal der Codeausschnitt mit dem ich lese und schreibe (läuft zur 
zeit im main als endlosschleife ab (mit Delay, denn sonst klappern meine 
Relais):
1
    //READ
2
    I2C1_Start(); 
3
    I2C1_SendByte(0x40);  //Schreibadresse
4
    I2C1_WaitAck();
5
    I2C1_SendByte(0xF0);  //Eingangspins HIGH sezten --> auch bei 0xFF 
6
                          //bleibt der Fehler erhalten
7
    I2C1_WaitAck();
8
    I2C1_Start(); 
9
    I2C1_SendByte(0x41);  //Leseadresse
10
    I2C1_WaitAck();
11
    input = I2C1_ReceiveByte();
12
    I2C1_NoAck();       
13
    I2C1_Stop();
14
15
    new_input = (input) >> 4;  //Eingelesene Daten direkt wieder ausgeben
16
    I2C1_Start();
17
    I2C1_SendByte(0x40);       //Schreibadresse
18
    while(I2C1_WaitAck());
19
    I2C1_SendByte(new_input);
20
    I2C1_Stop();

Was übersehe ich?

lg

von Falk B. (falk)


Lesenswert?

@  Patrick F. (breaker87)

>Ich kann Daten sowohl lesen, als auch schreiben, das Problem ist aber,
>dass beim Lesen die Ausgänge kurzzeitig alle auf low geschalten werden.

Ja logisch, das machst du doch selber!

>Hier mal der Codeausschnitt mit dem ich lese und schreibe (läuft zur
>zeit im main als endlosschleife ab (mit Delay, denn sonst klappern meine
>Relais):

>    //READ
>    I2C1_Start();
>    I2C1_SendByte(0x40);  //Schreibadresse
>    I2C1_WaitAck();
>    I2C1_SendByte(0xF0);  //Eingangspins HIGH sezten --> auch bei 0xFF
>                          //bleibt der Fehler erhalten

???
Warums schreibst du, wenn der Kommentar sagt lesen? Und dass hier IMMER 
deine Ausgänge LOW werden, sollte jeder sehen.
Wo ist das STOP?

>    I2C1_WaitAck();
>    I2C1_Start();
>    I2C1_SendByte(0x41);  //Leseadresse
>    I2C1_WaitAck();
>    input = I2C1_ReceiveByte();
>    I2C1_NoAck();
>    I2C1_Stop();

DAS ist das Lesen.

>    new_input = (input) >> 4;  //Eingelesene Daten direkt wieder ausgeben

Warum dann schieben? Lass es so wie es ist.

>    I2C1_Start();
>    I2C1_SendByte(0x40);       //Schreibadresse
>    while(I2C1_WaitAck());
>    I2C1_SendByte(new_input);
>    I2C1_Stop();

>Was übersehe ich?

Siehe oben. Man muss die Port P4-7 nur EINMAL mit 0xF beschreiben, die 
bleiben dann high, wenn man es richtig macht. Eher so.
1
my_i2c_write (uint8_t data) {
2
    
3
    I2C1_Start(); 
4
    I2C1_SendByte(0x40);  //Schreibadresse
5
    I2C1_WaitAck();
6
    I2C1_SendByte(0xF0 | data);  //P4-P7 Eingänge ->HIGH
7
    I2C1_Stop();
8
}
9
10
uint8_t my_i2c_read() {
11
12
    uint8_t input;
13
14
    I2C1_Start(); 
15
    I2C1_SendByte(0x41);  //Leseadresse
16
    I2C1_WaitAck();
17
    input = I2C1_ReceiveByte();
18
    I2C1_NoAck();       
19
    I2C1_Stop();
20
    return input;
21
}

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.