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

probléme de valeur envoyées en UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » sam. 16 déc. 2017 16:57 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

C'est parti pour de la pure programmation ...... enfin presque, d'abord je dois m'assurer que tout fonctionne bien afin de ne pas avoir de surprise par la suite.
Le plus dur à mon avis sera de paramétrer mes 2 UARTs .

le premier me servira à envoyer des infos au module radio. pour que lui même les envoies au robot. Et le second pour le dialogue entre les deux pics ( écran tactile).

dans un premier temps, le premier UART . J'ai faillis y arriver du premier coup, mais à ma surprise le comportement est bizarre!

Voici le programme très simple.

Une boucle qui fais clignoter une LED pour voir que mon programme tourne à la bonne cadence.
Et un compteur qui compte de 48 à 58 . après 58 il repasse à 48 et fais un saut de ligne

J'affiche le compteur en ASCII donc les valeurs de 48 à 57 corresponde aux chiffres de 0 à 9 .
j'affiche cela sur l’écran de l'ordi avec Realterm et un câble USB-RS232 TTL3V3

Code : Tout sélectionner

// PROGRAMME pour la télécommande-radio du robot

// DS du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/40001844D.pdf


//##################################     Variables ##############################################
 char Compteur ;

void main() {

    // RAZ des broches
    LATA = LATB = LATC = LATD = LATE = 0;

    // registres des I/O
    TRISA = 0xEF;     // RA4 en sortie pour liaison
    TRISB = 0xDF;     // RB5 en sortie Pour UART-TX2
    TRISC = 0xA1;     // En sortie RC1 et RC2 pour led test, RC3 et RC4 pour laiison AMB et RC6 pour Tx1
    TRISD = 0xF8;     // En sortie RC0, RC1 et RC2 pour liaison AMB
    TRISE = 0xff;     // Tout en entrée
    
    
// registre analogiques
    ANSELA = 0x80;   // RA7 en analogique
    ANSELB = 0x00;
    ANSELC = 0x01;   // RC0 en analogique
    ANSELD = 0xA0;   // RD5 et RD7 en analogique
    ANSELE = 0x00;

    // Registre des Pull-UP
    WPUA = 0x0F;  // RA0, RA1, RA2 et RA3 en Pull UP
    WPUB = 0x0F;  // RB0, RB1, RB2 et RB3 en Pull UP
    WPUC = WPUD = WPUE =0x00;

    // -----------------     Initialisation UART 1 ----------------------------------
    UART1_Init(57600);

   //-------------------     PPS     --------------------------------------------------
    // Séquence de déverouillage des PPS page 218 de la DS
    INTCON.GIE = 0;               // On désactive les INT
    PPSLOCK = 0x55;               // On envoie une valeur
    PPSLOCK = 0xAA;               // On envoie une valeur
    PPSLOCK.PPSLOCKED = 0x00;     // On deverouille les PPS
   
    
//RX1PPSbits.RXPPS = 0x17;
    //RX1PPS = 0x17 ;  //RC7->EUSART1:RX1;
    RC6PPS = 0x09;   //RC6->EUSART1:TX1;
    RB5PPS = 0x0B;   //RB5->EUSART2:TX2;
    RX2PPS = 0x0F;   //RB7->EUSART2:RX2;

    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCK.PPSLOCKED = 0x01; // On verouille les PPS

    INTCON.GIE = 1;           // On réactive les INT
    
    
    Compteur 
= 48 ;

 while(1){
 
    delay_ms 
(500);
    LATC.B2 = ~PORTC.B2 ;            // Clignotement d'une led pour voir le programme tourner
    
    UART1_Write_Text 
(&Compteur);

    Compteur++;
     if ( Compteur >= 58){
        Compteur = 48;
        UART1_Write(10);
        UART1_Write(13);
      }

 }
}


Et bien bizarrement le compteur compte de 0 à 3 puis retour à 0.....
Sans titre.jpg


Je n'arrive pas à comprendre pourquoi il retourne apres le "3" ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

probléme de valeur envoyées en UART
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » sam. 16 déc. 2017 18:03 lien vers la Data-Sheet : Cliquez ici

UART1_Write_Text (&Compteur);

Tu en penses quoi de ça ?

probléme de valeur envoyées en UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » sam. 16 déc. 2017 18:08 lien vers la Data-Sheet : Cliquez ici

satinas a écrit :Source du message Tu en penses quoi de ça ?

:oops: :oops: :oops: :oops: :oops: :oops: .

