@PicNick
Den INT-Pin am M128 habe ich nicht explizit als Eingang definiert.
Der folgende Code läuft fast richtig:
Code:
' TestInt5.bas
' ------------
' PCF 8574 : P0 <- Taster gegen GND
' P4 -> grüne LED -> R -> VCC
' P5 -> gelbe LED -> R -> VCC
' P5 -> rote LED -> R -> VCC
' INT -> 10K -> VCC
'
' M128 :PE5 (INT5) <- CD4050 <- INT von PCF8574
$regfile = "m128def.dat"
$hwstack = 64
$framesize = 64
$swstack = 64
$crystal = 16000000 'Quarzfrequenz 16 MHz
$baud = 19200 'Baudrate COM1
$baud1 = 19200 'Baudrate COM2
Const PCF_Adr = &H40
Dim PCF_Port As Byte
Dim B As Byte
Dim i As Integer
Config Sda = Portd.1
Config Scl = Portd.0
I2cinit 'I2C-Bus initialisieren
Waitms 250
'1.Hardware UART
'keine Definition notwendig (Ausgaben mit einfachem Print möglich)
'2.Hardware UART
Open "Com2:" For Binary As #1
'alle LED's aus (invertiertes Schalten)
PCF_Port = &B11111111
I2CSend PCF_Adr , PCF_Port
Config Int5 = Rising
On Int5 INT5_ISR
Enable Interrupts
Enable Int5
i = 0
Print #1 , "Start ..."
Do
Print #1 , i ; "->" ; Bin(PCF_Port)
'Tastenstatus lesen
I2CReceive PCF_Adr , PCF_Port
'gelbe LED an Port P5 einschalten
PCF_Port.5 = 0
I2CSend PCF_Adr , PCF_Port
Waitms 250
'grüne LED an Port P4 einschalten
PCF_Port.4 = 0
I2CSend PCF_Adr , PCF_Port
Waitms 250
'gelbe & grüne LED aus
PCF_Port.5 = 1
PCF_Port.4 = 1
I2CSend PCF_Adr , PCF_Port
Waitms 500
Loop
Close #1
End
'Service-Routine für INT5
INT5_ISR:
Incr i
'Tastenstatus lesen, mit entprellen
I2CReceive PCF_Adr , PCF_Port
Waitms 50
I2CReceive PCF_Adr , B
If PCF_Port.0 = B.0 then
'rote LED an Port P6 umschalten
Toggle PCF_Port.6
I2CSend PCF_Adr , PCF_Port
End if
Return
Fast deshalb, weil nach ein paar Tastendrücken der Port 0 des
PCF8574 (also der Port, wo der Taster angeschlossen ist) immer
auf 0 stehen bleibt ... also kein Interrupt mehr ausgelöst wird.
Grundsätzlich kann' s doch nicht so schwer sein ...
. Kann jemand
vielleicht noch mal über den Code schauen?
Gruß: - Reinhard -
Lesezeichen