;VARIAT.ASM ;Variateur de vitesse pour moteur Speed 400 (pour Aéromodélisme) ;commandé par une voie du récepteur de radiocommande ;pour Qx=3,2768Mhz ;RAPPEL REGISTRE D'ETAT = STATUS : p:30 ;(pages indiquées: 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 possède 36 octets de RAM ;adresses OCh à 2Fh ;attention: le nb qui suit Ram0+... doit être écrit 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 débordement du Timer0 ;géné de rapport cyclique variable ;crée un signal de période totale de 16ms (fixe) ;dont le temps à 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 ;ré-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=entrée signal voie gaz ;PA3=entrée 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 -> prédiv affecté 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 à 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 à 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 autorisée. 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 ;éteint LED INIT movlw .3 ;(nombre d'essais)+1 de remise en route si accu hs movwf nb_hs ;avant de déclarer forfait définitif ;----------------------------------------------------------------------- ;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 à 255 goto alimHS alimOK bcf PORTB,0 ;éteint 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 ;égalité : 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 consécutifs < 120 goto suite2 incf fr1 ;fr1=1 clrf autori ;par sécurité bcf PORTA,0 ;re-STOP par sécurité 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 simplifiée de acqui_t (sur 2 octets) ;attention, n'efface pas periode mais cumule les temps dans cette variable ;attendre niveau bas ;on est peut être déja en niv bas au départ de la procedure ;donc attendre ensuite niv haut ;attend niv bas ;fin comptage ;de sorte que la mesure = temps signal à 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 ;écrète à 255 (ne repasse pas à 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 autorisée 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 procédure 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 procédure 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