;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