; Indicateur de position pour potentiomètre linéaire
; Affichage sur 2 afficheurs 7 segments 20mm (HDSP3903, cath. com.) du pourcentage (course)

; Entrée analogique en RA0 (impedance ligne 1k)
; Commande alternée des afficheurs par PORTB0:6 et PORTC0:6
; Commande directe des afficheurs If=20mA, Vf=2.8V  RES=120 Ohms

; Aurélien ROBERT
; 06-07/2002

	list p=16f870
	include <P16F870.INC>

; Bits de Configuration, CF p16f870.inc :
; =======================================

	__CONFIG _BODEN_OFF & _CP_ALL & _PWRTE_ON & _WDT_OFF & _XT_OSC & _LVP_OFF & _WRT_ENABLE_ON

; Variables RAM :
; ===============

	cblock	0x020
		conf		; config
		w_temp, status_temp	; sauvegarde registres
		aff_dix, aff_unit	; affichages
		time, tempo_var	; temps
		result		; A/D	
	endc

bcd0	EQU	B'0
bcd1	EQU	B'0
bcd2	EQU	B'0
bcd3	EQU	B'0
bcd4	EQU	B'0
bcd5	EQU	B'0
bcd6	EQU	B'0
bcd7	EQU	B'0
bcd8	EQU	B'0
bcd9	EQU	B'0

#DEFINE	in_00	PORTA,2
#DEFINE	in_99	PORTA,3
#DEFINE	out_00	PORTA,4
#DEFINE	out_99	PORTA,5
#DEFINE	SEG_DIX	PORTB
#DEFINE	SEG_UNIT	PORTC

#DEFINE	dix	conf,0	; à 1 si le segment des dizaines est jusqu'alors activé (0=unités)
#DEFINE	new_acq	conf,1	; à 1 si une nouvelle acquisition doit etre lancée	

BANK0	MACRO
	bcf	STATUS,RP0
	ENDM

BANK1	MACRO
	bsf	STATUS,RP0
	ENDM

; Branchement Reset
; -----------------
	org	0x00
	goto	start

; Branchement Interruption
; ------------------------

	org	0x04
	movwf	w_temp
	movf	STATUS,w
	movwf	status_temp
	btfss	INTCON,T0IF	; test que cela vient bien du timer
	goto	restore
	movlw	D'98'
	movwf	TMR0
	btfss	dix
	goto	affich_dix
	clrf	SEG_DIX	; les dizaines étaient affichées
	movf	aff_unit,w
	movwf	SEG_UNIT	; affichage des unités
	bcf	dix	; activation flag
	goto	test_time
affich_dix	clrf	SEG_UNIT
	movf	aff_dix
	movwf	SEG_DIX
	bsf	dix
test_time	decfsz	time,f
	goto	restore
	movlw	D'30'
	movwf	time
	bsf	new_acq	; 300ms écoulées, il faut à nouveau decoder la position
restore	movf	status_temp,w
	movwf	STATUS
	movf	w_temp,w
	retfie

; Programme Principal
; -------------------

start	BANK1
	movlw	B'00001110'	; left-justified, tout digital sauf RA0
	movwf	ADCON1
	clrf	TRISC
	clrf	TRISB
	movlw	B'00001111'	; tout PORTA entrée sauf commandes relais
	movwf	TRISA
	bcf	PIE1,ADIE
	BANK0
	clrf	PORTA
	clrf	PORTB
	clrf	PORTC
	bsf	time
	clrf	aff_dix
	clrf	aff_unit
	movlw	D'98'
	movwf	TMR0
	BANK1
	movlw	B'11000101'	; timer0 enclenché, 1:64 prescaler
	movwf	OPTION_REG
	BANK0
	movlw	B'10100000'
	movwf	INTCON	; interruptions timer
