Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Bout de code posé là !

Modérateur : Jérémy

ASM: routine servomoteur 16F88
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#1 Message par F6FCO » ven. 17 mai 2024 16:43

Une petite routine pour commander un servomoteur de modélisme. Le PWM à été calculé pour un xtal de 4Mhz. Testé sur servomoteur MG996R de Tower Pro.

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

Une porte nand prend 2 bits en entrée... :eek:

Retourner vers « Recueil de mini programmes »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité