; Source created with Parsic Version 3.x

; at              : 2010.01.23. 8:38:35


; Project File    : C:\Krisztián bigyói\PIC\Parsic\Parsic_3.4.3.w.CR\1500.PIC

; Project Version : 1.0.2

; Created         : 2010.01.16. 21:01:00

; Last change     : 2010.01.23. 7:58:00

	PROCESSOR 12F675

	INCLUDE P12F675.INC

	RADIX DEC


	__IDLOCS H'0100'

	__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _MCLRE_ON

; Diverses

ZERO	EQU Z	; ZERO-Flag
CARRY	 EQU C	; CARRY-Flag


; Variable

TR1	= 32	; located in Bank 0
TR1_HI	= 33	; located in Bank 0
GP	= 34	; located in Bank 0
ZV1	= 35	; located in Bank 0
ZV1_FD	= 36	; located in Bank 0
S0	= 37	; located in Bank 0
ZV2	= 38	; located in Bank 0
ZV2_FD	= 39	; located in Bank 0
MF1	= 40	; located in Bank 0
MF1_HI	= 41	; located in Bank 0
MF1_FD	= 42	; located in Bank 0
RAM	= 43	; located in Bank 0
SYS_WSAV	= 112	; located in Bank 0, 1
SYS_SSAV	= 113	; located in Bank 0, 1

	ERRORLEVEL -302	; disable warning (Bankswitching)
	ERRORLEVEL -306	; disable warning (Pageswitching)

;****************************************
;Programmanfang
;****************************************

	ORG 0

	GOTO SYS_INIT
	NOP
	NOP
	NOP

;****************************************
;Interrupt-Adress
;****************************************

	MOVWF SYS_WSAV	; save register
	SWAPF STATUS,W
	CLRF STATUS	; bank 0
	MOVWF SYS_SSAV

	BCF INTCON,T0IF	; Interrupt quitieren

	BCF STATUS,RP0	; Bank 0
	INCFSZ TR1,F
	GOTO SYS_INT_LABEL_0
	INCF TR1_HI,F

SYS_INT_LABEL_0
	INCFSZ MF1,F
	GOTO SYS_INT_LABEL_1
	INCF MF1_HI,F

SYS_INT_LABEL_1

EXITINT

	SWAPF SYS_SSAV,W	; Register zurück
	MOVWF STATUS
	SWAPF SYS_WSAV,F
	SWAPF SYS_WSAV,W

	RETFIE


;****************************************
; Subroutines
;****************************************


;****************************************
;Initialisierung
;****************************************


SYS_INIT

	BSF STATUS,RP0	; Bank 1
	CALL 1023
	MOVWF OSCCAL
	MOVLW B'00100000'
	MOVWF INTCON

; Set output before direction

	BCF STATUS,RP0	; Bank 0
	MOVLW B'00000000'
	MOVWF GPIO

	MOVLW 15
	BSF STATUS,RP0	; Bank 1
	MOVWF OPTION_REG

	MOVLW 7	; all digital
	MOVWF CMCON

; Richtung setzen

	MOVLW B'11111001'
	MOVWF TRISIO

; init vars


; Clear RAM

	MOVLW 32
	MOVWF FSR
CR1
	CLRF INDF
	INCF FSR,F
	BTFSS FSR,7
	GOTO CR1
	BSF FSR,5
CR2
	CLRF INDF
	INCF FSR,F
	MOVLW H'C0'
	SUBWF FSR,W
	BTFSS STATUS,ZERO
	GOTO CR2


	BCF STATUS,RP0	; Bank 0
	CLRF TMR0
	BCF INTCON,T0IF
	BSF INTCON,GIE	; Interrupt freigeben

;**********************************
;******* Haupt-Programm ***********
;**********************************

MAIN

;***************************************************
; Timer -> TR1
;***************************************************

	MOVLW 7	; Test auf >=
	BCF STATUS,RP0	; Bank 0
	SUBWF TR1_HI,W	;F-W -> W
	BTFSS STATUS,ZERO
	GOTO LABEL_TR1_CHECK
	MOVLW 161
	SUBWF TR1,W	;F-W -> W
LABEL_TR1_CHECK
	BTFSS STATUS,CARRY
	GOTO LABEL_TR1_ENDE

LABEL_TR1_RESET
	MOVLW 7	; Test auf >=
	SUBWF TR1_HI,F	;F-W -> F
	MOVLW 161
	SUBWF TR1,F	;F-W -> F
	BTFSS STATUS,CARRY
	DECF TR1_HI,F

LABEL_TR1_SET	; toggel output
	BTFSC GPIO,1
	GOTO LABEL_TR1_CLR
	BSF GPIO,1
	GOTO LABEL_TR1_ENDE
LABEL_TR1_CLR
	BCF GPIO,1
LABEL_TR1_ENDE

;***************************************************
; Zähler -> ZV1
;***************************************************

	BCF STATUS,RP0	; Bank 0
	BTFSS S0,0	; Reset ?
	GOTO LABEL_ZV1_COUNT
	CLRF ZV1
	GOTO LABEL_ZV1_SETOUT

