"à chaque jour suffit sa peine" !
La taille de mon code augmente bien sur , au fur et à mesure des rajouts de fonctionnalités
ce n'est pourtant que l'Init du NCO ( Numerical Controlled Oscillateur) en début de programme
le probleme est bénin , mais EXISTANT !
la version precedente me donnait bien la valeur de fréquence (calculée) , associé au parametre Incrément du NCO
c'est en fait le simple resiultat de calcul avec entier long et flottants
aujourd'hui , j'ai 0.00 comme résultat au lieu de 599.9 ?????
aucune modif faite au niveau de cette Init NCO !
Code : Tout sélectionner
//declarations
const code float NCO1_Clock[5]={64000000,64000000,32000,500000,31000};
const char NCO1_CL4[] =" MFINTOSC/4 (31 kHz)";
const char NCO1_CL3[] =" MFINTOSC (500 kHz)";
const char NCO1_CL2[] =" LFINTOSC" ;
const char NCO1_CL1[] =" HFINTOSC ";
const char NCO1_CL0[] =" FOSC";
// Increment = Freq * 2097512/ NCO1 clock
const float NCO1_Coeff= 4.194; // 2097152/500.000= 4.194
const char * NCO1_Clock_Name[] ={ NCO1_CL0,NCO1_CL1,NCO1_CL2,NCO1_CL3, NCO1_CL4};
char NCO1_Clock_Choix=3; // 0 à 4
char PWS_Valeur=1 ; // = 2 ^ PWS_Choix =>{1,2,4,8,16,32,64,128]};
char PWS_Choix; // 0 à 7
unsigned long Increment;
-----------------------------------------------------
partie de la fonction void Init_NCO(void);
appelée depuis le main program
F0= (NCO1_Clock[NCO1_Clock_Choix] * (float)Increment )/ 2097152.0;
if (Bavard==1)
{
CPrint (" Freq Output= ");
Float2Ascii (F0,CRam1,1);
Print (CRam1); CRLF1();
Delay_ms(500);
}
sur terminal :
(0.000) Increment = 2516
(0.000) NCO1CLK choix = 3 soit MFINTOSC (500 kHz) 500000.0 Hz
(0.000) Freq Output= 0.0
l'increment est OK, la frequence de base 500KHz est OK
mais le resultat de l'equation globale est faux .
La valeur Freq est bien à zero, car rien ne sort si je valide le NCO1EN_bit
DIVISER POUR MIEUX REGNER .. c'est ma device dans ces cas là
je modifie donc le code pour separer le calcul en 2 operations ,
pour voir ce qui se passe ..
via rajout d'une variable intermediaire float F1;
Code : Tout sélectionner
CPrint (" F0= ");
F0= (NCO1_Clock[NCO1_Clock_Choix] * (float)Increment ) ;
Float2Ascii (F0,CRam1,1);
Print (CRam1); CRLF1();
F1=F0 / 2097152.0 ;
if (Bavard==1)
{
CPrint (" Freq Output= ");
Float2Ascii (F1,CRam1,1);
Print (CRam1); CRLF1();
Delay_ms(500);
}
et je retouve mon resultat OK
et j'obtiens bien la note à 600Hz si je valide NCO1EN_Bit
((0.000) Increment = 2516
(0.000) NCO1CLK choix = 3 soit MFINTOSC (500 kHz) 500000.0 Hz
(0.000) F0= 1257999897.0
(0.000) Freq Output= 599.9
Cela demontre que le compilateur MikroC est quand meme un peu (beaucoup) inconsistant ..
si le rajout de code modifie le comportement d'un morceau déja testé OK auparavant
* probleme de Pile ( Stack) ?
* pas de probleme d'appel externe via interrupt dans cette phase du programme ...
* Meme si je deplace le contenu de ma subroutine / fonction dans le main programme
pour eviter un appel de fonction ( usage de stack) en moins, c'est le meme probleme.
* probleme de Bank ?? ... on ne s'en preoccupe pas ..en C ( sauf si usage asm)
* probleme d'acces entre data en Flash ?
* le compilo se prend la tete ! -> aspirine pour compilo ?
quoique il me semble avoir déja vu des cas ou MikroC demande à ne pas trop mettre de
calculs sur la meme ligne, ou avec trop de parentheses , de les eclater sur plusieurs lignes ..
une idée ?
demander à MikroE ? ... le forum MikroC est quasi mort !
Le fait d'utiliser l'UART à outrance , charge effectivement un peu plus le MCU
mais cette bete n'est actuellement utilisée qu'à 6.2% de RAM et 17.6% de code ,
et me permet quand meme de debugger .. ou bugger ?
est-ce le fait d'avoir rajouté / testé ceci , pour Temps_X
Code : Tout sélectionner
#define DO4 523
#define RE4 587
#define MI4 659
#define FA4 698
#define SOL4 784
#define LA4 880
#define SI4 988
volatile typedef struct
{
unsigned int Note;
unsigned int Tempo;
} Partition;
Partition Melodie1[] = {
{DO4, 1},
{DO4, 1},
{DO4, 1},
{RE4, 1},
{MI4, 2},
{RE4, 2},
{DO4, 1},
{MI4, 1},
{RE4, 1},
{RE4, 1},
{DO4, 4}
};
void Au_clair_de_la_lune()
{ int i,j;
CPrint("Melodie 1 \r\n");
for (i=0;i<11;i++)
{
Led_B=1;
WordToStr( Melodie1[i].Note,CRam1);
Print(CRam1);UART1_Write(TAB);
WordToStr( Melodie1[i].Tempo,CRam1);
Print(CRam1);CRLF1();
Set_Note_NCO(Melodie1[i].Note);
NCO1EN_bit=1;
//VDelay_Advanced_ms(pause, fosc);
for (j=0;j< Melodie1[i].Tempo ;j++) Delay_ms(300);
NCO1EN_bit=0;
Led_B=0;
Delay_ms(100);
}
CRLF1();
}
(0.499) Melodie 1
(0.000) 523 1
(0.398) 523 1
(0.399) 523 1
(0.401) 587 1
(0.398) 659 2
(0.699) 587 2
(0.696) 523 1
(0.401) 659 1
(0.401) 587 1
(0.397) 587 1
(0.398) 523 4
(1.298)
NE PAS UTILISER MIKROC pour UN MCU AUTOMOBILE !

le proverbe précédement cité se confirme...
ou encore un mystere MikroC ..