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...
Schicks mal durch den Bascom-Compiler...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







Zitieren

Lesezeichen