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

Soft de commande CNC en asm
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#11 Message par F6FCO » ven. 20 avr. 2018 20:33

Gérard a écrit :Hello tous,
Temps-X, il n'y a aucune chance que je participe, mon niveau en asm est du genre maternelle. :shock:


Non mais Lol quoi Gérard ! et moi alors :sifflotte: mais c'est un excellent moyen de progresser, rien de tel que l'immersion forcée :lol:, allez viens avec nous.

Bon, à un moment il faut poser les choses:

Comme je l'ai dit je fais çà juste pour m'amuser à faire de la programmation pendant les longues soirées quand je suis sur mon chantier de rénovation loin du domicile familial, alors je ne vais pas construire une vraie cnc mais simplement un banc test 3 axes pour vérifier les routines.
Je pense partir sur une petite machine qui tiendrait sur le bureau sans trop géner, disons X=200mm, Y=200mm et Z=100mm. Les vis-mères en tige filetée M10/150. Pour les essais, la broche pourrait être remplacée par un crayon. Je pense mais çà peut changer que les vis-mères seront en tige filetée M10/150.

Je n'ai pas vraiment trouvé de doc sur la chose mais j'ai observé ce qu'il se passe sur une de mes machines en baissant la vitesse d'accélération au minimum pour y voir plus clair. Je dirai que l'accélération se passe sur environ 15mm, ensuite on prend le régime de croisière, puis vient la décélération sur à peu près 15mm.
Accélération+régime de croisière+ décélération= nbpas imposé par l'instruction gcode.
Un moteur pas à pas NEMA23 ou NEMA16 tel que ceux que j'utilise fait 200 pas par tours, 400 pas en demi-pas ce qui est le réglage le plus courant.
Donc on a dit M10/150 -->1,5mm par tour --> 1,5mm pour 200pas en pas entier --> 1,5mm pour 400pas en demi-pas.
Donc 4000pas pour faire les 15mm d'accélération. Mais 4000 pas çà ne tient pas dans un registre 8bits.

Soit je travaille en variables 16bits mais çà va alourdir le code et lire chaque fois l'octet de poids fort et l'octet de poids faible va pas mal compliquer les choses et au final ralentir l'éxécution des gcodes, soit je prend l'option de faire une accélération/décélération par trains de pulses. Cette seconde méthode me plait plus, avec deux variables 8bits, une pour le nb de pulses par train et une autre pour les différentes valeurs d'accélération je peux faire au max 255 paliers de 255 pulses, ce qui me donne 65025, on est large au dessus des 4000 nécessaires tout en restant en variables 8bits. Sur les captures d'écran on voit que je travaillais avec un pulse par incrément d'accélération, mais je pourrais très bien travailler avec plusieurs pulses par incrément d'accélération, par exemple faire un train de pulses pour la première valeur d'accélération, un autre train pour la deuxième valeur d'accélération, etc.
Comme on a dit plus haut qu'il fallait 4000 pas pour faire les 15mm je peux choisir par exemple 100 trains de 40 pulses, ou bien 200 trains de 20 pulses, ce qui me donne mon accel sur 15mm, pareil pour la décel. Pour résumer si je choisis le deuxième exemple çà fera au démarrage 40 pulses séparés chacun de 200 espaces, puis 40 pulses séparés chacun de 199 espaces, puis 40 pulses séparés chacun de 198 espaces, 40/197, 40/196, etc. etc. en décrémentant tous les 40 pulses jusqu'à arriver à avoir 1 seul espace entre les pulses, et on aura atteint le régime de croisière. On a bien notre accélération.
Je vais revoir mes routines pour qu'elles fonctionnent de cette manière.

En plus il faut tenir le compte en temps réel de la position de la broche dans l'espace de travail, donc 4000/15*10= environ 2666 pas pour 1cm, --> 533333 pour 200mm, trop pour une variable 8 ou 16bits, donc 32bits obligés. Il faudra donc 3 variables sur 32bits qui seront chacune incrémentées ou décrémentées en fonction des déplacements des 3 chariots sur leurs axes respectifs.

Le Gcode. Quand tout cela sera fait, dans un premier temps je commencerai par travailler sur un gcode simplifié, qui ne traite que les lignes horizontales et verticales, donc déplacements des axes X et Y séquentiellement. Pour graver du PCB c'est viable, on n'a pas besoin de tracer des arcs de cercles ou des pentes et çà simplifiera bien le travail.