LABEL_ZV1_COUNT

; Test auf positive Flanke

	BCF STATUS,RP0	; Bank 0
	BTFSS GPIO,1
	GOTO LABEL_ZV1_SETFD
	BTFSC ZV1_FD,0
	GOTO LABEL_ZV1_SETFD

	BSF ZV1_FD,0


	BTFSC S0,2	; Vorwärts oder Rückwärts ?
	GOTO LABEL_ZV1_BACKWARD

	INCF ZV1,F
	GOTO LABEL_ZV1_SETOUT

LABEL_ZV1_BACKWARD
	BCF STATUS,RP0	; Bank 0
	DECF ZV1,F

LABEL_ZV1_SETOUT


LABEL_ZV1_SETFD

; Test auf negative Flanke

	BCF STATUS,RP0	; Bank 0
	BTFSC GPIO,1
	GOTO LABEL_ZV1_EXIT
	BCF ZV1_FD,0

LABEL_ZV1_EXIT

;***************************************************
; Vergleich -> IF1
;***************************************************

	MOVLW 60
	SUBWF ZV1,W	; F - W -> W

LABEL_IF1_CHECK
	BCF STATUS,RP0	; Bank 0
	BTFSS STATUS,ZERO	; Test auf -> =
	GOTO LABEL_IF1_FALSE

LABEL_IF1_TRUE
	BSF S0,0
	GOTO LABEL_IF1_EXIT

LABEL_IF1_FALSE
	BCF S0,0

LABEL_IF1_EXIT
;***************************************************
; Zähler -> ZV2
;***************************************************

	BTFSS S0,1	; Reset ?
	GOTO LABEL_ZV2_COUNT
	CLRF ZV2
	GOTO LABEL_ZV2_SETOUT

LABEL_ZV2_COUNT

; Test auf positive Flanke

	BCF STATUS,RP0	; Bank 0
	BTFSS S0,0
	GOTO LABEL_ZV2_SETFD
	BTFSC ZV2_FD,0
	GOTO LABEL_ZV2_SETFD

	BSF ZV2_FD,0


	BTFSC S0,2	; Vorwärts oder Rückwärts ?
	GOTO LABEL_ZV2_BACKWARD

	INCF ZV2,F
	GOTO LABEL_ZV2_SETOUT

LABEL_ZV2_BACKWARD
	BCF STATUS,RP0	; Bank 0
	DECF ZV2,F

LABEL_ZV2_SETOUT


LABEL_ZV2_SETFD

; Test auf negative Flanke

	BCF STATUS,RP0	; Bank 0
	BTFSC S0,0
	GOTO LABEL_ZV2_EXIT
	BCF ZV2_FD,0

LABEL_ZV2_EXIT

;***************************************************
; Vergleich -> IF2
;***************************************************

	MOVLW 1460
	SUBWF ZV2,W	; F - W -> W

LABEL_IF2_CHECK
	BCF STATUS,RP0	; Bank 0
	BTFSS STATUS,ZERO	; Test auf -> =
	GOTO LABEL_IF2_FALSE

LABEL_IF2_TRUE
	BSF S0,1
	GOTO LABEL_IF2_EXIT

LABEL_IF2_FALSE
	BCF S0,1

LABEL_IF2_EXIT
;***************************************************
; GND
;***************************************************

	BCF S0,2	; immer Low

;***************************************************
; Mono-Flop -> MF1
;***************************************************

; Test auf positive Flanke

	BTFSC MF1_FD,0
	GOTO LABEL_MF1_CHKTIME
	BTFSS S0,1
	GOTO LABEL_MF1_CHKTIME


LABEL_MF1_RESET

	CLRF MF1
	CLRF MF1_HI
	BSF MF1_FD,1
	BSF GPIO,2

LABEL_MF1_CHKTIME

; Läuft der Impuls ?

	BCF STATUS,RP0	; Bank 0
	BTFSS MF1_FD,1
	GOTO LABEL_MF1_SETFD

	MOVLW 152
	SUBWF MF1_HI,W
	BTFSS STATUS,ZERO
	GOTO LABEL_MF1_CHECK
	MOVLW 150
	SUBWF MF1,W
LABEL_MF1_CHECK
	BTFSS STATUS,CARRY
	GOTO LABEL_MF1_SETFD
LABEL_MF1_TO

	BCF MF1_FD,1
	BCF GPIO,2

LABEL_MF1_SETFD

	BCF STATUS,RP0	; Bank 0
	BTFSS S0,1
	GOTO LABEL_MF1_CLR
	BSF MF1_FD,0
	GOTO LABEL_MF1_ENDE
LABEL_MF1_CLR
	BCF STATUS,RP0	; Bank 0
	BCF MF1_FD,0

LABEL_MF1_ENDE

;****************************************

	GOTO MAIN

	ORG 1023

	RETLW H'00'	; OSCCAL

	END

