teamohnename
14.07.2011, 12:55
Hallo,
auch, wenn das vielleicht schon 1000 Mal erklärt wurde, habe ich das ganze noch nicht richtig verstanden.
Ich möchte einen PCF8574 mit der I²C Lib von Peter Fleury in C ansteuern.
So funktioniert auf jeden Fall:
i2c_start_wait(0x70 + I2C_WRITE);
i2c_write(0xff);
i2c_stop();
Ist ja auch soweit nicht sonderlich schwer. Jetzt möchte ich aber LEDs einzeln aus- und anschalten. Ich kann die Ports ja nicht einzeln setzen. Ich muss immer alle zusammen in Binär bzw. Hex senden. Wenn ich also eine LED setze, weiß ich ja nicht, ob eine andere schon an ist, die würde ich so, wie das oben gemacht wird ja ausschalten. Ich müsste also erst die Ports auslesen und in eine Variable schreiben, dann diese Variable so ändern, dass z.B. das 4. Bit gesetzt oder gelöscht wird. Wie mache ich das? Soweit bin ich schon:
void setPortPCF8574(uint8_t adr, uint8_t port, uint8_t setOrDel) //Adresse, Pin Nr., die gesetzt/gelöscht werden soll, Pin setzen oder löschen
{
i2c_start_wait(adr + I2C_WRITE); //I²C Kommunikation starten (schreiben)
i2c_rep_start(adr+I2C_READ); //erneut starten, lesen
uint8_t ports=i2c_readAck(); //ports einlesen
i2c_stop(); //I²C Kommunikation stoppen
if(setOrDel==0) //wenn Variable 0 ist
{
ports = (ports | (1<<port)); //Pin löschen
}
else
{
ports = (ports ^ (1<<port)); //sonst (z.B. bei 1) Pin setzen
}
i2c_start_wait(adr + I2C_WRITE); //I²C Kommunikation starten (schreiben)
i2c_write(ports); //ports senden
i2c_stop(); //I²C Kommunikation stoppen
}
Damit passieren aber merkwürdige Dinge... Ports löschen funktioniert gar nicht. Setzen funktioniert nur bedingt, ich kann nur in bestimmten Reihenfolgen Ports löschen oder setzen, von daher gehe ich davon aus, dass der Befehl zum ,,manipulieren" der Variable, in denen die Ports gespeichert werden, falsch ist. LEDs sind nur an Pins P4 bis P7 angeschlossen, an P0-P3 Taster, das kommt aber nachher.
Ich hoffe, ihr habt das Problem verstanden!
Vielen Dank für Eure Hilfe schonmal im Vorraus und
Viele Grüße
teamohnename
auch, wenn das vielleicht schon 1000 Mal erklärt wurde, habe ich das ganze noch nicht richtig verstanden.
Ich möchte einen PCF8574 mit der I²C Lib von Peter Fleury in C ansteuern.
So funktioniert auf jeden Fall:
i2c_start_wait(0x70 + I2C_WRITE);
i2c_write(0xff);
i2c_stop();
Ist ja auch soweit nicht sonderlich schwer. Jetzt möchte ich aber LEDs einzeln aus- und anschalten. Ich kann die Ports ja nicht einzeln setzen. Ich muss immer alle zusammen in Binär bzw. Hex senden. Wenn ich also eine LED setze, weiß ich ja nicht, ob eine andere schon an ist, die würde ich so, wie das oben gemacht wird ja ausschalten. Ich müsste also erst die Ports auslesen und in eine Variable schreiben, dann diese Variable so ändern, dass z.B. das 4. Bit gesetzt oder gelöscht wird. Wie mache ich das? Soweit bin ich schon:
void setPortPCF8574(uint8_t adr, uint8_t port, uint8_t setOrDel) //Adresse, Pin Nr., die gesetzt/gelöscht werden soll, Pin setzen oder löschen
{
i2c_start_wait(adr + I2C_WRITE); //I²C Kommunikation starten (schreiben)
i2c_rep_start(adr+I2C_READ); //erneut starten, lesen
uint8_t ports=i2c_readAck(); //ports einlesen
i2c_stop(); //I²C Kommunikation stoppen
if(setOrDel==0) //wenn Variable 0 ist
{
ports = (ports | (1<<port)); //Pin löschen
}
else
{
ports = (ports ^ (1<<port)); //sonst (z.B. bei 1) Pin setzen
}
i2c_start_wait(adr + I2C_WRITE); //I²C Kommunikation starten (schreiben)
i2c_write(ports); //ports senden
i2c_stop(); //I²C Kommunikation stoppen
}
Damit passieren aber merkwürdige Dinge... Ports löschen funktioniert gar nicht. Setzen funktioniert nur bedingt, ich kann nur in bestimmten Reihenfolgen Ports löschen oder setzen, von daher gehe ich davon aus, dass der Befehl zum ,,manipulieren" der Variable, in denen die Ports gespeichert werden, falsch ist. LEDs sind nur an Pins P4 bis P7 angeschlossen, an P0-P3 Taster, das kommt aber nachher.
Ich hoffe, ihr habt das Problem verstanden!
Vielen Dank für Eure Hilfe schonmal im Vorraus und
Viele Grüße
teamohnename