Hallo Burki,
habe schnell was in den Editor getippt....
Leider nicht testen können
edit:
so funktioniert es bei mir
mit Interrupt schaut es etwas kompliziert aus...
Code:
'******************************************************************************
'Abfrage der Eingänge Port3 und Port4 am RNBFRA-Board, wenn Interrupt Int2 durch Eingang ausgelöst wird
'Powerport wird auf High geschalten, wenn Port3(Taste1) betätigt
'Powerport wird auf Low geschalten, wenn Port4(Taste2) betätigt
'Unterprogramme(Relais_on/ off schalten Power-Port
$regfile = "m32def.dat"
$baud = 9600
$crystal = 8000000 'Quarzfrequenz
Config Scl = Portc.0 'Ports fuer I2C-Bus
Config Sda = Portc.1
Config Pinb.2 = Input 'Interrupt Int2 (Pinb.2 als Eingang)
Portb.2 = 1 'PullIp ein (Potential am Pin ist High)
'Eingangs-Port
Const Writeeingabeport_adr = &H7E 'I2C Adr PCF 2 (Schreibadresse)
Const Readeingabeport_adr = &H7F 'I2C Adr PCF 2 (Leseadresse)
'Power-Port
Const Writepowerport_adr = &H72 'I2C Adr PCF 1 (Schreibadresse)
Const Readpowerport_adr = &H73 'I2C Adr PCF 1 (Leseadresse)
Dim I2cdaten As Byte 'Datenbyte aus PCF8574
Dim Taste1 As Byte 'Taste 1 (Eingangsport-Port3)
Dim Taste2 As Byte 'Taste 2 (Eingangsport-Port4)
Dim V As Byte 'Variable wird nur für Ausgabe benötigt
Dim Flag As Bit
I2cinit 'I2C Initialisieren
I2cstart 'I2C START
I2cwbyte &H74 'Schreibbefehl an PCF3 schicken
'Led´s ein ,Motorendstufen ein, Port-Peripherie ein, RBN-Bus Sleep Modus aus (also Peripherie aktiv)
I2cwbyte &B00000010 'Datenbyte an PCF3
I2cstop 'I2C STOP
Config Int2 = Falling
Enable Int2
Enable Interrupts
On Int2 Int2_isr
Portd.6 = 0 'Schrittmotoren erst mal ausschalten
I2cdaten = 0 'Variablen auf definierte Zustände setzen
Flag = 0
V = 0
Taste1 = 247 '247 entspricht Port3
Taste2 = 251 '251 entspricht Port4
'******************** Hauptprogramm ********************************************
Do
If Flag = 1 Then Gosub Relais_on 'Ist Flag=1 dann Unterprogramm "Relais_on"
If Flag = 0 Then Gosub Relais_off 'Ist Flag=0 dann Unterprogramm "Relais_off"
Waitms 200
Loop
'********************* Unterprogramme ******************************************
Relais_on:
I2cstart 'I2C START
I2cwbyte Writepowerport_adr 'Schreibbefehl an PCF1 schicken
I2cwbyte &B11111111 'Datenbyte an PCF1 -> PowerPort 5 einschalten
'binäre Darstellung, Port 6 auf High geschaltet
I2cstop 'I2C STOP
Return 'Rücksprung
Relais_off:
I2cstart 'I2C START
I2cwbyte Writepowerport_adr 'Schreibbefehl an PCF1 schicken
I2cwbyte &B00000000 'Datenbyte an PCF1 -> PowerPort 5 ausschalten
'binäre Darstellung, wenn Ports 1-8 auf Low geschaltet
I2cstop 'I2C STOP
Return 'Rücksprung
Int2_isr:
Disable Int2 'Interrupt Int2 ausschalten
I2cstart 'I2C START
I2cwbyte Readeingabeport_adr 'Lesebefehl an PCF schicken
I2crbyte I2cdaten , Nack 'Datenbyte von PCF lesen, lese letztes Byte
I2cstop 'I2C STOP
V = I2cdaten 'Datenübergabe an Variable V
If I2cdaten = Taste1 Then Flag = 1 'Auswertung von Eingangsdaten(I2cdaten) und setzen von Flag
If I2cdaten = Taste2 Then Flag = 0
If V = 247 Then
Print "letzter Eingangswert= " ; V ; " Relais= On " 'Vergleich-> ist V =247 dann geben an RS232 Werte aus
Print " " 'Leerzeile
Incr V 'Erhöhe V um 1, damit Anfangsbedingung nicht mehr erfüllt(sonst permanente Ausgabe)
End If
If V = 251 Then
Print "letzter Eingangswert= " ; V ; " Relais= Off " 'Vergleich-> ist V =251 dann geben an RS232 Werte aus
Print " " 'Leerzeile
Incr V 'Erhöhe V um 1, damit Anfangsbedingung nicht mehr erfüllt(sonst permanente Ausgabe)
End If
Enable Int2 'Interrupt Int2 einschalten
Return 'Rücksprung
Schicks mal durch den Bascom-Compiler...
Lesezeichen