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 ?
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#61 Message par Claudius » jeu. 17 déc. 2015 10:21

Bonjour,

Par rapport à tes besoins, ci-après les évolutions de la fonction envoi_texte() commentée ainsi que les chaines que tu souhaites afficher sur le LCD avec un padding à blanc:

Code : Tout sélectionner

...
   // Envoi et affichage des 6 caractères "azerty" complété de blancs pour remplir les 16 positions de la ligne du LCD
   envoi_texte ("azerty");
...
   // Envoi et affichage des 13 caractères "Hello World !" complété de blancs pour remplir les 16 positions de la ligne du LCD
   envoi_texte ("Hello World !");
...
   // Envoi et affichage limité aux 16 caractères "0123456789ABCDEF" car la longueur du texte est > à la ligne du LCD ;-)
   envoi_texte ("0123456789ABCDEFGHIJKL...");
...

void envoi_texte (char *texte)
{
    char i;

    // cf. 'http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/ansi_string_library.htm#strlen'
    // avec un cast car strlen() retourne un int ;-)
    for (i = 0; i < (char)strlen(texte) && i < 17; i++)     // Envoi des caractères de la chaine limité à 16 caractères
    {
        // If the previous data has been shifted out, send next data
        // cf. 'https://www.mikroe.com/helpdesk/index.php?/Knowledgebase/Article/View/157/0/uart-library-mc-pro-for-pic#uart1_tx_idle')
        if (UART1_Tx_Idle() == 1) {
            UART1_Write(texte[i]);  // on envoie une lettre de la chaine
        }

        while (1) {  // Attente que la donnée soit reçue
            if (UART1_Data_Ready()) {              // Si une donnée est prête à être lue
                Lcd_Chr (1, i, UART1_Read()));     // On la lit, l'affiche sur le LCD et on sort pour la suite
                break;
            }
        }
     }

     // Complément éventuel avec des espaces
     for ( ; i < 17; i++) {
          Lcd_Chr (1, i, ' ');
     }
}

Remarque: Les protections if (UART1_Tx_Idle() == 1) et while (1) { // Attente que la donnée soit reçue peuvent paraitre inutiles mais il ne faut jamais écrire dans le buffer de transmission si celui-ci n'est pas vide et il y a aucune raison que la donnée reçue soit disponible dès lors que le programme passe sur if (UART1_Data_Ready()). Ne pas oublier que nous sommes dans un cas ici où l'émission et la réception sont totalement synchrones du fait du rebouclage.

Je t'invite à tester ton précédent code avec une vitesse très basse comme 1200 bauds...

NB: Code non compilé et non testé ;-)
Modifié en dernier par Claudius le jeu. 17 déc. 2015 10:56, modifié 2 fois.

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 :

#62 Message par Jérémy » jeu. 17 déc. 2015 10:54

Bonjour ,

la nuit fut bonne ? :lol:

Allez je m'y colle !!! c'est partis.

PS : a cause du rebouclage du coup on va être assez vite brider niveau test non ? surtout pour l’interruption
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

#63 Message par patou149 » jeu. 17 déc. 2015 11:22

Tu peux essayer ceci pour voir (remplacement boucle for par while et i++)

Code : Tout sélectionner

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

// Fonction : afficher du Texte envoyé sur l'UART
// Param d'entrée : Une chaine de caractére
void envoi_texte (char *texte)
  {     i =0;

        while (texte[i])
        {
           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)
            i++;
        }
   }

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 :

#64 Message par Claudius » jeu. 17 déc. 2015 11:34

@patou149: C'est effectivement une alternative mais, sauf erreur de ma part, il ne répond pas:

- Au test à de faibles vitesses où je pense que des caractères à afficher seront perdus voire mal affichés (à vérifier ?!..)
- Au padding avec des blancs si la longueur de la chaine est < à celle de la ligne à afficher sur le LCD

Mais répond au problème d'une chaine trop "longue" @ LCD dès lors qu'elle est définie avec une longueur compatible ;-)
Modifié en dernier par Claudius le jeu. 17 déc. 2015 11:39, modifié 1 fois.

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 :

#65 Message par Jérémy » jeu. 17 déc. 2015 11:38

je vous dis ca tout de suite
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 :

#66 Message par Jérémy » jeu. 17 déc. 2015 11:47