Je pense avoir à peu près fait le tour pour les grandes lignes, d'avoir posé tout çà le truc parait déjà plus clair. Je ne sais pas si j'irai jusqu'au bout mais il y a déjà moyen de bien s'amuser :wink: .
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Soft de commande CNC en asm
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#12 Message par venom » dim. 22 avr. 2018 09:41

Bonjour a tous,

Que voila un beau gros sujet en perspective 8-) . Je vais suivre ça du fond de la classe :-D Bon courages en tout cas. :bravo:






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

Soft de commande CNC en asm
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#13 Message par Temps-x » dim. 22 avr. 2018 15:54

Bonjour F6FCO, venom, et tout le forum

En se qui concerne la tige fileté, je te conseille une tige de diamètre 14, ce qui fait 2mm par tour avec un pas standard .

Les 3 modes les plus courants étant : Mode à pas entier, Mode à pas entier deux phases alimentées en même temps, Mode demi-pas.

Mode de 100 pas par tour, ce qui fait 0,02 mm par pas
Mode de 200 pas par tour, ce qui fait 0,01 mm par pas
Mode de 400 pas par tour, ce qui fait 0,005 mm par pas

ça tombe juste, c'est beaucoup plus simple.

Je te suis dans ton résonnement, effectivement dans mon problème j'ai pas soulevé les dimensions :oops: c'est bien d'y avoir pensée.

On peu partir sur Euh..... 300 mm sur 300 mm

humour!! ça va fumer dans mon petit cerveau, mais pas sur CNC

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

Soft de commande CNC en asm
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#14 Message par Temps-x » mar. 24 avr. 2018 01:34

Bonjour F6FCO, venom, et tout le forum

Si j'avais prie des moteurs bipolaires je serais pas obligé de gérer la logique, car c'est le divers qui s'occupe de tous.

Mais comme je vais utiliser des moteurs unipolaires, je suis obligé de gérer la logique, voici un bout de code pour les intéressés.

Code : Tout sélectionner



      call mode_une_phase

      
return

;********************************************************************************************** 
mode_une_phase

      movlw 
B'00110000'               
      
andwf PORTB,W
      xorlw 
B'00000000'                   00          
      btfss STATUS
,Z
      
goto mode_deux_phase

      btfsc sélection
,
      
return
         
      
clrf sélection
      bsf sélection
,1

      movlw D
'0'
      
movwf mode_debut

      movlw D
'3'
      
movwf mode_fin
      
      movlw D
'0'
      
movwf pas

      
return

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

mode_deux_phase

      movlw 
B'00110000'
      
andwf PORTB,W
      xorlw 
B'00010000'                   01  
      btfss STATUS
,Z
      
goto mode_demi_pas

      btfsc sélection
,
      
return
         
      
clrf sélection
      bsf sélection
,2

      movlw D
'4'
      
movwf mode_debut

      movlw D
'7'
      
movwf mode_fin
      
      movlw D
'4'
      
movwf pas

      
return

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

mode_demi_pas

      movlw 
B'00110000'
      
andwf PORTB,W
      xorlw 
B'00100000'                   10  
      btfss STATUS
,Z
      
goto mode_une_phase

      btfsc sélection
,
      
return
         
      
clrf sélection
      bsf sélection
,3

      movlw D
'8'
      
movwf mode_debut

      movlw D
'15'
      
movwf mode_fin
      
      movlw D
'8'
      
movwf pas

      
return      
      
;----------------------------------------------------------------------------------------------

     ORG H'400'       

code_pas
      addwf  PCL
,F

; Mode à pas entier, une phase alimentée à la fois 

      retlw B
'11111000'
      retlw B'11110010'
      retlw B'11110100'
      retlw B'11110001'                   ; 0 à 3

; Mode à pas entier, deux phases alimentées en même temps 
             
      retlw B
'11111010'      
      retlw B
'11110110'  
      retlw B
'11110101'  
      retlw B
'11111001'                   ; 4 à 7

; Mode demi-pas 

      retlw B
'11111000'
      retlw B'11111010'
      retlw B'11110010'
      retlw B'11110110'
      retlw B'11110100'
      retlw B'11110101'
      retlw B'11110001'
      retlw B'11111001'                   ; 8 à 15



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

Soft de commande CNC en asm
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#15 Message par ducran lapoigne » mar. 24 avr. 2018 22:10

bonsoir temps x

ne vois pas dans mon post une attaque, juste une remarque

tu nous met un bout de code et a nous de faire le reverse engineering :sifflotte:

un minimum d' explications sur l' usage des variables aiderait vraiment

