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

Idée pour s'entrainer sur l'UART ?
patou149
Débutant
Débutant
Messages : 35
Enregistré en : octobre 2015

#51 Message par patou149 » mer. 16 déc. 2015 20:51

une autre solution (peut être ?)

Code : Tout sélectionner


char Rx_Data
[6];  
char mystring0
[]="azerty"   ;



 while (1){
 for (i=0;i<6;i++)
    {
        UART1_Write(mystring0[i]);
        if (UART1_Data_Ready() == 1) {
            UART1_Read(Rx_Data[i]);
            
        
}
    }
    Lcd_Out (1,1,Rx_Data);
 delay_ms(1000);
 Lcd_Cmd(_LCD_CLEAR);
}
 


Ne pas oublier toute la partie concernant le lcd (décalrations, init, ...)
attention n'étant pas un spécialiste de mikroc il y sûrement des erreurs de syntaxe.

Idée pour s'entrainer sur l'UART ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#52 Message par Jérémy » mer. 16 déc. 2015 20:52

J'avance un peu, mais ça bloque encore .

Avec le premier code de Paul, l'écran affichait n'importe quoi sur toutes les lignes.

J'ai modifier cette ligne :

Code : Tout sélectionner

Lcd_Out( 1,1,c1);

PAR

Code : Tout sélectionner

Lcd_Chr( 1,1,c1); 


OOhhh miracle j'ai un y qui s'affiche sur la première ligne de la première colonne . Je me dis que toutes les lettres se sont écrites les unes sur les autres , et donc on finit sur le y.

Je décide encore de modifier cette ligne

Code : Tout sélectionner

Lcd_Chr( 1,1,c1);

PAR

Code : Tout sélectionner

Lcd_Chr( 1,i+=1,c1); 


Et la j'obtiens : azy

Bizarre non !!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Idée pour s'entrainer sur l'UART ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#53 Message par Jérémy » mer. 16 déc. 2015 21:33

Alors Patou149 bravo !!! .

Après modification de ton code, ta solution fonctionne.
Tu as réussis a faire ce que je cherchais à faire au début , en décortiquant la phrase lettre par lettre, et à les affichées au fur et à mesure.

Je ne sais pas ce qu'en pense les autres nous verrons bien, pour ma part c'est cool , mais c'est juste esquiver un peu le probléme sans utilisé le fameux UART1_Write_Text("azerty"); .
Après si ça fait pareil je suis preneur. ça mérite certainement un peu de customisation :D voila un programme qui m'affiche" azerty" correctement:

Code : Tout sélectionner

 while (1)
{
 for (
i=0;i<7;i++)     // on effectue l'envoi lettre par lettre
    
{
        
UART1_Write(mystring0[i]);    // on envoie la lettre
        
if (UART1_Data_Ready() == 1)  // On attend de recevoir quelque chose
           
{
               
Rx UART1_Read();     // On stocke notre lettre dans un Int
               
Lcd_Chr (1,i,Rx);      // On l'affiche sur le LCD ( pas besoin de conversion avec Lcd_Chr)
           
}
    }

     
delay_ms(1000);
     
Lcd_Cmd(_LCD_CLEAR);
     
delay_ms(500);
 } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Idée pour s'entrainer sur l'UART ?
patou149
Débutant
Débutant
Messages : 35
Enregistré en : octobre 2015

#54 Message par patou149 » mer. 16 déc. 2015 21:45

En utilisant :
Jérémy a écrit :Source du message UART1_Write_Text("azerty");
tu transmets 6 caractères comme il y a 2 buffers en réception tu ne peux récupérer que les deux premiers caractères soit "az" les autres sont perdus.
Donc l'utilisations de UART1_Write_Text avec le rebouclage semble impossible même en utilisant les IT.

Idée pour s'entrainer sur l'UART ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#55 Message par Jérémy » mer. 16 déc. 2015 21:50

Ahhh d'accord , je crois que j'ai compris . Je pensais qu'un buffer était une zone mémoire, mais ene fait on peut y stocker que 1octet par buffer ?

sans vouloir t'embeter tu as vu ca dans la DS ? à la page 275 ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Idée pour s'entrainer sur l'UART ?
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#56 Message par Claudius » mer. 16 déc. 2015 21:57

Bravo à tous les 2,

