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 le langage C !

Modérateur : Jérémy

Test terminal VBRAY en mode XON XOFF avec fichier Gcode
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1033
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#1 Message par paulfjujo » sam. 19 mai 2018 20:39

bonsoir,

je suis le fil concernant CNC coté ASM,
mais ayant déconnecté l'ASM pour le C, je poste ici
un test fait avec le terminal VBRAY , avec handshaking XON XOFF
et les codes usuels normalisés pour XOFF et XON

le programme , dans sa boucle principale , lit un ADC (EA0) et affiche sa valeur .
Cette boucle tourne via un delai de boucle de 1 sec.
Via le terminal Vbray on peut selectionner un fichier
ici "Gcode_liste.txt"
j'ai rajouté en fin de ligne un index numerique , uniquement pour faciliter le reperage sur le terminal .
des l'appuy sur la touche SEND , celui ci est envoyé ...

La reception UART est traitée via interruption ..
Un flag est levé des la reception d'un CR (0x0D) , qui correspond à la fin d'une ligne de GCode
et aussitot , dans l'interrupt, j' envoie un XOFF pour stopper, suspendre le flux d'envoi .
Dans la boucle principale on à tout le temps necessaire pour traiter cette ligne de Gcode, ici je ne fais que l'afficher
et rearme l'envoi (la suite) du fichier , en envoyant un XON au terminal
et ainsi de suite ,
on recupere chaque ligne du GCode .
puis à la fin d'envoi du fichier
la tache principale (de fond) retourne à son etat de latence :
afficher la mesure analogique

Pour la liaison au PC ( tourne sous WIN10) j'utilise un cordon Prolific classique TTL/USB 3 fils 0V, TX,RX
Terminal VBray voit le port serie virtuel en COM13 (19200,8,N,1)
CON'S :
Le plus gros defaut de Vbray est que le scroll texte ne marche plus sous WIN10 .. was OK sous XP.
Il faut effacer l'ecran pour voir la suite,
sinon, il y a l'option d'activer un fichier log qui capturera tout.
PRO'S :
mais il a aussi des macros, touches de fonctions, et langage simili pascal.

oops Je SAIS , c'est en C ! mais il y aura ,je pense aussi des amateurs en C, interessé comme moi ,par ce sujet captivant CNC .

:?: Nota : avec TeraTerm , je ne vois null part ou declarer le protocole XON XOFF ?

le code mikroC

Code : Tout sélectionner


 
#define Version "180519"

 #define Directory  "C:\\_MikroC\\_MesProjets_MikroC\\_18F26K22_46K22 "
 #define Project   "18F26K22_uart_test_Xon_XOFF.mcppi"
 #define Source     "_18F26K22_16Mhz_Uart1_test_XON_XOFF_"
 #define FOSC_INTERNE
 #define FOSC "16MHz"
 #define MCU  "18F26K22"
 #define POWER_Supply "2,5 to 5V"

 //ac:Pinout18F26K22
 // Hardware
 /*
 Pin 28 RB7  -----------------ICSP Data
 Pin 27 RB6  -----------------ICSP Clock
 Pin 26 RB5
 Pin 25 RB4
 Pin 24 RB3
 Pin 23 RB2
 Pin 22 RB1
 Pin 21 RB0
 Pin 20      VDD --------+5V
 Pin 19      Vss ---------Gnd
 Pin 18  RC7  RX UART  <-- Keyboard
 Pin 17  RC6  TX UART  --> Display    * mettre une pull up de 10K si RX non utilisée
 Pin 16  RC5
 Pin 15  RC4  SDA
 
 Pin 14 RC3 SCL
 Pin 13 RC2
 Pin 12 RC1
 Pin 11 RC0
 Pin 10 RA6  --> output fOSC/4
 Pin  9 RA7
 Pin  8 VSS ---------  Gnd
 Pin  7 RA5
 Pin  6 RA4  Output -- Led -- 2,7K --+Vcc
 Pin  5 RA3
 Pin  4 RA2 (DAC)
 Pin  3 RA1  Analog input EA1
 Pin  2 RA0  Analog Input EA0
 Pin  1 RE3 MCLR  Reset --------ICSP PGRM
 
*/
 
