Mon Servo
Mon Servo
Mon Servo
;*********************************************************************
; DEFINE *
;*********************************************************************
; exemples
; ---------
#DEFINE SERVO PORTB,1 ;PIN de commande du servo
#DEFINE BP_DROITE PORTA,1 ; BP sur RA1
#DEFINE BP_GAUCHE PORTA,2 ; BP sur RA2
#DEFINE BP_REPOS PORTA,0 ; BP sur RA0
;*********************************************************************
; MACRO *
;*********************************************************************
;les banques
;-------
BANK0 macro
bcf STATUS,RP0
endm
BANK1 macro
bsf STATUS,RP0
endm
SERVON macro
bsf SERVO
endm
SERVOF macro
bcf SERVO
endm
;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************
;**********************************************************************
; DEMARRAGE SUR RESET *
;**********************************************************************
org 0x000 ; Adresse de d�part apr�s reset
goto init ; Adresse 0: initialiser
;**********************************************************************
; ROUTINE INTERRUPTION *
;**********************************************************************
;sauvegarder registres
;---------------------
ORG 0x004 ; adresse d'interruption
;restaurer registres
;-------------------
restorereg
swapf status_temp,w ; swap ancien status, r�sultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; R�inversion de L et H dans W
; W restaur� sans modifier status
return ; return from interrupt
;**********************************************************************
; INTERRUPTION TIMER 0 *
;**********************************************************************
repos
btfss SERVO ;test l'etat de SERVO (pin RB1)
; si SERVO=0--> va � "haut"
; si SERVO=1--> va � "bas"
goto hautr ; routine permettant de mettre RB1 � l'etat logique 1
goto basr ; routine permettant de mettre RB1 � l'etat logique 0
hautr
movlw 0xF4 ; 1500�s/128=12.....256-12=244=0xF4
movwf TMR0 ; je charge 244 dans le timer
SERVON ; pin RB1 � 1
return ; fin d'interruption timer
basr
movlw 0x70 ; 18500�s/128=144.....256-144=112=0x70
movwf TMR0 ; je charge 112 dans le timer
SERVOF ; pin RB1 � 0
return ; fin d'interruption timer
;***********************************************************************
droite
btfss SERVO ;test l'etat de SERVO (pin RB1)
; si SERVO=0--> va � "haut"
; si SERVO=1--> va � "bas"
goto hautd ; routine permettant de mettre RB1 � l'etat logique 1
goto basd ; routine permettant de mettre RB1 � l'etat logique 0
hautd
movlw 0xF0 ; 2000�s/128=16.....256-16=240=0xF0
movwf TMR0 ; je charge 240 dans le timer
SERVON ; pin RB1 � 1
return ; fin d'interruption timer
basd
movlw 0x73 ; 18000�s/128=141.....256-141=115=0x73
movwf TMR0 ; je charge 112 dans le timer
SERVOF ; pin RB1 � 0
return ; fin d'interruption timer
;***********************************************************************
gauche
btfss SERVO ;test l'etat de SERVO (pin RB1)
; si SERVO=0--> va � "haut"
; si SERVO=1--> va � "bas"
goto hautg ; routine permettant de mettre RB1 � l'etat logique 1
goto basg ; routine permettant de mettre RB1 � l'etat logique 0
hautg
movlw 0xF8 ; 1000�s/128=8.....256-8=248=0xF8
movwf TMR0 ; je charge 248 dans le timer
SERVON ; pin RB1 � 1
return ; fin d'interruption timer
basg
movlw 0x6C ; 19000�s/128=148.....256-148=108=0x6C
movwf TMR0 ; je charge 108 dans le timer
SERVOF ; pin RB1 � 0
return ; fin d'interruption timer
;*********************************************************************
; INITIALISATIONS *
;*********************************************************************
init
clrf PORTA ; Sorties portA � 0
clrf PORTB ; sorties portB � 0
clrf EEADR ; permet de diminuer la consommation
bsf STATUS,RP0 ; s�lectionner banque 1
movlw 0x1F ; TRISA configurer en entr�
movwf TRISA ; PORT EN ENTREE
movlw 0x00 ; TRISB configur� en Sortie
movwf TRISB ; PORT EN SORTIE
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; Effacer RAM
; ------------
movlw 0x0c ; initialisation pointeur
movwf FSR ; pointeur d'adressage indirec
init1
clrf INDF ; effacer ram
incf FSR,f ; pointer sur suivant
btfss FSR,6 ; tester si fin zone atteinte (>=40)
goto init1 ; non, boucler
btfss FSR,4 ; tester si fin zone atteinte (>=50)
goto init1 ; non, boucler
BANK0 ; S�lectionner banque 0
movlw INTERMASK ; masque interruption
movwf INTCON ; charger interrupt control
SERVOF ; je m'assure que RB1 est � 0
movlw H'70' ; je charge le timer � 112 par defaut
movwf TMR0
;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************
start
goto start