Bonjour, je rencontre un problème assez étrange.
J'utilise un micro contrôleur pour envoyer une trame en caractères ASCII via l'UART, mais j'utilise cet même UART pour commander un écran LCD, lui est commander avec des suites de chiffres uniquement.
J'ai fait un petit câblage autour d'un circuit logique composé de 4 portes NAND. J'ai donc une entrée données (UART du micro), une entrée commande (PORT du micro) et deux sortie, UART1 et UART2.
Ca me fait une sorte d'aiguillage en fait, si ma commande est à 1, UART1=entree et UART2=1 (ligne au repos) et si ma commande est à 0 UART1=1 et UART2 a 0.
Voilà le déroulement du programme:
-choix de l'UART1: PORTX.X=0
-envoi de l'entête de trame (caractères ASCII)
-segmentation d'un octet de donnée, exemple 234 en trois variables A=2, A=3, A=4
-envois en ASCII de A, puis B, puis C
-choix de l'UART2: PORTX.X=1
-fonction qui envoi les valeurs A,B,C (sans les modifiés) pour les affichés sur l'écran
-choix de l'UART1: PORTX.X=0
-cloture de la trame (caractères ASCII)
Donc théoriquement j'obtient ça:
ENTETE A B C CLOTURE
Mais j'obtient:
ENTETE ù'^"$ç= CLOTURE
Si je ne lance pas la fonction d'affichage sur le LCD tout est bon.
Pourtant mon A B et C sont envoyés dans la trame bien avant la fonction qui gère l'affichage sur le LCD. Donc c'est carrément indépendant.
Voici mon programme:
Merci de votre aide.Code:void convert(int value, int ligne) // prototype de ma fonction //---------------------------------------- ENVOI DE l'EN-TETE DE TRAME OK //---------------------------------------- convert(234,1); // fonction qui pose problème //---------------------------------------- ENVOI DE l'EN-TETE DE TRAME OK //---------------------------------------- void convert(int value, int ligne) //préparation des données, séparation des chiffre afin de les transmettres indépendaement par l'UART, ligne pour l'affichage sur l'écran. { int A,B,C; //---------------------------------------- //SEPARATION DE L'OCTET //---------------------------------------- A=(int)(value/100); B=(int)((value/10)-(10*A)); C=(int)((value)-(10*B)-(100*A)); //---------------------------------------- //ENVOI DES CARACTERES DE LA TRAMME NMEA //---------------------------------------- TXATT(); UDR=A+48; //transmission du chiffre +48 pour convertir en ASCII TXATT(); UDR=B+48; //transmission du chiffre +48 pour convertir en ASCII TXATT(); UDR=C+48; //transmission du chiffre +48 pour convertir en ASCII CS^=A+48 ; CS^=B+48 ; CS^=C+48; //ajout du CS pour la tramme NMEA //---------------------------------------- //AFFICHAGE SUR l'ECRAN LCD //---------------------------------------- PORTD.0=1; // choix TX2 func_afficher(A,B,C,ligne,1,255,255); //variable a afficher PORTD.0=0; // choix TX1 } Et enfin la fonction func_afficher: void func_afficher(int chiffre1, int chiffre2, int chiffre3, int x, int y, int color_a, int color_b) { int donnees[4], i; donnees[0]=chiffre1+48; donnees[1]=chiffre2+48; donnees[2]=44; donnees[3]=chiffre3+48; for(i=0;i<=3;i++) { TXATT();UDR=84; TXATT();UDR=donnees[i]; TXATT();UDR=y; TXATT();UDR=x; TXATT();UDR=color_a; TXATT();UDR=color_b; y++ ; //delay_ms(10); }
.
-----