CAG control Automatique de Gain (AVC) algorithme pour reguler le volume

develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 25 mai 2007 à 10:44
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 1 juin 2007 à 15:34
Bonjour,

J'ai un système embarqué (microcontrolleur AT89C51sndc1 avec un convertisseur ADC 10 bits)avec lequel je fais une gestion de volume en sortie des Haut Parleurs et ce en fonction d'un microphone d'environnment. Donc si le signal en provenance du microphone augmente je dois egalement augmenter le niveau de volume sonore dans les Haut-Parleurs, si il n'y a pas de bruit environnant je dois diminuer le niveau de volume sonore.

donc la conversion du signal en provenance du micro vari de 0 à 1023 (car 10bits) et je peux voir ça avec un printf sur l'ecran et si par exemple le niveau du microphone d'environnement se trouve entre 2 valeurs alors je met le volume de sortie à une valeur donnée. Comme le code existant  cidessous:
<hr />
         if (( micro_env >= 0)&&(micro_env < 7))
 {
    TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
  printf("Volumecag= 20\n");
  
 }
 if (( micro_env >= 7)&&(micro_env <11))
 {
  TEA6320_write_byte(0x00,0x22);    // Volume/Loudness
  printf("Volumecag= 22\n");
    
 }
 if (( micro_env >= 11)&&(micro_env < 45))
 {
  TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
  printf("Volumecag= 25\n");
   
 }
 if (( micro_env >= 45)&&(micro_env < 101))
 {
  TEA6320_write_byte(0x00,0x27);    // Volume/Loudness
  printf("Volumecag= 27\n");
  
 }
 if (( micro_env >= 101)&&(micro_env < 246))
 {
  TEA6320_write_byte(0x00,0x29);    // Volume/Loudness
  printf("Volumecag= 29\n");
 
 }
 if (( micro_env >=246)&&(micro_env < 445))
 {
  TEA6320_write_byte(0x00,0x2B);    // Volume/Loudness
  printf("Volumecag= 2B\n");
 
 }
 if (( micro_env >= 445)&&(micro_env < 596))
 {
  TEA6320_write_byte(0x00,0x2E);    // Volume/Loudness
  printf("Volumecag= 2E\n");
 
 }
 if (( micro_env >= 596)&&(micro_env < 770))
 {
  TEA6320_write_byte(0x00,0x30);    // Volume/Loudness
  printf("Volumecag= 30\n");
 
 }
 if ( micro_env >= 770)
 {
  TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
  printf("Volumecag= 33\n");
 
 }
<hr />
Etant nouveau en programmation et en C je ne sais pas comment proceder mais ce que je voudrais faire c'est 2 choses:

D'une part, une hystèrese donc je passe a un volume de sortie superieur d'un niveau si le niv de micro d'environnement atteint une valeur x donnée et je redescen au niveau precedent si le niv de micro d'environnement atteint une valeur y donnée mais qui serait inferieur à x. et ce semblable aux niveaux ci dessus.

D'une autre part, avoir la possibilité de defenir via le clavier 3 niveau sonores (milieu calme , milieur normal, milieu bruyant) et donc pour ces 3 niveaux on devra pouvoir aussi delimiter les seuils. Exemple de 70 à 110 c'ets un niveau calme, de 110 à 250 c'ets un niveau normal ainsi de suite.
Mais comme il faut une hysterese il faudrat pour chacun des trois niveaux definir des points de basculments c'est à dire les x et y.

Pouvez vou m'aider ?

Merci

12 réponses

develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
29 mai 2007 à 12:06
Apres bonne analyse,
j'ai fait le code de l'hysteresis du CAG et ça fonctionne bien mais je pense que le code doit etre ameliorer encore mais comment ?

Deplus j'ai enfin la valeur pour la moyenne en dB mais c'est des resultats que je n'attendais pas comment dois je caster ou changer ma formule pour qu'il presente ça en dB réel ?

mais variables sont donc :

unsigned long moyenne2; //2405 CAG moyenne2 = a * log10(moyenne/b)+c;
int a = 25;
float b = 0.001;
int c =-77;
double result; //2805

char env_choice; //0805
char range_choice; //2805
int seuil_bas; //2805
int seuil_haut; //2805

int ss; //2805
unsigned char Val_lue; //2805
extern void CF_operations7 (void); //2205 pour eliminer warning C206: missing function prototype

J'ai de plus une capture d'ecran pour que vous voyez mieux ce qui se passe.

code de configuration du CAG :
<hr />

