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

communication PC-PIC par USB-UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#21 Message par Jérémy » sam. 19 déc. 2015 11:37

Pour ton LCD, tu ne crois pas qu'il serait bien temps de te mettre a debug ? une fois que tu vas goutter, tu seras comme ME impossible sans mon debug

J'ai essayé plusieurs fois , mais sa m'as saoulé, car il se passe un truc bizarre, le programme ouvre, et rentre dans un nouveau fichiers , avec les commandes ASM, et impossible d'en sortir.

j'avoue ne pas avoir trop creuser encore, car je n'en ai pas eu trop besoin disons !.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

communication PC-PIC par USB-UART
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#22 Message par paulfjujo » sam. 19 déc. 2015 12:06

bonjour,


Code : Tout sélectionner


void interrupt 
(){
    if (PIR1.RC1IF==&& UART1_Data_Ready()){  // On check le FLAG de l'INT et le buffer
        UART_Read_Text(Rx_buffer, "OK", 20);   // On enregisre le text
        Lcd_out (1, 1, Rx_buffer );            // On l'affiche
        PIR1.RC1IF = 0;                        // On réarme
     }
}


tu ne t'y prends pas bien dans ce cas de figure, puisque Uart_read_Text... attendra jusqu'à ce que tu aies 20 caracteres ou renconté OK
Une gestion d'interruption ne doit pas etre bloquante .
RCIF suffit pour detecter l'interrupt, on peut y rajouter RC1IE pour verif si autorisé
precaution pour la suite .. si on rajoute d'autres sources d'interruptions..
On recupere le caractere dispo dans RCREG ( ayant causé l'interrupt !)
et on le range (via un index de position) dans le buffer..
Il faut par contre un delimiteur pour détecter la fin de transmission (ou validation)
ce peut etre le 'K' de "OK" (ou chosir CR =touche ENTER)
pour armer un flag qui sera utilisé dans le programme principal


Code : Tout sélectionner


void interrupt 
(){
    if (PIR1.RC1IF==1) && (RC1IE_bit))  // On check le FLAG de l'INT
    {  
      
// il manque ici
      // la gestion des erreur OERR 
      // et FERR
        
       c1
=RCREG;  // lecture registre UART
       buffer[index]=c1;
       index++;
       // si on detect la fin de lmmessage par K ou si on atteint la fin du buffer 
       if ((c1=='K') || (index >=20))
       {
          buffer[index]=0; // terminateur de string
          Index=0;
          Flag_Data_OK=1; 
          RC1IE_bit
=0;  //  *option pour bloquer la reception tant qu'on a pas utilisé le resulat du buffer
        }  
    
//     PIR1.RC1IF = 0;          // On réarme <- NON, c'est la lecture de RCREG qui efface ce drapeau
     }
}


// ...init 
char c1;
int index;
int Flag_Data_OK;

index=0;
 Flag_Data_OK=0;

//... dans le main 
   while(1)
   {
  ....
    if (Flag_data_OK==1)
    {
      ... affiche sur LCD ..
      ...etc ...
      Flag_data_OK=0;
      RC1IE_bit=1; // *option pour rearmer l'autorisation de reception
      }
....
  }  // while





il y a d'autres variantes pour gerer un buffer circulaire .. etc..


une alternative à l'interface utilisé sur ta carte (post #1)
un cordon USB/TTL liaison directe USB vers UART PIC
voir ICI
Aide toi, le ciel ou FantasPic t'aidera

communication PC-PIC par USB-UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#23 Message par Jérémy » dim. 20 déc. 2015 22:19

paulfjujo a écrit :Source du message une alternative à l'interface utilisé sur ta carte (post #1)
un cordon USB/TTL liaison directe USB vers UART PIC
voir ICI


J'en ai un , mais pour le moment restons sur la simplicité.