après avoir survolé le code, on trouve a la fin une table qui est vraisemblablement le reflet des sorties a activer ???

une chose un peu perturbante est les sous programmes avec plusieurs points de sortie

par exemple dans le mode_une_phase, on peut sortir par un return ou par un goto - pas cool :furieux:

perso: une sous routine = UN point d' entrée et UN point de sortie

EDIT: crois tu que cela vaut la peine de prévoir le mode "une bobine", la puissance du moteur est réduite dans ce cas

je suppose que ton driver va ressembler a ceci:

step drv pic.JPG


++ sur le fofo

antoine (en mode grognon)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Soft de commande CNC en asm
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#16 Message par Temps-x » mer. 25 avr. 2018 22:24

Bonsoir ducran lapoigne, et tout le forum,

ducran lapoigne a écrit :
Source du message le reverse engineering


Encore de l'anglais, vraiment pas possible de se débarrasser de cette langue, un vrai fléau :furieux:

ducran lapoigne a écrit :
Source du message crois tu que cela vaut la peine de prévoir le mode "une bobine", la puissance du moteur est réduite dans ce cas


Ok, là tu as raison je supprime ce mode, de plus ça me fera gagner du temps et je peux récupérer 1 patte de plus par moteur.

ducran lapoigne a écrit :
Source du message je suppose que ton driver va ressembler a ceci


Oui et non, pas besoin de prendre le courant sur les bobines, suffit de le prendre plus bas, ce week-end je vais un plan.

Promit juré :wink: je mets un plan avec un vrai code, Pour le Pic je prends un Pic16F887 qui est la copie original du Pic16F88 mais
avec plus de patte.

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

Soft de commande CNC en asm
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#17 Message par F6FCO » sam. 28 avr. 2018 13:22

Temps-x a écrit :Encore de l'anglais, vraiment pas possible de se débarrasser de cette langue, un vrai fléau :furieux:

De l'ingénieur renversé.

Temps-x a écrit :En se qui concerne la tige fileté, je te conseille une tige de diamètre 14, ce qui fait 2mm par tour avec un pas standard .

Pas con çà :wink:, çà simplifiera les calculs

Temps-x a écrit :On peu partir sur Euh..... 300 mm sur 300 mm

Oui, pas trop gros pour que çà tienne sur le bureau à coté du clavier. C'est juste pour tester les routines.

Temps-x a écrit : humour!! ça va fumer dans mon petit cerveau, mais pas sur CNC

T'inquiète, pas que dans le tien, mais on aime çà non ? :-D

Antoine a écrit :par exemple dans le mode_une_phase, on peut sortir par un return ou par un goto - pas cool :furieux:

Oui, c'est même tout l'intéret de commencer par poser des algorigrammes sur papier, une entrée et une sortie par programme.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Soft de commande CNC en asm
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#18 Message par Temps-x » sam. 28 avr. 2018 22:35

Bonsoir F6FCO, ducran lapoigne, et tout le forum,

Bon voilà un code qui fonctionne, pour 1 moteur pas à pas, donc on peut l'utiliser sois en mode manuel, ou automatique
Pilotage par une fréquence.

Il y a 4 boutons poussoir, rotation dans les deux sens, arrêt, et un changement de sens de rotation par appui du même bouton

Un réglage de vitesse avec potentiomètre (à revoir) car comme l'expliqué ducran lapoigne c'est pas l'inéaire, mais ça fonctionne.

Code : Tout sélectionner

;**********************************************************************************************
;
;
 RA0 sortie logique pour moteur pas à pas
; RA1 sortie logique pour moteur pas à pas
; RA2 sortie logique pour moteur pas à pas
; RA3 sortie logique pour moteur pas à pas

; RA4 entrée réglage de vitesse du moteur pas à pas
; RA5 entrée arrêt du moteur pas à pas (MCLR)
;
 RA6 entrée d'impulsion, pour rotation du moteur
; RA7 entrée sens de rotation du moteur pas à pas
;
;----------------------------------------------------------------------------------------------
;
; RB0 sortie PWM 

; RB1 entrée bouton de rotation du moteur pas à pas dans le sens d'
une aiguille d'une montre  
; RB2 entrée bouton de rotation du moteur pas à pas en sens inverse d'
une aiguille d'une montre

; RB3 sortie information du nombre de pas du moteur pas à pas, seulement pour mode manuel ****
; RB4 sortie information du sens de rotation du moteur pas à pas, seulement pour mode manuel ****

