@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 -