PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Frage zu PCF8574



Henry
18.03.2012, 18:20
Hallo,

ich experimentiere gerade etwas mit einem PCF8574 an einem ATMega32 herum.
Grundsätzlich habe ich meine kleine Portexpanderschaltung auch zum laufen gebracht. Wenn ich aber nun nur einmal den Befehl zum einschalten aller ports auf den Bus sende blitzen meine LEDs nur einmal kurz auf und bleiben dann aus.



i2c_start();
i2c_send(i2cadresse);
i2c_send(i2cdaten);
i2c_stop();


Wenn ich das ganze aber in die Endlosschleife des Hauptprogramms schreibe, dann bleiben sie zwar an, aber die LEDs erreichen bei weitem nicht ihre eigentliche Lichtstärke.
Meine Frage ist nun:
Ist es mit dem PCF8574 nicht möglich den Zustand der Ausgänge bei zu behalten bis der nächste Befehl kommt, ohne ständig die Daten wiederholt zu senden?
Oder mache ich da noch etwas falsch?

Hier noch einmal der Code den ich für die Funktionen verwendet habe.



void i2c_start(void)
{
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); // send start condition
while ((TWCR & _BV(TWINT)) == 0) ; // wait for transmission
}

void i2c_stop(void)
{
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);
}

void i2c_send(uint8_t DataByte)
{
TWDR = DataByte;
TWCR = _BV(TWINT) | _BV(TWEN); // clear interrupt to start transmission
while ((TWCR & _BV(TWINT)) == 0) ; // wait for transmission
}


Danke schon einmal für die Hilfe

Klebwax
18.03.2012, 18:37
Du zeigtst zwar nicht, wie deine LEDs angeschlossen sind, noch was du auf den Port schreibst, aber ich vermute einen klassischen "Manual Not Read Error" . Ich empfehle da Kapitel 7.3

MfG Klebwax

Henry
18.03.2012, 18:51
Hallo,

danke erst einmal für die schnelle Antwort.
Angeschlossen sind die LEDs über einen ULN2803 angeschlossen, der ist mit seinen Eingängen direkt an den IO-Pins des PCF8574 angeschlossen.
Auf den Port schreibe ich zum Test erst eimal immer eine 255.


ich vermute einen klassischen "Manual Not Read Error"
Da könntest Du in dem Fall wohl Recht haben. Ich habe das mal nachgeholt. Wenn ich das richtig verstanden habe muss ich die IO-Pins des PCF8574 noch mit Pull Up Widerständen bestücken.
Das werde ich mal versuchen.

Klebwax
18.03.2012, 18:59
Hallo,

danke erst einmal für die schnelle Antwort.
Angeschlossen sind die LEDs über einen ULN2803 angeschlossen, der ist mit seinen Eingängen direkt an den IO-Pins des PCF8574 angeschlossen.
Auf den Port schreibe ich zum Test erst eimal immer eine 255.


Da könntest Du in dem Fall wohl Recht haben. Ich habe das mal nachgeholt. Wenn ich das richtig verstanden habe muss ich die IO-Pins des PCF8574 noch mit Pull Up Widerständen bestücken.
Das werde ich mal versuchen.

Wie der Text sagt, sind das "quasi-bidirectional I/O". Der weak Pullup des Chips kann nicht genug Strom liefern, um den ULN durchzusteuern. Wenn du nur LEDs ansteuern willst, geht das einfacher: "Latched outputs with high current drive capability for directly driving LEDs".

MfG Klebwax

NOLEM
18.03.2012, 19:09
Hallo Henry
Das mit den Pullups ist richtig. Die Ausgänge des PCF8574 schalten gegen GND.
Der ULN 2803 benötigt aber eine positive Spannung am Eingang um die LED's einzuschalten.
Lösung: Mach die Pullups niederohmig = 2,2kOhm oder kleiner, damit der ULN einschalten kann oder besser schmeiss den ULN gleich raus. Dann die Pullups als Vorwiderstand der LED's verenden.
Der PCF8574 liefert genug Strom für die Leds.

Gruß NOLEM

Henry
18.03.2012, 19:10
Hallo,

Habe jetzt mal zum Test einen PullUp an P0 gelötet und das war wohl die Lösung. Hat halt jetzt nur den Nachteil das alle Ausgänge aktiv sind sobald Spannung anliegt. PullDown wäre in dem Fall schöner gewesen, klappt das auch oder mache ich dann die internen Widerstände kaputt?

Die LEDs sind nur erst einmal zum Test, da sollen später neben LEDs auch andere Lasten angesteuert werden.

Henry
18.03.2012, 19:15
Hallo Henry


Das mit den Pullups ist richtig. Die Ausgänge des PCF8574 schalten gegen GND.
Der ULN 2803 benötigt aber eine positive Spannung am Eingang um die LED's einzuschalten.
Lösung: Mach die Pullups niederohmig = 2,2kOhm oder kleiner, damit der ULN einschalten kann oder besser schmeiss den ULN gleich raus. Dann die Pullups als Vorwiderstand der LED's verenden.
Der PCF8574 liefert genug Strom für die Leds.

Gruß NOLEM

Da sind auch 3W LEDs dabei und teilweise mehrere Gruppen normaler LEDs parallel (60-100mA) , das wird wohl eng ;-)
Genen Null schaltend schließt natürlich PullDown aus.