On recupere le caractere dispo dans RCREG ( ayant causé l'interrupt !)

Je comprends pas. Quand on envoie une chaine de caracteres ,on envoie octet par octet. Donc il y aura autant d'INT que de caractères ?

et on le range (via un index de position) dans le buffer..

La c'est l'index de position que je ne comprends pas ?

Il faut par contre un délimiteur pour détecter la fin de transmission (ou validation)

Ce n'est pas l'absence de réception qui peut faire office de détection de fin de transmission ? certainement pas fiable !

Pour resumer ton programme puis-je ecrire

  • INT sur flag de réception de donnée. On sait qu'on reçoit car le RCREG1 à été rempli ( effacé automatiquement quand lu) page 119
  • On enregistre le RCREG1 dans une variable (ici "c1"). Pourquoi pas directement dans le buffer ?
  • On enregistre notre variable dans le tableau-buffer, en prenant soin de la placée suivant un index dans notre tableau-buffer pour les rangées dans l'ordre.
  • on incrémente l'index pour passer a la data suivante
  • Et on continu, continu , continu
  • jusqu’à arriver à 20 ou sur un caractère particulier ( ici "K") bon faut pas qu'il y ai de "K" dans notre mot :o
  • On remet l'index de notre tableau-buffer à 0 pour la trame suivante
  • On met lève un drapeau, pour signifier qu'un mot est arrivé correctement !
  • Option: on réarme pas l'INT si on pas traiter le mot dans le buffer.
  • Après réception du la lettre "K" ou 20 caractères ( à définir), on traite notre drapeau de retour au programme principale. affichage du mot ou traitement.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

communication PC-PIC par USB-UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#24 Message par Jérémy » dim. 20 déc. 2015 23:00

Jérémy a écrit :Source du message Pourquoi pas directement dans le buffer ?

Car en lisant le registre on efface le buffer, donc on ne peut plus utiliser ce registre . La première chose à faire dans ce cas de figure , sera toujours d’enregistrer notre registre, à mon avis.

Rohhhh ca ne fonctionne pas .

Encore une maudite coquille c'est pas vrai ! je vais chercher avec le debugger , mais je sais pas m'en servir , enfin faudra bien que je m'y mette quiand les programmes vont devenir plus complexes .

En attendant voici mon programme .
Je n'ai que la premiere lettre d'un mot envoyé qui s'affiche .

Code : Tout sélectionner

/*##################################################################################
Programme de test pour liaison UART-USB sur carte EasyPIC_V7 avec PC
Fait par Jérémy pour FantasPic.fr
- Version du "18-12-2015"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC à 8MHZ, Quartz extrene de 8Mhz, PLL désactivée
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
- manuel et schéma de la carte : http://www.mikroe.com/downloads/get/1711/easypic_v7_manual_v104c.pdf
#################################################################################*/

#define BP PORTD.B0

// Connections de l'écran LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin connections LCD

// Déclaration des  variables utilisées  ------------------------------------------
int Rx_buffer[16] ;
int Registre, index=0, Flag_Data_OK=0, i;

// Fin des varaibles---------------------------------------------------------------

// Prototypes  --------------------------------------------------------------------
// FIN Prototypes

// Début Interruption---------------------------------------------------------------
void interrupt (){
   if ((PIR1.RC1IF==1) && (RC1IE_bit)) // On check le FLAG de l'INT et si elle est autorisée
      {
        Registre=RCREG1;               // On lit et enregistre le registre UART  qui a donné lieu à l'INT
        Rx_buffer[index]=Registre;     // On enregistre le registre dans le buffer
        index++;                       // On incremente l'index pour la recept suivante

       if ((Registre=='K') || (index >=16)) // Si on recoit la lettre "K" ou depasse la taille du buffer
          {
           Rx_buffer[index]=0;         // On place un 0 pour indiqué la fin d'un string
           Index=0;                    // On RAZ notre index
           Flag_Data_OK=1;             // On lève le flag, pou indiqué que le mot est complet
          }
      }
}
// Fin Interruption ---------------------------------------------------------------

//##################################################################################
//#########################      PROGRAMME PRINCIPAL       #########################
//##################################################################################
void main() {

    ANSELB = 0x00;             // Configure le PORTB en digital pour le LCD
    ANSELC = 0x00;             // PORTB en digital
    ANSELD = 0x00;             // PORTB en digital

    TRISB = 0x00;              // PORTB en sortie
    TRISC = 0x00;              // PORTC en sortie
    TRISD = 0xFF;              // PORTD en entrée

//----- config. interrutpion ------------------------------------------------------
 INTCON.GIE = 1;           // Activation Global des INT
 INTCON.PEIE = 1;          // Active l'INT sur periphérique
 PIE1.RC1IE = 1;           // Active l'INT sur reception EUSART
 PIR1.RC1IF = 0;           // bit=0 --> buffer vide
 //PIE1.TX1IE = 0;           // Active l'INT sur l'émission EUSART
 //PIR1.TX1IF = 1;           // bit=0 --> buffer plein
//---------------------------------------------------------------------------------

    UART1_Init(300);          // Initialisation de l'UART
    delay_ms(100);             // Petite pause

    Lcd_Init();                // Initialisation du LCD
    Lcd_Cmd (_LCD_CLEAR);      // On efface l'écran
    Lcd_Cmd (_LCD_CURSOR_OFF); // On arrete le clignotement du curseur
    delay_ms(100);             // Petite pause

//#######################    BOUCLE INFINIE     ####################################
 while (1)
 {

    if ((BP==1) && (UART1_Tx_Idle() == 1))  // Check le BP et le buffer
       {
            UART1_Write_Text("Hello World !");  // Envoie du texte
            UART1_Write(10);                    // Envoie un CL
            UART1_Write(13);                    // envoie un CR
            while (BP==1);                      // Anti rebond
       }
    if (Flag_data_OK==1)  // Si la drapeau de fin de trame, on affiche le mot stocker dans le buffer
       {
          Lcd_out (1, 1, "Rx_buffer=" );
          Lcd_out (2, 1, Rx_buffer );  // On l'affiche
          Flag_data_OK=0;              // On RAZ le flag
       }
  }
}

//##################################################################################
//#########################      PROGRAMME SECONDAIRE       #########################
//##################################################################################  
C'est en faisant des erreurs, que l'on apprend le mieux !!!

communication PC-PIC par USB-UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#25 Message par Jérémy » lun. 21 déc. 2015 00:46

Niveau débugger, j'ai rien compris ; c'est vraiment pas intuitfi pour le coup.

Je croyais que j'allais pouvoir pas à pas mon programme avec les valeurs des registres, que nini ; le truc en fait qu'a ca tête . allez je file au lit !!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

communication PC-PIC par USB-UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#26 Message par Jérémy » lun. 21 déc. 2015 12:23

Bon quelques chose se passe mal , je vais reprendre depuis le début .....
C'est en faisant des erreurs, que l'on apprend le mieux !!!

communication PC-PIC par USB-UART
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#27 Message par paulfjujo » lun. 21 déc. 2015 17:09

bonjour,



probleme sur le test :

Code : Tout sélectionner

Registre=='K'

test plutot

Code : Tout sélectionner

if ( ( Registre==13) || ( Registre==10) || (index>=16))


Comment fais-tu ce test ... en bouclant 2 et 3 (TX et RX) DB9 ?
PAS BIEN !
Un vrai test , c'est en envoyant "Hello Worrld!" (ou n'importe quoi ! ) depuis un clavier (pas par le PIC sur lui meme)
il est alors correctement recu via l'interrupt et le rangement dans le buffer
et affiché sur le LCD.



