Henry
18.03.2012, 19: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
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