; Source created with Parsic Version 3.x

; at              : 2009.02.15. 16:11:30


; Project File    : C:\PROGRA~1\Parsic\HE\ADledlin.PIC

; Project Version : 1.0.11

; Created         : 2005.05.15. 21:34:00

; Last change     : 2009.02.15. 16:11:28

	PROCESSOR 16F877

	INCLUDE P16F877.INC

	RADIX DEC


	__IDLOCS H'0100'

	__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_ON & _XT_OSC & _LVP_OFF & _CPD_OFF & _DEBUG_OFF

; Diverses

ZERO	EQU Z	; ZERO-Flag
CARRY	 EQU C	; CARRY-Flag


; Variable

S0	= 32	; located in Bank 0
S0_HI	= 33	; located in Bank 0
S1	= 34	; located in Bank 0
S1_HI	= 35	; located in Bank 0
S2	= 36	; located in Bank 0
S2_HI	= 37	; located in Bank 0
ADC0	= 38	; located in Bank 0
ADC0_HI	= 39	; located in Bank 0
RAM	= 40	; located in Bank 0
SYS_TMP1	= 114	; located in Bank 0, 1, 2, 3
SYS_TMP2	= 115	; located in Bank 0, 1, 2, 3
SYS_TMP3	= 116	; located in Bank 0, 1, 2, 3
SYS_TMP4	= 117	; located in Bank 0, 1, 2, 3
SYS_TMP5	= 118	; located in Bank 0, 1, 2, 3
SYS_TMP6	= 119	; located in Bank 0, 1, 2, 3
SYS_TMP7	= 120	; located in Bank 0, 1, 2, 3
SYS_FSAV	= 121	; located in Bank 0, 1, 2, 3

	ERRORLEVEL -302	; disable warning (Bankswitching)
	ERRORLEVEL -306	; disable warning (Pageswitching)

;****************************************
;Programmanfang
;****************************************

	ORG 0

	CLRF STATUS	; switch to RAM-Bank 0
	MOVLW HIGH SYS_INIT	; set page
	MOVWF PCLATH
	GOTO SYS_INIT
	RETURN

;****************************************
; Division 16 - Bit
; OP1 = SYS_TMP1,2
; OP2 = SYS_TMP3,4
;****************************************

SYSDIV16
	MOVFW SYS_TMP3	; Division durch 0 ?
	IORWF SYS_TMP4,W
	BTFSC STATUS,ZERO
	GOTO SYSDIV16_ERROR

	CLRF SYS_TMP5	; Ergebnis löschen
	CLRF SYS_TMP6
	MOVLW 1
	MOVWF SYS_TMP7
SYSDIV16_0
	BTFSC SYS_TMP4,7	; OP2 linksbündig
	GOTO SYSDIV16_1
	INCF SYS_TMP7,F
	BCF STATUS,CARRY
	RLF SYS_TMP3,F
	RLF SYS_TMP4,F
	GOTO SYSDIV16_0

SYSDIV16_1
	MOVFW SYS_TMP4	; OP1 und OP2 vergleichen
	SUBWF SYS_TMP2,W	; F-W -> W
	BTFSS STATUS,ZERO
	GOTO SYSDIV16_2
	MOVFW SYS_TMP3
	SUBWF SYS_TMP1,W	; F-W -> W

SYSDIV16_2
	BTFSS STATUS,CARRY
	GOTO SYSDIV16_3
	MOVFW SYS_TMP4	; OP1-OP2
	SUBWF SYS_TMP2,F	; F-W -> F
	MOVFW SYS_TMP3
	SUBWF SYS_TMP1,F	; F-W -> F
	BTFSS STATUS,CARRY
	DECF SYS_TMP2,F
	BSF STATUS,CARRY
SYSDIV16_3
	RLF SYS_TMP5,F	; Ergebnis aktualisieren
	RLF SYS_TMP6,F
	RRF SYS_TMP4,F	; OP2 nach rechts schieben
	RRF SYS_TMP3,F
	DECFSZ SYS_TMP7,F	; Zähler -1
	GOTO SYSDIV16_1

	RETURN

SYSDIV16_ERROR
	MOVLW 255
	MOVWF SYS_TMP5
	MOVWF SYS_TMP6
	RETURN


