; Source created with Parsic Version 3.x ; at : 25.07.2011 19:08:03 ; Project File : C:\DOKUME~1\WOLFGA~1\Desktop\SchruNew.pic ; Project Version : 1.0.12 ; Created : 13.05.2003 14:45:00 ; Last change : 25.07.2011 19:07:31 PROCESSOR 12C509A INCLUDE P12C509A.INC RADIX DEC __IDLOCS H'0100' __CONFIG _CP_OFF & _WDT_ON & _INTRC_OSC & _MCLRE_OFF ; Diverses ZERO EQU Z ; ZERO-Flag CARRY EQU C ; CARRY-Flag #DEFINE RETURN RETLW 0 ; Variable S0 = 7 ; located in Bank 0, 1 ZR1 = 8 ; located in Bank 0, 1 ZR1_FD = 9 ; located in Bank 0, 1 S1 = 10 ; located in Bank 0, 1 MF1 = 11 ; located in Bank 0, 1 MF1_HI = 12 ; located in Bank 0, 1 SYS_OLDTMR0 = 13 ; located in Bank 0, 1 OS1_FD = 14 ; located in Bank 0, 1 MF2 = 15 ; located in Bank 0, 1 MF2_HI = 16 ; located in Bank 0 MF2_FD = 17 ; located in Bank 0 MF3 = 18 ; located in Bank 0 MF3_HI = 19 ; located in Bank 0 MF3_FD = 20 ; located in Bank 0 ZR2 = 21 ; located in Bank 0 ZR2_FD = 22 ; located in Bank 0 OS2_FD = 23 ; located in Bank 0 S2 = 24 ; located in Bank 0 OS3_FD = 25 ; located in Bank 0 OS4_FD = 26 ; located in Bank 0 OS5_FD = 27 ; located in Bank 0 TR1 = 28 ; located in Bank 0 TR1_HI = 29 ; located in Bank 0 ZR3 = 30 ; located in Bank 0 ZR3_FD = 31 ; located in Bank 0 ZR4 = 48 ; located in Bank 1 ZR4_FD = 49 ; located in Bank 1 RAM = 50 ; located in Bank 1 ERRORLEVEL -302 ; disable warning (Bankswitching) ERRORLEVEL -306 ; disable warning (Pageswitching) ;**************************************** ;Programmanfang ;**************************************** ORG 0 CLRF FSR MOVWF OSCCAL MOVLW HIGH SYS_INIT << 4 MOVWF STATUS ; Page GOTO SYS_INIT ;**************************************** ;Interrupt-Adress ;**************************************** SYS_INTERRUPT MOVFW SYS_OLDTMR0 SUBWF TMR0,W BTFSS STATUS,CARRY GOTO SYS_INTERRUPT_START ADDWF SYS_OLDTMR0,F BCF FSR,5 ; Bank 0 RETURN SYS_INTERRUPT_START ADDWF SYS_OLDTMR0,F INCFSZ MF1,F GOTO SYS_INT_LABEL_0 INCF MF1_HI,F SYS_INT_LABEL_0 INCFSZ MF2,F GOTO SYS_INT_LABEL_1 BCF FSR,5 ; Bank 0 INCF MF2_HI,F SYS_INT_LABEL_1 BCF FSR,5 ; Bank 0 INCFSZ MF3,F GOTO SYS_INT_LABEL_2 INCF MF3_HI,F SYS_INT_LABEL_2 INCFSZ TR1,F GOTO SYS_INT_LABEL_3 INCF TR1_HI,F SYS_INT_LABEL_3 NOTMR0INT EXITINT BCF FSR,5 ; Bank 0 RETURN ;**************************************** ; Subroutines ;**************************************** ;**************************************** ;Initialisierung ;**************************************** SYS_INIT ; Set output before direction MOVLW B'00000011' MOVWF GPIO MOVLW 15 OPTION ; Richtung setzen MOVLW B'11111100' TRIS GPIO ; init vars ; Clear RAM MOVLW 7 MOVWF FSR CR1 CLRF INDF INCF FSR,F BTFSC STATUS,ZERO GOTO CR2 BTFSS FSR,5 GOTO CR1 BSF FSR,4 GOTO CR1 CR2 MOVLW B'00000001' MOVWF S0 MOVLW B'00000010' BCF FSR,5 ; Bank 0 MOVWF S2 CLRF TMR0 ;********************************** ;******* Haupt-Programm *********** ;********************************** MAIN CLRWDT ;*************************************************** ; UND - Gatter -> LG1 ;*************************************************** LABEL_LG1_1 BTFSC GPIO,5 GOTO LABEL_LG1_FALSE LABEL_LG1_TRUE BCF S0,0 GOTO LABEL_LG1_ENDE LABEL_LG1_FALSE BSF S0,0 LABEL_LG1_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; UND - Gatter -> LG2 ;*************************************************** LABEL_LG2_1 BTFSC S0,2 GOTO LABEL_LG2_FALSE LABEL_LG2_2 BTFSS S0,0 GOTO LABEL_LG2_FALSE LABEL_LG2_3 BTFSS S0,3 GOTO LABEL_LG2_FALSE LABEL_LG2_TRUE BSF S0,1 GOTO LABEL_LG2_ENDE LABEL_LG2_FALSE BCF S0,1 LABEL_LG2_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Zähler -> ZR1 ;*************************************************** BTFSC S1,3 ; Reset ? GOTO LABEL_ZR1_COUNT CLRF ZR1 GOTO LABEL_ZR1_SETOUT LABEL_ZR1_COUNT ; Test auf positive Flanke BTFSC ZR1_FD,0 GOTO LABEL_ZR1_SETFD BTFSS S1,2 GOTO LABEL_ZR1_SETFD INCF ZR1,F LABEL_ZR1_SETOUT ; Output Q3 BTFSS ZR1,3 GOTO LABEL_ZR1_SETOUT3 BSF S1,1 GOTO LABEL_ZR1_SETOUT3_END LABEL_ZR1_SETOUT3 BCF S1,1 LABEL_ZR1_SETOUT3_END LABEL_ZR1_SETFD BTFSS S1,2 GOTO LABEL_ZR1_SETFD2 BSF ZR1_FD,0 GOTO LABEL_ZR1_END LABEL_ZR1_SETFD2 BCF ZR1_FD,0 LABEL_ZR1_END ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; RS-FLIP-FLOP -> RS1 ;*************************************************** BTFSC S1,4 GOTO LABEL_RS1_RESET BTFSS S1,1 GOTO LABEL_RS1_ENDE BSF S0,2 ; Ausgang setzen GOTO LABEL_RS1_ENDE LABEL_RS1_RESET BCF S0,2 ; Ausgang zurücksetzen LABEL_RS1_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; UND - Gatter -> LG3 ;*************************************************** LABEL_LG3_1 BTFSC S0,2 GOTO LABEL_LG3_FALSE LABEL_LG3_TRUE BCF GPIO,0 GOTO LABEL_LG3_ENDE LABEL_LG3_FALSE BSF GPIO,0 LABEL_LG3_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Anzug-Verzögerung -> MF1 ;*************************************************** BTFSC S0,1 ; Eingang auf High ? GOTO LABEL_MF1_CHKTIME ; Ja ; RESET CLRF MF1 CLRF MF1_HI BCF S0,7 GOTO LABEL_MF1_EXIT ; raus LABEL_MF1_CHKTIME BTFSC S0,7 ; Ausgang schon auf High ? GOTO LABEL_MF1_EXIT ; Ja MOVLW 0 SUBWF MF1_HI,W BTFSS STATUS,CARRY GOTO LABEL_MF1_EXIT MOVLW 20 SUBWF MF1,W BTFSS STATUS,CARRY GOTO LABEL_MF1_EXIT BSF S0,7 LABEL_MF1_EXIT ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; One Shot -> OS1 ;*************************************************** BTFSS S0,0 GOTO LABEL_OS1_1 BTFSC OS1_FD,0 GOTO LABEL_OS1_1 BSF OS1_FD,0 BSF S1,2 GOTO LABEL_OS1_2 LABEL_OS1_1 BCF S1,2 BTFSC S0,0 GOTO LABEL_OS1_2 BCF OS1_FD,0 LABEL_OS1_2 ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Mono-Flop -> MF2 ;*************************************************** ; Test auf negative Flanke BTFSS MF2_FD,0 GOTO LABEL_MF2_CHKTIME BTFSC S0,0 GOTO LABEL_MF2_CHKTIME LABEL_MF2_RESET CLRF MF2 CLRF MF2_HI BSF MF2_FD,1 BSF S1,3 LABEL_MF2_CHKTIME ; Läuft der Impuls ? BCF FSR,5 ; Bank 0 BTFSS MF2_FD,1 GOTO LABEL_MF2_SETFD MOVLW 15 SUBWF MF2_HI,W BTFSS STATUS,ZERO GOTO LABEL_MF2_CHECK MOVLW 66 SUBWF MF2,W LABEL_MF2_CHECK BTFSS STATUS,CARRY GOTO LABEL_MF2_SETFD LABEL_MF2_TO BCF MF2_FD,1 BCF S1,3 LABEL_MF2_SETFD BTFSS S0,0 GOTO LABEL_MF2_CLR BCF FSR,5 ; Bank 0 BSF MF2_FD,0 GOTO LABEL_MF2_ENDE LABEL_MF2_CLR BCF FSR,5 ; Bank 0 BCF MF2_FD,0 LABEL_MF2_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Mono-Flop -> MF3 ;*************************************************** ; Läuft der Impuls ? BTFSC MF3_FD,1 GOTO LABEL_MF3_CHKTIME ; Test auf negative Flanke BTFSS MF3_FD,0 GOTO LABEL_MF3_SETFD BTFSC S1,6 GOTO LABEL_MF3_SETFD LABEL_MF3_RESET CLRF MF3 CLRF MF3_HI BSF MF3_FD,1 BSF S1,4 LABEL_MF3_CHKTIME MOVLW 0 BCF FSR,5 ; Bank 0 SUBWF MF3_HI,W BTFSS STATUS,ZERO GOTO LABEL_MF3_CHECK MOVLW 78 SUBWF MF3,W LABEL_MF3_CHECK BTFSS STATUS,CARRY GOTO LABEL_MF3_SETFD LABEL_MF3_TO BCF MF3_FD,1 BCF S1,4 LABEL_MF3_SETFD BTFSS S1,6 GOTO LABEL_MF3_CLR BCF FSR,5 ; Bank 0 BSF MF3_FD,0 GOTO LABEL_MF3_ENDE LABEL_MF3_CLR BCF FSR,5 ; Bank 0 BCF MF3_FD,0 LABEL_MF3_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; ODER - Gatter -> LG4 ;*************************************************** LABEL_LG4_1 BTFSC S1,5 GOTO LABEL_LG4_TRUE LABEL_LG4_2 BTFSC S0,6 GOTO LABEL_LG4_TRUE LABEL_LG4_3 BTFSC S2,2 GOTO LABEL_LG4_TRUE LABEL_LG4_FALSE BCF S0,3 GOTO LABEL_LG4_ENDE LABEL_LG4_TRUE BSF S0,3 LABEL_LG4_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Zähler -> ZR2 ;*************************************************** BTFSS S0,5 ; Reset ? GOTO LABEL_ZR2_COUNT CLRF ZR2 GOTO LABEL_ZR2_SETOUT LABEL_ZR2_COUNT ; Test auf positive Flanke BCF FSR,5 ; Bank 0 BTFSC ZR2_FD,0 GOTO LABEL_ZR2_SETFD BTFSS S1,0 GOTO LABEL_ZR2_SETFD INCF ZR2,F LABEL_ZR2_SETOUT ; Output Q0 BTFSS ZR2,0 GOTO LABEL_ZR2_SETOUT0 BSF S0,6 GOTO LABEL_ZR2_SETOUT0_END LABEL_ZR2_SETOUT0 BCF S0,6 LABEL_ZR2_SETOUT0_END ; Output Q1 BTFSS ZR2,1 GOTO LABEL_ZR2_SETOUT1 BSF S0,4 GOTO LABEL_ZR2_SETOUT1_END LABEL_ZR2_SETOUT1 BCF S0,4 LABEL_ZR2_SETOUT1_END LABEL_ZR2_SETFD BTFSS S1,0 GOTO LABEL_ZR2_SETFD2 BCF FSR,5 ; Bank 0 BSF ZR2_FD,0 GOTO LABEL_ZR2_END LABEL_ZR2_SETFD2 BCF FSR,5 ; Bank 0 BCF ZR2_FD,0 LABEL_ZR2_END ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; One Shot -> OS2 ;*************************************************** BTFSC S1,7 GOTO LABEL_OS2_1 BTFSC OS2_FD,0 GOTO LABEL_OS2_1 BSF OS2_FD,0 BSF S1,0 GOTO LABEL_OS2_2 LABEL_OS2_1 BCF S1,0 BTFSS S1,7 GOTO LABEL_OS2_2 BCF FSR,5 ; Bank 0 BCF OS2_FD,0 LABEL_OS2_2 ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; ODER - Gatter -> LG5 ;*************************************************** LABEL_LG5_1 BTFSC S0,4 GOTO LABEL_LG5_TRUE LABEL_LG5_2 BTFSC S1,1 GOTO LABEL_LG5_TRUE LABEL_LG5_3 BTFSC S2,1 GOTO LABEL_LG5_TRUE LABEL_LG5_FALSE BCF S0,5 GOTO LABEL_LG5_ENDE LABEL_LG5_TRUE BSF S0,5 LABEL_LG5_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; UND - Gatter -> LG6 ;*************************************************** LABEL_LG6_1 BTFSC S0,7 GOTO LABEL_LG6_FALSE LABEL_LG6_TRUE BCF GPIO,1 GOTO LABEL_LG6_ENDE LABEL_LG6_FALSE BSF GPIO,1 LABEL_LG6_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; UND - Gatter -> LG7 ;*************************************************** LABEL_LG7_1 BTFSS GPIO,4 GOTO LABEL_LG7_FALSE LABEL_LG7_TRUE BCF S2,1 GOTO LABEL_LG7_ENDE LABEL_LG7_FALSE BCF FSR,5 ; Bank 0 BSF S2,1 LABEL_LG7_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; RS-FLIP-FLOP -> RS2 ;*************************************************** BTFSC S2,1 GOTO LABEL_RS2_RESET BTFSS S2,0 GOTO LABEL_RS2_ENDE BSF S1,5 ; Ausgang setzen GOTO LABEL_RS2_ENDE LABEL_RS2_RESET BCF S1,5 ; Ausgang zurücksetzen LABEL_RS2_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; UND - Gatter -> LG8 ;*************************************************** LABEL_LG8_1 BTFSC S2,1 GOTO LABEL_LG8_FALSE LABEL_LG8_2 BTFSS S1,6 GOTO LABEL_LG8_FALSE LABEL_LG8_TRUE BSF S1,7 GOTO LABEL_LG8_ENDE LABEL_LG8_FALSE BCF S1,7 LABEL_LG8_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; One Shot -> OS3 ;*************************************************** BTFSS GPIO,3 GOTO LABEL_OS3_1 BTFSC OS3_FD,0 GOTO LABEL_OS3_1 BSF OS3_FD,0 BSF S2,0 GOTO LABEL_OS3_2 LABEL_OS3_1 BCF FSR,5 ; Bank 0 BCF S2,0 BTFSC GPIO,3 GOTO LABEL_OS3_2 BCF OS3_FD,0 LABEL_OS3_2 ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; One Shot -> OS4 ;*************************************************** BTFSS GPIO,2 GOTO LABEL_OS4_1 BTFSC OS4_FD,0 GOTO LABEL_OS4_1 BSF OS4_FD,0 BSF S1,6 GOTO LABEL_OS4_2 LABEL_OS4_1 BCF S1,6 BTFSC GPIO,2 GOTO LABEL_OS4_2 BCF FSR,5 ; Bank 0 BCF OS4_FD,0 LABEL_OS4_2 ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; One Shot -> OS5 ;*************************************************** BTFSC S2,2 GOTO LABEL_OS5_1 BTFSC OS5_FD,0 GOTO LABEL_OS5_1 BSF OS5_FD,0 BSF S2,7 GOTO LABEL_OS5_2 LABEL_OS5_1 BCF FSR,5 ; Bank 0 BCF S2,7 BTFSS S2,2 GOTO LABEL_OS5_2 BCF OS5_FD,0 LABEL_OS5_2 ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Timer -> TR1 ;*************************************************** MOVLW 15 ; Test auf >= SUBWF TR1_HI,W ;F-W -> W BTFSS STATUS,ZERO GOTO LABEL_TR1_CHECK MOVLW 66 SUBWF TR1,W ;F-W -> W LABEL_TR1_CHECK BTFSS STATUS,CARRY GOTO LABEL_TR1_ENDE LABEL_TR1_RESET MOVLW 15 ; Test auf >= SUBWF TR1_HI,F ;F-W -> F MOVLW 66 SUBWF TR1,F ;F-W -> F BTFSS STATUS,CARRY DECF TR1_HI,F LABEL_TR1_SET ; toggel output BTFSC S2,3 GOTO LABEL_TR1_CLR BSF S2,3 GOTO LABEL_TR1_ENDE LABEL_TR1_CLR BCF S2,3 LABEL_TR1_ENDE ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Zähler -> ZR3 ;*************************************************** BTFSS S2,7 ; Reset ? GOTO LABEL_ZR3_COUNT CLRF ZR3 GOTO LABEL_ZR3_SETOUT LABEL_ZR3_COUNT ; Test auf positive Flanke BCF FSR,5 ; Bank 0 BTFSC ZR3_FD,0 GOTO LABEL_ZR3_SETFD BTFSS S2,3 GOTO LABEL_ZR3_SETFD INCF ZR3,F LABEL_ZR3_SETOUT ; Output Q0 BTFSS ZR3,0 GOTO LABEL_ZR3_SETOUT0 BSF S2,6 GOTO LABEL_ZR3_SETOUT0_END LABEL_ZR3_SETOUT0 BCF S2,6 LABEL_ZR3_SETOUT0_END ; Output Q1 BTFSS ZR3,1 GOTO LABEL_ZR3_SETOUT1 BSF S2,6 GOTO LABEL_ZR3_SETOUT1_END LABEL_ZR3_SETOUT1 BCF S2,6 LABEL_ZR3_SETOUT1_END ; Output Q3 BTFSS ZR3,3 GOTO LABEL_ZR3_SETOUT3 BSF S2,6 GOTO LABEL_ZR3_SETOUT3_END LABEL_ZR3_SETOUT3 BCF S2,6 LABEL_ZR3_SETOUT3_END ; Output Q7 BTFSS ZR3,7 GOTO LABEL_ZR3_SETOUT7 BSF S2,4 GOTO LABEL_ZR3_SETOUT7_END LABEL_ZR3_SETOUT7 BCF S2,4 LABEL_ZR3_SETOUT7_END LABEL_ZR3_SETFD BCF FSR,5 ; Bank 0 BTFSS S2,3 GOTO LABEL_ZR3_SETFD2 BSF ZR3_FD,0 GOTO LABEL_ZR3_END LABEL_ZR3_SETFD2 BCF FSR,5 ; Bank 0 BCF ZR3_FD,0 LABEL_ZR3_END ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; Zähler -> ZR4 ;*************************************************** BTFSS S2,7 ; Reset ? GOTO LABEL_ZR4_COUNT BSF FSR,5 ; Bank 1 CLRF ZR4 GOTO LABEL_ZR4_SETOUT LABEL_ZR4_COUNT ; Test auf positive Flanke BSF FSR,5 ; Bank 1 BTFSC ZR4_FD,0 GOTO LABEL_ZR4_SETFD BCF FSR,5 ; Bank 0 BTFSS S2,4 GOTO LABEL_ZR4_SETFD BSF FSR,5 ; Bank 1 INCF ZR4,F LABEL_ZR4_SETOUT ; Output Q5 BTFSS ZR4,5 GOTO LABEL_ZR4_SETOUT5 BCF FSR,5 ; Bank 0 BSF S2,5 GOTO LABEL_ZR4_SETOUT5_END LABEL_ZR4_SETOUT5 BCF FSR,5 ; Bank 0 BCF S2,5 LABEL_ZR4_SETOUT5_END LABEL_ZR4_SETFD BCF FSR,5 ; Bank 0 BTFSS S2,4 GOTO LABEL_ZR4_SETFD2 BSF FSR,5 ; Bank 1 BSF ZR4_FD,0 GOTO LABEL_ZR4_END LABEL_ZR4_SETFD2 BSF FSR,5 ; Bank 1 BCF ZR4_FD,0 LABEL_ZR4_END ;*************************************************** CALL SYS_INTERRUPT ;*************************************************** ; UND - Gatter -> LG9 ;*************************************************** LABEL_LG9_1 BTFSS S2,6 GOTO LABEL_LG9_FALSE LABEL_LG9_2 BTFSS S2,5 GOTO LABEL_LG9_FALSE LABEL_LG9_TRUE BSF S2,2 GOTO LABEL_LG9_ENDE LABEL_LG9_FALSE BCF FSR,5 ; Bank 0 BCF S2,2 LABEL_LG9_ENDE ;*************************************************** CALL SYS_INTERRUPT ;**************************************** GOTO MAIN ORG 1023 MOVLW H'64' ; OSCCAL END