; RB5 entrée sélection du mode de pas

; RB6 réglage de la valeur de l'
intensité moteur
; RB7 analyse de la consommation 

;**********************************************************************************************
               
    Errorlevel
-302                        ; Supprime le message "Ensure that bank bits are correct" 

    LIST      P
=PIC16F88                  ; Définition de processeur
    
#include <p16F88.inc>                 ; fichier include                   

    __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON  & _WDT_OFF & _INTRC_IO
    __CONFIG _CONFIG2
, _IESO_OFF & _FCMEN_OFF

;*************************************** assignations ***************************************** 

 
#DEFINE mode_mask    B'00110000'           ; sélection du mode   

;**********************************************************************************************
;******************************
 déclaration des variables *************************************
;**********************************************************************************************
  

 CBLOCK H
'20' 
      bank0 
: D'1'                       ; zone de la ram en bank 1 : H'20' à H'6F' soit 80 octets              
 
      mode_debut    
:1
      mode_fin      
:1        
      sélection     
:1      
      pas           
:1

      demarrage     
:1
      backup        
:1

      vitesse       
:
      retard        
:
      sens          
:1          
      pwm           
:

      intensité
      aligne        
:1
 ENDC


 CBLOCK H
'A0' 
      bank1 
: D'80'                       ; zone de la ram en bank 1 : H'A0' à H'EF' soit 80 octets  

 ENDC
        

 CBLOCK H
'110'                          
      bank2 
: D'96'                       ; zone de la ram en bank 2 : H'110' à H'16F' soit 96 octets  
 ENDC


 CBLOCK H
'190'                          
      bank3 
: D'96'                       ; zone de la ram en bank 3 : H'190' à H'1EF' soit 96 octets  
 ENDC


 CBLOCK H
'70'                             ; zone commune en bank 0, bank 1, bank 2, bank 3 : H'70' à H'7F' soit 16 octets  

     
      loop1         
:1
      loop2         
:1
 ENDC        

;**************************** adresse de depart après reset **********************************

    ORG H'0'
      goto debut      

;******************************** lieu des interruptions **************************************

    ORG  H'4'           
      retfie    

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

debut

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

      BANKSEL bank1                       ; passer en bank 1 

;************************ configuration du registre OSCTUNE en bank 1 *************************
                                          ; rélage de la précision de l'oscillateur interne                                           

                                          ; 00000000 valeur par défaut    
                                          ; 00011111 fréquence maximale           <-- mon choix 
                                          ; 00100000 fréquence minimale       
                                            
      movlw B'
00011111'                   ; choix fréquence maximale
      movwf OSCTUNE                       ;

;************************** configuration du registre OSCCON en bank 1 ************************

                                          ; fréquence pour l'
oscillateur interne 

                                          
; 01110000 oscillateur 8 MHz
                                          
; 01100000 oscillateur 4 MHz            <-- mon choix
                                          
; 01010000 oscillateur 2 MHz
                                          
; 01000000 oscillateur 1 MHz
                                          
; 00110000 oscillateur 500 kHz
                                          
; 00100000 oscillateur 250 kHz
                                          
; 00010000 oscillateur 125 kHz
                                          
; 00000000 oscillateur 31.25 kHz


      movlw B
'01100000'                   ; choix sur 4 Mhz  
      movwf OSCCON                        
;

;**************************
 configuration du registre ANSEL en bank 1 *************************
    
      movlw B
'00010000'                   ; en mode numérique, 3(RA4)                   
      movwf ANSEL                         
; en mode E/S 17(RA0),18(RA1),1(RA2),2(RA3),12(RB6),13(RB7)

;************************
 configuration du registre OPTION_REG en bank 1 ********************** 

      movlw B
'10000000'                   ; 
      movwf OPTION_REG                    
; résistances hors service                                            
                                                     
;************************* configuration du registre CMCON en bank 1 **************************  

      movlw B
'00000111'
      movwf CMCON                         ; éteindres les comparateurs                   

;******************* configuration des registres TRISA & TRISB en bank 1 **********************

      movlw B'11110000'                   ; 
      movwf TRISA                         
; configure les pattes dans TRISA
                                          
; 17(RA0),18(RA1),1(RA2),2(RA3),3(RA4),4(RA5),15(RA6),16(RA7)                         
               
      movlw B
'10110110'                   ; 
      movwf TRISB                         
; configure les pattes dans TRISB
                                          
; 6(RB0),7(RB1),8(RB2),9(RB3),10(RB4),11(RB5),12(RB6),13(RB7)                                                                   
                                                                          
