Vous êtes sur la page 1sur 5

;************************************************************************

; Ce fichier est un programme de commande d'un servo-moteur en *


; position de repos � 00� *
; droite � +90� *
; gauche � -90� *
;************************************************************************
; *
; NOM: COMMANDE SERVO-MOTEUR *
; Date: 14/11/2008 *
; Version: 01.0 *
; Circuit: Platine d'essai et simulation MPLAB *
; Auteur: FRANCKNVS *
; *
;************************************************************************
; *
; Fichier requis: P16F84.inc *
; *
; *
; *
;************************************************************************
; Notes: *
; *
;J'utilise un prescaler sur TIMER � 128 avec un quartz de 4Mhz et une *
;interruption sur TMR0 pour changer l'etat RB1 afin de creer une dur�e *
;et une periode sachant que : *
;
*
; -une "periode" est egale �:
*
; 20ms -(la dur�e du signal)
*
; -la dur�e du signal est fonction de la position souhait�e: *
; repos 00�==> 1500ms
*
; gauche -90�==> 1000ms
*
; droite +90�==> 2000ms
*
;************************************************************************

LIST p=16F84 ; D�finition de processeur


#include <p16F84.inc> ; D�finitions des constantes

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

; '__CONFIG' pr�cise les param�tres encod�s dans le processeur au moment de


; la programmation. Les d�finitions sont dans le fichier include.
; Voici les valeurs et leurs d�finitions :
; _CP_ON Code protection ON : impossible de relire
; _CP_OFF Code protection OFF
; _PWRTE_ON Timer reset sur power on en service
; _PWRTE_OFF Timer reset hors-service
; _WDT_ON Watch-dog en service
; _WDT_OFF Watch-dog hors service
; _LP_OSC Oscillateur quartz basse vitesse
; _XT_OSC Oscillateur quartz moyenne vitesse
; _HS_OSC Oscillateur quartz grande vitesse
; _RC_OSC Oscillateur � r�seau RC
;*********************************************************************
; ASSIGNATIONS *
;*********************************************************************

OPTIONVAL EQU H'86' ; Valeur registre option


; R�sistance pull-up OFF
; Interrupt flanc montant RB0
; Pr�scaler timer � 128

INTERMASK EQU H'A0' ; Masque d'interruption

;*********************************************************************
; 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 *
;*********************************************************************

CBLOCK 0x00C ; d�but de la zone variables


w_temp :1 ; Zone de 1 byte
status_temp : 1 ; zone de 1 byte

ENDC ; Fin de la zone

;**********************************************************************
; 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

movwf w_temp ; sauver registre W


swapf STATUS,w ; swap status avec r�sultat dans w
movwf status_temp ; sauver status swapp�

; switch vers interrupts sur TMR0


;----------------------------------------

btfsc INTCON,T0IE ; tester si interrupt timer autoris�e


btfsc INTCON,T0IF ; oui, tester si interrupt timer en cours

btfsc BP_DROITE ;RA1


call droite
btfsc BP_GAUCHE ;RA2
call gauche
btfsc BP_REPOS ;RA0
call repos ; appel de ss routine
movlw INTERMASK ; je recharge intermask pour revalider GIE
movwf INTCON ; et effacer le flag
goto restorereg ; fin 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

;***** prescaler r�gl� � 128

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

;***** prescaler r�gl� � 128

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

;***** prescaler r�gl� � 128

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

END ; directive fin de programme

Vous aimerez peut-être aussi