CAG control Automatique de Gain (AVC) algorithme pour reguler le volume
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009
-
25 mai 2007 à 10:44
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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");
}
<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.
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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 :");
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);
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");
<!-- 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?
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 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 ?
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 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.
=
Vous n’avez pas trouvé la réponse que vous recherchez ?
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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:");
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
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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?
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 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
====
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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?
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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;
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;
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;
<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?
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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;
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;
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;
<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?
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 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;
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;
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;
<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?