;************************ configuration du registre ADCON1 en bank 1 **************************

      clrf  ADCON1                        ; b7 = détermine si le résultat de la conversion sera justifié à droite = 1 ou à gauche = 0  
                                          
; b5 = VCFG1 selection des tension de reférence, Vref- = Vss 
                                          
; b4 = VCFG0 selection des tension de reférence, Vref+ = Vdd  

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

      BANKSEL bank0                       ; passe en bank 0

;************************ configuration du registre ADCON0 en bank 0 **************************

      movlw B'11100000'                   ; b7 = ADCS1 choisir la fréquence de fonctionnement du 
      movwf ADCON0                        
; b6 = ADCS0 convertisseur en fonction de la fréquence d'horloge du PIC  
                                          ; b5 = CHS2 sélection du canal RA4/AN4 
                                          ; b4 = CHS1 sélection du canal RA4/AN4  
                                          ; b3 = CHS0 sélection du canal RA4/AN4
                                          ; b2 = GO/DONE indique la fin de la conversion analogique, et permet de lancer la conversion
                                          ; b1 = N.C
                                          ; b0 = ADON mise en service du convertiseur 0 = arrêt : 1 = marche 

;************************ configuration du registre PR2 en bank 0 *****************************

      movlw    D'
255'                           ; réglage du "débordement" de TMR2 
      movwf    PR2                              ; PR2 D'
255' donc fréquence à 3900 Hz

;************************ configuration du registre T2CON en bank 0 ***************************
                                          
      movlw B'
00000100'                      ; "prédiviseur à 1" bit zéro à 0, bit un à 0 
      movwf    T2CON                         ; "timer on", bit deux à 1 (mise en route du timer2. 0 : arrêt. 1 : marche)
                                          ; "postdiviseur à 1" bit trois à 0, bit quatre à 0, bit cinq à 0, bit six à 0
                                          ; dans registre de contrôle
                                         

      movlw B'
00001100'                   ; "1100" 4 bits mode pwm 
      movwf CCP1CON                       ; "00" 2 bits pour variation du rapport cyclique 

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

      clrf CCPR1L                       

      clrf INTCON                       

      clrf PORTA

      clrf PORTB

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

      clrf demarrage      
      clrf sélection
      clrf backup
      clrf sens
      clrf pas
              
;********************************************************************************************** 
stop
      call touche

      bcf demarrage,7                     ; mode de vitesse activer en mode manuel

      btfss PORTA,6                       ; 
      goto manuel_1                       ; ici, mode manuel
                                          ; ici, mode automatique 
impulsion
      btfsc PORTA,6
      goto impulsion            

      clrf sens

      bsf demarrage,7                     ; mode de vitesse désactivé en mode auto 
                                      
      btfss PORTA,7                     
      goto auto_1                         ; sens de rotation 
      goto auto_2                         ; sens de rotation

;********************************************************************************************** 
manuel_1    

      btfss sens,0 
      goto manuel_2

auto_1
      movfw pas
      xorwf mode_fin,W                    ; mode_fin 3, 7, 15
      btfss STATUS,Z    
      goto $+D'
4'

      movfw mode_debut                    ; mode_debut 0, 4, 8
      movwf pas
      goto $+D'
2'

      incf pas,F

      call trouve            
      
;********************************************************************************************** 
manuel_2        

      btfss sens,1    
      goto stop

auto_2
      movfw pas
      xorwf mode_debut,W                  ; mode_debut 0, 4, 8 
      btfss STATUS,Z    
      goto $+D'
4'

      movfw mode_fin                      ; mode_fin 3, 7, 15
      movwf pas
      goto $+D'
2'

      decf pas,F

      call trouve            

      goto stop
;********************************************************************************************** 
trouve     
      movfw PORTA                         ; sauvegarde du PORTA pour manupulation des bits
      movwf backup                        ; sauvegarde effectuer dans backup
       
      bsf backup,0                        ; créer un masque
      bsf backup,1
      bsf backup,2
      bsf backup,3

      movlw D'
4'     
      movwf PCLATH   

      movfw pas
                             
      call  code_pas           
                                   
      andwf backup,W             
      movwf PORTA 
     
      btfsc demarrage,7                   ; mode automatique
      return 
         
      call choix_vitesse                  ; mode manuel    

      return      
 
;********************************************************************************************** 

touche

;********************************************************************************************** 
bt0
      btfsc PORTA,5
      goto bt1   
      btfss PORTA,5
      goto $-D'
