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 ---
- 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 ---
Modérateur : mazertoc
Soft de commande CNC en asm
- F6FCO
Expert- Messages : 1415
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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.
Non mais Lol quoi Gérard ! et moi alors mais c'est un excellent moyen de progresser, rien de tel que l'immersion forcée , 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 .
Soft de commande CNC en asm
Bonjour a tous,
Que voila un beau gros sujet en perspective . Je vais suivre ça du fond de la classe Bon courages en tout cas.
@++
Que voila un beau gros sujet en perspective . Je vais suivre ça du fond de la classe Bon courages en tout cas.
@++
Soft de commande CNC en asm
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 c'est bien d'y avoir pensée.
On peu partir sur Euh..... 300 mm sur 300 mm
ça va fumer dans mon petit cerveau, mais pas sur CNC
A+
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 c'est bien d'y avoir pensée.
On peu partir sur Euh..... 300 mm sur 300 mm
ça va fumer dans mon petit cerveau, mais pas sur CNC
A+
Soft de commande CNC en asm
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.
A+
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,1
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,2
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,3
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+
Soft de commande CNC en asm
- ducran lapoigne
Débutant- Messages : 96
- Enregistré en : septembre 2015
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
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
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:
++ sur le fofo
antoine (en mode grognon)
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
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
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:
++ 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
Bonsoir ducran lapoigne, et tout le forum,
Encore de l'anglais, vraiment pas possible de se débarrasser de cette langue, un vrai fléau
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.
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é 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+
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
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é 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+
Soft de commande CNC en asm
- F6FCO
Expert- Messages : 1415
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Temps-x a écrit :Encore de l'anglais, vraiment pas possible de se débarrasser de cette langue, un vrai fléau
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 çà , çà 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 : ça va fumer dans mon petit cerveau, mais pas sur CNC
T'inquiète, pas que dans le tien, mais on aime çà non ?
Antoine a écrit :par exemple dans le mode_une_phase, on peut sortir par un return ou par un goto - pas cool
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.
Soft de commande CNC en asm
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.
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
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,
A+
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 :1
retard :1
sens :1
pwm :1
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,1
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,2
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,3
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
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,
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.
Soft de commande CNC en asm
- F6FCO
Expert- Messages : 1415
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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 .
Va pour 220x310, c'est un bon format pour tester sans encombrer. Un peu de 3D en perspective pour modéliser tout çà
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.
L'algorigramme:
Le code:
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 .
Va pour 220x310, c'est un bon format pour tester sans encombrer. Un peu de 3D en perspective pour modéliser tout çà
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.
L'algorigramme:
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.
Soft de commande CNC en asm
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités