PCF8574 mit Taster auslesen
Hallo,
ich habe folgendes Problem: Ich habe 2LEDs mit Vorwiderstand von Vcc nach P0 und P1 des PCF8574 und einen Taster von Vcc nach P2 mit 10k Ohm Pull-Down geschaltet, sowie eine LED von PB0 vom Atmega32.
Wenn nun der Taster gedrückt wird soll die LED an PB0 leuchten.
Code:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0x01;
PORTB = 0x01;
TWBR = 0x01;;
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
TWDR = 0b01000000;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
TWDR = 0b11111100;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
_delay_ms(1000);
TWDR = 0b00000100;
PORTB = 0x00;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
TWDR = 0b01000001;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
while(1)
{
if ((TWDR & 0b00000100) == 1)
{
PORTB = 0x01;
}
else
{
PORTB = 0x00;
}
}
}
Zuerst werden alle LEDs angeschaltet. Dann wird die LED an PB0 ausgeschaltet. Danach endet die erste Übertragung und eine zweite mit der Leseadresse(0x41) beginnt. In der while Schleife soll jetzt abgefragt werden ob der Taster gedrückt wird. Normalerweise funktioniert das ja mit folgendem Muster : if ((PINx & (1<<Px0-7)) == 1).
Da die Pins vom PCF8574 nicht so definiert sind muss ich sie ja dann über eine 8bit Binär- oder Hexadezimaladresse ansprechen.
Der Fehler muss also in der Abfrage liegen.
Hoffe mir kann jemand helfen.
Mfg Dennis