J'ai jamais entièrement compris les pointeurs, pour être honnête j'ai lu plein de truc dessus . Je pense avoir compris l'idée. Un pointeur contient l'adresse d'une variable, mais je ne comprends pas l’intérêt dans certains cas.

Pour ce cas la j'ai essayé comme ça, mais j'ai fais plein d'autre tests, avec des choses plus standard. Le résultat est toujours le même, j'ai 4 valeurs qui se suivent, puis pouf ca repart au début .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

probléme de valeur envoyées en UART
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#4 Message par satinas » sam. 16 déc. 2017 18:12 lien vers la Data-Sheet : Cliquez ici

On a déjà parlé des chaînes de caractères, cette fonction attend une chaîne et tu ne lui passes pas une chaîne. Si tu n'envoie pas une chaîne (qui doit être zéro terminated), alors il faut utiliser UART1_Write() et envoyer caractère par caractère.
C'est peut être pas ça le problème, mais commençons doucement :)

probléme de valeur envoyées en UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » sam. 16 déc. 2017 18:14 lien vers la Data-Sheet : Cliquez ici

Tu as raison , une chaine de caractère doit se terminer avec un terminateur de string. /0
C'est en faisant des erreurs, que l'on apprend le mieux !!!

probléme de valeur envoyées en UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » sam. 16 déc. 2017 19:23 lien vers la Data-Sheet : Cliquez ici

Je pense que j'ai un problème de timing sur l'envoie des données.

Voici une boucle et son résultat :

Code : Tout sélectionner

 while(1){
 
    delay_ms 
(10);
    LATC.B2 = ~PORTC.B2 ;            // Clignotement d'une led pour voir le programme tourner
    
    UART1_Write 
(Compteur);
    Compteur++;

     if ( Compteur >= 58){
        Compteur = 48;
    UART1_Write(10);
    UART1_Write(13);
      }
 }

Sans titre.jpg


Même code avec une pause de 100ms

Code : Tout sélectionner

 while(1){
 
    
delay_ms (100);
    
LATC.B2 = ~PORTC.B2 ;            // Clignotement d'une led pour voir le programme tourner
    
    
UART1_Write (Compteur);
    
Compteur++;

     if ( 
Compteur >= 58){
        
Compteur 48;
    
UART1_Write(10);
    
UART1_Write(13);
      }
 } 

Le résultat:
Sans titre1.jpg


Même code avec une pause de 500 ms :

Code : Tout sélectionner

 while(1){
 
    
delay_ms (500);
    
LATC.B2 = ~PORTC.B2 ;            // Clignotement d'une led pour voir le programme tourner
    
    
UART1_Write (Compteur);
    
Compteur++;

     if ( 
Compteur >= 58){
        
Compteur 48;
    
UART1_Write(10);
    
UART1_Write(13);
      }
 } 


Sans titre2.jpg


L'nevoi est different suivant le timing !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

probléme de valeur envoyées en UART
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#7 Message par satinas » sam. 16 déc. 2017 19:49 lien vers la Data-Sheet : Cliquez ici

A 57600 bauds, tu envoies le caractère en 100us, alors c'est pas les tempos en ms qui vont changer quelque chose. Tu utilises une fonction UART(57600). Qui te dis qu'elle est capable d'assurer cette vitesse avec précision, cela dépend de ton horloge système. Commence à 9600 bauds.

probléme de valeur envoyées en UART
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » sam. 16 déc. 2017 20:02 lien vers la Data-Sheet : Cliquez ici

Re,

à 9600 ou a 2400 même résultats. :furieux:

J'ai fait à l’expérience ! j'ai déjà utilisé L'UART à 57600 bauds sans problème sur des PICS plus petit . Je me dis qu'avec celui la c'est le doigts dans le nez .
Le compilateur m'indique des warning quand la précision au dessus de 2% pour la com UART . A 64Mhz aucun warning !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

probléme de valeur envoyées en UART
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#9 Message par JMarc » sam. 16 déc. 2017 20:10 lien vers la Data-Sheet : Cliquez ici

bonjour jérémY, Satinas et tout le monde

avec 18f4525, j'ai des problèmes avec les variable longue en mémoire, il me suffit de déplacer la variable de place et cela fonctionne

si cela peut servir...

probléme de valeur envoyées en UART
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#10 Message par satinas » sam. 16 déc. 2017 20:11 lien vers la Data-Sheet : Cliquez ici

Salut JMarc
Jeremy, juste avant chaque UART1_Write(); il faut mettre
while (UART1_Tx_Idle() == 0) { }
Ca t'éviteras de mettre ces tempos inutiles (tout au moins pour la com série)


Retourner vers « Langage C »

Qui est en ligne

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