LIST P=PIC12F675 #include P12F675.inc __config B'00000110000001' Schl01Reg EQU 0x22 Kor5Reg EQU 0x23 ;Registeradresse (plus Konstante) Inn5Reg EQU 0x24 ;Registeradresse (innere Schleifenzahl) mal Auss5Reg EQU 0x25 ;Registeradresse (aeussere Schleifenzahl) Kor20Reg EQU 0x26 ;Registeradresse (plus Konstante) Inn20Reg EQU 0x27 ;Registeradresse (innere Schleifenzahl) mal Auss20Reg EQU 0x28 ;Registeradresse (aeussere Schleifenzahl) Kor100Reg EQU 0x29 ;plus Konstante Inn100Reg EQU 0x2A ;innere Schleifenzahl mal Auss100Reg EQU 0x2B ;aeussere Schleifenzahl MyFlags EQU 0x2C ;MyFlags,0 gesettet =Portchange Interrupt mit GIE während WLT hat stattgefunden ZL8Reg EQU 0x2D ; für verschiedene DECFSZ's WLTFreqReg EQU 0x2E ;für das Timing der automatischen Selbstbremsung bei Signalausfall (Weglaufen also Wegfahren) ;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP ;PROGRAMM pppppppp--PROGRAMM pppppppp--PROGRAMM pppppppp--PROGRAMM pppppppp--PROGRAMM pppppppp--PROGRAMM pppppppp-- Start NOP NOP NOP GOTO Init ;---------------------------------------------------------------------- ;INTERRUPT mit Vector (nur um Tastenzugriff während WLT zu ermöglichen,sonst wird Rundlauf mit Polling verwendet.) Intvec NOP BCF GPIO,0 ;Ausgang abschalten falls an CALL Schl20; Das Sendemodul hat einen Pufferkondensator und könnte ev. noch ein paar Millisekunden weitersenden. CALL Schl20;Also mit Codewechsel warten! BCF GPIO,1 ; Kanalwahl resetten CALL Schl5 BSF MyFlags,0 ;mein Zusatz Interrupt Flag CALL ISR ;Ausnahmsweise wird ISR wirklich gecallt weil PortChange während WLT Return ;------------------------------------------------------------------------------------------------------------- Init BCF GPIO,1 ;Sendeausgang BCF MyFlags,0 ;mein Zusatz Interrupt Flag, Muß beim ersten Start natürlich clear sein. MOVLW D'20' ; Periode der WLT-Impulse MOVWF WLTFreqReg MOVLW B'00110101' MOVWF T1CON ; mit Prescaler ca 2 pro sec BSF STATUS,RP0 MOVLW B'00000000' MOVWF ANSEL MOVLW B'00101100' MOVWF TRISIO MOVLW B'00001100' ;Interrupt on change an GP2u3 MOVwf IOC BCF STATUS,RP0 MOVLW B'00000111' MOVWF CMCON ;wird nicht gebraucht auf ganz aus gestellt BCF GPIO,1 BCF PIR1,0 ;TMR1-Flag ; sleep kein sleep! Rundlauf CALL Schl100 Init2 NOP ISR NOP Knopf1 BTFSC GPIO,3 GOTO Knopf2 ISR1 CALL Brems GOTO ISR7 ISR7 BCF INTCON,0 ;PortChange Flag RETOUR BTFSC MyFlags,0 ;mein Zusatz Interrupt Flag RETURN ;also da nach dem WLT-Zeug,wo Unterbrochen wurde, welches dank MyFlags,0 gleich wieder abgewürgt wird, alles nur um den Stack zu popen. GOTO Init2 Knopf2 BTFSC GPIO,2 GOTO TMInter ISR3 CALL Release GOTO ISR7 TMInter BTFSC MyFlags,0 ;mein Zusatz Interrupt Flag RETURN ;also da nach dem WLT-Zeug,wo unterbrochen wurde, welches dank MyFlags,0 gleich wieder abgewürgt wird ; alles nur um den Stack zu popen. BTFSS PIR1,0 ;Timer Interrupt für Weglauftimer GOTO Init2 DECFSZ WLTFreqReg,F GOTO ISR6 MOVLW D'31' ; Periode der WLT-Impulse MOVWF WLTFreqReg ISR5 CALL WLTReset ISR6 BCF PIR1,0 ;TMR1-Flag GOTO Init2 ;-------------------------------------- Brems BCF GPIO,1 ; Kanalwahl CALL Schl01 ;Zeit für den Transistor durchzuschalten. BSF GPIO,0 ;Ausgang einschalten MOVLW D'7' MOVWF ZL8Reg Brems3 DECFSZ ZL8Reg,F ;Mindestzeit auch bei kurzem Knopfdrücken GOTO Brems5 Brems4 BTFSS GPIO,3 ;Knopf 1 abfragen GOTO Brems4 BCF GPIO,0 CALL Schl20 RETURN Brems5 CALL Schl100 GOTO Brems3 ;- - - - - - - - - - - - - - - - - - - - - - - - - Release BSF GPIO,1 CALL Schl01 ;Einstellzeit für den Code-Schalt-Mosfet CALL Schl01 BSF GPIO,0 ;Ausgang einschalten MOVLW 0x0A ;(Release Code = Dauersignal (8bit zu je 100ms alle =H mit zulässigem ÜbertragungsFehler von 1 oder 2)) MOVWF ZL8Reg Release3 DECFSZ ZL8Reg,F ;Mindestzeit auch bei kurzem Knopfdrücken GOTO Release5 Release4 BTFSS GPIO,2 ;Knopf 2 abfragen GOTO Release4 BCF GPIO,0 ; Das Sendemodul hat einen Pufferkondensator und könnte ev. noch ein paar Millisekunden weitersenden. CALL Schl20 ;Also mit Codewechsel warten! Um nicht fälschlich Bremssignal zu senden. CALL Schl20 BCF GPIO,1 CALL Schl5 RETURN Release5 CALL Schl100 GOTO Release3 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - WLTReset BSF STATUS,RP0 BCF PIE1,0 ;Timer Interrupt sperren BCF STATUS,RP0 BCF INTCON,0 ;PortChange Flag BSF INTCON,3 ;port Interr Enable BCF PIR1,0 ;TMR1-Flag BSF INTCON,7 ;Interruptvector für PortChange I aktivieren BSF GPIO,1 ;Kanalwahl CALL Schl01 ;warten bis Kanalwahl wirksam CALL Schl01 MOVLW 0x05 ;(6) MOVWF ZL8Reg BTFSC MyFlags,0 ;komme ich etwa vom Interrupt zurück? Dann jetzt keinen Mist machen.(Und etwa bremsen statt WLT) GOTO WLTR3 BSF GPIO,0 ;weil das erste Bit wohl vom Empfängermodul verschluckt wird drei (1) zusätzlich Call Schl100 Call Schl100 Call Schl100 WLTR1 BTFSC MyFlags,0 ;komme ich etwa vom Interrupt zurück? Dann jetzt keinen Mist machen. GOTO WLTR3 BSF GPIO,0 Call Schl100 BTFSC MyFlags,0 ;komme ich etwa vom Interrupt zurück? Dann jetzt keinen Mist machen. GOTO WLTR3 BCF GPIO,0 Call Schl100 DECFSZ ZL8Reg,F GOTO WLTR1 WLTR3 BCF INTCON,7 ;Ausstieg: Interruptvector für PortChange I wieder sperren,der sonst nicht benutzt wird(nur Flags) BCF GPIO,0 ;Ausgang nochmal abschalten falls von Interrupt reingeschneit sendend unwahrscheinlich aber möglich CALL Schl20 ; Das Sendemodul hat einen Pufferkondensator und könnte ev. noch ein paar Millisekunden weitersenden. CALL Schl20 ;Also mit Codewechsel warten! BCF MyFlags,0 ;mein Zusatz Interrupt Flag BCF GPIO,1 ; Kanalwahl resetten CALL Schl5 Return ;----------------------------------- Schl01 MOVLW D'48' MOVWF Schl01Reg Schl01Dec DECFSZ Schl01Reg,F GOTO Schl01Dec RETURN ;------------------- Schl5 MOVLW 0x0D ;Korrekturschleife laden MOVWF Kor5Reg Schl5Korr DECFSZ Kor5Reg,1 GOTO Schl5Korr MOVLW 0x6C ;Schl auss laden MOVWF Auss5Reg load5inn MOVLW 0x15 ;Schl inn laden MOVWF Inn5Reg Schl5inn DECFSZ Inn5Reg,1 GOTO Schl5inn CLRWDT DECFSZ Auss5Reg,1 GOTO load5inn NOP Return ;--------------- Schl20 MOVLW 0x09 ;Korrekturschleife laden MOVWF Kor20Reg Schl20Korr DECFSZ Kor20Reg,1 GOTO Schl20Korr MOVLW 0xE3 ;Schl auss laden MOVWF Auss20Reg load20inn MOVLW 0x2A ;Schl inn laden MOVWF Inn20Reg Schl20inn DECFSZ Inn20Reg,1 GOTO Schl20inn CLRWDT DECFSZ Auss20Reg,1 GOTO load20inn Return ;------------------ Schl100 MOVLW 0x2F ;Korrekturschleife laden MOVWF Kor100Reg Schl100Korr DECFSZ Kor100Reg,1 GOTO Schl100Korr MOVLW 0xDE ;Schl auss laden MOVWF Auss100Reg load100inn MOVLW 0xDF ;Schl inn laden MOVWF Inn100Reg Schl100inn DECFSZ Inn100Reg,1 GOTO Schl100inn CLRWDT DECFSZ Auss100Reg,1 GOTO load100inn Return END