'********************************************* '* Filename : EFN Schrankensteuerung * '* Revision : 2.0 * '* Controller : Arduino NANO V3.0 * '* Stand : Juli/2021 * '********************************************* $regfile = "m328pdef.dat" 'Arduino Nano V3.0 $crystal = 16000000 '16 MHz ' $baud = 19200 'COM4 $loadersize = &H800 'Bootloader nicht ueberschreiben $hwstack = 40 $swstack = 20 $framesize = 20 '********************************************* 'Ausgänge Config PORTB.5=Output 'On-Board LED LED_ON_BOARD alias PORTB.5 LED_ON_BOARD=0 Reset LED_ON_BOARD Config PORTD.6=Output LED alias PORTD.6 LED=0 Reset LED Config PORTD.7=Output RELAIS alias PORTD.7 RELAIS=0 Reset RELAIS '********************************************* 'Eingänge konfigurieren als Taster Config PinB.0 = Input Config PinB.1 = Input Config PinB.2 = Input Config PinB.3 = Input Config PinB.4 = Input 'Pull up einschalten PORTB.0=1 PORTB.1=1 PORTB.2=1 PORTB.3=1 PORTB.4=1 '********************************************* 'Variablen KeyN alias PINB.4 KeyFA alias PINB.3 KeyFB alias PINB.2 KeyFC alias PINB.1 KeyFD alias PINB.0 Dim bitKeyN As Bit '=1 wenn gedrückt Dim bitKeyFA As Bit '=1 Dim bitKeyFB As Bit '=1 Dim bitKeyFC As Bit '=1 Dim bitKeyFD As Bit '=1 Dim SCHRANKE as String * 4 Dim B, B_OLD, G1, G2, A1, A2, C1, C2 as bit Dim I, ZAEHLER, Z, FAZ, FBZ, FCZ, FDZ, NZ, SZ as integer SZ=0 Const VZ_ALLE=-3 Const VZ_A=-5 Const VZ_B=0 Const VZ_C=0 Const VZ_D=0 '********************************************* 'Konfiguriere INT1 für Tastenerkennung mit Dioden Config INT1=FALLING 'PIND.3=INT1 On Int1 TASTEN 'INT1 Interrupt-Routine Enable INT1 'INT1 einschalten Enable Interrupts 'Interrupts erlauben stop adc stop AC declare sub anzeige declare sub erkennen declare sub var_reset var_reset '********************************************* do Incr ZAEHLER if ZAEHLER=100 then var_reset endif anzeige erkennen Toggle LED_ON_BOARD wait 1 loop end '********************************************* sub erkennen () { if bitKeyN=1 then ZAEHLER=-20 bitKeyN=0 incr NZ end if if bitkeyFA=1 then if B=1 and C1=1 then ZAEHLER=VZ_ALLE+VZ_A else ZAEHLER=ZAEHLER end if G1=1 A1=1 bitKeyFA=0 incr FAZ end if if bitKeyFB=1 then if B=1 and A1=1 then ZAEHLER=VZ_ALLE+VZ_B else ZAEHLER=ZAEHLER end if G1=1 C1=1 bitKeyFB=0 incr FBZ end if if bitkeyFC=1 then if B=1 and C2=1 then ZAEHLER=VZ_ALLE+VZ_C else ZAEHLER=ZAEHLER end if G2=1 A2=1 bitKeyFC=0 incr FCZ end if if bitKeyFD=1 then if B=1 and A2=1 then ZAEHLER=VZ_ALLE+VZ_D else ZAEHLER=ZAEHLER end if G2=1 C2=1 bitKeyFD=0 incr FDZ end if end sub '********************************************* sub anzeige 'print "Schrankensteuerung" B_OLD=B if ZAEHLER < 0 then SCHRANKE="ZU" B=1 RELAIS=1 LED=1 else SCHRANKE="AUF" B=0 RELAIS=0 LED=0 end if 'Flanke von "zu" nach "auf" loescht gesetzte Variablen if B_OLD > B then Z=0 G1=0 G2=0 A1=0 A2=0 C1=0 C2=0 incr SZ 'Schrankenzähler + 1 end if 'Anzahl der Zuege if G1=1 and G2=1 then Z=2 elseif G1=0 and G2=0 then Z=0 else Z=1 end if print "Gleis1 : ";G1 print "Gleis2 : ";G2 print "Zuege : ";Z print "Schranke : ";SCHRANKE print "Zaehler : ";ZAEHLER print print "A: ";FAZ;" B: ";FBZ;" C: ";FCZ;" D: ";FDZ;" N: ";NZ print "Schliesssungen: ";SZ print end sub '********************************************* sub var_reset SCHRANKE="AUF" LED=0 RELAIS=0 B=0 G1=0 G2=0 A1=0 A2=0 C1=0 C2=0 Z=0 ZAEHLER=0 bitKeyFA=0 bitKeyFB=0 bitKeyFC=0 bitKeyFD=0 bitKeyN=0 for I=1 to 8 '4*blinken toggle LED_ON_BOARD waitms 100 next end sub '********************************************* TASTEN: 'Interrupt on INT1 bitKeyN = Not KeyN bitKeyFA = Not KeyFA bitKeyFB = Not KeyFB bitKeyFC = Not KeyFC bitKeyFD = Not KeyFD Return