Roberto
21.11.2006, 16:19
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:
'============ 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
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:
'============ 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