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

2xUART en mode PPS ?
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#11 Message par satinas » lun. 20 août 2018 15:54 lien vers la Data-Sheet : Cliquez ici

Il n'y a pas d'erreur, le cast parfait n'existe pas à mon avis.
Tu as bien un debugger, affiche les valeurs de l1 l2 l3 SP1BRG ci-dessous juste après leur calcul.

Code : Tout sélectionner

void Uart1_Init(unsigned long baudrate)
{
  unsigned long l1 = 64000000/4/baudrate-1;
  unsigned long l2 = 64000000UL/4/baudrate-1;
  unsigned long l3 = (unsigned long)64000000/4/baudrate-1;
  BAUD1CON = 0x08;                  // uart, brg16=1
  SP1BRG   = 64000000/4/baudrate-1; // uart, speed
  TX1STA   = 0x24;                  // uart, tx on, brgh=1
  RC1STA   = 0x90;                  // uart on, rx on
}

2xUART en mode PPS ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#12 Message par Jérémy » lun. 20 août 2018 17:15 lien vers la Data-Sheet : Cliquez ici

HUmmmmmm Pour lui

64000000 / 4 = 9216

JE cherche l'erreur !!!!!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

2xUART en mode PPS ?
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#13 Message par satinas » lun. 20 août 2018 17:25 lien vers la Data-Sheet : Cliquez ici

64000000 c'est 0x3D09000
il travaille par défaut en 16 bits, donc il a pris 0x9000, et c'est 4*9216.
S'il est pas capable de voir que 64000000 rentre pas dans 16 bits, il faut consulter ...
Tout ça doit dépendre du réglage du compilateur, tu as dû avoir un warning, il ne faut jamais les négliger.
essaie ces 2 trucs
64000000UL/4/baudrate-1;
(unsigned long)64000000/4/baudrate-1;

2xUART en mode PPS ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#14 Message par Jérémy » lun. 20 août 2018 18:51 lien vers la Data-Sheet : Cliquez ici

Re,

Aucun warning, j'ai du faire une fausse manip lors de débug car maintenant ca calcul presque bien si je fais :
test = ((64000000)>>2)/9600;

La valeur de test est bien 1666 .

Par contre si je fais ;:

void Uart1_Init(unsigned long baudrate)
{
test = ((64000000)>>2)/baudrate;
}

LA valeur de test est de : 4294967295 ???

SI je fais :

Code : Tout sélectionner

void Uart1_Init(unsigned long baudrate)
{
  
baudrate 9600;
  
test 64000000/4/baudrate;
  } 


C'est bon j'ai bien 1666 .
J'en déduis que la valeur baudrate n'est pas bonne . je n'arrive à localiser cette variable locale dans le debugger
C'est en faisant des erreurs, que l'on apprend le mieux !!!

2xUART en mode PPS ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#15 Message par Jérémy » lun. 20 août 2018 19:03 lien vers la Data-Sheet : Cliquez ici

Avec ca :

Code : Tout sélectionner

void Uart1_Initunsigned long baudrate)
{
  
test2 baudrate;
  
test 64000000/4/baudrate;


test2 reste à zero ???? :mur: :mur: :mur: :mur:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

2xUART en mode PPS ?
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#16 Message par satinas » lun. 20 août 2018 19:08 lien vers la Data-Sheet : Cliquez ici

baudrate n'est pas le problème c'est un paramètre de la fonction.
Le problème est expliqué plus haut. En théorie il faut indiquer que la constante est de type long, en ajoutant un suffixe, ou en castant. Je suis surpris que tu n'aie pas de warning, car le compilo a certainement rouspété avant de tronquer une constante arbitrairement.

Pour la seconde fois (seconde car y aura pas de troisième :) ) essaye :
SPB1RG = 64000000UL/4/baudrate-1;
SPB1RG = (unsigned long)64000000/4/baudrate-1;

2xUART en mode PPS ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#17 Message par Jérémy » lun. 20 août 2018 19:18 lien vers la Data-Sheet : Cliquez ici

Aucun warning je confirme.

Avec

Code : Tout sélectionner

void Uart1_Initunsigned long baudrate)
{
 
SP1BRG 64000000UL/4/baudrate-1;
 
SP1BRG = (unsigned long)64000000/4/baudrate-1;
 
//test = 64000000/4/baudrate;


Sp1BRG = 65534 pour les deux calculs !
SP1BRGH = 255 et SP1BRGL = 254
C'est en faisant des erreurs, que l'on apprend le mieux !!!

2xUART en mode PPS ?
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#18 Message par satinas » lun. 20 août 2018 19:25 lien vers la Data-Sheet : Cliquez ici

là je suis paumé, alors allons-y pour ça :

unsigned long fosc = 64000000UL;
SP1BRG = fosc/4/baudrate-1;

ou

unsigned long u = 64000000UL;
u = u/4/baudrate-1;
SP1BRG = u;

Si tu n'as pas un vrai debugger pas à pas, passe à MpLab ...
test2 il est déclaré ou ?
renomme toutes les fonctions Uart1_xxx() en U1_xxx(), idem pour Uart2_xxx()

2xUART en mode PPS ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#19 Message par Jérémy » lun. 20 août 2018 19:43 lien vers la Data-Sheet : Cliquez ici

je pense avoir trouvé .....

Je vérifie après mangé car madame commence à crié fort !!!

Il me semble que c'est le nom de la fonction qui coince !!!!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

2xUART en mode PPS ?
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#20 Message par satinas » lun. 20 août 2018 20:11 lien vers la Data-Sheet : Cliquez ici

Identifiers

Identifiers are arbitrary names of any length given to functions, variables, symbolic constants, user-defined data types and labels. All these program elements will be referred to as objects throughout the help (don't get confused with the meaning of object in object-oriented programming).

Case Sensitivity

The mikroC PRO for PIC identifiers aren't case sensitive by default, so that Sum, sum, and suM represent an equivalent identifier. Case sensitivity can be activated or suspended in Output Settings window. Even if case sensitivity is turned off Keywords remain case sensitive and they must be written in lower case.


Retourner vers « Langage C »

Qui est en ligne

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