Fichier main:
Code : Tout sélectionner
;******************************************************************************
; F6FCO - 16mai2024
; routine servomoteur
; xtal horloge 4Mhz
;
; NOTE: - Ce code à été mis au point avec un servomoteur MG996R Tower Pro et n'a pas
; été testé avec d'autres servosmoteurs.
; Il est possible que les valeurs duty-cycle ne soient pas adaptées pour
; un autre type, dans ce cas il faudra consulter le datasheet du servo et recalculer les tempos.
; - Pour un positionnement correct j'ai du adapter les valeurs de tempo
; par rapport à celles données par le datasheet.
; - Le PWM est calculé pour une horloge de 4Mhz. Pour une autre fréquence
; d'horloge il faudra recalculer les tempos.
; - Pour des valeurs d'angles intermédiaires, recalculer les tempos.
;
;******************************************************************************
List p=16F88
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
OPTIONVAL EQU H'0087' ; Valeur registre option, Prescaler à 256
#define servo1 PORTA,0
#define cycle d'50' ; nombre de cycles que met le servo pour atteindre la position
BANK0 macro
bcf STATUS , RP0
endm
BANK1 macro
bsf STATUS , RP0
endm
CBLOCK 0x00C
cmpt :1
w_temp :1 ; Sauvegarde du registre W
status_temp :1 ; Sauvegarde du registre STATUS
Reg_1 :1
Reg_2 :1
Reg_3 :1
conchita :1 ; variable à tout faire
ptr :1
ENDC
org 0x000 ; Adresse de départ après reset
goto init ; Adresse 0: initialiser
; ------------------------ Init
init
clrf PORTA
clrf PORTB
clrf EEADR ; diminue la consommation
BANK1
movlw OPTIONVAL
movwf OPTION_REG
clrf ANSEL ; broches toutes en I/O
movlw b'00000000'
movwf TRISA
movwf TRISB
BANK0
;call _0degres_servo1
;call tempo2s4
;call tempo2s4
;call _180degres_servo1
; -----------------------------------
main
;goto main
; éxécute des aller/retours de 0 à 180°
call _0degres_servo1
nop
call tempo2s4 ; tempo
call tempo2s4 ; tempo
nop
call _90degres_servo1
nop
call tempo2s4 ; tempo
call tempo2s4 ; tempo
nop
call _180degres_servo1
nop
call tempo2s4 ; tempo
call tempo2s4 ; tempo
nop
call _90degres_servo1
nop
call tempo2s4 ; tempo
call tempo2s4 ; tempo
nop
goto main
#include <Routines.asm>
#include <Tempos servo.asm>
END
Fichier routines:
Code : Tout sélectionner
_0degres_servo1
movlw cycle
movwf ptr
p1 bsf servo1
call tempo0.2ms4
bcf servo1
call tempo19.8ms4
decfsz ptr
goto p1
return
_90degres_servo1
movlw cycle
movwf ptr
p2 bsf servo1
call tempo1ms4
bcf servo1
call tempo19ms4
decfsz ptr
goto p2
return
_180degres_servo1
movlw cycle
movwf ptr
p3 bsf servo1
call tempo2ms4
bcf servo1
call tempo18ms4
decfsz ptr
goto p3
return
Fichier tempos:
Code : Tout sélectionner
; ----------------- 0° avec xtal 4MHz
tempo0.2ms4
; Délai 200 Cycles de la machine
; Durée du délai 0.2 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .66
movwf Reg_1
decfsz Reg_1,F
goto $-1
nop
return
tempo19.8ms4
; Délai 19 800 Cycles de la machine
; Durée du délai 19.8 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .181
movwf Reg_1
movlw .26
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
nop
nop
return
; ----------------- 90° avec xtal 4MHz
tempo1ms4
; Délai 1 000 Cycles de la machine
; Durée du délai 1 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .75
movwf Reg_1
movlw .2
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
return
tempo19ms4
; Délai 19 000 Cycles de la machine
; Durée du délai 19 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .171
movwf Reg_1
movlw .25
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
nop
nop
return
tempo1.5ms4
; Délai 1 500 Cycles de la machine
; Durée du délai 1.5 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .241
movwf Reg_1
movlw .2
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
nop
nop
return
tempo18.5ms4
; Délai 18 500 Cycles de la machine
; Durée du délai 18.5 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .5
movwf Reg_1
movlw .25
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
return
; ----------------- 180° avec xtal 4MHz
tempo2ms4
; Délai 2 000 Cycles de la machine
; Durée du délai 2 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .151
movwf Reg_1
movlw .3
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
nop
nop
return
tempo18ms4
; Délai 18 000 Cycles de la machine
; Durée du délai 18 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .95
movwf Reg_1
movlw .24
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
return
tempo1.8ms4
; Délai 1 800 Cycles de la machine
; Durée du délai 1.8 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .85
movwf Reg_1
movlw .3
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
return
tempo18.2ms4
; Délai 18 200 Cycles de la machine
; Durée du délai 18.2 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .161
movwf Reg_1
movlw .24
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
nop
nop
return
; ---------------------------------------------------
tempo2s4
; Délai 2 000 000 Cycles de la machine
; Durée du délai 2000 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .93
movwf Reg_1
movlw .38
movwf Reg_2
movlw .11
movwf Reg_3
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
decfsz Reg_3,F
goto $-5
nop
nop
return