boucle	btfss	new_acq	; nouvelle acquisition ?
	goto	test_relais
	bcf	new_acq
	movlw	D'30'
	movwf	time
	movlw	B'010000001'	; channel0, Fosc/8, turn on A/D module
	movwf	ADCON0
	movlw	D'30'
	movwf	tempo_var	; 3x30µs d'attente
	decfsz	tempo_var,f
	goto	$-1	; acquisition terminée
	bsf	ADCON0,GO_DONE	; lancement conversion
	btfsc	ADCON0,GO_DONE	; attente fini
	goto	$-1
	movf	ADRESH,w
	movwf	result
	bcf	ADCON0,ADON	; extinction module A/D
	rrf	result,f
	bcf	result,7	; on a besoin que d'une definition à 128 pres..
	movlw	0x07	; on se refere au tables pour savoir quoi afficher
	movwf	PCLATH
	movf	result,w
	call	tabDix
	movwf	aff_dix
	movlw	0x06
	movwf	PCLATH
	movf	result,w
	call	tabUnit
	movwf	aff_unit
	clrf	PCLATH
test_relais	movf	aff_dix,w	; test affich = 99%
	sublw	bcd9
	btfss	STATUS,Z
	goto	test0
	movf	aff_unit,w
	sublw	bcd9
	btfss	STATUS,Z
	goto	on_relais
	bcf	out_99
	goto	boucle
test0	movf	aff_dix	; test affich = 0%
	sublw	bcd0
	btfss	STATUS,Z
	goto	on_relais
	movf	aff_unit
	sublw	bcd0
	btfss	STATUS,Z
	goto	on_relais
	bcf	out_0
	goto	boucle
on_relais	btfsc	in_00	; test inter 0%
	bsf	out_00
	btfsc	in_99	; test inter 99%
	bsf	out_99
	btfss	in_00	; test inter 0%
	bcf	out_00
	btfss	in_99	; test inter 99%
	bcf	out_99
	goto	boucle


; Tables d'affichage
; ------------------

	org	H'0600'	; tableau des unités
tabUnit	addwf	PCL,f
	retlw	bcd0
	retlw	bcd0
	retlw	bcd1
	retlw	bcd2
	retlw	bcd3
	retlw	bcd3
	retlw	bcd4
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd7
	retlw	bcd8
	retlw	bcd9
	retlw	bcd0
	retlw	bcd1
	retlw	bcd1
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd4
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd8
	retlw	bcd8
	retlw	bcd9
	retlw	bcd0
	retlw	bcd1
	retlw	bcd2
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd5
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd8
	retlw	bcd9
	retlw	bcd9
	retlw	bcd0
	retlw	bcd1
	retlw	bcd2
	retlw	bcd3
	retlw	bcd3
	retlw	bcd4
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd7
	retlw	bcd8
	retlw	bcd9
	retlw	bcd0
	retlw	bcd0
	retlw	bcd1
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd4
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd8
	retlw	bcd8
	retlw	bcd9
	retlw	bcd0
	retlw	bcd1
	retlw	bcd1
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd5
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd8
	retlw	bcd9
	retlw	bcd9
	retlw	bcd0
	retlw	bcd1
	retlw	bcd2	
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd5
	retlw	bcd6
	retlw	bcd6
	retlw	bcd7
	retlw	bcd8
	retlw	bcd9
	retlw	bcd0
	retlw	bcd0
	retlw	bcd1
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd4
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd7
	retlw	bcd8
	retlw	bcd9
	retlw	bcd0
	retlw	bcd1
	retlw	bcd1
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd5
	retlw	bcd5
	retlw	bcd6
	retlw	bcd7
	retlw	bcd8
	retlw	bcd8
	retlw	bcd9
	retlw	bcd0
	retlw	bcd1
	retlw	bcd2
	retlw	bcd2
	retlw	bcd3
	retlw	bcd4
	retlw	bcd5
	retlw	bcd6
	retlw	bcd6
	retlw	bcd7
	retlw	bcd8
	retlw	bcd9
	retlw	bcd9

	org	H'0700'
tabDix	addwf	PCL,f	; tableau des dizaines
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd0
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1	
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd1
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd2
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd3
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd4
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd5
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd6
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd7
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd8
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9
	retlw	bcd9

	END




