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 ---
- 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 ---
Modérateur : Jérémy
Idée pour s'entrainer sur l'UART ?
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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:
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é
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.
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Idée pour s'entrainer sur l'UART ?
Idée pour s'entrainer sur l'UART ?
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
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
@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
- 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.
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Idée pour s'entrainer sur l'UART ?
Idée pour s'entrainer sur l'UART ?
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 !
Idée pour s'entrainer sur l'UART ?
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 :
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 ligne, 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(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 ligne, char *texte)
{
char i;
// On calcule la longueur du Texte pour ajuster
for (i = 0; i <= (char)strlen(texte) && i < 17; i++) // 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 (ligne, i+1, 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++) { // A la suite du Texte ecrit on place des espaces jusqu'a à la fin de ligne
Lcd_Chr (ligne, i, ' '); // On ecrit des espaces
}
}
Idée pour s'entrainer sur l'UART ?
Ce n'est pas plutôt la première lettre qui manque ? , car en effet dans la ligne de code il manque
soit
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 ?
Ce n'est pas plutôt la première lettre qui manque ? , car en effet dans la ligne de code il manque
soit
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 ?
il est possible de remplacer cette ligne
par ceci :
pour les espaces pourquoi ne pas effacer l'écran avant d'envoyer un autre texte :
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);
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 90 invités