MCC18, devinette syntaxique.

Bonsoir à tous,

J'utilise MCC18 et je me demande quel est la syntaxe correct qui permet d'obtenir la valeur du Baud Rate Generator en fonction de la fréquence de l'oscillateur interne, j'ai éssayé la syntaxe suivante, mais le résultat n'est pas celui que j"attend, je dois buté sur un problême de syntaxe et plus particulièrement de déclaration des variables.

#define FOSC 40 //Fréquence de l'oscillateur interne en MhZ #define BAUDRATE ((((FOSC*1000000)/9600)/64)-1)

float i; i=BAUDRATE;

en assembleur cela fonctionne mais pas en C ?

si vous avez une piste.

En attendant vos réponses, A+

Reply to
Bruno
Loading thread data ...

Salut,

Bruno a écrit :

Le langage C est parfois assez subtil pour les types par défaut et les conversions implicites. Qu'est-ce que ça donne avec 1e6 au lieu de

10000000, histoire de bien faire comprendre au compilo que tu veux un calcul en flottant et non en entier ?
Reply to
Pascal Hambourg

Salut

à tout hasard (pas garanti, je n'utilise pas C18):

#define FOSC 40 ///Fréquence de l'oscillateur interne en MhZ #define BAUDRATE (((((FOSC*1000000.0)/9600)/64)-1)

float i; i=BAUDRATE;

L'idée de cette modification est que comme toutes tes variables sont entières, le préprocesseur fait le calcul avec une division entière. Du coup tu obtient un résultat entier. En ajoutant .0, tu transforme un des élements en nombre flottant, et le préprocesseur devrait donc faire des opérations flottantes.

Si ca ne fonctionne pas, essaye de placer (float) devant FOSC dans le define de BAUDRATE, et/ou de mettre un L à la fin de 1000000.

Bon WE Bertrand

Reply to
Bertrand

Pascal Hambourg a écrit :

Je te remercie, c'est exactement ça

#define FOSC 40 //Fréquence de l'oscillateur interne en MhZ #define BAUD 9600 //Débit USART Asynchrone #define BAUDRATE ((((FOSC*1e6)/BAUD)/64)-1) //BRGH

char i;

i=BAUDRATE; //64 c'est ok

Merci encore et bonne soirée

Reply to
Bruno

Bruno a écrit :

le principal problème, c'est de mettre i en float cat le registre lui est forcément un entier. Mettre un float dans le registre peut faire des choses imprévisibles...

j'ai fait ceci pour des pic16 et ça marche

#define quartz 4000000 ; Hz #define baudrate 1200 ; bauds

; diviseur pour SIE #define div (quartz/(16*baudrate))-1 if (div > 255) #define diviseur (quartz/(64*baudrate))-1 #define brgh 0 else #define diviseur (quartz/(16*baudrate))-1 #define brgh 1 endif

JJ

Reply to
jj

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.