1'

      call delay_1ms

bt0_ini
      clrf sens

      movlw B'
11110000'                ; arrêt du moteur pas à pas(coupure d'alimentation des bobines)
      andwf PORTA,F                    ; inconvénient, perte de pas.    

      goto bt_fin

;********************************************************************************************** 
bt1
      btfsc PORTB
,1
      goto bt2    
      btfss PORTB
,1
      goto 
$-D'1'        

      call delay_1ms

bt1_ini
      clrf sens
      bsf sens
,0

      goto bt_fin

;********************************************************************************************** 
bt2
      btfsc PORTB
,2
      goto bt3    
      btfss PORTB
,2
      goto 
$-D'1'      

      call delay_1ms

bt2_ini
      clrf sens
      bsf sens
,1  

      goto bt_fin

;********************************************************************************************** 
bt3
      movfw retard
      xorlw D
'0'
      btfsc STATUS,Z
      goto bt3_ini

      decfsz retard
,F
      goto bt_fin        

bt3_ini
      btfsc PORTB
,7                       ; relier une résistance de 10k ohms au + 5 volts   
      goto bt_fin     

      movlw D
'200'                        ;
      movwf retard 

      btfsc sens
,0      
      goto bt2_ini        
      btfsc sens
,1
      goto bt1_ini   

      goto bt0_ini                        

bt_fin
      call mode_une_phase

      return
;********************************************************************************************** 
mode_une_phase

      movfw    B
'00110000'
      andwf PORTB,W
      xorlw B
'00000000'                   ; 00          
      btfss STATUS
,Z
      goto mode_deux_phase

      btfsc sélection
,
      return
         
      clrf sélection
      bsf sélection
,1

      movlw D
'0'
      movwf pas
      movwf mode_debut

      movlw D
'3'
      movwf mode_fin
      
      return

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

mode_deux_phase

      movfw    B
'00110000'
      andwf PORTB,W
      xorlw B
'00010000'                   ; 01  
      btfss STATUS
,Z
      goto mode_demi_pas

      btfsc sélection
,
      return
         
      clrf sélection
      bsf sélection
,2

      movlw D
'4'
      movwf pas
      movwf mode_debut

      movlw D
'7'
      movwf mode_fin
      
      return

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

mode_demi_pas

      movfw B
'00110000'               
      andwf PORTB
,W
      xorlw B
'00100000'                   ; 10  
      btfss STATUS
,Z
      goto mode_une_phase

      btfsc sélection
,
      return
         
      clrf sélection
      bsf sélection
,3

      movlw D
'8'
      movwf pas
      movwf mode_debut

      movlw D
'15'
      movwf mode_fin
      
      return      

;********************************************************************************************** 
choix_vitesse

      bsf ADCON0
,ADON                     ; on lance l’acquisition (charge du condensateur)
      nop             
      nop                                 
; pause, temps de charge du condensateur
      nop
      bsf ADCON0
,GO                       ; lancer la conversion A/D

      btfsc ADCON0
,GO                     ; si le bit GO est à 1 on va à la ligne 1        
      goto 
$-D'1'                         ; convertion n'est pas terminer     
      bcf ADCON0,ADON                     ; fin de conversion, éteindre convertisseur

      movfw ADRESH 
 
      movwf vitesse                       ; vitesse sélectionné 

      movwf pwm
                                          
delay_pas
      call delay_50µs
      decfsz vitesse,F
      goto delay_pas

      decfsz aligne,F
      goto delay_pas

      return

;********************************************************************************************** 
delay_1ms

      movlw D'
75'
      movwf loop1

      movlw D'
2'
      movwf loop2

      decfsz loop1,F
      goto $-D'
1'
      decfsz loop2,F
      goto $-D'
3'

      return
;********************************************************************************************** 
delay_50µs

      movlw D'
16
      movwf loop1
      
      decfsz loop1,F
      goto $-D'
1'

      return
;********************************************************************************************** 

     ORG H'
400'       

code_pas
      addwf  PCL,F

; Mode à pas entier, une phase alimentée à la fois (One Phase ON, Full Step) :

      retlw B'
11111000'
      retlw B'
11110010'
      retlw B'
11110100'
      retlw B'
11110001'                   ; 0 à 3

; Mode à pas entier, deux phases alimentées en même temps (Two Phase ON, Full Step) :
             
      retlw B'
11111010'      
      retlw B'
11110110'  
      retlw B'
11110101'  
      retlw B'