;****************************************
; Subroutines
;****************************************

;****************************************
; Direct jump into a table
;****************************************

SYSTABJMP
	BCF INTCON,GIE
	BTFSC INTCON,GIE
	GOTO SYSTABJMP
	MOVFW SYS_TMP2
	MOVWF PCLATH
	MOVFW SYS_TMP1
	MOVWF PCL
;***************************************************
; Read  -> AN0
;***************************************************

READ_AN0

	MOVLW B'100'
	BSF STATUS,RP0	; Bank 1
	BCF STATUS,RP1	; Bank 1
	MOVWF ADCON1
	BSF TRISA,0
	BSF ADCON1,ADFM	; Right-Justified

	MOVLW B'11000001'	; CH0
	BCF STATUS,RP0	; Bank 0
	MOVWF ADCON0
	MOVLW 5
	MOVWF SYS_TMP1

SYS_ADC_LABEL_0
	DECFSZ SYS_TMP1,F
	GOTO SYS_ADC_LABEL_0

	BSF ADCON0,GO	; Start convert

SYS_ADC_LABEL_1

	BTFSC ADCON0,GO	; ready ?
	GOTO SYS_ADC_LABEL_1	; no

	BSF STATUS,RP0	; Bank 1
	MOVFW ADRESL
	BCF STATUS,RP0	; Bank 0
	MOVWF ADC0
	MOVFW ADRESH
	MOVWF ADC0_HI


	MOVLW 6
	BSF STATUS,RP0	; Bank 1
	MOVWF ADCON1
	MOVLW B'11111111'
	MOVWF TRISA
	
	RETURN


;****************************************
;Initialisierung
;****************************************


SYS_INIT

	MOVLW B'00000000'
	MOVWF INTCON

; Set output before direction

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVLW B'00000000'
	MOVWF PORTA

	MOVLW B'00000000'
	MOVWF PORTB

	MOVLW B'00000000'
	MOVWF PORTC

	MOVLW B'00000000'
	MOVWF PORTD

	MOVLW B'00000000'
	MOVWF PORTE

	MOVLW 143
	BSF STATUS,RP0	; Bank 1
	MOVWF OPTION_REG

	MOVLW 6	; all Digital
	MOVWF ADCON1

; Richtung setzen

	MOVLW B'11111111'
	MOVWF TRISA

	MOVLW B'00000000'
	MOVWF TRISB

	MOVLW B'11111111'
	MOVWF TRISC

	MOVLW B'11111111'
	MOVWF TRISD

	MOVLW B'00000111'
	MOVWF TRISE

; init vars


; Clear RAM

	BCF STATUS,IRP
	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'F0'
	SUBWF FSR,W
	BTFSS STATUS,ZERO
	GOTO CR2
	BSF STATUS,IRP
	MOVLW 16
	MOVWF FSR
CR3
	CLRF INDF
	INCF FSR,F
	MOVLW H'70'
	SUBWF FSR,W
	BTFSS STATUS,ZERO
	GOTO CR3
	MOVLW 144
	MOVWF FSR
CR4
	CLRF INDF
	INCF FSR,F
	MOVLW H'F0'
	SUBWF FSR,W
	BTFSS STATUS,ZERO
	GOTO CR4



;**********************************
;******* Haupt-Programm ***********
;**********************************

MAIN

	CALL READ_AN0
;***************************************************
; Verteiler -> BV1
;***************************************************

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSC S0,0
	GOTO LABEL_BV1_0
	BCF PORTB,0
	GOTO LABEL_BV1_0_END
LABEL_BV1_0
	BSF PORTB,0
LABEL_BV1_0_END

;**********************************************

	BTFSC S0,1
	GOTO LABEL_BV1_1
	BCF PORTB,1
	GOTO LABEL_BV1_1_END
LABEL_BV1_1
	BSF PORTB,1
LABEL_BV1_1_END

;**********************************************

	BTFSC S0,2
	GOTO LABEL_BV1_2
	BCF PORTB,2
	GOTO LABEL_BV1_2_END
LABEL_BV1_2
	BSF PORTB,2
LABEL_BV1_2_END

