- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: PCF8574 mit Taster auslesen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.03.2015
    Beiträge
    31

    PCF8574 mit Taster auslesen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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
    61
    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
    61
    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
    61
    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;
    }
    }
    }

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.03.2015
    Beiträge
    31
    Habe schon öfter mal darüber nachgedacht die Lib zu verwenden aber bei mir treten manchmal Fehler auf. Ich möchte sobald das funktioniert ein paar eigene kleine Funktionen schreiben.
    Die Lib habe ich schon mal gedownloadet und glaube, dass ich weiß wie es funktionieren könnte. Aus der Lib kann ich folgendes ableiten:
    while(1)
    {
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    TWDR = 0x41; // Leseadresse
    TWCR = (1<<TWINT) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    input = i2c_readNak(); // Die Funktion werd ich dann so übernehmen, habe jetzt die Lib durchgeschaut aber nirgend die Definition für input gesehen
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);

    if Abfrage
    }

    So sollte es dann eigentlich funktionieren. Ich denke mal das input als uint8_t definiert ist.

    - - - Aktualisiert - - -

    Kleiner Nachtrag: Ich habe gerade den Wald vor lauter Bäumen nicht gesehen input ist natürlich unsigned char

    - - - Aktualisiert - - -

    Nochmal der zum Glück letzte Nachtrag: Danke für den Code mit der Peter Fleury Lib! Nachdem ich die readNAK funktion übertragen habe funktioniert der Code einwandfrei und die LED leuchtet beim Tastendruck. Ich werde jetzt noch Funktionen zum senden und lesen einbauen aber bin auf jeden fall jetzt schon sehr zufrieden.

    Mfg Dennis

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    61
    Beiträge
    199
    Ich freue mich, dass ich helfen konnte!
    Gruß, Dirk

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    19.03.2015
    Beiträge
    31
    Es gibt doch noch ein kleines Problem : TWBR steht bei mir ja auf dem Minimum,mit der Formel SCL = CPU/(16+2TWBR*4^TWPS) bekomme ich als Ergebnis SCL = 41666,666666... also ungefähr 41500 (macht ja keinen Sinn aufzurunden)
    Das Problem hierbei ist,dass das Programm mit einer Stromversorgung durch den Programmer(mySmartUsb Light) funktioniert. Mit einer 9V Batterie(die auf 5V runtergeregelt wird) allerdings nicht. Kann es sein, dass die Frequenz zu niedrig ist und deshabl der Quarz im Programmer mitbenutzt wird? Die LEDs am PCF8574 können über einen Atmega Port problemlos betrieben werden und bei der PCF8574 Schaltung sind sie ja von Vcc nach P0 bzw P1 geschaltet d.h. daran kanns nicht liegen
    Geändert von D3nni5 (13.08.2015 um 16:00 Uhr) Grund: Schreibfehler

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    61
    Beiträge
    199
    Welchen Controller benutzt Du? Hängen die TWI Pins auch am Programmer (als SPI Pins), wenn dieser angesteckt ist?

Seite 1 von 3 123 LetzteLetzte

Ä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
  •  

12V Akku bauen