MCC18, devinette syntaxique.

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From French to

Threaded View
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;
iBA%UDRATE;


en assembleur cela fonctionne mais pas en C ?

si vous avez une piste.

En attendant vos réponses, A+

Re: MCC18, devinette syntaxique.
Salut,

Bruno a écrit :
Quoted text here. Click to load it

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 ?

Re: MCC18, devinette syntaxique.
Pascal Hambourg a écrit :
Quoted text here. Click to load it

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;

iBA%UDRATE;    //64 c'est ok

Merci encore et bonne soirée

Re: MCC18, devinette syntaxique.
Bruno a écrit :
Quoted text here. Click to load it

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

Re: MCC18, devinette syntaxique.
Salut

Quoted text here. Click to load it

à 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;
iBA%UDRATE;

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

Site Timeline