;VARIAT.ASM
;Variateur de vitesse pour moteur Speed 400 (pour Aeromodelisme)
;commande par une voie du recepteur de radiocommande
;pour Qx=3,2768Mhz
;RAPPEL REGISTRE D'ETAT = STATUS : p:30 
;(pages indiquees: Les micr.PIC descrip. Ch.Tavernier - Edition DUNOD 1995)
;----------------------------------------------------------------------
;
;                        w =   7
;                     wreg =   7
;           
	LIST   P=PIC16C84
;qq
	include p16c84.inc

;SVP definir ScratchPadRam ici:
;Si vous utilisez un PIC16C5X definissez	"departRam equ 0x10" 
;sinon definissez		         	"departRam equ 0x20"
;----------------------------------------------------------------------
w       equ     0
f	equ	1

;attention: le PIC16C84 possede 36 octets de RAM
;adresses OCh a 2Fh
;attention: le nb qui suit Ram0+... doit etre ecrit en Hexa !

Ram0	equ     000C

WW	equ	Ram0+00	;pour sauvegarder w pendant INT

t1      equ     Ram0+01	;pour les tempos
t2	equ	Ram0+02
t3	equ	Ram0+03
t4	equ	Ram0+04

periode	equ	Ram0+05

cycl1	equ	Ram0+06	;rapport cyclique ver moteur = 1..20
autori	equ	Ram0+07
memo1	equ	Ram0+08
compte	equ	Ram0+09
fr1	equ	Ram0+0A
nb_hs	equ	Ram0+0B	

;----------------------------------------------------------------------

        org     0       ;start address 0

        goto    start

;----------------------------------------------------------------------
;traitement interruption
;ici debordement du Timer0
;gene de rapport cyclique variable
;cree un signal de periode totale de 16ms (fixe)
;dont le temps a 1 est variable en une centaine de pas
;3.2768Mz/4/1/128=6400Hz (0.15625ms)
;3.2768Mz/4/1/32=25600Hz (39us)
;25600 /80 = 320 Hz

	org	0004	;INT
	movwf	WW

	movlw	.256 - .32	;ici on passe tous les 
	movwf	TMR0

	movf	cycl1,w
	subwf	t4,w		;positionne c
	btfss	STATUS,0	;test bit carry
	goto	int1
	
	bcf	PORTA,0	

	goto	int2

int1	btfsc	autori,0
	bsf	PORTA,0

int2	decfsz	t4,f
	goto 	finint
	movlw	.80
	movwf	t4


finint	bcf	INTCON,2	;re-autorise int Timer0 voir p:136 et p:156

	movf	WW,w
	retfie


;----------------------------------------------------------------------
;INITIALISATION DES PORTS
;----------------------------------------------------------------------
;PA0=sortie moteur vers NMOS ( IRFZ44 )
;PA1=sortie frein vers BC549C et PMOS ( IRF9640 )
;PA2=entree signal voie gaz
;PA3=entree mesure tension alim en amont du 78L05
;PB0=sortie signal alim faible (LED)
;PB1=sortie signal INIT (LED)

        org     0020


start	clrwdt


	movlw	B'00001100'	;0=sortie 1=entree (RA4=aussi RTCC)
	TRIS	PORTA		;config du port A (TRISA en page 1)
	movlw	B'11111100'
	TRIS	PORTB		;config du port B

	bcf	PORTA,0		;sortie VMOS IRFZ 44
;----------------------------------------------------------------------
;PROGRAMMATION DU REGISTRE OPTION
;VOIR page 144 et 143
;soit chien = 1/128 -> PS2,1,0 = 111b  VOIR PAGE 135
;PSA (bit3) = 1 -> prediv affecte au chien voir p:73
;RTE (bit4) = 0 -> inc sur front montant
;RTS (bit5) = 0 -> branche Timer0 sur horloge interne
;INTEDG=x
;RBPU (bit7)= 0-> R tirage a Vdd du port B 


;	   bits:  76543210
	movlw	B'00001111'
	OPTION
;----------------------------------------------------------------------

;PROG DU REGISTRE INTCON
;voir page 155 et surtout p:136
;bit0 RBIF=x (sortie?)
;bit1 INTF=x (sortie?)
;bit2 RTIF=x (SORTIE?)
;bit3 RBIE=0 -> INT du port RB4 a RB7 interdites.
;bit4 INTE=0 -> INT de RB0/INT interdite.
;bit5 RTIE=1 -> INT par debordement Timer0
;bit6 EEIE=0 -> INT EEPROM interdites
;bit7 GIE=1  ->INT GLOBALE autorisee.

	movlw	B'10100000'
	movwf	INTCON


