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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Conversion moteur CC en servomoteur
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 » sam. 3 janv. 2026 16:31

Salut les gens,
Et re-bonne année.

Testeur TTL terminé j'ai encore besoin d'asm, j'ai envie de redémarrer le projet Rub1k qui était en stand-bye depuis 2ans à cause d'un servomoteur qui rendait l'âme, pourtant un servo 40kg, çà commençait à devenir onéreux à force, il faut commencer par régler ce problème. Donc arriver à en construire un encore plus costaud qui tiendrait la route pour soulever et baisser en aller/retours l'ensemble PAP nema17/pince et son servo avec toute la précision requise (voir le sujet sur le projet RUB1K).
L'idée est de coupler un encodeur à quadrature à un moteur CC, et de le faire tourner tant de pas par rapport à une consigne. S'il dépasse la consigne en marche avant on inverse la tension, s'il dépasse en arrière on ré-inverse, etc., et on le maintient dans la position consigne. Une espèce de PID maison, j'avais déjà fait un truc dans ce genre sur arduino.

https://www.youtube.com/watch?v=I8lomcwNn68
Sur cette vidéo j'utilisais un moteur Namiki démultiplié avec encodeur en quadrature de qualité intégré, du beau matos Japonais.

Toujours avec le moteur Namiki, cette fois en asm et PIC : viewtopic.php?f=29&t=1438

Pour l'appli RUB1K je pense que le Namiki sera trop faible, cette fois je commence avec un simple moteur cc pour la mise au point, je n'en attends pas de grandes performances pour le couple mais quand (si) le code sera opérationnel j'utiliserai un moteur démultiplié et c'est la résistance exercée par la démultiplication du train de pignons qui aidera au couple de maintien. Inconvénient: le déplacement sera lent, pas top pour résoudre un cube mais je ne vois pas d'autres solutions.

Petit montage prototype rapide sur un coin de table, un simple moteur CC 12v auquel j'ai couplé un encodeur chinois par liaison souple (un bout de tuyau nylon). Pullup et capas de découplages montées sur la breadboard, pilotage du moteur par l'extension drivers L298 enfichée sur la platine DEV.

IMG_20260103_105624.jpg


En tournant l'axe à la main çà donne çà, c'est ok, signaux propres:

Alamain.PNG


Seulement comme on n'est pas chez les bisounours rien ne va normalement, le moteur tournant sous tension donne çà, des rebonds en veux-tu en voilà:

Moteur.PNG


En enlevant la charge sur l'axe c'est mieux mais toujours pas acceptable, encore des rebonds parasites:

axelibre.PNG


Morale: ces encodeurs mécaniques chinois ne sont pas utilisables pour ce genre d'utilisation qui les pousse dans leurs limites, on est loin de l'encodeur optique du Namiki. Je vais tenter l'opération avec un de mes petits pap convertis en encodeur, on en avait déjà parlé quelque part sur le forum. Maintenant je dois aller affronter les ours dans mon atelier pour modifier le prototype.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Une porte nand prend 2 bits en entrée... :eek:

Conversion moteur CC en servomoteur
venom
Avatar de l’utilisateur
Expert
Expert
Messages : 1619
Âge : 40
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#2 Message par venom » sam. 3 janv. 2026 19:57

Bon courage pour les ours (gla gla....) :-D

Pour le reste aussi. Le Rubik va reprendre du service. 8-)

De mon côté je cogite quand j'ai 5min a mon projet de cube solver sur la meilleur façon de fabriquer la chose (même si je sais qu'il y aura des améliorations après la v1)

J'aimerais dans l'idéal avoir le cube bloqué de ses 6 axes en position "diamant" mais à voir la mécanique pour car je n'y connais rien en meca oops




@++
Mon site web
Mon discord : venom#4888

Conversion moteur CC en servomoteur
gwion
Expert
Expert
Messages : 1122
Enregistré en : février 2022

#3 Message par gwion » sam. 3 janv. 2026 20:05

