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
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:
Irgendwie passiert beim Mega8 das gleiche.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
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
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.
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
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.
Hallo Robert (Danke für die schnelle Antwort )
Wie soll ich das verhindern ?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
Hatte schon mal nur in der ISR die Werte am LCD ausgegeben, aber reagiert noch gleich..?!
l.G. Roberto
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.
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
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
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.
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
Lesezeichen