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
Soft de commande CNC en asm
- F6FCO
Expert- Messages : 1415
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Hello le monde,
Je suis de passage dans la famille et je profite de leur connexion internet pour vous donner des nouvelles car dans mon chantier toujours pas d'internet, ce qui d'un coté est bien, çà me permet de programmer sereinement au lieu de surfer à tort et à travers.
J'ai démarré la prog du projet 4L1C3, comme annoncé j'ai démarré par ce qui me semblait le plus complexe dans la gestion d'une CNC, cad la réception des données et la séparation en trains formatés d'une ligne XYZ.
Pour stopper l'envoi des données j'ai d'abord voulu utiliser la macro de Satinas, hélas çà n'a pas fonctionné, çà ne stoppait rien , et isolé dans mon coin je ne pouvais pas venir appeler à l'aide, j'ai donc du me d....der tout seul. J'ai ensuite essayé XON/XOFF, pareil çà ne stoppait rien, pourtant je voyais bien partir les valeurs 17 et 19 avec l'analyseur logique mais elles semblaient inactives sur le PC. J'avais pourtant bien coché la case interruption software dans Teraterm, je suis même allé la cocher sur le COM4 à partir du gestionnaire de périfériques.
Comme çà ne voulait pas faire et qu'il fallait que j'avance dans mon truc, j'ai sacrifié une de mes deux dernière pins libres pour tirer un fil CTS.
Cochage case interrupt hardware dans Teraterm et là çà fonctionne au poil
OUF!
Je pense connaitre la raison de mes mésaventures, c'est certainement mon W7 qui me fait des misères, il commence à être bien corrompu et part un peu dans tous les sens. Ce qui me fait dire çà c'est que parfois quand j'utilisais les interrup software (macro et XON/XOFF) le port COM4 disparaissait, il fallait redémarrer le PC pour le retrouver de nouveau.
Il faudrait ré-installer W7 mais comme je n'ai pas d'internet pour l'instant je préfère m'abstenir car je ne pourrai pas le ré-activer en ligne. j'ai déjà fait çà une fois par telephonne et c'est une galère....
Donc je fonctionne en ce moment avec CTS pour stopper le flux.
Voilà ou j'en suis pour l'instant, je produis bien mes trains de données bien formatés et les range proprement dans les bonne variables codées sur 32bits. L'analyseur logique m'a été d'une grande aide pour mettre tout çà au point et çà n'a finalement pas été aussi compliqué que je le croyais.
Le programme (je ne pars jamais sans ma petite clé USB ):
Pour m'en sortir et comprendre ce que je voyais à l'écran j'ai créé un fichier gcode significatif avec des valeurs qui se suivent, j'ai pu ainsi visualiser l'enchainement des différents trains en faisant du pas à pas.
On voit bien sur ces captures d'écran les trains de données successifs, si rendu visible l'intervalle en plaçant une tempo, c'est à cet endroit que je placerais les appels aux routines de gestion de la machine pour faire bouger les trois axes suivant les valeurs reçues.
Pour l'instant les données sont stockées en mem sur 32bits mais je vais certainement passer en 24bits pour gagner du temps de calcul, avec la taille de ma petite CNC les octets de poids fort risquent d'être toujours à zéro. Encore stockées sous leur forme ASCII, il va falloir les transformer en numérique et je vais
m'attaquer aux routines de génération des pulses.
Prochaines nouvelles quand je ressortirai de ma grotte.
Je suis de passage dans la famille et je profite de leur connexion internet pour vous donner des nouvelles car dans mon chantier toujours pas d'internet, ce qui d'un coté est bien, çà me permet de programmer sereinement au lieu de surfer à tort et à travers.
J'ai démarré la prog du projet 4L1C3, comme annoncé j'ai démarré par ce qui me semblait le plus complexe dans la gestion d'une CNC, cad la réception des données et la séparation en trains formatés d'une ligne XYZ.
Pour stopper l'envoi des données j'ai d'abord voulu utiliser la macro de Satinas, hélas çà n'a pas fonctionné, çà ne stoppait rien , et isolé dans mon coin je ne pouvais pas venir appeler à l'aide, j'ai donc du me d....der tout seul. J'ai ensuite essayé XON/XOFF, pareil çà ne stoppait rien, pourtant je voyais bien partir les valeurs 17 et 19 avec l'analyseur logique mais elles semblaient inactives sur le PC. J'avais pourtant bien coché la case interruption software dans Teraterm, je suis même allé la cocher sur le COM4 à partir du gestionnaire de périfériques.
Comme çà ne voulait pas faire et qu'il fallait que j'avance dans mon truc, j'ai sacrifié une de mes deux dernière pins libres pour tirer un fil CTS.
Cochage case interrupt hardware dans Teraterm et là çà fonctionne au poil
OUF!
Je pense connaitre la raison de mes mésaventures, c'est certainement mon W7 qui me fait des misères, il commence à être bien corrompu et part un peu dans tous les sens. Ce qui me fait dire çà c'est que parfois quand j'utilisais les interrup software (macro et XON/XOFF) le port COM4 disparaissait, il fallait redémarrer le PC pour le retrouver de nouveau.
Il faudrait ré-installer W7 mais comme je n'ai pas d'internet pour l'instant je préfère m'abstenir car je ne pourrai pas le ré-activer en ligne. j'ai déjà fait çà une fois par telephonne et c'est une galère....
Donc je fonctionne en ce moment avec CTS pour stopper le flux.
Voilà ou j'en suis pour l'instant, je produis bien mes trains de données bien formatés et les range proprement dans les bonne variables codées sur 32bits. L'analyseur logique m'a été d'une grande aide pour mettre tout çà au point et çà n'a finalement pas été aussi compliqué que je le croyais.
Le programme (je ne pars jamais sans ma petite clé USB ):
Code : Tout sélectionner
;----------------------------------------------------------------------------------------------
; 4L1C3 - F6FC0
; 21 septembre 2018 réception trains et stockage valeur en mem ok
; faire un reset du code, une déco/reco de teraterm avant de lancer chaque processus.
;----------------------------------------------------------------------------------------------
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f4525 ; processeur utilisé
#include <p18f4525.inc> ; Définitions des constantes
;---------------------------------------------------------------------------------------------
CONFIG OSC = XT ; Oscillateur ext 4MHz
CONFIG IESO = OFF ; Oscillateur secondaire refusé (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (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
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 = ON ; 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)
;-------------------------------------- assignations ------------------------------------------
#define btn_jog_Xmoins PORTA,0 ; 1
#define btn_jog_Yplus PORTA,1 ; 1
#define btn_jog_Ymoins PORTA,2 ; 1
#define btn_jog_Xplus PORTA,3 ; 1
#define btn_jog_Zmoins PORTA,4 ; 1
#define btn_jog_Zplus PORTA,5 ; 1
#define capteur_pomZ PORTB,0 ; 1
#define capteur_pomX PORTB,1 ; 1
#define capteur_pomY PORTB,2 ; 1
#define led_pomZ PORTB,3 ; 0
#define led_pomY PORTB,4 ; 0
#define cts PORTB,5 ; 0
#define nc0 PORTB,6 ; x
#define nc1 PORTB,7 ; x
#define led_popY PORTC,0 ; 0
#define led_popZ PORTC,1 ; 0
#define btn_run PORTC,2 ; 1
#define btn_popX PORTC,3 ; 1
#define drv_stepY PORTC,4 ; 0
#define drv_dirY PORTC,5 ; 0
#define Tx PORTC,6 ; 1
#define Rx PORTC,7 ; 1
#define btn_popY PORTD,0 ; 1
#define btn_popZ PORTD,1 ; 1
#define drv_stepX PORTD,2 ; 0
#define drv_dirX PORTD,3 ; 0
#define drv_stepZ PORTD,4 ; 0
#define drv_dirZ PORTD,5 ; 0
#define led_pomX PORTD,6 ; 0
#define btn_pom PORTD,7 ; 1
#define btn_ctrl PORTE,0 ; 1
#define btn_btn_fn PORTE,1 ; 1
#define led_popX PORTE,2 ; 0
;------------------------------ déclaration des variables -------------------------------------
CBLOCK H'0'
ENDC
CBLOCK H'80'
; ----------- variables de stockage des octets réception train, ne pas modifier l'ordre
axeX:1 ; ascii 'Z'
coordX:4 ; coordonnée stockée sur 32 bits
espace1 ; espace
axeY ; ascii 'Y'
coordY:4 ; coordonnée stockée sur 32 bits
espace2 ; espace
axeZ ; ascii 'Z'
coordZ:4 ; coordonnée stockée sur 32 bits
retour_ligne ; retour chariot
ptr_variable ; utilisé pour calculer l'adr mem ou stocker les valeurs du train
ptr_train_RCIF ; compteur nb octets reçus dans un train
flag_fin_gcode
; ----------------------
tampon
W_TEMP
STATUS_TEMP
BSR_TEMP
Tampon_REC ; tampon réception
Tampon_EM ; tampon émission
Reg_1
Reg_2
Reg_3
ENDC
; ---------------------------------------- macros --------------------------------------------
qrt macro ; demande au PC d'arreter l'émission
bsf cts
endm
qrv macro ; demande au PC de relancer l'émission
bcf cts
endm
;--------------------------------- adresse de depart après reset -----------------------------
ORG H'0'
bra init
;--------------------------------------- interruptions ---------------------------------------
ORG H'08'
interrupt btfss PIR1,RCIF ; registre plein ? si oui on saute à réception
bra int1 ; sinon on sort de l'interrupt
reception
nop
movff RCREG,POSTINC0 ; lecture de RCREG et mise en mem
incf ptr_train_RCIF ; on a reçu qq chose donc on incrémente le compteur de trains
btfss RCSTA,OERR ; test d'une erreur d'overrun
goto int1
; traitement de l'erreur d'overrun
bcf RCSTA,CREN ; on efface le bit OERR
bsf RCSTA,CREN ; on relance la réception
int1 ; traitement des autres interruptions
retfie
;----------------------------------- Initialisations -------------------------------------------------
init
;clrf ptr_train_RCIF ; raz du compteur de trains
bcf ADCON0,ADON ; convertisseur a/n dévalidé
movlw 0xFF
movwf ADCON1,PCFG3 ; on passe tout en digital
movlw b'11000000' ; INTCON (activation des int GIE/GIEH=1, PEIE/GIEL=1)
movwf INTCON
movlw b'10000000' ; RCON (priorités int activées IPEN=1,)
movwf RCON
movlw b'00100000' ; IPR1 (Rx en haute priorité RCIP=1)
movwf IPR1
movlw b'00100000' ; PIE1 (int RX activée RCIE=1)
movwf PIE1
movlw b'00100100' ; TXSTA (Emission USART activée TXEN=1, et mode asynchrone haute vitesse BRGH=1)
movwf TXSTA
movlw b'10010000' ; RCSTA (Utilisation du port série activée SPEN=1, Réception USART activée CREN=1)
movwf RCSTA
movlw d'25' ; 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
movwf SPBRG
bcf BAUDCON,BRG16 ; réglé à 8bits
movlw B'11111111'
movwf TRISA
movlw B'00000111'
movwf TRISB
movlw B'11111100'
movwf TRISC
movlw B'10000011'
movwf TRISD
movlw B'10000011'
movwf TRISE
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
; RAZ variables
; ---------------- RAZ du bloc de variables de axeX à ptr_train_RCIF
lfsr FSR0,axeX
movlw d'20'
movwf tampon
raz_var clrf POSTINC0
decf tampon
btfss STATUS,Z
bra raz_var
; -----------------
lfsr FSR0,axeX ; init sur l'adresse de la première variable axeX
clrf flag_fin_gcode
qrv ; prêt pour réception
bcf led_pomY
bra main
; -------------------------------------- Programme principal --------------------------------------
main
Test_nb_trains
movlw d'16' ; compter 28 octets pour un train
subwf ptr_train_RCIF,w
btfss STATUS,Z
bra main
qrt ; demande de stop émission du PC, on va maintenant s'occuper de gérer la machine grace aux infos reçues
clrf ptr_train_RCIF
lfsr FSR0,axeX ; on repointe sur la première variable axeX
; ------------------- Placer ici les appels aux routines de gestion de la machine
call tempo
; -------------------
call test_fin_gcode ; test si fin du gcode
movlw 1
subwf flag_fin_gcode
btfsc STATUS,Z
bra init
qrv ; pret pour réception
bra main
test_fin_gcode
movlw 0x4D ; test du 'M' de la fin du gcode (M0030)
subwf axeX,w
btfss STATUS,Z
return
bsf led_pomY
movlw 1
movwf flag_fin_gcode
return
; ------------------------------ routines de gestion de la machine ---------------------------------
tempo
; Délai 20 000 Cycles de la machine
; Durée du délai 20 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .248
movwf Reg_1
movlw .26
movwf Reg_2
decfsz Reg_1
bra $-2
decfsz Reg_2
bra $-6
nop
return
END
Pour m'en sortir et comprendre ce que je voyais à l'écran j'ai créé un fichier gcode significatif avec des valeurs qui se suivent, j'ai pu ainsi visualiser l'enchainement des différents trains en faisant du pas à pas.
On voit bien sur ces captures d'écran les trains de données successifs, si rendu visible l'intervalle en plaçant une tempo, c'est à cet endroit que je placerais les appels aux routines de gestion de la machine pour faire bouger les trois axes suivant les valeurs reçues.
Pour l'instant les données sont stockées en mem sur 32bits mais je vais certainement passer en 24bits pour gagner du temps de calcul, avec la taille de ma petite CNC les octets de poids fort risquent d'être toujours à zéro. Encore stockées sous leur forme ASCII, il va falloir les transformer en numérique et je vais
m'attaquer aux routines de génération des pulses.
Prochaines nouvelles quand je ressortirai de ma grotte.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Soft de commande CNC en asm
Bonjour F6FCO et tout le monde
Dans ta routine de réception, il est noté
C’est une erreur de commentaire ?
Pourquoi en plein programme refaire une init complète ?
Dans ta routine de réception, il est noté
Code : Tout sélectionner
movlw d'16' ; compter 28 octets pour un train
C’est une erreur de commentaire ?
Code : Tout sélectionner
; -------------------
call test_fin_gcode ; test si fin du gcode
movlw 1
subwf flag_fin_gcode
btfsc STATUS,Z
bra init
qrv ; pret pour réception
bra main
Pourquoi en plein programme refaire une init complète ?
Soft de commande CNC en asm
- F6FCO
Expert- Messages : 1415
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
JMarc a écrit :Bonjour F6FCO et tout le monde
Dans ta routine de réception, il est notéCode : Tout sélectionner
movlw d'16' ; compter 28 octets pour un train
C’est une erreur de commentaire ?
Quand je fais des modifs sur mes programmes, pris dans ma réflexion j'oublie souvent de changer les commentaires. Ici le commentaire devrait indiquer 16 octets. Une petite explication quand même sur cette ligne "Z0001 X0002 Y0003", çà fait 15 octets auxquels il faut rajouter les deux espaces et un retour à la ligne (on est en ASCII), ce qui fait 18 octets. Mais si on regarde la capture de l'analyseur logique on voit qu'il passe encore 2 octets après l'envoi du CTS, donc 18-2=16 octets avant d'envoyer le CTS.
JMarc a écrit :Code : Tout sélectionner
; -------------------
call test_fin_gcode ; test si fin du gcode
movlw 1
subwf flag_fin_gcode
btfsc STATUS,Z
bra init
qrv ; pret pour réception
bra main
Pourquoi en plein programme refaire une init complète ?
Pour le coup j'ai codé à la pioche, il faudra rajouter un label pour se brancher sur la RAZ des variables.
Soft de commande CNC en asm
Bonjour tout le monde
J’essaie de prendre le train en marche mais c’est difficile de me remettre dans le bain
C’est toujours d’actualité ?
J’ai du mal à comprendre,ce n’est pas un reproche sur ton code mais pour ma curiosité car je reprends mes transmissions sous un autre angle
Tu envoies Z=1 octet
Les valeurs sur 2 octets
Le tout 3 fois pour Z,X et Y
Soit 9 octets, je suppose qu’il y a un en-tête en une fin comme l’a notifié Satinas dans un post précédent ( d’ailleurs il faut que je lui réponde sur la gestion des écrans)
Pourquoi envoyer l’ordre stop puisque tes chaines son de longueur prédéfinis et que c’est le pic qui demande les envoie ? D’ailleurs il le demande comment ?
Jean-Marc, très curieux moi
J’essaie de prendre le train en marche mais c’est difficile de me remettre dans le bain
F6FCO a écrit :C'est des trains de 14 octets, les valeurs seules seront stockées dans trois variables 32bits.
Voilà comment je compte procéder:
Le PC envoie le premier train, par exemple "Z000003 X000005 Y000005", les valeurs 000003, 000005, 000005 sont stockées dans 3 variables 32bits. Le PIC envoie l'ordre "stop" au PC et traite ces variables pour mouvoir les trois axes.
Ceci fait il envoie au PC l'ordre d'envoyer un nouveau train "Z000001 X000005 Y000005", et ainsi de suite jusqu'à la fin du gcode.
C’est toujours d’actualité ?
J’ai du mal à comprendre,ce n’est pas un reproche sur ton code mais pour ma curiosité car je reprends mes transmissions sous un autre angle
Tu envoies Z=1 octet
Les valeurs sur 2 octets
Le tout 3 fois pour Z,X et Y
Soit 9 octets, je suppose qu’il y a un en-tête en une fin comme l’a notifié Satinas dans un post précédent ( d’ailleurs il faut que je lui réponde sur la gestion des écrans)
Pourquoi envoyer l’ordre stop puisque tes chaines son de longueur prédéfinis et que c’est le pic qui demande les envoie ? D’ailleurs il le demande comment ?
Jean-Marc, très curieux moi
Soft de commande CNC en asm
Bonjour à tous,
Bravo JMarc, y en a au moins un qui suit :)
Je reconnais que c'est un peu compliqué tout ça, même avec le pseudo-code. En fait F6FC0 est revenu à sa première idée, avec le CTS. Mais cela restera tout de mème complexe à mettre au point.
Voila ce que j'ai écrit, pas encore testé avec la macro Tera Term qu'il faut modifier un peu (tout ça à tester avec le debugger, vive les debuggers). En partant de ton programme, pour que tu sois pas trop dépaysé.
Par contre je comprends pas, mon timer 0 est réglé pour se déclencher toutes les 100ms. Avec une variable qui compte jusqu'à 10, il devrait faire clignoter la led toutes les secondes. Hors elle clignote toutes les 1/2s, je vois pas pourquoi. Si quelqu'un a une idée ...
En fait si on lance le programme, il y a 5 envois de ACK chaque seconde, puis sans réponse du PC, le programme passe en abort et fait clignoter la led très vite, là c'est normal.
Pour éviter d'avoir des problèmes de tabulations dans les sources, il faut régler Mplab pour remplacer les tabulations par des espaces, lorsqu'il sauvegarde sur disque. C'est dans le menu Edit/Properties/ASM File Type
Bravo JMarc, y en a au moins un qui suit :)
Je reconnais que c'est un peu compliqué tout ça, même avec le pseudo-code. En fait F6FC0 est revenu à sa première idée, avec le CTS. Mais cela restera tout de mème complexe à mettre au point.
Voila ce que j'ai écrit, pas encore testé avec la macro Tera Term qu'il faut modifier un peu (tout ça à tester avec le debugger, vive les debuggers). En partant de ton programme, pour que tu sois pas trop dépaysé.
Par contre je comprends pas, mon timer 0 est réglé pour se déclencher toutes les 100ms. Avec une variable qui compte jusqu'à 10, il devrait faire clignoter la led toutes les secondes. Hors elle clignote toutes les 1/2s, je vois pas pourquoi. Si quelqu'un a une idée ...
En fait si on lance le programme, il y a 5 envois de ACK chaque seconde, puis sans réponse du PC, le programme passe en abort et fait clignoter la led très vite, là c'est normal.
Pour éviter d'avoir des problèmes de tabulations dans les sources, il faut régler Mplab pour remplacer les tabulations par des espaces, lorsqu'il sauvegarde sur disque. C'est dans le menu Edit/Properties/ASM File Type
Code : Tout sélectionner
;----------------------------------------------------------------------------------------------
; 4L1C3 - F6FC0
; 21 septembre 2018 réception trains et stockage valeur en mem ok
; faire un reset du code, une déco/reco de teraterm avant de lancer chaque processus.
;----------------------------------------------------------------------------------------------
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f4685 ; processeur utilisé
#include <p18f4685.inc> ; Définitions des constantes
;---------------------------------------------------------------------------------------------
CONFIG OSC = XT ; IRCIO67 ; Oscillateur ext 4MHz
CONFIG IESO = OFF ; Oscillateur secondaire refusé (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (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
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 = ON ; 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)
#define SIZBUFFER 40
#define HEADER '<'
#define TRAILER '>'
#define led LATD,2 ; !!!!!!!!!!!!!!!!!!!
;------------------------------ déclaration des variables -------------------------------------
CBLOCK H'0'
ENDC
CBLOCK H'80'
packet:SIZBUFFER ; buffer réception paquet
cpt_rcv_bytes ; nombre octets reçus
new_packet ; flag paquet reçu complet
cpt_gcode_lines:2 ; compteur lignes gcode reçues
next_cmd_byte ; commande à envoyer, 'F' ou 'U'
cpt_retry ; compteur demandes paquet (> 1 si erreur réception)
cpt_tops ; compteur tops timer (toutes les 100ms)
top_last_rcv ; top dernière réception pour gestion d'un time-out
cpt_tops_led ; led clignote toutes les secondes
checksum ; checksum paquet calculé à la volée
byte_received ; variable temporaire
Reg_1
Reg_2
Reg_3
ENDC
;--------------------------------- adresse de depart après reset -----------------------------
ORG H'0'
bra init
;--------------------------------------- interruptions ---------------------------------------
ORG H'8'
interrupt btfss PIR1,RCIF ; registre plein ? si oui on saute à réception
bra int1 ; sinon on passe à l'interrupt timer 0
reception movff RCREG,byte_received
btfss RCSTA,OERR ; test d'une erreur d'overrun
bra byte_verif
bcf RCSTA,CREN ; on efface le bit OERR
bsf RCSTA,CREN ; on relance la réception
byte_verif sublw SIZBUFFER
btfsc STATUS,Z
bra int1 ; erreur si overflow buffer
btfsc new_packet,1 ; erreur si paquet complet déjà en buffer
bra int1
movwf byte_received
sublw HEADER
btfsc STATUS,Z ; reçu header ?
bra is_header
no_header movf cpt_rcv_bytes
btfsc STATUS,Z
bra int1 ; erreur si 1er octet reçu n'est pas un header
bra byte_ok
is_header movf cpt_rcv_bytes
btfss STATUS,Z
bra int1 ; erreur si header non reçu en 1ère position
byte_ok movwf byte_received
sublw TRAILER
btfsc STATUS,Z ; reçu trailer ?
bsf new_packet,1
movwf byte_received
addwf checksum
movwf POSTINC0 ; mise en buffer
incf cpt_rcv_bytes
movff cpt_tops,top_last_rcv ; init time-out réception
int1 btfss INTCON,TMR0IF ; timer 0 int toutes les 100ms
bra int2
decf cpt_tops_led
btfss STATUS,Z
bra razt0
movlw d'10'
movwf cpt_tops_led
btg led
razt0 movlw (65536-50000)/256 ; 100ms (50000*2us si Fosc=4MHz et prescaler :2)
movwf TMR0H
movlw (65536-50000)%256
movwf TMR0L
bcf INTCON,TMR0IF
int2 retfie
;-------------------------------------- Programme principal --------------------------------------
main
;----------------------------------- Initialisations -------------------------------------------------
init bcf ADCON0,ADON ; convertisseur a/n dévalidé
movlw 0x0F
iorwf ADCON1 ; on passe tout en digital
movlw b'11000000' ; INTCON (activation des int GIE/GIEH=1, PEIE/GIEL=1)
movwf INTCON
movlw b'10000000' ; RCON (priorités int activées IPEN=1,)
movwf RCON
movlw b'00100000' ; IPR1 (Rx en haute priorité RCIP=1)
movwf IPR1
movlw b'00100000' ; PIE1 (int RX activée RCIE=1)
movwf PIE1
movlw b'00100100' ; TXSTA (Emission USART activée TXEN=1, et mode asynchrone haute vitesse BRGH=1)
movwf TXSTA
movlw b'10010000' ; RCSTA (Utilisation du port série activée SPEN=1, Réception USART activée CREN=1)
movwf RCSTA
movlw d'25' ; 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
movwf SPBRG
bcf BAUDCON,BRG16 ; réglé à 8bits
movlw B'11111111'
movwf TRISA
movlw B'00000111'
movwf TRISB
movlw B'11111100'
movwf TRISC
movlw B'10000011'
movwf TRISD
movlw B'10000011'
movwf TRISE
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
movlw B'10000000' ; T0CON (TMR0ON=1, prescaler=:2)
movwf T0CON
movlw b'11100000' ; INTCON (GIEH=1, GIEL=1, TMR0IE=1)
movwf INTCON
movlw d'10'
movwf cpt_tops_led
clrf cpt_tops ; raz tops horloge (0 à max 25,5 secondes)
clrf cpt_gcode_lines ; raz compteur lignes gcode reçues
clrf cpt_gcode_lines+1
clrf cpt_retry ; raz compteur demandes du premier paquet
movlw 'F' ; premier ACK
bra send_cmd
send_retry call tempo_1s ; redemander paquet après 1 seconde
movlw 'U' ; avec un NAK
send_cmd movwf next_cmd_byte ; stocker commande à envoyer
movlw 5
subwf cpt_retry,W ; cpt_retry = 5 ?
btfsc STATUS,Z
bra abort
incf cpt_retry ; incrémenter compteur demandes du paquet
lfsr FSR0,packet ; buffer réception paquet
clrf cpt_rcv_bytes ; raz nombre octets reçus
clrf new_packet ; raz flag paquet reçu
clrf checksum ; raz checksum
movff cpt_tops,top_last_rcv ; init time-out réception
movff next_cmd_byte,TXREG ; envoi commande sur uart
bcl_wait movwf top_last_rcv ; gérer time-out réception
subwf cpt_tops,W ; W = nb top 100ms depuis dernière réception
sublw 3
btfss STATUS,C ; W <= 3 ? (moins de 300ms depuis dernière réception ?)
bra send_retry ; non, redemander paquet
btfss new_packet,1 ; paquet reçu ?
bra bcl_wait
call do_packet ; oui, traiter paquet
btfsc STATUS,C ; paquet correct ?
bra send_retry ; non, redemander paquet
clrf cpt_retry ; oui, raz compteur demandes du paquet
movlw 'F' ; envoyer ACK
bra send_cmd
abort call tempo_20ms ; transfert en erreur, on boucle
call tempo_20ms
call tempo_20ms
call tempo_20ms
call tempo_20ms
btg led
bra abort
;------------------------------- Traitement paquet -------------------------------------------------
do_packet ; comparer cpt_gcode_lines et index ligne gcode dans le paquet
; si différents, sortie en erreur
; comparer checksum calculé et checksum dans le paquet
; si différents, sortie en erreur
; si sortie en erreur
; bsf STATUS,C ; retour C=1 pour paquet incorrect
; return
; si pas d'erreur, on traite la ligne gcode
; on incrémente le compteur de lignes gcode ainsi
infsnz cpt_gcode_lines ; incrémenter compteur lignes gcode reçues
incf cpt_gcode_lines+1
bcf STATUS,C ; retour C=0 pour paquet ok
return
; ------------------------------ temporisations ----------------------------------------------------
tempo_1s movlw .58
movwf Reg_3
tp1s call tempo_20ms
decfsz Reg_3
bra tp1s
return
tempo_20ms
; Délai 20 000 Cycles de la machine
; Durée du délai 20 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .248
movwf Reg_1
movlw .26
movwf Reg_2
decfsz Reg_1
bra $-2
decfsz Reg_2
bra $-6
nop
return
END
Modifié en dernier par satinas le mer. 26 sept. 2018 23:40, modifié 1 fois.
Soft de commande CNC en asm
Soft de commande CNC en asm
C'est vrai, il faut faire toutes les tempos avec le timer 0, et pour cela mettre un flag pour ne pas plus tenir compte du compteur jusqu'à 10, et passer d'un clignotement chaque seconde, à un clignotement toutes les 100ms du mode "erreur de transfert".
Mais comme j'avais des problèmes avec la durée de la seconde, j'ai préféré ne plus toucher à l'int timer.
Mais comme j'avais des problèmes avec la durée de la seconde, j'ai préféré ne plus toucher à l'int timer.
Soft de commande CNC en asm
- F6FCO
Expert- Messages : 1415
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonjour tous,
Désolé pour le retard de mes réponses mais comme je l'ai deja dit je n'ai plus d'internet cause demenagement. On vient de me le brancher mais seulement dans le chantier de réno. Là de suite je suis avec le portable sur des tréteaux à me battre avec un repeteur wifi qui ne veut pas fonctionner pour essayer d'avoir une connnection dans le gite ou je campe.
Pas simple et pas pratique.
Oui JMarc, tout à changé, ne tiens pas compte du formatage de mes trains, je travaille maintenant en 64bits. Le programme à bien avancé, l'avantage de ne pas avoir internet, on ne fait plus que de la programmation . Je vous en dirais plus et posterai le code quand je ne serai plus à genoux dans la poussière.
Désolé pour le retard de mes réponses mais comme je l'ai deja dit je n'ai plus d'internet cause demenagement. On vient de me le brancher mais seulement dans le chantier de réno. Là de suite je suis avec le portable sur des tréteaux à me battre avec un repeteur wifi qui ne veut pas fonctionner pour essayer d'avoir une connnection dans le gite ou je campe.
Pas simple et pas pratique.
Oui JMarc, tout à changé, ne tiens pas compte du formatage de mes trains, je travaille maintenant en 64bits. Le programme à bien avancé, l'avantage de ne pas avoir internet, on ne fait plus que de la programmation . Je vous en dirais plus et posterai le code quand je ne serai plus à genoux dans la poussière.
Soft de commande CNC en asm
- F6FCO
Expert- Messages : 1415
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Hello,
de nouveau à genoux dans la poussière, le pc portable posé sur deux agglos. C'est Week-end et j'ai laissé tomber la truelle.
JMarc, mes trains actuels (version définitive) sont composés de:
lettre X: 1 octet, valeurX: 8octets, espace: 1octet, lettre Y: 1octet, valeurY: 8octets, espace: 1octet, lettre Z: 1octet, valeurZ: 8octets, 2 interlignes: 2octets.
Les deux interlignes sur 2 octets pour justement passer dans les deux octets en trop et ne pas gréver les valeurs.
Le flux est contrôlé par deux macros qui gèrent le CTS: QRT qui indique au PC de cesser la transmission et QRV qui lui demande d'envoyer de nouveau.
Pour ceux que çà intéresse QRV et QRT font partie de la procédure en code morse pour justement demander de cesser ou reprendre la transmission, petit clin d'oeil à une autre de mes passions.
Mais comme ce n'est pas facile et confortable pour moi de forummer dans ces conditions j'ai mis à jour ma page web sur 4L1C3.
http://f6fco.pagesperso-orange.fr/4L1C3.htm
J'essaierai de venir converser avec vous dans la poussière de temps en temps
de nouveau à genoux dans la poussière, le pc portable posé sur deux agglos. C'est Week-end et j'ai laissé tomber la truelle.
JMarc, mes trains actuels (version définitive) sont composés de:
lettre X: 1 octet, valeurX: 8octets, espace: 1octet, lettre Y: 1octet, valeurY: 8octets, espace: 1octet, lettre Z: 1octet, valeurZ: 8octets, 2 interlignes: 2octets.
Les deux interlignes sur 2 octets pour justement passer dans les deux octets en trop et ne pas gréver les valeurs.
Le flux est contrôlé par deux macros qui gèrent le CTS: QRT qui indique au PC de cesser la transmission et QRV qui lui demande d'envoyer de nouveau.
Pour ceux que çà intéresse QRV et QRT font partie de la procédure en code morse pour justement demander de cesser ou reprendre la transmission, petit clin d'oeil à une autre de mes passions.
Mais comme ce n'est pas facile et confortable pour moi de forummer dans ces conditions j'ai mis à jour ma page web sur 4L1C3.
http://f6fco.pagesperso-orange.fr/4L1C3.htm
J'essaierai de venir converser avec vous dans la poussière de temps en temps
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 64 invités