Alors le code de patou149 : Claudius à raison, ca fonctionne, mais ca n'écrit pas le dernier caractère , et ça ne complète pas la ligne avec des espaces . Ce qui fais quand je vois le texte" azert" écrit j'ai aussi "World" affiché à la suite . ce qui fais que l'utilisateur est obligé de complété avec des espaces jusqu'a la fin de la ligne !
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 :

#67 Message par Jérémy » jeu. 17 déc. 2015 11:48

Et pour le texte de Claudius c'est la première lettre qui est mangé ????
Sinon les blancs sont bien au rendez vous .

@Patou149: je n'arrive pas à corriger ton code pour ne pas qu'il grignote la dernière lettre ? Par contre avec une vitesse a 110 bauds il fonctionne.

@Claudius: J'ai customisé ton code en rajoutant le choix de la ligne . et j'ai corriger le fait qu'il mangeait la dernière lettre !.
J'ai toutefois une p'tite question :

pourquoi mettre une boucle while (1) ? ca le rend bloquant non ?

Sinon c'est parfait, et vraiment je vous remercie, car maintenant j'y vois nettement plus clair !.

Bravo pour l'astuce du complément avec des espaces, j'ai mis un peu de temps à comprendre , le fait que la variable "i" n'est pas remise à 0 quand on sort de la boucle FOR .

Encore une fois un grand Merci . Voyez vous d'autre choses a tester ? l'INT ?mais pour déclencher l'INT il faudrait un acte extérieur ? je devrais passer avec l'USB UART, pour aller plus loin non ?

Voici mon code :

Code : Tout sélectionner

/*##################################################################################
Programme de test pour liaison UART sur carte EasyPIC_V7
Fait par Jérémy pour FantasPic.fr
- Version du "17-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 ligne;
char Texte[16];
// Fin des varaibles---------------------------------------------------------------

// Prototypes  --------------------------------------------------------------------
 
void envoi_texte (char lignechar *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(110);          // 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 (1"azerty") ;
      
delay_ms(1000);
   
envoi_texte (2"Hello World !!");
     
delay_ms(1000);
   
envoi_texte (1"Fantas-PIC") ;
      
delay_ms(1000);
   
envoi_texte (2"Merci");
     
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 lignechar *texte)
{
    
char i;
                                                              
// On calcule la longueur du Texte pour ajuster
     
for (0<= (char)strlen(texte) && 17i++)     // Envoi des caractères de la chaine limité à 16 caractères
    
{
         if (
UART1_Tx_Idle() == 1) { // On verifie si le regsitre TX est vide ou non
             
UART1_Write(texte[i]);   // Si il est remplit, on envoie une lettre de la chaine
          
}

        while (
1) {  // Attente que la donnée soit reçue
            
if (UART1_Data_Ready()) {              // Si une donnée est prête à être lue
                
Lcd_Chr (lignei+1UART1_Read());     // On la lit, l'affiche sur le LCD et on sort pour la suite
                
break;
             }
         }
     }

     
// Complément éventuel avec des espaces
     
for ( ; 17i++) {      // A la suite du Texte ecrit on place des espaces jusqu'a à la fin de ligne
          
Lcd_Chr (lignei' '); // On ecrit des espaces
     
}
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

#68 Message par patou149 » jeu. 17 déc. 2015 16:41

Ce n'est pas plutôt la première lettre qui manque ? , car en effet dans la ligne de code il manque +1
patou149 a écrit :Source du message Lcd_Chr (1,i,UART1_Read());

soit

Code : Tout sélectionner

Lcd_Chr (1,i+1,UART1_Read());

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

#69 Message par patou149 » jeu. 17 déc. 2015 16:41

Ce n'est pas plutôt la première lettre qui manque ? , car en effet dans la ligne de code il manque +1
patou149 a écrit :Source du message Lcd_Chr (1,i,UART1_Read());

soit

Code : Tout sélectionner

Lcd_Chr (1,i+1,UART1_Read());

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

#70 Message par patou149 » jeu. 17 déc. 2015 16:46

il est possible de remplacer cette ligne
patou149 a écrit :Source du message while (texte[i])

par ceci :

Code : Tout sélectionner

while (i<=strlen(texte)) 

pour les espaces pourquoi ne pas effacer l'écran avant d'envoyer un autre texte :

Code : Tout sélectionner

while (1)
 {

   envoi_texte ("azerty");
      delay_ms(1000);
        Lcd_cmd(_LCD_clear);
   envoi_texte ("Hello World  !?");
     delay_ms(1000);
     Lcd_cmd(_LCD_clear);
  


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 41 invités