// config Bits
//P18F26K22_FOSC_interne_16Mhz.cfgsch
/*
CONFIG1H : $300001 : 0x0029
CONFIG2L : $300002 : 0x001F
CONFIG2H : $300003 : 0x003C
CONFIG3H : $300005 : 0x00BF
CONFIG4L : $300006 : 0x0081
CONFIG5L : $300008 : 0x000F
CONFIG5H : $300009 : 0x00C0
CONFIG6L : $30000A : 0x000F
CONFIG6H : $30000B : 0x00E0
CONFIG7L : $30000C : 0x000F
CONFIG7H : $30000D : 0x0040

*/

#define XOFF   19
#define XON    17

#define CLS 12
#define CR 13
#define LF 10
#define TAB 9
#define BACK 8

#define MAXLEN0 80
#define MAXLEN1 80
#define MAXLEN2 80

//sbit Led_Rouge at LATA4_bit  ;
#define Led_On_RA4 LATA4_bit      //tirage au +VCC via 2,7K
#define Led_On_RA4_Direction TRISA4_bit
#define ON 0
#define OFF 1


// Port Expander module connections
sbit  SPExpanderRST at RC0_bit;
sbit  SPExpanderCS  at RC1_bit;
sbit  SPExpanderRST_Direction at TRISC0_bit;
sbit  SPExpanderCS_Direction  at TRISC1_bit;


unsigned char TEXTE[MAXLEN0];
unsigned char buffer1[MAXLEN1];
unsigned char buffer2[MAXLEN2];
unsigned char * txt;
int i,j,k,l;
unsigned char Reglage;

unsigned char CRam1[32];
unsigned int Index;


unsigned int EA0;
unsigned int clk;
  
volatile char  c1
,c2;
volatile int DataReady1;
volatile int CptFO1,CptFE1;
volatile int Index1,i1;
int erreurs;


#define PI 3.141592653589793238
float df1;
float r1,r2,r3,r4;


//void Interrupts() iv 0x0008 ics ICS_AUTO 
void Interrupts_High() iv 0x0008 ics ICS_AUTO 
{   
  if
((RC1IE_bit==1)&& (PIR1.RC1IF==1)) // si une interruption UART1 arrive
  {
   c1 =RC1REG; // le lire => RAZ  RCIF
   if(RCSTA1.FERR==)
    {
     RCSTA1.SPEN = 0 ;
     CptFE1++;
     RCSTA1.SPEN= 1 ;
     c1=0;
    }
    if (RCSTA1.OERR==1)    // voir parag 16.1.26 p273
    {
       RCSTA1.CREN = 0 ;
       CptFO1++;
       RCSTA1.CREN = 1 ;
       c1=0;
    }
    if(c1 != CR )
    {
      buffer1[i1] = c1;
      Index1=i1;
      i1++;
       if (i1>(MAXLEN1-1))
       {
        TXREG=XOFF; // envoi XOFF
        DataReady1=2;
        RC1IE_bit=0;
        buffer1[i1-1]=0;
        Index1=i1;
        i1=0;

       }
      }
       else
        
{
        TXREG=XOFF; // envoi XOFF
         buffer1[i1] = 0;         //  0 a la fin du string
        DataReady1 = 1;      // drapeau Data recue
        Index1=i1;
        i1=0;

     }
   } //if PIR1
 }
 

void UART1_Write_CText
(const char *txt)
 {
   while (*txt)
      UART1_Write(*txt++);
 }

 
void Print_Cte_String 
(const char * q)
{
while(*
q)
{
UART1_Write(*q++);
}
}
 

void CRLF1
()
{
  UART1_Write(CR);
  UART1_Write(LF);
  }


void RAZ_UART1(void)
  {
  for (i1=0;i1<MAXLEN1;i1++) buffer1[i1]=0;
  DataReady1=0;
  Index1=0;
  buffer1[0]=0;
  RC1IE_bit=1;
  i1=0;
  c1=0;
 }

 