;----------------------------------------------------------------------
	clrf	autori		;pas d'autorisation de mise en marche
	clrf	periode
	bcf	PORTA,0		;RAZ sortie VMOS IRFZ 44
	bsf	PORTB,1		;LED INIT
	call	tp10ms
	bsf	PORTA,1		;Freine

	movlw	.100
	movwf	memo1
	movlw	.10
	movwf	compte
	movlw	.6
	movwf	t4
	movlw	.1
	movwf	cycl1
	movlw	.20
	movwf	fr1
	call	tp100ms
	bcf	PORTB,1		;eteint LED INIT

	movlw	.3	;(nombre d'essais)+1 de remise en route si accu hs
	movwf	nb_hs	;avant de declarer forfait definitif

;-----------------------------------------------------------------------
;essai

;----------------------------------------------------------------------
;BOUCLE PRINCIPALE
	

loop1	clrwdt
	btfss	PORTA,3		;mesure tension alim (detecte effondr. 78L05)
	goto	alimOK

alimHS	clrwdt
	clrf	autori		
	bcf	PORTA,0		;STOP
	movlw	.100
	movwf	memo1
	clrf	cycl1
	clrf	periode
	bsf	PORTB,0		;allume LED alim faible
	movlw	.20
	call	tx100ms
	bsf	PORTA,1		;Frein
	decfsz	nb_hs
	goto	loop1


	incf	nb_hs		;sinon de passera de 0 a 255
	goto	alimHS	

alimOK	bcf	PORTB,0		;eteint LED alim faible

suite7	decfsz	compte,f
	goto	suite5
	
	clrf	periode
	call	acq_t		;1 fois sur 10...
	movlw	.10
	movwf	compte

suite5	bcf	STATUS,0
	movf	memo1,w
	subwf	periode,w
	btfsc	STATUS,2	;bit z
	goto	suite4		;egalite : on ne change pas memo1
	btfsc	STATUS,0	;bit c
	goto	suite3

	decf	memo1,f
	decf	memo1,f
	goto	suite4

suite3	incf	memo1,f

suite4	movlw	.160
	subwf	memo1,w		;periode = periode - 130
	movwf	cycl1

	movlw	.170		;si (signal < 140 ) -> stop
	subwf	memo1,w
	btfsc	STATUS,0
	goto	suite1		;si (signal > 140 ) -> marche

stop	clrf	autori
	bcf	PORTA,0		;STOP
	movlw	.150		;si (signal < 130 ) -> stop + frein
	subwf	memo1,w
	btfsc	STATUS,0
	goto	suite2

frein	decfsz	fr1		;freine si 20 signaux consecutifs < 120
	goto	suite2
	incf	fr1		;fr1=1
	clrf	autori		;par securite
	bcf	PORTA,0		;re-STOP  par securite
	bsf	PORTA,1		;Frein
	goto	suite2

suite1	bcf	PORTA,1		;RAZ frein
	movlw	.20
	movwf	fr1
	bsf	autori,0


suite2	;movlw	.5
	call	tp10ms

	goto	loop1
       
;----------------------------------------------------------------------
;DEBUT DES PROCEDURES
;----------------------------------------------------------------------
;PERIODEMETRE (sur 1 octet)
;cette procedure est une autre version simplifiee de acqui_t (sur 2 octets)
;attention, n'efface pas periode mais cumule les temps dans cette variable
;attendre niveau bas
;on est peut etre  deja en niv bas au depart de la procedure
;donc attendre ensuite niv haut
;attend niv bas
;fin comptage

;de sorte que la mesure = temps signal a 1


acq_t	nop
acloop1	btfsc	PORTA,2	;saute le goto si niv bas
	goto	acloop1	;attend niv bas si niv haut

acloop2	btfss	PORTA,2	;saute le goto si niv haut
	goto	acloop2	;attend niv haut si niv bas

;re-PROG DU REGISTRE INTCON
	bcf	INTCON,7	;INT GLOBALE interdite

acloop3	incfsz	periode,f	;mesure ici		1t
	goto	acq2
	decf	periode,f	;ecrete a 255 (ne repasse pas a 0)

acq2	btfsc	PORTA,2	;saute le goto si niv bas	1t
	goto	acloop3	;attend niv bas si niv haut	2t

	
;re-PROG DU REGISTRE INTCON
	bsf	INTCON,7	;INT GLOBALE autorisee

	return

;--------------------------------------------------------------------

; Qx = 3,2768Mhz

tp300us	movlw	.79
	movwf	t1

t3loop1	decfsz	t1,f
	goto	t3loop1
	return

;----------------------------------------------------------------------
; Qx = 3,2768Mhz

tp2ms	clrwdt
	movlw	.16
	movwf	t1

t4loop1	movlw	.32
	movwf	t2

t4loop2	decfsz	t2,f
	goto	t4loop2
	decfsz	t1,f
	goto	t4loop1
	return

;----------------------------------------------------------------------
; Qx = 3,2768Mhz

tp10ms	clrwdt
	movlw	.82
	movwf	t1

t1loop1	movlw	.32
	movwf	t2

t1loop2	decfsz	t2,f
	goto	t1loop2
	decfsz	t1,f
	goto	t1loop1
	return

;----------------------------------------------------------------------
; Qx = 3,2768Mhz

tp100ms	clrwdt
	movlw	.170
	movwf	t1

t2loop1	movlw	.160
	movwf	t2

t2loop2	clrwdt
	decfsz	t2,f
	goto	t2loop2
	decfsz	t1,f
	goto	t2loop1
	return
;----------------------------------------------------------------------
; Qx = 3,2768Mhz
;tempo n x 100ms
;charger w avec n avant l'appel de cette procedure

tx100ms	clrwdt
	movwf	t3

txloop	clrwdt		;chien de garde
	call tp100ms
	decfsz	t3,f	
	goto txloop
	return

;----------------------------------------------------------------------
; Qx = 3,2768Mhz
;tempo n x 10ms
;charger w avec n avant l'appel de cette procedure

tx10ms	clrwdt
	movwf	t3

txlp2	clrwdt		;chien de garde
	call tp10ms
	decfsz	t3,f	
	goto txlp2
	return
;----------------------------------------------------------------------

ORG     2007H	; Fuses
	DATA    3FF5	;osc=XT 


        end