Ou alors avec 2 montages identhiques ?
le 1er PIC envoye Hello World au 2em PIC
Qui le recoit et le renvoit au 1er PIC
Aide toi, le ciel ou FantasPic t'aidera

communication PC-PIC par USB-UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#28 Message par Jérémy » lun. 21 déc. 2015 17:22

Hello world, euhhh pardon Paul, :D

Je perd la tête car j'y suis depuis ce matin. et le fonctionnement est ératique et non prévisible .

Pour le hard, non j'ai connecté la carte EasypicV7 par un cordon USB d'un coté ( qui va sur le PC) et en embout carré style "imprimante" qui va sur ma carte .
schéma en page 17

En fait je galère je pense avec le registre et le buffer . je confonds un peu tout , en plus l'affichage sur LCD me facilite pas la tache .

En émission je n'ai aucun problème .

Pour la réception , j'utilise le logiciel de MikroC USART terminal dans tool .
J'ait un doute sur la fiabilité du logiciel qui plante régulièrement quand j’éteins ma carte .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

communication PC-PIC par USB-UART
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#29 Message par paulfjujo » lun. 21 déc. 2015 18:45

schema
donc avec swith orienté cote FTDI et selection RC6 et RC7 ... OK


Init à 300 bauds ..me semble trop bas !
j'ai testé à 2400 bauds .. 19200 bds .. OK
Aide toi, le ciel ou FantasPic t'aidera

communication PC-PIC par USB-UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#30 Message par Jérémy » lun. 21 déc. 2015 18:49

ok pou le 300 bauds . je mettais dis qu'ainsi y'aurait aucun loupé .

en fait je vois ce qui se passe sans le comprendre lol .

Je pense que mon code se bloque . car tout se passe bien , jusque je provoque volontairement du nombre de index . ca s’affiche bien, mais après je n'arrive plus à recevoir .

J'ai fais beaucoup de modifs aujourd'hui pour essayer de comprendre ...... mais avec les enfants dans les pattes, c'est un peu galère .Je vais bosser dur ce soir et cette nuit pour avancer un peu quand il seront au dodo et madame devant la télé .....

j'ai testé à 2400 bauds .. 19200 bds .. OK

Le post en #22 tu l'as tésté ?
==> Si oui cela viendrais donc du logiciel ou dune combinaison de redemarrag/reset ..
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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