Effectivement, je pense que votre gestion caractère par caractère est la bonne car on ne sait pas ce qu'il y a derrière cette méthode UART1_Write_Text(). Je crains même qu'il y ait un écrasement à l'émission du fait de la longueur de la chaine "azerty" le temps de passer dans la routine de réception, ce qui expliquerait la réception de "azy" car seul "azy" est ... parti ;-).

D'ailleurs, leur exemple s'appuie sur une chaine "OK" et en plus à 4800 bauds composée de 2 seuls caractères qui est le tampon des UART dans les PICs (acceptation d'écrire un caractère alors qu'un autre est en cours d'émission).

Par contre UART1_Write_Text() doit bien fonctionner hors cas de rebouclage car dans ce cas le PIC n'a que cela à faire et pour peu que le récepteur extrait les caractères reçus mais à priori c'est le cas.

Bravo encore...

Idée pour s'entrainer sur l'UART ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#57 Message par Jérémy » mer. 16 déc. 2015 22:02

Nickel tu valide aussi la méthode , c'est cool . ca avance !!! .

Vous avez un autre exercice que je m'entraine cette nuit ? le RTS ou CTS je sais plus trop ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Idée pour s'entrainer sur l'UART ?
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#58 Message par Claudius » mer. 16 déc. 2015 22:19

Euuh, si je puis me permettre, utilisation de UART1_Tx_Idle() ce qui évite justement les écrasements à l'émission et d'enchainer l'émission des caractères au plus près de la vitesse réelle de la liaison.

D'ailleurs, cette méthode ou équivalente est indispensable pour une gestion sous interruption comme la UART1_Data_Ready().

Sur ce, bonne nuit ;-)

Idée pour s'entrainer sur l'UART ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#59 Message par Jérémy » mer. 16 déc. 2015 22:30

Ok je bosse ca ! bonne nuit et encore merci
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Idée pour s'entrainer sur l'UART ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#60 Message par Jérémy » mer. 16 déc. 2015 23:56

Alors j'ai lu les fonctions de Claudius !.

Et je me pose des questions :
UART1_Tx_Idle() nous permet de savoir si une donnée à été transférer !
- 1 la donnée à bien été transférée
- 0 si ce n'est pas le cas

de l'autre coté on à :
UART1_Data_Ready(); qui nous permet de connaitre si la donnée dans le buffer est prête à être lue
- 1 La donnée est prête à être lue
- 0 Le registre de réception est vide

Mais dans notre exemple cela fait doublon ? non ?
Oui car si une donnée est prête à être lue , c'est forcement qu'elle à bien été transférée. Si on en test un , nous ne sommes pas obligé de tester l'autre si ?
Après re-lecture : peut-être que , Si la donnée à été transférée ET qu'une nouvelle donnée est prête à être lue alors on y va ? ce ne serait pas cela les conditions de l’interruption?

Une autre remarque que je n'arrive pas à faire fonctionner.
Quand j'écris du texte , plus court que 16 caractères , à la place de mettre du vide ( des espaces), il me remplit l’écran de caractères "hasardeux" .
j'ai essayé d’arrêté la fonction quand on trouve un '/0' mais sans succès ! verriez-vous une solution propre pour palier à cela .

Code : Tout sélectionner

/*##################################################################################
Programme de test pour liaison UART sur carte EasyPIC_V7
Fait par Jérémy pour FantasPic.fr
- Version du "15-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
#################################################################################*/

// 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  ------------------------------------------
unsigned char i=;
char Texte[16];
// Fin des varaibles---------------------------------------------------------------

// Prototypes  --------------------------------------------------------------------
 void envoi_texte (char *texte);
// FIN Prototypes

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

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

    TRISB = 0x00;              // PORTB en sortie

    UART1_Init(4800);          // 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)
 {
   envoi_texte ("azerty");
      delay_ms(1000);
   envoi_texte ("Hello World !   ");
     delay_ms(1000);

  }
}

//##################################################################################
//#########################      PROGRAMME SECONDAIRE       #########################
//##################################################################################

// Fonction : afficher du Texte envoyé sur l'UART
// Param d'entrée : Une chaine de caractére
void envoi_texte (char *texte)
  {
      for (i=0;i<17;i++)     // boucle pour la largeur d'une ligne du LCD
        {
           UART1_Write(Texte[i]);    // on envoie une lettre de la chaine

           if (UART1_Data_Ready())         // Si une donnée est prête aà être lue
               Lcd_Chr (1,i,UART1_Read()); // On l'affiche sur le LCD ( pas besoin de conversion avec Lcd_Chr)
        }
   }
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 42 invités