-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: I2C PCF8574A Interruptleitung nutzen ??

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    51
    Beiträge
    576

    I2C PCF8574A Interruptleitung nutzen ??

    Anzeige

    Hallo Leute

    Habe da wieder ein Problem..

    Möchte meinen AVR mit dem PCF8574A (I2C Expander) erweitern und dazu den Interruptausgang (INT)vom Baustein nutzen.

    Der INT Pin zieht ja gegen Masse wenn am PCF8574er ein Pin auf Eingang geht.

    Dazu habe ich vom AVR den INT0 Eingang verwendet, der mir bei fallender Flanke dann den PCF8574 auslesen soll...

    Leider funktioniert das Ganze nicht so richtig.
    Irgendwie spinnt der AVR dann und bringt nur mehr wirres Zeug oder bleibt hängen oder der Int0 reagiert nicht mehr ...

    Das Ganze läuft normalerweise auf einem Mega32.
    Zum testen und damit ich einen Minimalcode zum zeigen zusammenbekomme, habe ich das nochmal mit dem Mega8 aufgebaut.

    Hier der Code:
    Code:
     '============ PCF 8574 versuch_2  mit INT0=================================
    
    $regfile = "m8def.dat"
    $crystal = 10000000
    
    $hwstack = 250
    $swstack = 250
    $framesize = 250
    
    
    
    '##################### Config für LCD ####################################################
    Config Lcd = 40 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5
    Config Lcdbus = 4
    Config Lcdmode = Port
    Cursor On
    Cls
    
    
    
    '############################ Config I2C Bus ###################################
    Config Scl = Portd.1                                        ' I2C-Port festlegen
    Config Sda = Portd.0                                        ' I2C-Port festlegen
    
    Config Portd.2 = Input                                      'Int0
    Portd.2 = 1                                                 'Pull up
    
    
    
    '############################ Config INT0 #######################################
    Config Int0 = Falling
    On Int0 Int0_auswerten
    Enable Int0
    
    
    Dim Tasten As Byte
    Dim Taste0 As Byte
    Dim Taste1 As Byte
    Dim Taste2 As Byte
    Dim Zaehler As Word
    
    Enable Interrupts
    
    '###############################################################################
    
    Do
    
    
    
    'Tasten_lesen:
    I2cstart
    I2cwbyte &B01110001                                         'lese Adresse von PCF8574A
    I2crbyte Tasten , Nack
    I2cstop
    
    Locate 2 , 2
     Lcd Tasten
    
    Loop
    
    End
    
    
    
    
    
    
     '################# Tasten_lesen Anfang (INT0) ##################################
    Int0_auswerten:
    
    Waitms 10
    
    'Tasten_lesen:
    I2cstart
    I2cwbyte &B01110001                                         'lese Adresse von PCF8574A Baustein B
    I2crbyte Tasten , Nack
    I2cstop
    
       Taste0 = Tasten.0
       Taste1 = Tasten.1
       Taste2 = Tasten.2
    
    Locate 1 , 1
     Lcd Tasten
    Locate 1 , 7
     Lcd Taste0
    
    
    If Taste1 = 0 Then
       If Taste0 = 0 Then
          Zaehler = Zaehler + 1
    
             Locate 1 , 30
             Lcd " Arbeite!!"
             Wait 1
             Locate 1 , 30
             Lcd "          "
             Wait 1
    
             Locate 2 , 25
             Lcd "Zaehler= " ; Zaehler ; "  "
    
       End If
    End If
    
    Return
    Irgendwie passiert beim Mega8 das gleiche.
    Nach ein paar mal aktivieren von einem Pin vom PCF8574er , habe ich am LCD nur mehr wirre zeichen und dann sehe ich gar nix mehr...

    Hat jemand schon mal diesen Ausgang vom PCF8574er ausgewertet ?
    Könnt Ihr vielleicht einen Fehler in meinem Code sehen ?
    Ideen?

    Bin für jeden Tipp dankbar

    Ps.:
    Der I2C Bus ist mit 10K gegen +5V und am INT hängen 5k gegen +5V


    l.G. Roberto

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    In der Do... Hauptschleife werkst du permanent an LCD und I2C Bus.

    d.h. die ISR fährt dir da mitten drein. Das gibt Chaos
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    51
    Beiträge
    576
    Hallo Robert

    mmhhh...
    Wie müsste ich das richtig machen ?

    In der INT0-ISR alles abschalten?! (wie?)

    (beim Meag32 laufen noch 3 Timer dazu und ein Grafik LCD )

    -------
    Kann man eigentlich aus der INT0-ISR auch mit Goto rausspringen oder kann ich in der ISR nur Werte übergeben und diese dann im normalem Code auswerten ?

    l.G. Roberto

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich würde in der ISR nur einen Schalter setzen.
    In der normalen Hauptschleife diesen Schalter abfragen.
    Wenn gesetzt, löschen und den PCF abfragen und ggf. werte herzeigen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    51
    Beiträge
    576
    Hallo Robert (Danke für die schnelle Antwort )


    In der Do... Hauptschleife werkst du permanent an LCD und I2C Bus.

    d.h. die ISR fährt dir da mitten drein. Das gibt Chaos
    Wie soll ich das verhindern ?

    Hatte schon mal nur in der ISR die Werte am LCD ausgegeben, aber reagiert noch gleich..?!

    l.G. Roberto

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Schau mal:
    Code:
     '============ PCF 8574 versuch_2  mit INT0================================= 
    
    $regfile = "m8def.dat" 
    $crystal = 10000000 
    
    $hwstack = 250 
    $swstack = 250 
    $framesize = 250 
    
    
    
    '##################### Config für LCD #################################################### 
    Config Lcd = 40 * 2 
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5 
    Config Lcdbus = 4 
    Config Lcdmode = Port 
    Cursor On 
    Cls 
    
    
    
    '############################ Config I2C Bus ################################### 
    Config Scl = Portd.1                                        ' I2C-Port festlegen 
    Config Sda = Portd.0                                        ' I2C-Port festlegen 
    
    Config Portd.2 = Input                                      'Int0 
    Portd.2 = 1                                                 'Pull up 
    
    
    
    '############################ Config INT0 ####################################### 
    Config Int0 = Falling 
    On Int0 Int0_auswerten 
    Enable Int0 
    
    
    Dim Tasten As Byte 
    Dim Taste0 As Byte 
    Dim Taste1 As Byte 
    Dim Taste2 As Byte 
    Dim Zaehler As Word 
    
    
    Dim isr_flag As byte            'NEWNEWNEW
    
    
    Enable Interrupts 
    
    '############################################################################### 
    
    Do 
    
          if isr_flag = 1 then 
            isr_flag = 0
    
              I2cstart 
              I2cwbyte &B01110001                  'lese Adresse von PCF8574A 
              I2crbyte Tasten , Nack 
              I2cstop 
    
              Locate 2 , 2 
              Lcd Tasten 
    
             Taste0 = Tasten.0 
             Taste1 = Tasten.1 
             Taste2 = Tasten.2 
    
             Locate 1 , 1 
             Lcd Tasten 
             Locate 1 , 7 
             Lcd Taste0 
    
             If Taste1 = 0 Then 
                If Taste0 = 0 Then 
                   Zaehler = Zaehler + 1 
    
                  Locate 1 , 30 
                  Lcd " Arbeite!!" 
                  Wait 1 
                   Locate 1 , 30 
                   Lcd "          " 
                   Wait 1 
    
                   Locate 2 , 25 
                   Lcd "Zaehler= " ; Zaehler ; "  " 
                End If 
            End If 
    
        End If 
    
    Loop 
    
    End 
    
    
     '#################  (INT0) ################################## 
    Int0_auswerten: 
       isr_flag = 1
    Return
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    51
    Beiträge
    576
    Hallo Robert

    Ja, so funktioniert es.

    Ich darf da wohl nur Parameter in der ISR übergeben

    Das Problem ist ein bisschen, dass an den PCF auch Endschalter dran kommen und das Programm sollte sofort reagieren, wenn ein Endschalter schaltet.

    Beim Mega32 laufen dann noch 3 Timer mit ca. 20khz Taktausgabe und ein Grafik LCD und ein ADC.....

    Da kann es leicht sein, dass das Hauptprogramm ein bisschen langsam reagiert.

    Aber ich werde es mal so proboeren..

    Danke nochmal

    l.G. Roberto

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    hallo da...

    ich hab das zwar noch nicht gemacht, denke aber dass der befehl pushall am eingang der int-routine und der befehl popall am ende der routine das problem lösen müsste.

    siehe Bascom hilfe -> language reference

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wovon spricht er ? Uns gehen ja keine register verloren.
    Und da keine float-routinen da sind, pushed Bascom völlig ausreichend.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    war ja auch nur ne idee...
    wenn Bascom dass ausreichend selbst verwaltet, wie du sagst, wieso soll es dann nicht möglich sein in der int-routine richtig zu arbeiten ?

    gruss

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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