;**********************************************

	BTFSC S0,3
	GOTO LABEL_BV1_3
	BCF PORTB,3
	GOTO LABEL_BV1_3_END
LABEL_BV1_3
	BSF PORTB,3
LABEL_BV1_3_END

;**********************************************

	BTFSC S0,4
	GOTO LABEL_BV1_4
	BCF PORTB,4
	GOTO LABEL_BV1_4_END
LABEL_BV1_4
	BSF PORTB,4
LABEL_BV1_4_END

;**********************************************

	BTFSC S0,5
	GOTO LABEL_BV1_5
	BCF PORTB,5
	GOTO LABEL_BV1_5_END
LABEL_BV1_5
	BSF PORTB,5
LABEL_BV1_5_END

;**********************************************

	BTFSC S0,6
	GOTO LABEL_BV1_6
	BCF PORTB,6
	GOTO LABEL_BV1_6_END
LABEL_BV1_6
	BSF PORTB,6
LABEL_BV1_6_END

;**********************************************

	BTFSC S0,7
	GOTO LABEL_BV1_7
	BCF PORTB,7
	GOTO LABEL_BV1_7_END
LABEL_BV1_7
	BSF PORTB,7
LABEL_BV1_7_END

;**********************************************


;***************************************************
; Call subroutine BYTE_LIN
;***************************************************


	MOVLW LOW BYTE_LIN
	MOVWF SYS_TMP1
	MOVLW HIGH BYTE_LIN
	MOVWF SYS_TMP2

	BCF STATUS,CARRY
	RLF S1,W
	ADDWF SYS_TMP1,F
	BTFSC STATUS,CARRY
	INCF SYS_TMP2,F

	MOVLW HIGH SYSTABJMP	; set page
	MOVWF PCLATH
	CALL SYSTABJMP

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVWF S0


	INCF SYS_TMP1,F
	BTFSC STATUS,ZERO
	INCF SYS_TMP2,F

	MOVLW HIGH SYSTABJMP	; set page
	MOVWF PCLATH
	CALL SYSTABJMP

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVWF S0_HI

	BSF INTCON,GIE
	BCF PCLATH,3	; Page 0
	BCF PCLATH,4	; Page 0
;***************************************************
;AF1
;***************************************************

	MOVFW S2
	MOVWF SYS_TMP1
	MOVFW S2_HI
	MOVWF SYS_TMP2
	MOVLW LOW 128
	MOVWF SYS_TMP3
	MOVLW HIGH 128
	MOVWF SYS_TMP4
	MOVLW HIGH SYSDIV16
	MOVWF PCLATH
	CALL SYSDIV16
	MOVLW HIGH LABEL_AF1
	MOVWF PCLATH
LABEL_AF1
	MOVFW SYS_TMP5
	MOVWF S1
	MOVFW SYS_TMP6
	MOVWF S1_HI

LABEL_AF1_EXIT
;***************************************************
;AF2
;***************************************************

	MOVFW ADC0_HI
	ADDLW HIGH 1
	MOVWF S2_HI
	MOVFW ADC0
	ADDLW LOW 1
	MOVWF S2
	BTFSC STATUS,CARRY
	INCF S2_HI,F

LABEL_AF2_EXIT
;****************************************

	GOTO MAIN

;***************************************************
; Table -> BYTE_LIN
;***************************************************

BYTE_LIN

	RETLW 0	; // INDEX 0
	RETLW 0	; // INDEX 0
	RETLW 1	; // INDEX 1
	RETLW 0	; // INDEX 1
	RETLW 3	; // INDEX 2
	RETLW 0	; // INDEX 2
	RETLW 7	; // INDEX 3
	RETLW 0	; // INDEX 3
	RETLW 15	; // INDEX 4
	RETLW 0	; // INDEX 4
	RETLW 31	; // INDEX 5
	RETLW 0	; // INDEX 5
	RETLW 63	; // INDEX 6
	RETLW 0	; // INDEX 6
	RETLW 127	; // INDEX 7
	RETLW 0	; // INDEX 7
	RETLW 255	; // INDEX 8
	RETLW 0	; // INDEX 8
	RETLW 9	; // INDEX 9
	RETLW 0	; // INDEX 9


	END