[quote="F6FCO"Je vais tenter l'opération avec un de mes petits pap convertis en encodeur, on en avait déjà parlé quelque part sur le forum.[/quote]

J'avais fait des essais avec un pap de HDD, c'est bof bof bof...
Tu connais ces machins là : https://fr.aliexpress.com/item/1005009525067438.html

Conversion moteur CC en servomoteur
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2889
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » dim. 4 janv. 2026 13:15

Bonjour,

Bonne année, et surtout bonne santé à tous le monde,

Utilisé un encodeur pas bon du tout, il faut utiliser un potentiomètre linéaire, c'est le principe du servo....

il suffit de démonter un petit servo, (même si celui-ci a les engrenages endommagés, mais pas l'électronique)

Si tu regardes la datasheet des circuits des petits servos, tu vas t'apercevoir qu'il y a un ADC ou un Comparateur qui est branché sur le potentiomètre, quant au potentiomètre autant prendre la même valeur.

C'est pour cela que je garde les servos endommagés quand j'ai un crash de mon hélicoptère, car l'électronique est bonne, mais pas les engrenages qui sont très souvent endommagés.

==> A+
Modifié en dernier par Temps-x le dim. 4 janv. 2026 17:51, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Conversion moteur CC en servomoteur
LP_2
Amateur
Amateur
Messages : 142
Enregistré en : août 2022
Localisation : Haute-Loire

#5 Message par LP_2 » dim. 4 janv. 2026 16:40

gwion a écrit :J'avais fait des essais avec un pap de HDD, c'est bof bof bof...

Salut
Les moteurs de rotation sont des triphasés synchrones.
J'y arriverai . . .

Conversion moteur CC en servomoteur
gwion
Expert
Expert
Messages : 1122
Enregistré en : février 2022

#6 Message par gwion » dim. 4 janv. 2026 19:30


Conversion moteur CC en servomoteur
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#7 Message par F6FCO » dim. 4 janv. 2026 19:45

Utilisé un encodeur pas bon du tout, il faut utiliser un potentiomètre linéaire, c'est le principe du servo....

Seulement un des principes, on peut commander d'une autre manière avec un encodeur mécanique, roue codeuse, etc., voir ici https://fantaspic.fr/viewtopic.php?p=21729#p21729, j'ai refait des essais avec ce système ce matin et çà fonctionne bien, je vais m'en servir de base pour continuer.
Ca fonctionne bien avec un encodeur, le souci actuel c'est que j'utilise un encodeur mécanique à bas prix qui génère des rebonds à partir d'une certaine vitesse, sur la vidéo du lien j'utilise un encodeur maison avec une roue codeuse mais c'est un peu compliqué mécaniquement.

J'avais fait des essais avec un pap de HDD, c'est bof bof bof...

De mon coté j'ai eu de bons résultats avec les miens mais il faut actionner l'axe assez énergiquement pour générer la tension en créneaux, çà devrait le faire avec la rotation du moteur. C'est sur que si on actionne l'axe avec la douceur d'un encodeur lambda ce n'est pas suffisant.


Non je ne connaissais pas, encore un truc à tester, j'espère qu'il y a un datasheet consistant pour démarrer avec. Toi tu vas finir par me ruiner à force :evil:
Une porte nand prend 2 bits en entrée... :eek:

Conversion moteur CC en servomoteur
gwion
Expert
Expert
Messages : 1122
Enregistré en : février 2022

#8 Message par gwion » dim. 4 janv. 2026 21:45

F6FCO a écrit :
Toi tu vas finir par me ruiner à force :evil:


Je suis démasqué :lol:

Conversion moteur CC en servomoteur
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2889
Enregistré en : juillet 2016
Localisation : Terre

#9 Message par Temps-x » dim. 4 janv. 2026 23:15

Bonsoir,

F6FCO a écrit :Source du message Ca fonctionne bien avec un encodeur, le souci actuel c'est que j'utilise un encodeur mécanique à bas prix qui génère des rebonds à partir d'une certaine vitesse,


Ce n'est pas une question de prix, le système mécanique n'est pas bon à la longue, usure... même les servos du commerce ont leurs limites sur l'utilisation.

Faisant du modèle réduit, dans le domaine des hélicoptères, je suis obligé de changer certains de mes servos tous les 3 ans (usure du potentiomètre, même avec des servos de grande marque).

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Conversion moteur CC en servomoteur
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#10 Message par F6FCO » dim. 18 janv. 2026 18:11

Salut les gens,
Projet terminé et validé, j'ai mon servo super puissant.

Il utilise une routine de gestion d'encodeur, j'en ai déjà fait plusieurs fonctionnelles mais j'avais en tête une autre façon et pas pu résister à tout recoder from scratch.

En premier définir la table de vérité de l'encodeur, et en tenant compte des erreurs (utile pour gérer les rebonds intempestifs, bien que j'ai réussi à les éliminer), juste pour entraîner les neurones

table vérité.jpg


On voit que les signaux déphasés A et B forment la séquence en sens horaire 00, 01, 11, 10, et le contraire en sens anti-horaire 10, 11, 01, 00. Tout changement dans cette séquence serait une erreur (rebond, vibration, etc.) et prise en compte par le programme.
L'écriture de la table de vérité dans une table 4x4 est pratique pour bien visualiser le truc.

A savoir avant de continuer: les encodeurs chinois mécaniques (les miens en tout cas) ont 20 crans par tour, ce qui ne veut pas dire qu'ils ont 20 pas (la bonne appelation est 'ticks'), on compte 4 ticks par pas comme on peut le voir sur cette capture d'écran: 11, 01, 00, 10, ...
Donc 20x4= 80 ticks, ce qui bienl pour cette application, un encodeur plus précis et plus de ticks aurait compliqué la gestion des déplacements qui se font au max -128 ticks et +128 tiks.

4Tik encodeur.PNG


Partant de cela j'ai pondu l'algo suivant qui retourne les infos suivantes:
ptr: octet de comptage des ticks produits
bit H: sens horaire à 1 en sens horaire sinon 0
bit AH: sens anti-horaire à 1 en sens AH sinon 0
bit immo: à 1 si encodeur non bougé sinon 0

Un peu grand alors sur 2 pages

encodeur1.jpg

encodeur2.jpg


Ensuite j'ai fais des essais avec plusieurs encodeurs et moteurs.

Ici moteur cc 12v de visseuse piloté par un encodeur à base de pap dont on a déjà parlé

P1070521.JPG


et les signaux produits

Encodeur pap.PNG


J'ai laissé tomber cette idée pour ce projet parce que je voudrais avoir un système reproductible et à bas prix, en définitive j'ai utilisé un moteur gearbox chinois 12v/40rpm et un encodeur mécanique chinois à 0.80€.
A noter que les encodeurs mécaniques chinois généraient comme dit plus haut beaucoup de rebonds que j'ai pu résorber en rajoutant juste une capa de 1µF en // avec les 100n sur les sorties de l'encodeur. Depuis j'obtiens des signaux très propres.

L'histoire de l'encodeur étant réglée je suis passé sur la gestion du servomoteur, au final çà marchait bien mais çà "frétillait" sur la position, j'ai résolu le souci en ajoutant une tolérance dans la position.

Gestion en déplacement H

deplacementH.jpg


gestion en déplacement AH

deplacementAH.jpg


Le nez dans le guidon je n'ai pas pensé à faire plus de photos des autres tests mais quand même une courte vidéo avec le papencodeur, des encodeurs chinois, des moteurs gearbox et un moteur de visseuse non démultiplié.
Le moteur de visseuse était juste là pour mettre le truc au point, pas tellement utilisable car aucun couple et déplacement trop rapide mais il m'a servi à coder les contre-réactions en cas de dépassement des consignes (erreurs, inertie du bras, etc.), choses plus difficiles à observer avec le torque des trains de pignons des moteurs gearbox.

https://www.youtube.com/watch?v=X2tccNbFqAI

Pour travailler sur un octet et ne pas compliquer le code j'initialise en début de programme la position zéro du bras à 128 pour éviter les erreurs de débordement.
Exemple pour avoir un déplacement de +20 et -20 je règle: consigneH=148 et consigneAH=108, le bras se déplace et reste en position dés qu'il atteint ces valeurs.

Code : Tout sélectionner

; ***********************************************************************************************
;
                     F6FCO
;                 Réglages des fusibles 18f2525
;
;************************************************************************************************

        Errorlevel-302             ; Supprime le message "Ensure that bank bits are correct" 
        list            p
=18f2525    ; processeur utilisé 
        
#include        <p18f2525.inc>    ; Définitions des constantes PIC
    
 CONFIG OSC 
= INTIO67                   ; Oscillateur interne 8MHz 
 
;CONFIG OSC = XT                         ; Oscillateur xtal externe 
 CONFIG IESO 
= OFF                         ; Délai au démarrage (ON/OFF)
 CONFIG BOREN = OFF                        ; Reset si chute de tension (ON/OFF)
 CONFIG PWRT = ON                          ; Délai au démarrage (ON/OFF)
 CONFIG BORV = 0                           ; Tension de reset en 1/10ème Volts 
 CONFIG WDT 
= OFF                          ; Mise hors service du watchdog (ON/OFF)
 CONFIG PBADEN = OFF                       ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
 CONFIG LPT1OSC 
= OFF                      ; Timer1 configuré pour un fonctionnement plus puissant
 CONFIG MCLRE 
= ON                         ; Mclr configuré comme entrée
 CONFIG STVREN 
= ON                        ; Reset sur débordement de pile (ON/OFF)
 CONFIG LVP = OFF                          ; Programmation basse tension autorisée (ON/OFF)
 CONFIG XINST = OFF                        ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
 CONFIG DEBUG = OFF                        ; Debugger hors service
 CONFIG CP0 = OFF                       ; Code protection sur block 0 (ON/OFF)
 CONFIG CP1 = OFF                       ; Code protection sur block 1 (ON/OFF)
 CONFIG CP2 = OFF                       ; Code protection sur block 2 (ON/OFF)
 CONFIG CPB = OFF                       ; Code protection sur bootblock  (ON/OFF)
 CONFIG CPD = OFF                          ; Code protection sur eeprom (ON/OFF)
 CONFIG WRT0 = OFF                         ; Protection écriture block 0 (ON/OFF)
 CONFIG WRT1 = OFF                         ; Protection écriture block 1 (ON/OFF)
 CONFIG WRT2 = OFF                         ; Protection écriture block 2 (ON/OFF)
 CONFIG WRTB = OFF                         ; Protection écriture bootblock (ON/OFF)
 CONFIG WRTC = OFF                         ; Protection écriture configurations (ON/OFF)
 CONFIG WRTD = OFF                         ; Protection écriture zone eeprom (ON/OFF)
 CONFIG EBTR0 = OFF                        ; Protection lecture de table block 0 (ON/OFF)
 CONFIG EBTR1 = OFF                        ; Protection lecture de table block 1 (ON/OFF)
 CONFIG EBTR2 = OFF                        ; Protection lecture de table block 2 (ON/OFF)
 CONFIG EBTRB = OFF                        ; Protection lecture de table bootblock (ON/OFF)


Code : Tout sélectionner

;******************************************************************************
;
                           F6FCO - janvier 2026                                            
;             Utilisation d'un moteur CC en servomoteur
;                horloge 8Mhz interne
;        
;******************************************************************************
; IMPORTANT, A SAVOIR !!!
; Les encodeurs mécaniques chinois bon marché d'
Aliexpress génèrent 4 ticks par cran
; 1 tour = 20 crans (pas) = 80 ticks
;
#include<Fusibles 18f2525.asm>


; gestion encodeur
#define pinA         PORTB,0        ; pin A encodeur
#define pinB        PORTB,1        ; pin B encodeur
#define H        encodeurB,0
#define AH        encodeurB,1
#define immo        encodeurB,2

;gestion moteur cc
#define driverA        LATB,2        ; driver L298
#define driverB        LATB,3        ; driver L298

     

    CBLOCK 0x00C               
    w_temp         
:1        ; Sauvegarde du registre W
    status_temp     
:1        ; Sauvegarde du registre STATUS
    Reg_1        
:1
    Reg_2        
:1
    Reg_3        
:1
    conchita    
:2        ; variable bonne à tout faire    
    new        
:1        ; état T de l'encodeur (recopie PORTB)
    old        :1        ; état T-1 encodeur
    ptr        :1        ; nombre de ticks
    val_00        :1
    val_01        :1
    val_11        :1
    val_10        :1
    encodeurB    :1        ; bits de gestion
            ; <0> H        ; 1 si tourné sens horaire
            ; <1> AH    ; 1 si tourné sens anti-horaire
            ; <2> immo    ; 1 si immobile
            ; <3> 
            ; <4> 
            ; <5> 
            ; <6> 
            ; <7> 
    consigneH    :1        ; valeur de déplacement sens horaire
    consigneAH    :1        ; valeur de déplacement sens anti-horaire
    ENDC                                      

    org    0x000             ; Adresse de départ après reset     


     bra        init            

; ------------------------  Routines Interruptions                            
    ;sauvegarder registres    
    org     0x008            ; 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é
    
    
; Interrupt MSSP
    btfss    PIR1
,SSPIF        ; <3>
    bra    restorereg        
    call    intMSSP            
; on vient d'avoir une int MSSP, on la traite
        
    ;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
    retfie              
; return from interrupt

intMSSP
    movff    SSPBUF
,conchita
    bsf    SSPCON1
,CKP        ; on relâche l'horloge
    bcf    PIR1,SSPIF        ; <3> raz flag d'
interrupt                         
    return
    
    
    
; ------------------------ Init

init
    clrf    EEADR            
; diminue la consommation
    
; init oscillateur
    movlw    0xff            
; Horloge interne 8Mhz
    movwf    OSCCON

        
; init ports
        movlw     0xff
          movwf     ADCON1                
; mode digital
          bcf    ADCON0
,ADON        ; <0> CAN désactivé
          
          movlw    0x07
          movwf    CMCON            
; mode comparateur désactivé

    movlw    b
'00000011'        
    movwf    TRISB
    clrf    PORTB
    clrf    LATB
    
    movlw    b
'00000000'        ; rc3/rc4 I2C        
    movwf    TRISC
    clrf    PORTC
    clrf    LATC

    
; init interruptions
    bsf    RCON
,IPEN
    bsf    INTCON
,GIE        ; <7> int non masquées activées
    bsf    INTCON
,PEIE        ; <6> int périphériques non masquées activées
    bsf    PIE1
,SSPIE        ; <3> MSSP activé
    bcf    PIR1
,SSPIF        ; <3> flag interrupt à zéro
    bsf    SSPCON1
,SSPEN        ; <5> rb0 et rb1 en mode SDA/SCL
    
        
    
; mode esclave 7 bits avec interruptions
    bsf    SSPCON1
,SSPEN        ; <5>
    bsf    SSPCON1,CKP        ; <4>

    bcf    SSPCON1,SSPM0        ; <0>        
    bsf    SSPCON1
,SSPM1        ; <1>
    bsf    SSPCON1,SSPM2        ; <2>
    bcf    SSPCON1,SSPM3        ; <3>

    bsf    SSPCON2,SEN        ; <0> Etirement horloge activé

    
; adresse esclave
    movlw    b
'00010000'    
    movwf    SSPADD
    
    bsf    SSPSTAT
,S        ; <3> startbit
    
; ------------------------- initialisation variables gestion encodeur
    movlw      b
'00000000'      
    movwf    val_00
    movlw    b
'00000001'
    movwf    val_01
    movlw    b
'00000011'
    movwf    val_11
    movlw    b
'00000010'
    movwf    val_10
    
    movff    PORTB
,WREG
    andlw    b
'00000011'        ; isole b0 et b1 (pins encodeur)
    movff    WREG,old        ; état T-1 de l'encodeur
    nop
    
    clrf    conchita
    clrf    encodeurB
    movlw    d'
128'
    movwf    ptr
    clrf     new    
    clrf    old


    

    ; vers main
; -----------------------------------
            




Code : Tout sélectionner

#include <ServoMoteurCC_init.asm>
;main    
    
; On travaille sur un octet, on a 256 ticks de déplacement, 
    
; pour éviter des erreurs de comptage (>255 ou <0), on régle la position 
    
; repos sur la valeur  128.
    ; Le déplacement du bras se fera donc autour de la valeur médiane d'128'
    ;
    movlw    d'148'            ; +20 pas en déplacement horaire (128+20)
    movwf    consigneH
    movlw    d
'108'            ; -20 pas en déplacement anti-horaire (128-20)
    movwf    consigneAH
main    nop
    call    rotationHoraire        
; tourne sens horaire jusqu'à  consigneH
    call    tempo_ms
    ;nop
    ;call    rotationAntiHoraire    ; tourne sens anti-horaire jusqu'
à consigneAH
    
;call    tempo
    nop
    bra    main

#include <Routines_ServoMoteurCC.asm>
#include <Routines_encodeur.asm>

    END

Code : Tout sélectionner


rotationHoraire
rh    nop
    call    gestion_encodeur    
; retourne le nombre de ticks dans ptr
    nop
    movff    consigneH
,WREG        ; consigneH dans W
    cpfsgt    ptr            
; ptr > consigneH ?
    bra    rh1
mAH    nop    
    bcf    driverA            
; on tourne AH pour rattraper
    bsf    driverB
    bra    rh
rh1    nop
    cpfslt    ptr            
; ptr < consigneH ?
    bra    rh2
mH    nop
    bsf    driverA            
; on tourne H pour rattraper
    bcf    driverB
    nop
    bra    rh
rh2    cpfseq    ptr            
; ptr = consigneH ?
    bra    mS
    bra    rh
mS    bcf    driverA
    bcf    driverB
    return
    




tempo
; Délai 1 600 000 Cycles de la machine
; Durée du délai 800 millisecond
; Fréquence de l'oscillateur 8 MHZ

            movlw       .228
            movwf       Reg_1,1
            movlw       .30
            movwf       Reg_2
            movlw       .9
            movwf       Reg_3
            decfsz      Reg_1,F,1
            bra         $-2
            decfsz      Reg_2
            bra         $-6
            decfsz      Reg_3
            bra         $-.10
            nop

        return
        


Code : Tout sélectionner

gestion_encodeur
    nop
    movff    PORTB
,WREG
    andlw    b
'00000011'    ; isole b0 et b1 (pins encodeur)
    movff    WREG,new    ; état T dans new
    movff    old
,WREG    ; état T-1 dans W
    cpfseq     val_00
    bra    e1
    bra    a0        
; saute si encodeur =00
e1    cpfseq    val_01
    bra    e2
    bra    b0        
; saute si encodeur =01
e2    cpfseq    val_11
    bra    e3
    bra    c0        
; saute si encodeur =11
e3    cpfseq    val_10
fin    return
    bra    d0        
; saute si encodeur =10
    
a0    movff    new
,WREG
    cpfseq    val_00        
;immo
    bra    a1a
    bra    a3
a1a    cpfseq     val_11        
; erreur
    bra    a1
    bra    a3
a1    cpfseq    val_01        
; H
    bra    a2
    bra    a4
a2    cpfseq    val_10        
; AH
    return
    bra    a5
    
b0    movff    new
,WREG
    cpfseq     val_00        
; AH
    bra    b1
    bra    b3
b1    cpfseq    val_01        
; immo
    bra    b2a    
    bra    b4
b2a    cpfseq    val_10        
; erreur
    bra    b2
    bra    b4
b2    cpfseq    val_11        
;H
    return
    bra    b5
    
c0    movff    new
,WREG
    cpfseq    val_01        
; AH
    bra    c1
    bra    c3
c1    cpfseq    val_00        
; erreur
    bra    c2a
    bra    c4
c2a    cpfseq    val_11        
; immo
    bra    c2
    bra    c4
c2    cpfseq    val_10        
; H
    return
    bra    c5

d0    movff    new
,WREG
    cpfseq    val_00        
; H
    bra    d1
    bra    d3
d1    cpfseq    val_11        
; AH
    bra    d2a
    bra    d4
d2a    cpfseq    val_01        
; erreur
    bra    d2
    bra    d5
d2    cpfseq    val_10        
; immo
    return
    bra    d5               

a3    bsf    immo
    bcf    H
    bcf    AH
    movff    new
,old
    return
    
a4    bcf    immo
    bsf    H
    bcf    AH
    movff    new
,old
    incf    ptr
    return
    
a5    bcf    immo
    bcf    H
    bsf    AH
    movff    new
,old
    decf    ptr    
    return
    
b3    bcf    immo
    bcf    H
    bsf    AH
    movff    new
,old
    decf    ptr
    return
    
b4    bsf    immo
    bcf    H
    bcf    AH
    movff    new
,old
    return
    
b5    bcf    immo
    bsf    H
    bcf    AH
    movff    new
,old
    incf    ptr
    return
    
c3    bcf    immo
    bcf    H
    bsf    AH
    movff    new
,old
    decf    ptr
    return
    
c4    bsf    immo
    bcf    H
    bcf    AH
    movf    new
,old
    return
    
c5    bcf    immo
    bsf    H
    bcf    AH
    movff    new
,old
    incf    ptr
    return
    
d3    bcf    immo
    bsf    H
    bcf    AH
    movff    new
,old
    incf    ptr
    return
    
d4    bcf    immo
    bcf    H
    bsf    AH
    movff    new
,old
    decf    ptr
    return
    
d5    bsf    immo
    bcf    H
    bcf    AH
    movff    new
,old
    return
    
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Une porte nand prend 2 bits en entrée... :eek:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités