- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: PCF8574 nach Interrupt an INT2 auslesen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    10.10.2007
    Alter
    48
    Beiträge
    45

    PCF8574 nach Interrupt an INT2 auslesen

    Hallo zusammen,

    um ehrlich zu sein, verzweifel ich an meiner PCF8574-Schaltung. Die folgende Funktion sollte hier stattfinden:


    1. Ein, am PCF8574 angeschlossener, Schalter wird gedrückt und zieht den entsprechenden Pin auf GND
    2. Der PCF8574 löst daraufhin ein Interrupt aus und zieht das INT-Signal auf GND
    3. Der Mikrocontroller erkennt das INT-Signal und springt zur entsprechende ISR
    4. In der ISR wird der PCF ausgelesen und das Ergebnis für eine LCD Anzeige umgewandelt
    5. Das LCD Modul sollte nun die ausgelesenen 8 Bit darstellen


    Die LCD-Anzeige wird auch über I2C angesprochen, sie liefert aber kein INT-Signal zurück (das kann also keine Störung verursachen)!

    Ich schaffe es, dass der Interrupt ein Auslesen anstößt und etwas, dass wie Bits aussieht, ausgibt. Drücke ich Taster 2, der am P6 des PCF8574 hängt, dann sollte ein "10111111" angezeigt werden. Das habe ich jetzt dreimal getestet und einmal habe ich ein "11011001", dann ein "00111111" und schließlich ein "11111111" erhalten. Nach dem letzten Ergebnis tillte die Anzeige völlig aus und zeigte, in rasender Folge, wirre Zeichen auf dem LCD-Display.

    Hier der Code und die PCF8574 Schaltung und darunter der Schaltplan. Ich hoffe sehr, dass mir irgendjemand weiterhelfen kann, denn mittlerweile habe ich den Durchblick völlig verloren

    Code:
    #ifndef F_CPU           //Wenn CPU-Takt nicht bereits definiert wurde...    
    #define F_CPU 16000000                //...dann definiere ihn auf 16MHz
    #endif
    
    
    #include "i2clcd.h"
    #include "i2cmaster.h"
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    
    volatile unsigned char adr1_w = 0x42;    // Device 1 write-address
    volatile unsigned char adr1_r = 0x43;    // Device 1 read-address
    unsigned char read_data;                // Variable für Leseergebnis
    volatile unsigned char s[2];            // Var. für Bitdarstellung von 'read_data'
    
    
    void init_INT2(void) {
        GICR &= ~(1<<INT2);        // INT2 deaktivieren
        MCUCSR &= ~(1<<ISC2);    // Bei fallender Flanke Interrupt aktivieren
        GIFR |= (1 << INTF2);    // Interrupt Flag setzen (s.S 67 ATMEGA32 Datasheet)
        GICR |= (1 << INT2);    // INT2 aktivieren
    }
    void init_prog(void) {
        cli();                    // Interrupts deaktiviert
        i2c_init();                // Starte I2C Bus
        lcd_init();                  // Starte I2CLCD
        lcd_command(LCD_CLEAR);    // Leere Display
        lcd_wait_ms(30);        // Warte 3ms
    }
    void init_IO(void){
        DDRB &= ~(1 << DDB2);    // PB2 = Eingang für Interrupt
        PORTB |= (1 << PB2);    // internen Pull-Up an PB2 aktivieren
        DDRD |= (1 << DDD7);    // PD7 = Ausgang => LED 4
        PORTD |= (1 << PD7);    // PD7 = High => LED4 an
    }
    
    
    int main(void) {
    cli();             // Interrupts deaktiviert
    init_IO();
    init_INT2();
    init_prog();
    sei();            // Interrupts aktiviert
    while(1){
        lcd_printlc(2,1,(unsigned char *)s);
    }}
    
    
    ISR(INT2_vect){
        PORTD &= ~(1<<PD7);            // PD7 = Low => LED4 aus
        read_data = 0;                // read_data zurücksetzen
        i2c_start(adr1_r);            // Starte Lesezugriff
        read_data = i2c_readNak();    // read_data mit Leseergebnis beschreiben
        itoa(read_data,s,2);        // read_data als ASCII in s schreiben
    }
    Klicke auf die Grafik für eine größere Ansicht

Name:	PCF8574-Schaltplan.png
Hits:	75
Größe:	8,1 KB
ID:	24878

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    16.04.2011
    Beiträge
    78
    Tastenprellung und Lötfehler entfallen völlig?

    MfG Nik

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    10.10.2007
    Alter
    48
    Beiträge
    45
    Hallo Nik,

    Lötfehler mag ich tatsächlich ausschließen wollen. Wenn ich PB2 (INT2) als normalen Eingang beschalte, dann funktioniert der einwandfrei. Wenn in diesem Fall das Low-Signal vom Interrupt kommt, habe ich in der ISR die LED an PD7 abgeschaltet (die Abschaltanweisung ist sogar noch in der o.g. ISR drin). Klappt auch wie geplant. Ich glaube daher, dass das richtig verlötet ist.
    Was die Tasterprellung angeht, hast du natürlich recht. Es könnte sein, dass der Interrupt häufiger kurz hintereinander ansteht. Aber damit rufe ich doch nur häufiger und kurz hintereinander die ISR auf, oder nicht? Warum sollte er mir falsche Werte anzeigen oder extrem viele wirre Zeichen, die auf dem Display zu scrollen scheinen? Was meinst du dazu?

    Gruß, Reissdorf

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Auf jeden Fall sind die 2 chars, in die du mit itoa deinen Binärstring reinschreiben willst, zu klein. 9 Bytes wirst du da schon spendieren müssen, und das 9te muss die abschliessende 0 sein, wenn deine print Routine nullterminierte Strings verlangt.

    Grüße von der Katze

Ähnliche Themen

  1. Interrupt mit PCF8574
    Von Tido im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 20.11.2008, 19:24
  2. ISR wird nach enable INT2 ausgeführt, obwohl Pin auf high
    Von robodriver im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 04.05.2008, 11:52
  3. PCF8574 auslesen
    Von Andun im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 29.10.2007, 19:10
  4. Interrupt und PCF8574
    Von bertl100 im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 11.02.2006, 07:18
  5. Interrupt und PCF8574
    Von RHS im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 23
    Letzter Beitrag: 08.11.2005, 10:23

Stichworte

Berechtigungen

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

12V Akku bauen