11111001'                   ; 4 à 7

; Mode demi-pas 

      retlw B'
11111000'
      retlw B'
11111010'
      retlw B'
11110010'
      retlw B'
11110110'
      retlw B'
11110100'
      retlw B'
11110101'
      retlw B'
11110001'
      retlw B'
11111001'                   ; 8 à 15
      
    
      end 



Le programme ASM devient lisible si un schéma électronique est fourni, donc j'ai fait un schéma, si vous voyez une
amélioration à faire, ou des erreurs, dite le moi SVP


Schéma.jpg


F6FCO a écrit :
Source du message Oui, pas trop gros pour que çà tienne sur le bureau à coté du clavier. C'est juste pour tester les routines.


Oui, tu as raison, je pars sur un format A4 (220mm X 310mm)

Toujours un plaisir de faire du code avec des personnes aussi sympathique, :wink:

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le dim. 29 avr. 2018 16:36, modifié 9 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Soft de commande CNC en asm
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#19 Message par F6FCO » sam. 28 avr. 2018 22:49

Bonsoir les gens,
Dommage que tu utilises des unipolaires, je ne retrouve plus les miens pour tester tes routines, comme je suis en train de rénover une vieille maison assez loin d'ici j'ai commencé à déménager pas mal de trucs et ils doivent trainer dans des cartons :? . Mais d'un autre coté c'est bien d'aborder le projet avec du matériel différent, çà permet de voir toutes les facettes du pilotage de pas à pas. Je vais scruter ton code :wink: .

Va pour 220x310, c'est un bon format pour tester sans encombrer. Un peu de 3D en perspective pour modéliser tout çà :-D

Voici ma routine d'accélération par train, codée lors des longues soirées au chantier. Pour une visu plus parlante sur l'écran de l'analyseur logique j'ai initialisé les variables à 10 trains de 3 pulses, j'ai testé et çà fonctionne aussi bien avec 200 trains de 40 pulses nécessaires pour parcourir 15mm.

Accel_par_train.PNG


L'algorigramme:
accel_train28042018.jpg


Le code:

Code : Tout sélectionner

;**********************************************************************
;
                                                                     
;    NOM:        rampe d'acceleration par train de pulses                                        
;    Date:       24/04/2018                                           
;    Auteur:     F6FCO  JC Buisson                                        
;     xtal:       4Mhz                                                 
;    
;    Commande de moteur PAP en PWM
;   
;
;                                                                     
;**********************************************************************
    
    Errorlevel-302
    
    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'
0008'            

; --------------------------------------------------------------------------------------------
#define clock PORTB,0              ; clock
#define dir PORTB,1              ; direction

BANK0    macro
        bcf    STATUS,RP0            ; passer banque0
        endm

BANK1    macro
        bsf    STATUS,RP0            ; passer banque1
        endm

pulse_haut macro
    bsf        clock
    call     tempo_base
    endm
    
pulse_bas macro
    bcf        clock
    call     tempo_base
    endm


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

    CBLOCK 0x020                   
        nb_pas:2                ; nombre de pas à effectuer sur 16 bits
        accel                    ; nombre de temps morts entre deux pulses_haut au départ de la rampe
        nb_pulses                ; variable tampon
        tampon:2                ; variable tampon
        pik                        ; nb pulses par train
        nbpik                    ; registre de travail pour pik
        valeur1:2                 ; pour la soustraction 16 bits
        valeur2:2                ; pour la soustraction 16 bits
        Reg_1
        Reg_2
        Reg_3
    ENDC                                                                                  

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

    org     0x0000                 ; Adresse de départ après reset
init;
    BANK1                        ; bank1
    clrf    ANSEL                ; broches du CAN en I/O
    movlw    OPTIONVAL            ; charger masque
    movwf    OPTION_REG            ; initialiser registre option
    clrf    TRISB                ; PORTB en sortie 
    BANK0                        ; bank0
    

;*********************************************************************
;                      PROGRAMME PRINCIPAL                           *
;*********************************************************************

main
    ;call tourne_en_continu       ; pour test du moteur
    ;goto    main
    
init_variables
    ; ------------------- ; initialisation du nombre de pas à réaliser par le moteur pap
    movlw    0x28
    movwf    nb_pas            ; poids faible        
    movlw    0x0
    movwf    nb_pas+1        ; poids fort
    ; ------------------- ; initialisation du nb temps morts par alternance au départ rampe 
    movlw    d'
