- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 22

Thema: PCF8574 mit Taster auslesen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.03.2015
    Beiträge
    31

    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    Hallo Dennis,

    ich meine, Du hättest schon einen Fehler in Deiner Logikabfrage, denn:

    TWDR & 0b00000100 ergibt entweder 0 oder 4 und nie 1. Du solltest also lieber schreiben:

    if (TWDR & 0b00000100)
    {
    ...
    }

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.03.2015
    Beiträge
    31
    Hallo uffi,
    danke für die Antwort. Das hatte ich auch schon versucht und habe das jetzt auch so nochmal umgeändert. Wenn ich den Taster drücke leuchtet die LED leider nicht auf.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    ok, der nächste Fehler ist, dass Du in Deiner while Schleife keine erneute Abfrage des PCF8574 machst.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    19.03.2015
    Beiträge
    31
    Wo müsste die Abfrage dann hin? Oder müsste ich die ganze if Abfrage in eine while Schleife mit einer PCF8574 Abfrage machen?
    So wie ich das verstanden habe,schreibe,logischerweise,mit der Schreibadresse in TWDR also lese ich die Informationen mit der Leseadresse in TWDR ein. Das bedeutet ich müsste die Daten irgendwie in einer while Schleife auslesen. Ich habe allerdings noch keinen Auslesebefehl gefunden.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    Nimm doch die Lib von Peter Fleury, binde sie in Deinen Code ein und benutze die Schreib- und Lesefunktionen, die dort implementiert sind.

    i2c_init();

    while(1)
    {
    busy = i2c_start(PCF8574-Addresse + I2C_READ);

    // address I2C device with read access
    if (busy == 0)
    {
    input = i2c_readNak(); // read one byte
    i2c_stop(); // release I2C bus
    }

    if (input & 0b00000100)
    {
    PORTB = 0x01;
    }
    else
    {
    PORTB = 0x00;
    }
    }
    }

Ähnliche Themen

  1. PCF8574 nach Interrupt an INT2 auslesen
    Von Reissdorf im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 22.03.2013, 08:38
  2. Taster-Spannung auslesen mit RN-Control und BASIC
    Von Torrentula im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 08.04.2010, 19:21
  3. Einzelnen Taster auslesen.
    Von Asuroneuling im Forum C - Programmierung (GCC u.a.)
    Antworten: 59
    Letzter Beitrag: 19.07.2009, 16:39
  4. PCF8574 auslesen
    Von Andun im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 29.10.2007, 19:10
  5. ASURO ADC für Taster direkt auslesen
    Von I2C im Forum Asuro
    Antworten: 10
    Letzter Beitrag: 17.06.2005, 15:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress