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 :

#191 Message par F6FCO » mar. 21 août 2018 11:38

venom a écrit : :lol: J'adore l'idée. Voici la nouvelle façon de faire ses pcb en 2018 :bravo:


Oui je suis en train de virer Cromagnon, mes prochains PCB seront en bois et j'espère passer rapidement à la pierre :wink:
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

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 :

#192 Message par F6FCO » mar. 25 sept. 2018 19:05

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 :sad:, 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 :-D
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 :sifflotte: ):

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.

al44.JPG


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.

al45.JPG

al46.JPG


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.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Soft de commande CNC en asm
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#193 Message par JMarc » mar. 25 sept. 2018 23:42

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 ?



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
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#194 Message par F6FCO » mer. 26 sept. 2018 09:44

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.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Soft de commande CNC en asm
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#195 Message par JMarc » mer. 26 sept. 2018 19:12

Bonjour tout le monde

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 :sifflotte:

Soft de commande CNC en asm
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#196 Message par satinas » mer. 26 sept. 2018 21:51

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

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
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#197 Message par JMarc » mer. 26 sept. 2018 23:20

Bonjour Satinas et tout le monde

La commande btg led
Est dans le programme principal est aussi dans l’interruption donc double emplois

Pour l’instant je ne fait que lire pour refaire travailler ma mémoire

Soft de commande CNC en asm
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#198 Message par satinas » mer. 26 sept. 2018 23:41

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.

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 :

#199 Message par F6FCO » sam. 6 oct. 2018 12:16

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 :-D . Je vous en dirais plus et posterai le code quand je ne serai plus à genoux dans la poussière.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

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 :

#200 Message par F6FCO » sam. 6 oct. 2018 16:12

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 :sifflotte:
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Roger et 49 invités