9'
    movwf    accel                
    clrf    nb_pulses
    call     decrementation_nb_pas
    ; ------------------- ; initialisation du nb de pulses par train
    movlw    d'
3'
    movwf    pik
    
loopA
    ;test de accel, pour le tester sans le déformer on le transfère et on travaille dans la variable tampon
    movf    accel,W
    movwf    tampon
    movlw    1
    subwf    tampon,f
    btfsc    STATUS,Z
    goto     test_pasA        ; si accel=1 la rampe est terminée et on saute directement à test1 pour continuer à vitesse normale
    decf    accel,f            ; sinon on rentre dans la routine d'
acceleration pour ajouter des pulses bas entre deux pulses haut
    movf    pik
,w
    movwf    nbpik
decremente_pik
    decf    nbpik
,f
    decf    nb_pas
,f
    pulse_haut
a    
    nop
    movf    accel
,W
    movwf    nb_pulses
loop_ecartA
    pulse_bas
    decf    nb_pulses
,f
    btfss    STATUS
,Z
    goto    loop_ecartA
test_pik
    movf    nbpik
,w            ; nb pik par train
    movwf    tampon
    btfss    STATUS
,Z
    goto     decremente_pik    
    goto    loopA
    
; test du nombre de pas parcourus, pour tester nb_pas sans déformer on transfère et travaille dans tampon    
test_pasA
    call    decrementation_nb_pas
    pulse_haut
    pulse_bas
    
; test si nb_pas et nb_pas+1 sont à 0 (il faut tester les 16 bits). si oui programme fini, sinon goto loop1
    movf    nb_pas
+1,w
    btfsc    STATUS
,Z
    goto    loopA
    movf    nb_pas
,W
    btfsc    STATUS
,Z
    goto    loopA
    
    
    call     tempo_fin_de_programme    
; juste pour séparer chaque éxécution du programme et pouvoir les différencier sur l'analyseur logique
    goto     main
    
    
decrementation_nb_pas
    ;decf    nb_pas
    ;goto loop
    ;--------------------- ici on va effectuer la décrémentation de nb_pas sur 16 bits
    movf    nb_pas,W        ; on transfère nb_pas dans valeur1
    movwf    valeur1
    movf    nb_pas+1,W
    movwf    valeur1+1
    movlw    1                ; on charge d'
1' dans valeur2
    movwf    valeur2            
    clrf    valeur2+1
    call    soustraction16
    ;--------------------
    movf    valeur2,W        ; on stocke le résultat (nb_pas-1) dans nb_pas
    movwf    nb_pas
    movf    valeur2+1,w
    movwf    nb_pas+1
    return
    
soustraction16
    ; on fait le complément à 2 de valeur2 et valeur2+1
    movf    valeur2,W
    xorlw    0xFF
    addlw    0x1
    movwf    valeur2
    movf    valeur2+1,w
    xorlw    0xFF
    movwf    valeur2+1
    ; addition des poids faibles
    movf    valeur1,W
    addwf    valeur2,f
    ; addition du carry
    movf    STATUS,W
    andlw    0x1
    addwf    valeur2+1,f
    ; addition des poids forts, résultat dans valeur2/valeur2+1
    movf     valeur1+1,W
    addwf    valeur2+1,f
    return
    
tourne_en_continu   ; routine pour tester le moteur en continu
    pulse_haut
    pulse_bas
    return
    
tempo_base        ; temps de base d'
un pulse (demi_alternance)
;
 Délai 400 Cycles de la machine
; Durée du délai 400 microsecond
; Fréquence de l'oscillateur 4 MHZ

            movlw       .133
            movwf       Reg_1
            decfsz      Reg_1,F
            goto        $-1
          return
            
tempo_fin_de_programme
; Délai 200 000 Cycles de la machine
; Durée du délai 200 millisecond
; Fréquence de l'
oscillateur 4 MHZ
            movlw       .186
            movwf       Reg_1
            movlw       .4
            movwf       Reg_2
            movlw       .2
            movwf       Reg_3
            decfsz      Reg_1
,F
            goto        
$-1
            decfsz      Reg_2
,F
            goto        
$-3
            decfsz      Reg_3
,F
            goto        
$-5
            nop
            return
            

    END             

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Soft de commande CNC en asm
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#20 Message par Temps-x » dim. 29 avr. 2018 04:36

Bonsoir,

L'avantage d'avoir un drivers qui fait tout, tu n'as plus qu'a traiter les impulsions, et le sens de rotation.

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


Retourner vers « Langage ASM »

Qui est en ligne

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