-
Interrupt und PCF8574
Hallo,
ich habe den Interrupt-Ausgang eines PCF 8574 mit INT5 (PE.5)
eines Mega128 verbunden. Am PCF 8574 sind Taster gegen
Masse angeschlossen.
Ich möchte nun in Bascom eine Interrupt-Routine anspringen und
dort abfragen, welche Taster gedrückt sind.
Code:
Config Int5 = FALLING
On Int5 PCF_Key
Enable Interrupts
Enable Int5
Do
'irgendwas
Loop
PCF_Key:
Print "Taster gedrückt"
Return
Mein Problem ist, dass das Interrupt-Label immer/ständig
angesprungen wird. Wie macht man das richtig?
Danke: - Reinhard -
-
Hallo,
hast Du überall Pullup Widerstände drin (bei INT und Tastern), damit keine Signale ins flattern kommen?
-
@linux_80
PullUp's sind bei den Tastern dran. Wie soll ich das beim INT
machen?
Ich habe gerade noch mal gemessen: wenn ich einen Taster
drücke, wird der INT-Ausgang vom PCF auf low (0) gezogen.
Ich kann das Signal aber beim M128 nicht auswerten ...
Gruß: - Reinhard -
-
im DB unter 7.2 ist es auch dargestellt, Fig.12
Die Tasten werden dann auch noch prellen,
wenn nix gedrückt wird sollte zumindest kein INT ausgelöst werden.
Wenn der M128 beim INT auf falling reagiert, sollte das schon mal dir richtige Richtung sein.
-
der INT -ausgang ist open-drain, verständlicherweise. Hast du das berücksichtigt ?
-
@PicNick
was sagt mir das genau?
Ich habe jetzt den PullUp beim INT installiert (10K gegen VCC) und
es läuft immer noch nicht ...
Was muss ich noch einstellen, damit der M128 das Signal auswerten
kann?
Gruß: - Reinhard -
-
Ist der INT-Pin am 128-er als Input definiert ? Ich kann in den diversen Beschreibungen nicht entnehmen, ob das automatisch mit der Interrupt-definition geschieht.
Zitat:
was sagt mir das genau?
--> Pullup. Hat sich aber eledigt, seh ich.
-
@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 -
-
Was den INT betrifft, seh ich da nix Böses.
Äh, mir fällt ein, daß BasCom in der 1.117.4 Version Probleme mit den Interrupts hatte. Du hast ja wenigstens 1.11.7.8 oder 9 ?
-
und sollte der INT nicht auf falling reagieren !?
Wir wärs, als hätte ich in so'nem Datenblatt was davon gelesen !