void main
() 
{
#ifdef FOSC_INTERNE

OSCCON = 0b01110010  ; //0x72 ;     //Oscillateur à 16Mhz
//OSCCON = 0b01100010  ; //0x62 ;     //Oscillateur à 8Mhz
//OSCTUNE.PLLEN=1
OSCTUNE=0;;
OSCTUNE.PLLEN=0;
while (OSCCON.HFIOFS==0); // wait stable oscillator
#else
// Q=20Mhz
#endif

ANSELA=3;
ANSELB=;
ANSELC=;
TRISB=0xFF;
TRISC=0b10010100;
TRISA=0b00000011;
Led_On_RA4_Direction=0;
Led_On_RA4=OFF;   // eteinte car tirage au +VCC via 2,7K
INTCON2.RBPU=0;      // enable Pull-up

i1=0;
Index1=0;
DataReady1=0;
CptFO1=CptFE1=0;
txt=TEXTE;

ADC_Init();
EA0 = ADC_Read(0);   // Get 10-bit results of AD conversion

UART1_Init(19200);  // Initalize USART (38400,8,N,1)
UART_Set_Active(&UART1_Read, &UART1_Write, &UART1_Data_Ready, &UART1_Tx_Idle);

Delay_ms(200);
UART1_Write(CLS);   // Erase screen terminal  :it is an option on Vbray Terminal!
CRLF1();
Print_Cte_String("MCU : " MCU"\r\n");
Print_Cte_String("Power supply: "POWER_Supply"\r\n");
Print_Cte_String("Directory : " Directory"\r\n");
Print_Cte_String("Projet : " Project"\r\n");
Print_Cte_String("Source : "Source"_"Version".c\r\n");
Print_Cte_String(" FOSC  : " FOSC"\r\n");
CRLF1()    ;

CptFO1=CptFE1==0;
RAZ_UART1();
RCON.IPEN=1   ; // enable priority levels
INTCON.PEIE = 1 ;
RC1IE_bit=1;
GIE_bit=1;
erreurs=0;
i=0;
Reglage=0;

Print_Cte_String("envoi XON\r\n");
UART1_Write(XON);

 do
 
{
  EA0 = ADC_Read(0);   // Get 10-bit results of AD conversion
  txt=TEXTE;
  sprintf(txt,"Test UART1  %3d  ADC0= % 5d  % 4XH\r\n",i,EA0,EA0);
  UART1_Write_Text(txt);
  erreurs= CptFO1+CptFE1;

  if(DataReady1==1)
  {
    txt=TEXTE;
    sprintf(txt,"envoi stopé par XOFF, Recept buffer1 = %s \r\n",buffer1 );
    UART1_Write_Text(txt);
    Print_Cte_String("envoi XON pour la suite du fichier \r\n");
    UART1_Write(XON);
    RAZ_UART1();
  }
   if (DataReady1==2)
  { 
   txt
=TEXTE;
   sprintf(txt,"Buffer1 UART1 Full = %05d \r\n",Index1 );
   UART1_Write_Text(txt);
   CRLF1();
   UART1_Write_Text(buffer1);
   CRLF1();
   Print_Cte_String("envoi XON\r\n");
   UART1_Write(XON);
   RAZ_UART1();
   } 
  Led_On_RA4
=!Led_On_RA4;
  Delay_ms(1000);
  i++;
}
while(
1);

}
 



Terminal_VBray_use_XON_XOFF.jpg



fichier Gcode_list.txt
GCODE
Text test
Z10
X10 Y10 Z10 1
X10 Y10 Z1 2
X10 Y10 Z0 3
X70 Y10 Z0 4
X70 Y70 Z0 5
X10 Y70 Z0 6
X10 Y10 Z0 7
X10 Y10 Z10 8
X10 Y0 Z10 9
X10 Y0 Z1 10
X10 Y0 Z0 11
X80 Y0 Z0 12
X80 Y80 Z0 13
X0 Y80 Z0 14
X0 Y0 Z0 15
X10 Y0 Z0 16
X10 Y0 Z10 FIN



fichier log recupéré

Code : Tout sélectionner


Terminal log file
Date
19/05/2018 19:58:04
-----------------------------------------------
þ
MCU 
18F26K22
Power supply
2,5 to 5V
Directory 
C:\_MikroC\_MesProjets_MikroC\_18F26K22_46K22 
Projet 
18F26K22_uart_test_Xon_XOFF.mcppi
Source 
_18F26K22_16Mhz_Uart1_test_XON_XOFF__180519.c
 FOSC  
16MHz
Test Reglage OSCTUNE
avec Freq meter sur RA6 
Clock initiale in Khz 
16000 