// D : Change environnement's mode
if(STR_IN[31]==0x44)
{
      int varrepeat =0;  
        printf("*Environnement's mode*\n\r");
        printf("0: LOW LEVEL\n\r");
printf("1: HIGH LEVEL\n\r");
        printf("2: NORMAL LEVEL\n\r");
printf("3: DEFAULT AGC CONTROL LEVEL\n\r");
 
  printf(" Please select first your environnement's mode\n :");
 
         do{
      env_choice=getchar(); 

       switch(env_choice){
case'0':
        type_volume=0;
varrepeat =1;
  break;
case'1':
        type_volume=1;
varrepeat =1;
  break;
case'2':
        type_volume=2;
varrepeat =1;
  break;
   case'3':
       type_volume=3;
       varrepeat =1;
break;
        default :
         printf("\n Please enter a correct number:");
 
    }
}while(varrepeat==0);
 
 
if(env_choice!=3)
{
printf("\n The environnement's sound range is between 0 to 770 !\n :");  //2805
printf("Please now select your Hysteresis range\n :");
 
if(env_choice==0)
printf("\n For this level the default low limit is 80, the high limit is 200\n :");
 
elseif(env_choice==1)
   printf("\n For this level the default low limit 600, the high limit 770\n :");
 
if(env_choice==2)
printf("\n For this level the default low limit is 300, the high limit is 500\n");
 
    printf("Enter a low limit value : \n");
scanf("%i",&seuil_bas);
    printf("Enter a high limit value : \n");
    scanf("%i",&seuil_haut);
   
   } 
printf("\n-> Please press any key to exit\n");
 
for(j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
STR_IN[31]=getchar0();
 
  printf("%c\n",STR_IN[31]);
 
}
 
<hr />

Code de contrôle du CAG 
<hr />
//C : Check environnement's mode
   if(STR_IN[31]==0x43)
   {

switch(type_volume){
case0:
  printf("\n The type of volume is LOW LEVEL\n");
  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
  break;
case1:
  printf("\n The type of volume is HIGH LEVEL\n");
  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
  break;
case2:
  printf("\n The type of volume is NORMAL LEVEL\n");
  printf("The low limit is: %i the high limit is: %i\n",seuil_bas,seuil_haut);
 
case3:
  printf("\n The default's type of volume is AGC LEVEL\n");
 
}
printf("\n-> Please press any key to exit\n");

for(j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
STR_IN[31]=getchar0();
  printf("%c\n",STR_IN[31]);
 

   } 
 
 
 
<hr />
Et enfin mon code CAG 
<hr />
 void CAG (void)
{  
    int valcag;  //2905
init_ADC();
Watch_Dog();
 
for(j=max_samples; j>0; j--)
{
samples[j] = samples[j-1];
   }
 
ADCON = ADCON | 0x08; //start A to D conversion
byte1 = ADDH<<2;
byte2 = ADDL;
samples[0] = byte1 + byte2;
    printf("samples[0] = %X\n", samples[0]) ; //1105
moyenne = 0;
for(j=max_samples; j>0; j--)
{
moyenne = moyenne + samples[j];
        printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
  
}
moyenne = moyenne / max_samples;  //BON

    printf("VRAI moyenne sur echantillons de 10: %i\n", moyenne) ; //1105
 
    //printf("Math log:  %i\n", moyenne) ; //1105
    // moyenne2 = a * log10(moyenne/b)+c; //2405
    //   printf("Moyenne en dB: %li\n", moyenne2) ; //1105  //2805 dis
 
     result = (double)a * log10(((double)moyenne/(double)b))+ (double)c ;
     printf("Moyenne en dB: %lf\n", result) ; //1105  //2805
 
if((moyenne==0)&&(P1_5 == 1))// If AUTOMATIC MODE & ADC Average=0
{
CPT_NoMic++;
}

if((CPT_NoMic==60)&&(NoMic_Bit==0))// If ADC Average=0 during 60 seconds
{
 
        #ifdef DEBUG_ME   //testali0304
printf("No ambiance microphone\n"); // No Ambiance microphone => Volume = maximum
        #endif            //testali0304
CPT_NoMic=0;
NoMic_Bit=1;
     
}
if((moyenne>0)&&(P1_5 1))// If ADC Average<>0> Ambiance microphone (re-)connected
{
NoMic_Bit=0;
}
 
switch(type_volume){
case0:
 
           if(moyenne > seuil_haut)
         {
TEA6320_write_byte(0x00,0x26);    // Volume/Loudness
        valcag=0x26;
printf("Volumecag= %X\n",valcag);
         }
 
  if(moyenne < seuil_bas)
         {
TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
valcag=0x20;
printf("Volumecag= %X\n",valcag);
         }
 
  if(moyenne < seuil_haut && moyenne > seuil_bas)
         {

printf("Volumecag= %X\n",valcag);
         }
 
 
  break;
case1:
 
           if(moyenne > seuil_haut)
         {
TEA6320_write_byte(0x00,0x2C);    // Volume/Loudness
        valcag=0x2C;
printf("Volumecag= %X\n",valcag);
         }
 
  if(moyenne < seuil_bas)
         {
TEA6320_write_byte(0x00,0x26);    // Volume/Loudness
        valcag=0x26;
printf("Volumecag= %X\n",valcag);
         }
 
      
  if(moyenne < seuil_haut && moyenne > seuil_bas)
         {

printf("Volumecag= %X\n",valcag);
         }
 
  break;
 
case2:
 
           if(moyenne > seuil_haut)
         {
TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
        valcag=0x33;
printf("Volumecag= %X\n",valcag);
         }
 
  if(moyenne < seuil_bas)
         {
TEA6320_write_byte(0x00,0x2C);    // Volume/Loudness
        valcag=0x2C;
printf("Volumecag= %X\n",valcag);
         }
 

  if(moyenne < seuil_haut && moyenne > seuil_bas)
         {

printf("Volumecag= %X\n",valcag);
         }
 
  break;
case3:
  //copier coller le code existant ici // volume adapté au volume ambiant
                            
 
    if(( moyenne >= 0)&&(moyenne < 7))
{
  TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
printf("Volumecag= 20\n");
 
}
if(( moyenne >= 7)&&(moyenne <11))
{
TEA6320_write_byte(0x00,0x22);    // Volume/Loudness
printf("Volumecag= 22\n");
 
}
if(( moyenne >= 11)&&(moyenne < 45))
{
TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
printf("Volumecag= 25\n");
 
}
if(( moyenne >= 45)&&(moyenne < 101))
{
TEA6320_write_byte(0x00,0x27);    // Volume/Loudness
printf("Volumecag= 27\n");
 
}
if(( moyenne >= 101)&&(moyenne < 246))
{
TEA6320_write_byte(0x00,0x29);    // Volume/Loudness
printf("Volumecag= 29\n");
 
}
if(( moyenne >=246)&&(moyenne < 445))
{
TEA6320_write_byte(0x00,0x2B);    // Volume/Loudness
printf("Volumecag= 2B\n");
 
}
if(( moyenne >= 445)&&(moyenne < 596))
{
TEA6320_write_byte(0x00,0x2E);    // Volume/Loudness
printf("Volumecag= 2E\n");
 
}
if(( moyenne >= 596)&&(moyenne < 770))
{
TEA6320_write_byte(0x00,0x30);    // Volume/Loudness
printf("Volumecag= 30\n");
 
}
if( moyenne >= 770)
{
TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
printf("Volumecag= 33\n");
 
}
  break;
default: printf("Une erreur dans le switchcase \n");
 
}
 
 if((P1_5 0)&& (cond3 0))// SW2 -> MANUAL MODE: first way
{
 
printf("MANUAL MODE\n");
printf("Menu: press ?\n");
 
 
cond3 = 1;
 
}
if((P1_5 == 0) && (RI==0))// SW2 -> MANUAL MODE: normal program cycle 
{
 
printf("MANUAL MODE...");
printf(" ADC value = %d",moyenne);
printf(" volume = %Xh\n",volume);         //0605
 
}
 
if((P1_5 == 0) && (Menu_Flag==0) && (RI==1))// SW2 -> MANUAL MODE if key detected
{
 
   if(typeutil==1)
   volume_PA();
   else
   volume_PAbis();
}
if(P1_5 == 1)// SW2 -> AUTOMATIC MODE
{
 
printf("AUTO MODE: ");
printf("ADC value= %d ",moyenne);
printf(" ||  Volume= %X\n",VOL_TEA6320);
 
}
 
 
 
 
}
 
 
<hr />

Et pour finir la capture :

<hr />

samples[j] = 63
VRAI moyenne sur echantillons de 10: 295
Moyenne en dB: 59745550
Volumecag= 2CMANUAL MODE... ADC value 295 volume 23h
samples[0] = 3FF
samples[j] = FF
samples[j] = 23F
samples[j] = 10
samples[j] = 0
samples[j] = 303
samples[j] = 10
samples[j] = 0
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
VRAI moyenne sur echantillons de 10: 352
Moyenne en dB: 61663560
Volumecag= 2CMANUAL MODE... ADC value 352 volume 23h
samples[0] = 32
samples[j] = 23F
samples[j] = 10
samples[j] = 0
samples[j] = 303
samples[j] = 10
samples[j] = 0
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
VRAI moyenne sur echantillons de 10: 429
Moyenne en dB: 63811450
Volumecag= 2CMANUAL MODE... ADC value 429 volume 23h
samples[0] = 1
samples[j] = 10
samples[j] = 0
samples[j] = 303
samples[j] = 10
samples[j] = 0
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
VRAI moyenne sur echantillons de 10: 376
Moyenne en dB: 62379700
Volumecag= 2CMANUAL MODE... ADC value 376 volume 23h
samples[0] = 38F
samples[j] = 0
samples[j] = 303
samples[j] = 10
samples[j] = 0
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
VRAI moyenne sur echantillons de 10: 375
Moyenne en dB: 62350780
Volumecag= 2CMANUAL MODE... ADC value 375 volume 23h
samples[0] = 7F
samples[j] = 303
samples[j] = 10
samples[j] = 0
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
samples[j] = 38F
VRAI moyenne sur echantillons de 10: 466
Moyenne en dB: 64709650
Volumecag= 2CMANUAL MODE... ADC value 466 volume 23h
samples[0] = 3FD
samples[j] = 10
samples[j] = 0
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
VRAI moyenne sur echantillons de 10: 401
Moyenne en dB: 63078600
Volumecag= 2CMANUAL MODE... ADC value 401 volume 23h
samples[0] = 1F
samples[j] = 0
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
VRAI moyenne sur echantillons de 10: 502
Moyenne en dB: 65517610
Volumecag= 33MANUAL MODE... ADC value 502 volume 23h
samples[0] = 3FF
samples[j] = 300
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
VRAI moyenne sur echantillons de 10: 505
Moyenne en dB: 65582290
Volumecag= 33MANUAL MODE... ADC value 505 volume 23h
samples[0] = 4
samples[j] = 63
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
VRAI moyenne sur echantillons de 10: 530
Moyenne en dB: 66106900
Volumecag= 33MANUAL MODE... ADC value 530 volume 23h
samples[0] = 3
samples[j] = 3FF
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
VRAI moyenne sur echantillons de 10: 521
Moyenne en dB: 65920940
Volumecag= 33MANUAL MODE... ADC value 521 volume 23h
samples[0] = 21D
samples[j] = 3FF
samples[j] = 32
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
samples[j] = 3
VRAI moyenne sur echantillons de 10: 419
Moyenne en dB: 63555360
Volumecag= 33MANUAL MODE... ADC value 419 volume 23h
samples[0] = 39
samples[j] = 32
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
samples[j] = 3
samples[j] = 21D
VRAI moyenne sur echantillons de 10: 371
Moyenne en dB: 62234360
Volumecag= 33MANUAL MODE... ADC value 371 volume 23h
samples[0] = 3
samples[j] = 1
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
samples[j] = 3
samples[j] = 21D
samples[j] = 39
VRAI moyenne sur echantillons de 10: 371
Moyenne en dB: 62234360
Volumecag= 33MANUAL MODE... ADC value 371 volume 23h
samples[0] = 0
samples[j] = 38F
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
samples[j] = 3
samples[j] = 21D
samples[j] = 39
samples[j] = 3
VRAI moyenne sur echantillons de 10: 372
Moyenne en dB: 62263570
Volumecag= 33MANUAL MODE... ADC value 372 volume 23h
samples[0] = 0
samples[j] = 7F
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
samples[j] = 3
samples[j] = 21D
samples[j] = 39
samples[j] = 3
samples[j] = 0
VRAI moyenne sur echantillons de 10: 281
Moyenne en dB: 59217670
Volumecag= 2CMANUAL MODE... ADC value 281 volume 23h
samples[0] = 0
samples[j] = 3FD
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
samples[j] = 3
samples[j] = 21D
samples[j] = 39
samples[j] = 3
samples[j] = 0
samples[j] = 0
VRAI moyenne sur echantillons de 10: 268
Moyenne en dB: 58703370
Volumecag= 2CMANUAL MODE... ADC value 268 volume 23h
samples[0] = 0
samples[j] = 1F
samples[j] = 3FF
samples[j] = 4
samples[j] = 3
samples[j] = 21D
samples[j] = 39
samples[j] = 3
samples[j] = 0
samples[j] = 0
samples[j] = 0
VRAI moyenne sur echantillons de 10: 166
Moyenne en dB: 53502720
Volumecag= 2C
 
 <!-- END TEMPLATE: bbcode_code -->
<hr />
Le resultat de la formule pour l'expression en dB a partir de la formule logarithmique est ce qui s'affiche a droite de Moyenne en dB:
Je ne vois pas comment resoudre ce probleme?

Merci

 
 
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
29 mai 2007 à 13:23
Salut, 

Ce que je ferais c'est avoir une variable temporaire double temp;
temp = moyenne/b;
 temp = log10(moyenne);
 temp = a*temp+c;
 car on n'est jamais sur de la maniere donc les conversions int/doubles se dont un moyen classique n'est pas de convertir en double comme tu fais, mais de multiplier par 1.0
Est-ce que ca marche mieux ?

=
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
29 mai 2007 à 14:04
Salut,

Je crois que tu voulais ecrire plutot ceci ?

double temp;

moyenne = moyenne/b;
temp = log10(moyenne);
temp = a*temp+c;

Voila au niveau de mon code j'ai :


<hr />

unsigned long moyenne2;
unsigned int volume2;
int a = 25;
float b=0.001;
int c= -77;

double result;
double temp;

moyenne=moyenne/max_samples;
printf ("VRAI moyenne sur echantillons de 10 : %i\n",moyenne);

result =(double)a * log10(((double)moyenne/(double)b)) + (double)c;
printf ("Moyenne en dB:  %lf\n",result);

moyenne   = moyenne/b;
temp = log10(moyenne);
temp = a*temp+c;

printf ("Moyenne en dB version2:  %lf\n",temp);
<hr />

J'ai fait ce que tu m'as dit mais je n'ai pas de bons resultats encore, je ne voit pas qu'est ce que ça pourrait être
et j'ai fait une capture d'ecran tu verras mieux:
<hr />
You must enter a password  : abcd
You are in administrator mode
RAD>>PA ON
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
LSP driver off
samples[0] = 3
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
VRAI moyenne sur echantillons de 10: 0
Moyenne en dB: NaN
Moyenne en dB version2 : NaN
Volumecag= 26
MANUAL MODE
Menu: press ?MANUAL MODE... ADC value 0 volume 23h
samples[0] = 3
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
VRAI moyenne sur echantillons de 10: 0
Moyenne en dB: NaN
Moyenne en dB version2 : NaN
Volumecag= 26MANUAL MODE... ADC value 0 volume 23h
samples[0] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3
VRAI moyenne sur echantillons de 10: 0
Moyenne en dB: NaN
Moyenne en dB version2 : NaN
Volumecag= 26MANUAL MODE... ADC value 0 volume 23h
samples[0] = 7
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3
samples[j] = 0
samples[j] = 7
VRAI moyenne sur echantillons de 10: 1
Moyenne en dB: -2000000
Moyenne en dB version2 : -2010857
Volumecag= 2CMANUAL MODE... ADC value 999 volume 23h
samples[0] = 13
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3
samples[j] = 0
samples[j] = 7
samples[j] = 7
VRAI moyenne sur echantillons de 10: 2
Moyenne en dB: 5525757
Moyenne en dB version2 : 5520325
Volumecag= 2CMANUAL MODE... ADC value 1999 volume 23h
samples[0] = C
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3
samples[j] = 0
samples[j] = 7
samples[j] = 7
samples[j] = 13
VRAI moyenne sur echantillons de 10: 3
Moyenne en dB: 9928032
Moyenne en dB version2 : 9924408
Volumecag= 2CMANUAL MODE... ADC value 2999 volume 23h
samples[0] = 14
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3
samples[j] = 0
samples[j] = 7
samples[j] = 7
samples[j] = 13
samples[j] = C
VRAI moyenne sur echantillons de 10: 5
Moyenne en dB: 15474240
Moyenne en dB version2 : 15474240
Volumecag= 2CMANUAL MODE... ADC value 5000 volume 23h
samples[0] = 1C3
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3
samples[j] = 0
samples[j] = 7
samples[j] = 7
samples[j] = 13
samples[j] = C
samples[j] = 14
VRAI moyenne sur echantillons de 10: 7
Moyenne en dB: 19127450
Moyenne en dB version2 : 19125900
Volumecag= 2CMANUAL MODE... ADC value 6999 volume 23h
samples[0] = FF
samples[j] = 0
samples[j] = 3
samples[j] = 3
samples[j] = 0
samples[j] = 7
samples[j] = 7
samples[j] = 13
samples[j] = C
samples[j] = 14
samples[j] = 1C3
VRAI moyenne sur echantillons de 10: 52
Moyenne en dB: 40900090
Moyenne en dB version2 : 40899880
Volumecag= 2CMANUAL MODE... ADC value -13537 volume 23h
samples[0] = 3D
samples[j] = 3
samples[j] = 3
samples[j] = 0
samples[j] = 7
samples[j] = 7
samples[j] = 13
samples[j] = C
samples[j] = 14
samples[j] = 1C3
samples[j] = FF
VRAI moyenne sur echantillons de 10: 77
Moyenne en dB: 45162270
Moyenne en dB version2 : 24483410
Volumecag= 2CMANUAL MODE... ADC value 11464 volume 23h
samples[0] = 30
samples[j] = 3
samples[j] = 0
samples[j] = 7
samples[j] = 7
samples[j] = 13
samples[j] = C
samples[j] = 14
samples[j] = 1C3
samples[j] = FF
samples[j] = 3D
VRAI moyenne sur echantillons de 10: 83
Moyenne en dB: 45976960
Moyenne en dB version2 : 29052970
Volumecag= 2CMANUAL MODE... ADC value 17463 volume 23h

<hr />
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
29 mai 2007 à 14:49
RE
temp moyenne/b; ou moyenne moyenne/b; c'est la meme chose en fait, moi j'etais partie sur temp, mais ca fait rien.
Tu as des valeurs loufoques de ta moyenne, c'est tres etrange et
 tu devrais avoir des valeurs extremement petites suite au log10
DONC je te conseille d'afficher toutes les etapes intermediaires du calcul, ainsi que les valeurs de a, b, c et moyenne, et  le probleme devrait apparaitre de maniere evidente, car une variable doit etre mal initialisee.

=
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
29 mai 2007 à 16:50
Voila j'ai fait des tests et effectivement la valeur de moyenne semble etrange comme vous pouvez le voir sur la capture.

Voici mes declarations des variables


<hr />
data unsigned int moyenne;  //data pour liberer mem

unsigned int type_volume;  //2205



unsigned long moyenne2;  //2405 CAG   moyenne2 = a * log10(moyenne/b)+c;
int a = 25;
float b = 0.001;
int c =-77;



double temp;



char env_choice;  //0805
char range_choice;  //2805
int seuil_bas;     //2805
int seuil_haut;   //2805
int seuil_bas0;
int seuil_haut0;
int seuil_bas1;
int seuil_haut1;
int seuil_bas2;
int seuil_haut2;





int ss; //2805
double result; //2805
unsigned char Val_lue; //2805
extern void CF_operations7 (void);
<hr />
J'ai eu aussi un autre petit soucis c'est le fait que ma config du CAG je voudrais l'enregistrer dans l'EEPROM mais lorsque je reverifie les valeurs stockées je m'aperçoit qu'il y a un decalage j'ai les valeurs des seuils hauts en place des seuils bas.
Voici mon code je crois avoir compris l'erreur comm on fait un write byte, la valeur max est normalement de 255 est comme je stocke un entier, une valeur superieur à 255 ça reagit mal. Mais comment pourrais je faire je voudrais creer un tableau d'entier mais dans l'EEPROM et y placer mes valeurs est ce possible et comment ?

Voici mon code de configuration manuel du CAG dans l'EEPROM :


<hr />

// D : Change environnement's mode
 if (STR_IN[31]==0x44)
 {
      int varrepeat =0;   
        printf("*Environnement's mode*\n\r");
        printf("0: LOW LEVEL\n\r");
  printf("1: HIGH LEVEL\n\r");
        printf("2: NORMAL LEVEL\n\r");
  printf("3: DEFAULT AGC CONTROL LEVEL\n\r");   printf(" Please select first your environnement's mode\n :");

         do {
        env_choice=getchar(); 
 
         switch(env_choice) {
  case '0':
         type_volume=0;
   varrepeat =1;
    break;
  case '1':
         type_volume=1;
   varrepeat =1;
    break;
  case '2':
         type_volume=2;
   varrepeat =1;
    break;
    case '3':
        type_volume=3;
        varrepeat =1;
   break;
        default :
         printf("\n Please enter a correct number:");

      }
  }while (varrepeat==0);

     
  EEP2408_ADDRESS = 0x61;  //addresse du type_volume environnement //2905
  EEP2408_VALUE = type_volume;
  EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
 
 if(env_choice!=3)
 {
 printf("\n The environnement's sound range is between 0 to 770 !\n");  //2805
 printf("Now you must select your Hysteresis range\n");

 if(env_choice=='0')
 printf("\n For this choice of level, the default low limit is 80, the high limit is 200\n :");

 else if(env_choice=='1')
    printf("\n For this choice of level, the default low limit is 600, the high limit is 770\n :");

 if(env_choice=='2')
 printf("\n For this choice of level, the default low limit is 300, the high limit is 500\n");

    printf("Enter a your low limit value : \n");
 scanf("%i",&seuil_bas);
    printf("Enter a your high limit value : \n");
    scanf("%i",&seuil_haut);
   
   
 if(env_choice=='0')             //2905
       {
  EEP2408_ADDRESS = 0x62;  //addresse du seuil_bas niveau 0
  seuil_bas0=seuil_bas;
  EEP2408_VALUE = seuil_bas0;
  EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
  
  EEP2408_ADDRESS = 0x63;  //addresse du seuil_haut niveau 0
  seuil_bas0=seuil_haut;
  EEP2408_VALUE = seuil_haut0;
  EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
  }    

 else if(env_choice=='1')                                            //2905
       {    
    EEP2408_ADDRESS = 0x64;  //addresse du seuil_bas niveau 1
  seuil_bas1=seuil_bas;
  EEP2408_VALUE = seuil_bas1;
  EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
  
  EEP2408_ADDRESS = 0x65;  //addresse du seuil_haut niveau 1
  seuil_bas1=seuil_haut;
  EEP2408_VALUE = seuil_haut1;
  EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
  }    

 if(env_choice=='2')                                               //2905
  {
        EEP2408_ADDRESS = 0x66;  //addresse du seuil_bas niveau 2
  seuil_bas2=seuil_bas;
  EEP2408_VALUE = seuil_bas2;
  EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
  
  EEP2408_ADDRESS = 0x67;  //addresse du seuil_haut niveau 2
  seuil_bas2=seuil_haut;
  EEP2408_VALUE = seuil_haut2;
  EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
  }
    

 
   }  //2905 
  printf("\n-> Please press any key to exit\n");

   for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
  STR_IN[31]=getchar0();

    printf("%c\n",STR_IN[31]);

 }

<hr />

Ainsi que ma capture:
<hr />

AUTOMATIC MODE: SWITCH 2 OFF
*MANUAL MODE: SWITCH 2 ON*Would you like to enter in administrator mode (Y/N) ?

You must enter a password  :

abcd
You are in administrator mode
RAD>>PA ON
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
LSP driver off
samples[0] = 3
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
VRAI moyenne sur echantillons de 10: 0
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 0i
Valeur de result (en prcent lf): 0000000
Valeur de temp (en prcent lf): 0000000
Moyenne en dB: NaN
Valeur de moyenne (apres moyenne =moyenne/b;): 0i
Valeur de temp (apres temp = log10(moyenne);): -INF
Valeur de temp (apres temp = a*temp+c;): NaN
Moyenne en dB version2 : NaN
Volumecag= 26
MANUAL MODE
Menu: press ?MANUAL MODE... ADC value 0 volume 23h
samples[0] = 3D
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
VRAI moyenne sur echantillons de 10: 0
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 0i
Valeur de result (en prcent lf): NaN
Valeur de temp (en prcent lf): NaN
Moyenne en dB: NaN
Valeur de moyenne (apres moyenne =moyenne/b;): 0i
Valeur de temp (apres temp = log10(moyenne);): -INF
Valeur de temp (apres temp = a*temp+c;): NaN
Moyenne en dB version2 : NaN
Volumecag= 26MANUAL MODE... ADC value 0 volume 23h
samples[0] = 77
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3D
VRAI moyenne sur echantillons de 10: 6
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 6i
Valeur de result (en prcent lf): NaN
Valeur de temp (en prcent lf): NaN
Moyenne en dB: 17453780
Valeur de moyenne (apres moyenne =moyenne/b;): 5999i
Valeur de temp (apres temp = log10(moyenne);): 3778079
Valeur de temp (apres temp = a*temp+c;): 17451970
Moyenne en dB version2 : 17451970
Volumecag= 26MANUAL MODE... ADC value 5999 volume 23h
samples[0] = FF
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3D
samples[j] = 77
VRAI moyenne sur echantillons de 10: 18
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 18i
Valeur de result (en prcent lf): 17453780
Valeur de temp (en prcent lf): 17451970
Moyenne en dB: 29381820
Valeur de moyenne (apres moyenne =moyenne/b;): 18000i
Valeur de temp (apres temp = log10(moyenne);): 4255273
Valeur de temp (apres temp = a*temp+c;): 29381820
Moyenne en dB version2 : 29381820
Volumecag= 26MANUAL MODE... ADC value 18000 volume 23h
samples[0] = C7
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3D
samples[j] = 77
samples[j] = FF
VRAI moyenne sur echantillons de 10: 43
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 43i
Valeur de result (en prcent lf): 29381820
Valeur de temp (en prcent lf): 29381820
Moyenne en dB: 38836720
Valeur de moyenne (apres moyenne =moyenne/b;): 42999i
Valeur de temp (apres temp = log10(moyenne);): 4633459
Valeur de temp (apres temp = a*temp+c;): 38836460
Moyenne en dB version2 : 38836460
Volumecag= 2CMANUAL MODE... ADC value -22537 volume 23h
samples[0] = 7F
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 0
samples[j] = 3
samples[j] = 3D
samples[j] = 77
samples[j] = FF
samples[j] = C7
VRAI moyenne sur echantillons de 10: 63
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 63i
Valeur de result (en prcent lf): 38836720
Valeur de temp (en prcent lf): 38836460
Moyenne en dB: 42983520
Valeur de moyenne (apres moyenne =moyenne/b;): 62999i
Valeur de temp (apres temp = log10(moyenne);): 4799334
Valeur de temp (apres temp = a*temp+c;): 42983340
Moyenne en dB version2 : 42983340
Volumecag= 2CMANUAL MODE... ADC value -2537 volume 23h
....
?
MENU

M: Menu MP3

  a: Tree and choice of file

  b: Play the track

  c: Play the track with a Gong

O: Mute PA

P: Unmute PA

C: Check environnement's mode

D: Change environnement's mode

I: Mute TEA6320

U: Unmute TEA6320

Y: CF RESET = 1

T: CF RESET = 0

W: Write EEPROM AND ALL VOLUME CONTROL

Q: To Change Priority

r: Read appropriate proporties

p: Mode Pause

m: Change user's mode

-> Please press a key
C

 The type of volume is NORMAL LEVEL
The low limit is: 2656 the high limit is: 28672

-> Please press any key to exit

samples[0] = 7F
samples[j] = E3
samples[j] = E7
samples[j] = 27C
samples[j] = 183
samples[j] = 7F
samples[j] = 30F
samples[j] = 1F
samples[j] = 7C
samples[j] = 380
samples[j] = C
VRAI moyenne sur echantillons de 10: 345
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 345i
Valeur de result (en prcent lf): 61786260
Valeur de temp (en prcent lf): 34301950
Moyenne en dB: 61445480
Valeur de moyenne (apres moyenne =moyenne/b;): 17319i
Valeur de temp (apres temp = log10(moyenne);): 4238523
Valeur de temp (apres temp = a*temp+c;): 28963070
Moyenne en dB version2 : 28963070
Volumecag= 2CMANUAL MODE... ADC value 17319 volume 23h
samples[0] = 4F
samples[j] = E7
samples[j] = 27C
samples[j] = 183
samples[j] = 7F
samples[j] = 30F
samples[j] = 1F
samples[j] = 7C
samples[j] = 380
samples[j] = C
samples[j] = 7F
VRAI moyenne sur echantillons de 10: 335
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 335i
Valeur de result (en prcent lf): 61445480
Valeur de temp (en prcent lf): 28963070
Moyenne en dB: 61126130
Valeur de moyenne (apres moyenne =moyenne/b;): 7319i
Valeur de temp (apres temp = log10(moyenne);): 3864452
Valeur de temp (apres temp = a*temp+c;): 19611290
Moyenne en dB version2 : 19611290
Volumecag= 2CMANUAL MODE... ADC value 7319 volume 23h
samples[0] = 4F
samples[j] = 27C
samples[j] = 183
samples[j] = 7F
samples[j] = 30F
samples[j] = 1F
samples[j] = 7C
samples[j] = 380
samples[j] = C
samples[j] = 7F
samples[j] = 4F
VRAI moyenne sur echantillons de 10: 320
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 320i
Valeur de result (en prcent lf): 61126130
Valeur de temp (en prcent lf): 19611290
Moyenne en dB: 60628750
Valeur de moyenne (apres moyenne =moyenne/b;): 57856i
Valeur de temp (apres temp = log10(moyenne);): 4762349
Valeur de temp (apres temp = a*temp+c;): 42058720
Moyenne en dB version2 : 42058720
Volumecag= 2C
?
MENU

M: Menu MP3

  a: Tree and choice of file

  b: Play the track

  c: Play the track with a Gong

O: Mute PA

P: Unmute PA

C: Check environnement's mode

D: Change environnement's mode

I: Mute TEA6320

U: Unmute TEA6320

Y: CF RESET = 1

T: CF RESET = 0

W: Write EEPROM AND ALL VOLUME CONTROL

Q: To Change Priority

r: Read appropriate proporties

p: Mode Pause

m: Change user's mode

-> Please press a key
D
*Environnement's mode*

0: LOW LEVEL

1: HIGH LEVEL

2: NORMAL LEVEL

3: DEFAULT AGC CONTROL LEVEL

 Please select first your environnement's mode
 :
 Please enter a correct number:2
 The environnement's sound range is between 0 to 770 !
Now you must select your Hysteresis range

 For this choice of level, the default low limit is 300, the high limit is 500
Enter a your low limit value :
310
Enter a your high limit value :
490

-> Please press any key to exit
 
samples[0] = 3F
samples[j] = 183
samples[j] = 7F
samples[j] = 30F
samples[j] = 1F
samples[j] = 7C
samples[j] = 380
samples[j] = C
samples[j] = 7F
samples[j] = 4F
samples[j] = 4F
VRAI moyenne sur echantillons de 10: 264
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 264i
Valeur de result (en prcent lf): 60628750
Valeur de temp (en prcent lf): 42058720
Moyenne en dB: 58540100
Valeur de moyenne (apres moyenne =moyenne/b;): 1856i
Valeur de temp (apres temp = log10(moyenne);): 3268578
Valeur de temp (apres temp = a*temp+c;): 4714455
Moyenne en dB version2 : 4714455
Volumecag= 2CMANUAL MODE... ADC value 1856 volume 23h
samples[0] = 4F
samples[j] = 7F
samples[j] = 30F
samples[j] = 1F
samples[j] = 7C
samples[j] = 380
samples[j] = C
samples[j] = 7F
samples[j] = 4F
samples[j] = 4F
samples[j] = 3F
VRAI moyenne sur echantillons de 10: 232
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 232i
Valeur de result (en prcent lf): 58540100
Valeur de temp (en prcent lf): 4714455
Moyenne en dB: 57137210
Valeur de moyenne (apres moyenne =moyenne/b;): 35391i
Valeur de temp (apres temp = log10(moyenne);): 4548893
Valeur de temp (apres temp = a*temp+c;): 36722340
Moyenne en dB version2 : 36722340
Volumecag= 2CMANUAL MODE... ADC value -30145 volume 23h
samples[0] = 4F
samples[j] = 30F
samples[j] = 1F
samples[j] = 7C
samples[j] = 380
samples[j] = C
samples[j] = 7F
samples[j] = 4F
samples[j] = 4F
samples[j] = 3F
samples[j] = 4F
VRAI moyenne sur echantillons de 10: 227
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 227i
Valeur de result (en prcent lf): 57137210
Valeur de temp (en prcent lf): 36722340
Moyenne en dB: 56900650
Valeur de moyenne (apres moyenne =moyenne/b;): 30391i
Valeur de temp (apres temp = log10(moyenne);): 4482745
Valeur de temp (apres temp = a*temp+c;): 35068630
Moyenne en dB version2 : 35068630
Volumecag= 2CMANUAL MODE... ADC value 30391 volume 23h
samples[0] = 7C
samples[j] = 1F
samples[j] = 7C
samples[j] = 380
samples[j] = C
samples[j] = 7F
samples[j] = 4F
samples[j] = 4F
samples[j] = 3F
samples[j] = 4F
samples[j] = 4F
VRAI moyenne sur echantillons de 10: 156
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 156i
Valeur de result (en prcent lf): 56900650
Valeur de temp (en prcent lf): 35068630
Moyenne en dB: 52828130
Valeur de moyenne (apres moyenne =moyenne/b;): 24928i
Valeur de temp (apres temp = log10(moyenne);): 4396688
Valeur de temp (apres temp = a*temp+c;): 32917190
Moyenne en dB version2 : 32917190
Volumecag= 2C
?
MENU

M: Menu MP3

  a: Tree and choice of file

  b: Play the track

  c: Play the track with a Gong

O: Mute PA

P: Unmute PA

C: Check environnement's mode

D: Change environnement's mode

I: Mute TEA6320

U: Unmute TEA6320

Y: CF RESET = 1

T: CF RESET = 0

W: Write EEPROM AND ALL VOLUME CONTROL

Q: To Change Priority

r: Read appropriate proporties

p: Mode Pause

m: Change user's mode

-> Please press a key
C

 The type of volume is NORMAL LEVEL
The low limit is: 490 the high limit is: 28672

-> Please press any key to exit

<hr />

Merci
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
29 mai 2007 à 17:30
Ok je crois que pour la formule log10 c'est ok, j'ai mis:

printf("Moyenne en dB: %f\n", result) ; //

Ma capture donne :
<hr />
VRAI moyenne sur echantillons de 10: 89
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 89i
Valeur de result (en prcent lf): 46734760
Valeur de temp (en prcent lf): 32259590
Moyenne en dB: 46.7348
Valeur de moyenne (apres moyenne = moyenne/b;): 23463i
Valeur de temp (apres temp = log10(moyenne);): 4370384
Valeur de temp (apres temp = a*temp+c;): 32259590
Moyenne en dB version2 : 32259590
Volumecag= 2CMANUAL MODE... ADC value 23463 volume 23h
samples[0] = 7C
samples[j] = 33
samples[j] = 7E
samples[j] = 7F
samples[j] = 7F
samples[j] = 7
samples[j] = 7
samples[j] = 50
samples[j] = 60
samples[j] = C3
samples[j] = 7F
VRAI moyenne sur echantillons de 10: 94
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 94i
Valeur de result (en prcent lf): 46734760
Valeur de temp (en prcent lf): 32259590
Moyenne en dB: 47.3282
Valeur de moyenne (apres moyenne =moyenne/b;): 28463i
Valeur de temp (apres temp = log10(moyenne);): 4454281
Valeur de temp (apres temp = a*temp+c;): 34357030
Moyenne en dB version2 : 34357030
Volumecag= 2CMANUAL MODE... ADC value 28463 volume 23h
samples[0] = 63
samples[j] = 7E
samples[j] = 7F
samples[j] = 7F
samples[j] = 7
samples[j] = 7
samples[j] = 50
samples[j] = 60
samples[j] = C3
samples[j] = 7F
samples[j] = 7C
VRAI moyenne sur echantillons de 10: 101
Valeur de a (en prcent i): 25
Valeur de b (en prcent f): 0.001000
Valeur de c (en prcent i): -77
Valeur de moyenne (en prcent ui): 101i
Valeur de result (en prcent lf): 47328200
Valeur de temp (en prcent lf): 34357030
Moyenne en dB: 48.108
Valeur de moyenne (apres moyenne =moyenne/b;): 35463i
Valeur de temp (apres temp = log10(moyenne);): 4549776
Valeur de temp (apres temp = a*temp+c;): 36744400
Moyenne en dB version2 : 36744400
Volumecag= 2CMANUAL MODE... ADC value -30073 volume 23h
samples[0] = 3C
samples[j] = 7F
samples[j] = 7F
samples[j] = 7
samples[j] = 7
samples[j] = 50
samples[j] = 60
samples[j] = C3
samples[j] = 7F
samples[j] = 7C
samples[j] = 63
<hr />

Je pense que là pour le log10 c'est ok  mais pour le EEPROM je dois pouvoir creer un tableau de int de façon a bien enregistrer les data dans l'eeprom mais exist il d'autres alternatives par exemple enregistrer sur 2 bytes un scanf  et comment?

Merci
<!-- / message -->
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
29 mai 2007 à 18:15
RE

Je comprend pas exactement ta question, et j'avoue ne pas avoir appris par coeur les 4000 lignes de code et de traces que tu as poste, mais si tu veux des entiers sur 2 bytes, essaye avec des short sinon, tu peux aussi faire un tableau de deux char ou bien lire un int et ensuite t'arranger pour que la valeur ne sorte pas de l'intervalle [0; 65535] avec des if
 ====
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
30 mai 2007 à 00:27
Je ne  m y connais pas trop en EEPROM comment faire en sorte que par exemple je puisse mettre un int dans une eeprom? Dois je allouer deux adresses de l eeprom et/ou utiliser un tableau et comment?
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
31 mai 2007 à 20:56
Salut,

EEPROM c'est une memoire, ca s'accede comme une memoire, a moins d'avoir de la doc speciale, donc tu fais comme tu veux.

=
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
1 juin 2007 à 15:34
Bonjour,

Voila  pour l'initialisation pour relire les contenus des addresses dans l'eeprom et les stocker dans une seule variable, je l'ai fait ainsi:
<hr />///// declarations:
intVarField var;
   int variableFinale;  //type_volume
 
  intVarField var1;
   int variableFinale1;   //seuil_bas0
 
  intVarField var2;
   int variableFinale2;  // seuil_haut0
 
  intVarField var3;
   int variableFinale3;  //seuil_bas1
 
  intVarField var4;
   int variableFinale4;  // seuil_haut1
 
  intVarField var5;
   int variableFinale5;  //seuil_bas2
 
  intVarField var6;
   int variableFinale6;  // seuil_haut2
 
 
////lecture eeprom à l'initialisation :
EEP2408_ADDRESS = 0x61; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//type_volume=EEP_READ; //0106 test?
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x62; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x63; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x64; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale = var.globalValue;
type_volume= variableFinale ;
 
//
 
EEP2408_ADDRESS = 0x65; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//seuil_bas0=EEP_READ;
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x66; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x67; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x68; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale1 = var.globalValue;
seuil_bas0 = variableFinale1 ;
 
//
 
//
 
EEP2408_ADDRESS = 0x69; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//seuil_haut0=EEP_READ;
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x70; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x71; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x72; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale2 = var.globalValue;
seuil_haut0 =   variableFinale2 ;
//
....
 
<hr />
mais seul soucis c'est que la phase d'ecriture devait être adaptée au paravant en consequence. il faut que j'adapte aussi en consequence mais
j'ai ça comme code il faudrait autre chose mais quoi exactement pour bien faire?

code d'ecriture sur l'eeprom:
<hr />if(env_choice=='0')
       {

    seuil_bas0=seuil_bas;    EEP2408_ADDRESS 0x65;  //addresse du seuil_bas niveau 0                  EEP2408_VALUE seuil_bas0;
     EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
    EEP2408_ADDRESS = 0x69;  //addresse du seuil_haut niveau 0
    seuil_haut0=seuil_haut;
    EEP2408_VALUE = seuil_haut0;
    EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
     }
 
if(env_choice=='1')
       {
   ....
<hr />
Avec ces codes le programme compile bien marche mais je ne sais pas avoir la dernière config lorsque je fais un reset, je pense que le problème vient de mon code d'ecriture sur l'eeprom, comment pourrais je ecrire de façon à ce corriger ce problème?

Merci
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
1 juin 2007 à 15:34
Bonjour,

Voila  pour l'initialisation pour relire les contenus des addresses dans l'eeprom et les stocker dans une seule variable, je l'ai fait ainsi:
<hr />///// declarations:
intVarField var;
   int variableFinale;  //type_volume
 
  intVarField var1;
   int variableFinale1;   //seuil_bas0
 
  intVarField var2;
   int variableFinale2;  // seuil_haut0
 
  intVarField var3;
   int variableFinale3;  //seuil_bas1
 
  intVarField var4;
   int variableFinale4;  // seuil_haut1
 
  intVarField var5;
   int variableFinale5;  //seuil_bas2
 
  intVarField var6;
   int variableFinale6;  // seuil_haut2
 
 
////lecture eeprom à l'initialisation :
EEP2408_ADDRESS = 0x61; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//type_volume=EEP_READ; //0106 test?
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x62; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x63; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x64; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale = var.globalValue;
type_volume= variableFinale ;
 
//
 
EEP2408_ADDRESS = 0x65; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//seuil_bas0=EEP_READ;
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x66; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x67; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x68; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale1 = var.globalValue;
seuil_bas0 = variableFinale1 ;
 
//
 
//
 
EEP2408_ADDRESS = 0x69; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//seuil_haut0=EEP_READ;
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x70; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x71; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x72; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale2 = var.globalValue;
seuil_haut0 =   variableFinale2 ;
//
....
 
<hr />
mais seul soucis c'est que la phase d'ecriture devait être adaptée au paravant en consequence. il faut que j'adapte aussi en consequence mais
j'ai ça comme code il faudrait autre chose mais quoi exactement pour bien faire?

code d'ecriture sur l'eeprom:
<hr />if(env_choice=='0')
       {

    seuil_bas0=seuil_bas;    EEP2408_ADDRESS 0x65;  //addresse du seuil_bas niveau 0                  EEP2408_VALUE seuil_bas0;
     EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
    EEP2408_ADDRESS = 0x69;  //addresse du seuil_haut niveau 0
    seuil_haut0=seuil_haut;
    EEP2408_VALUE = seuil_haut0;
    EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
     }
 
if(env_choice=='1')
       {
   ....
<hr />
Avec ces codes le programme compile bien marche mais je ne sais pas avoir la dernière config lorsque je fais un reset, je pense que le problème vient de mon code d'ecriture sur l'eeprom, comment pourrais je ecrire de façon à ce corriger ce problème?

Merci
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
1 juin 2007 à 15:34
Bonjour,

Voila  pour l'initialisation pour relire les contenus des addresses dans l'eeprom et les stocker dans une seule variable, je l'ai fait ainsi:
<hr />///// declarations:
intVarField var;
   int variableFinale;  //type_volume
 
  intVarField var1;
   int variableFinale1;   //seuil_bas0
 
  intVarField var2;
   int variableFinale2;  // seuil_haut0
 
  intVarField var3;
   int variableFinale3;  //seuil_bas1
 
  intVarField var4;
   int variableFinale4;  // seuil_haut1
 
  intVarField var5;
   int variableFinale5;  //seuil_bas2
 
  intVarField var6;
   int variableFinale6;  // seuil_haut2
 
 
////lecture eeprom à l'initialisation :
EEP2408_ADDRESS = 0x61; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//type_volume=EEP_READ; //0106 test?
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x62; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x63; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x64; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale = var.globalValue;
type_volume= variableFinale ;
 
//
 
EEP2408_ADDRESS = 0x65; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//seuil_bas0=EEP_READ;
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x66; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x67; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x68; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale1 = var.globalValue;
seuil_bas0 = variableFinale1 ;
 
//
 
//
 
EEP2408_ADDRESS = 0x69; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
//seuil_haut0=EEP_READ;
var.byte.mmb = EEP_READ;
 
EEP2408_ADDRESS = 0x70; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.mlb = EEP_READ;
       
EEP2408_ADDRESS = 0x71; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.lmb =EEP_READ;
 
EEP2408_ADDRESS = 0x72; //Force l'adresse ou doit être écrit les data
EEP2408_read_byte(EEP2408_ADDRESS);
printf("\n");
var.byte.llb =EEP_READ;
 
variableFinale2 = var.globalValue;
seuil_haut0 =   variableFinale2 ;
//
....
 
<hr />
mais seul soucis c'est que la phase d'ecriture devait être adaptée au paravant en consequence. il faut que j'adapte aussi en consequence mais
j'ai ça comme code il faudrait autre chose mais quoi exactement pour bien faire?

code d'ecriture sur l'eeprom:
<hr />if(env_choice=='0')
       {

    seuil_bas0=seuil_bas;    EEP2408_ADDRESS 0x65;  //addresse du seuil_bas niveau 0                  EEP2408_VALUE seuil_bas0;
     EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
    EEP2408_ADDRESS = 0x69;  //addresse du seuil_haut niveau 0
    seuil_haut0=seuil_haut;
    EEP2408_VALUE = seuil_haut0;
    EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE);
     }
 
if(env_choice=='1')
       {
   ....
<hr />
Avec ces codes le programme compile bien marche mais je ne sais pas avoir la dernière config lorsque je fais un reset, je pense que le problème vient de mon code d'ecriture sur l'eeprom, comment pourrais je ecrire de façon à ce corriger ce problème?

Merci
0
Rejoignez-nous