envoi XON
Test UART1    0  ADC0
=  1023   3FFH
Test UART1    1  ADC0
=   950   3B6H
Test UART1    2  ADC0
=   932   3A4H
Test UART1    3  ADC0
=   919   397H
Test UART1    4  ADC0
=   904   388H
Test UART1    5  ADC0
=   886   376H
Test UART1    6  ADC0
=   873   369H
Test UART1    7  ADC0
=   867   363H
Test UART1    8  ADC0
=   867   363H
Test UART1    9  ADC0
=   869   365H
Test UART1   10  ADC0
=   875   36BH
envoi stopé par XOFF
Recept buffer1 CODE 
envoi XON
Test UART1   11  ADC0
=   883   373H
envoi stopé par XOFF
Recept buffer1 Text test 
envoi XON
Test UART1   12  ADC0
=   917   395H
envoi stopé par XOFF
Recept buffer1 Z10 
envoi XON
Test UART1   13  ADC0
=   975   3CFH
envoi stopé par XOFF
Recept buffer1 10 Y10 Z10 1 
envoi XON
Test UART1   14  ADC0
=   976   3D0H
envoi stopé par XOFF
Recept buffer1 X10 Y10 Z1  2  
envoi XON
Test UART1   15  ADC0
=   972   3CCH
envoi stopé par XOFF
Recept buffer1 X10 Y10 Z0  3  
envoi XON
Test UART1   16  ADC0
=   949   3B5H
envoi stopé par XOFF
Recept buffer1 70 Y10 Z0  4 
envoi XON
Test UART1   17  ADC0
=   941   3ADH
envoi stopé par XOFF
Recept buffer1 70 Y70 Z0  5 
envoi XON
Test UART1   18  ADC0
=   933   3A5H
envoi stopé par XOFF
Recept buffer1 10 Y70 Z0  6 
envoi XON
Test UART1   19  ADC0
=   925   39DH
envoi stopé par XOFF
Recept buffer1 10 Y10 Z0  7 
envoi XON
Test UART1   20  ADC0
=   916   394H
envoi stopé par XOFF
Recept buffer1 10 Y10 Z10 8  
envoi XON
Test UART1   21  ADC0
=   897   381H
envoi stopé par XOFF
Recept buffer1 10 Y0 Z10  9    
envoi XON
Test UART1   22  ADC0
=   871   367H
envoi stopé par XOFF
Recept buffer1 10 Y0 Z1   10 
envoi XON
Test UART1   23  ADC0
=   869   365H
envoi stopé par XOFF
Recept buffer1 10 Y0 Z0   11 
envoi XON
Test UART1   24  ADC0
=   875   36BH
envoi stopé par XOFF
Recept buffer1 80 Y0 Z0   12 
envoi XON
Test UART1   25  ADC0
=   892   37CH
envoi stopé par XOFF
Recept buffer1 80 Y80 Z0  13 
envoi XON
Test UART1   26  ADC0
=   919   397H
envoi stopé par XOFF
Recept buffer1 X0 Y80 Z0   14 
envoi XON
Test UART1   27  ADC0
=   961   3C1H
envoi stopé par XOFF
Recept buffer1 X0 Y0 Z0    15 
envoi XON
Test UART1   28  ADC0
=   983   3D7H
envoi stopé par XOFF
Recept buffer1 10 Y0 Z0   16 
envoi XON
Test UART1   29  ADC0
=   979   3D3H
envoi stopé par XOFF
Recept buffer1 10 Y0 Z10  FIN 
envoi XON
Test UART1   30  ADC0
=   980   3D4H
envoi stopé par XOFF
Recept buffer1 =  
envoi XON
Test UART1   31  ADC0
=   917   395H
envoi stopé par XOFF
Recept buffer1 =  
envoi XON
Test UART1   32  ADC0
=   893   37DH
Test UART1   33  ADC0
=   872   368H
Test UART1   34  ADC0
=   867   363H
Test UART1   35  ADC0
=   881   371H
Test UART1   36  ADC0
=   918   396H
Test UART1   37  ADC0
=   972   3CCH
Test UART1   38  ADC0
=   984   3D8H
Test UART1   39  ADC0
=   982   3D6H
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Test terminal VBRAY en mode XON XOFF avec fichier Gcode
Temps-x
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 880
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » dim. 20 mai 2018 00:37

Bonsoir paulfjujo, et tout le forum,


Le XOFF et XON ne son pas une obligation parce qu'on pratique un checksum, qui est calculé sur tout les octets précédents voir ICI.

Rien n'empêche de créer un programme sur PC pour envoi des donnés, et d'avoir son propre protocole, mais cela ne sera pas intégrés
dans usart du PIC, donc obligé de réinventé la roue. :roll:

Merci d'avoir ouvert ce post pour évité de pollué ASM, j'espère que tu auras du monde qui viendrons de ton coté, Jérémy
sera ravi de participer, car maintenant il en à une, et lui il pratique le C++ :langue:

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Test terminal VBRAY en mode XON XOFF avec fichier Gcode
satinas
Passioné
Passioné
Messages : 285
Enregistré en : novembre 2015

#3 Message par satinas » dim. 20 mai 2018 07:22

Bonjour,
Le Xon /Xoff c'est un contrôle de flux logiciel. Il évite les fils supplémentaires, mais il impose d'envoyer dans le flot de données 2 octets de contrôle STOP et RESTART pour moduler le trafic. Il ne faut donc pas que ces 2 octets figurent dans les datas transmises.

Dans notre cas, je pense qu'il est plus simple de demander ligne par ligne, ça ne surcharge pas du tout le pic, car envoyer de temps en temps ACK, c'est rien du tout. Il n'y a même pas à attendre qu'il soit parti, on passe tout de suite à autre chose. On a juste écrit un registre.

On a réinventé un protocole, mais cela n'a pas été trop dur :) Dans tous les cas, le pic doit calculer un checksum. La aussi ce sera simple si on conserve le checksum de Tera Term. En fait il fait la somme des octets du paquet. Donc le pic des qu'il reçoit un paquet par irq, calcule la somme à la volée, et dès que le nombre d'octets du paquet (qui figure dans les premiers octets du paquet) est atteint, il compare le dernier octet avec le checksum calculé, et c'est fini. Il pourra éventuellement gérer un buffer, mais je vois pas trop l'intérêt, vu que l'élément lent de la chaîne PC->Pic->CNC , c'est le dernier, la machine CNC.

Le problème dans tout ça, c'est de demander à un 18F de faire des math :)
gcode_1.1.ttl.txt



Paul,
dans Tera Term tu peux régler le contrôle de flux, une fois la communication série établie, par le menu Setup/Serial port
pour les macros, il y a l'instruction "setflowctrl"
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Test terminal VBRAY en mode XON XOFF avec fichier Gcode
Jérémy
Administrateur du site
Administrateur du site
Messages : 2112
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » dim. 20 mai 2018 09:27

Hello ici ,

Super idée Paul ton post !

Je vais bien évidemment le suivre avec grand intérêt !.

Mais j'avoue que je ne compte pas m'y frotter pour plusieurs raisons. C'est vraiment passionnant les CNC ( un peu comme la robotique), mais je sais déjà que cela va prendre énormément de temps. De plus j'en ai une maintenant ! bien sur un jour ( peu être proche qui sait) je devrais forcement la modifier (changer la carte de contrôle, l'alim , le moteur etc ..). Pour le moment je préfère faire plein de petits projets plutôt qu'un gros !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Test terminal VBRAY en mode XON XOFF avec fichier Gcode
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1033
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#5 Message par paulfjujo » dim. 20 mai 2018 13:16

satinas a écrit :Le Xon /Xoff c'est un contrôle de flux logiciel. Il évite les fils supplémentaires, mais il impose d'envoyer dans le flot de données 2 octets de contrôle STOP et


si les datas GCode sont en ascii , donc dans la plage des caracteres imprimables
0x30 pour '0' ...pour les chiffres . et Alphabet >= 0x20
pourquoi les code originaux XON ,XOFF seraient à éviter ?

dans Tera Term tu peux régler le contrôle de flux, une fois la communication série établie, par le menu Setup/Serial port
pour les macros, il y a l'instruction "setflowctrl"


En effet, il faut que la COM soit déja activée pour pouvoir modifier le protocole
Bizarre aussi qu'on ne puisse sauvegarder la config via TERATERM.INI
contrairement avec terminal VBRAY .
ou y a-t-il un autre moyen en passant un parametre dans la commande Tterm.exe ?


correctif:
oops en fait le fichier Teraterm.ini modifié n'était pas dans le bon directory
la config est donc bien sauvegardée.

sinon test avec Teraterm et envoi de fichier ..ligne par ligne ...OK
Modifié en dernier par paulfjujo le dim. 20 mai 2018 14:27, modifié 2 fois.

Test terminal VBRAY en mode XON XOFF avec fichier Gcode
satinas
Passioné
Passioné
Messages : 285
Enregistré en : novembre 2015

#6 Message par satinas » dim. 20 mai 2018 14:13

pourquoi les code originaux XON ,XOFF seraient à éviter ?

J'ai pas dit qu'ils seraient à éviter, mais qu'on peut pas tout faire, par exemple envoyer du binaire. Dans notre cas, en fait, aucun problème.
En fait, j'ai un peu de mal à suivre, je réponds souvent du tac au tac sans regarder ce qu'il y a au dessus :)


Retourner vers « Langage C »

Qui est en ligne

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