Je suis en train d'écrire un firmware pour un appareil MSP430 qui utilise des LED et des photodiodes pour détecter des types spécifiques sur l'encre. Le dispositif scanne à environ 155us et les échantillons sous le scanner vont de 0,1 m/s à 3,3 m/s. Le but de l'appareil est de tester l'encre et de mesurer l'encre (passer) pour tester (pas passer) et allumer une LED verte lorsque le rapport est entre la valeur correspondante et allumer une LED rouge quand ce n'est pas le cas. J'utilise des tableaux entiers statiques pour stocker les valeurs des passes consécutives et des valeurs de test au même numéro d'index de chaque tableau. Après le dernier index du tableau, l'index est remis à zéro et les anciennes valeurs sont écrasées.Tableau circulaire Collé dans les instructions if
GREEN_LED_ON; et les définitions similaires sont des définitions de port pour mon MCU et sont vérifiées pour être correctes.
événement est le résultat du test. Si l'encre est détectée, événement = DETECTEE et vice versa
test sera l'ensemble moyen d'une interface graphique, mais pour l'instant il n'y a rien parce que je ne l'ai pas partie de ma fonction de travail
Normalement, je n'aura pas GREEN_LED_ON; etc dans les boucles if (event), mais je les ai mis là pour voir où mon code ne va pas. Le code semble être coincé dans lequel jamais boucle commence même avec. Par exemple, si je commence avec l'appareil sans encre, la LED reste rouge, et quand l'appareil est sur l'encre, l'appareil reste vert, peu importe quoi. Est-ce que quelqu'un a une idée de ce que je fais de mal et comment le réparer?
Remarques:
* J'ai aussi essayé de changer le tout (événement) s à se déclarations et je reçois le même résultat
* Quand je commente les tableaux dans l'instruction if, le code fonctionne comme prévu
* version Top est la partie actuelle du code et le fond est ce que j'ai commencé avec
void display(char event, char test) {
static int size=6;
static int array[6]={0}; //array with number of passes for each n
static int n=0;
static float sum=0;//total number of passes
static float average=0;//average pass rate over n
static int consecpass=0; //consecutive passes
static int consecfail=0; //consecutive fails
static int totalnumberoftests[6]={0}; //total number of tests conducted. Counts the number of passing or failing tests for the nth value
static float counter=1; //used to count the total number of tests
static int flag=0;
if(n==size) n=0;
if (event == DETECTED)
{
if (flag==0)
{
sum=sum-array[n];
counter=counter-totalnumberoftests[n];
array[n]=0;
totalnumberoftests[n]=consecfail;
sum=sum+array[n];
counter=counter+totalnumberoftests[n];
n++;
}
consecfail=0;
consecpass++;
//GREEN_LED_ON;
//RED_LED_OFF;
flag=1;
} if (event==NOT_DETECTED){
if(flag==1)
{
sum=sum-array[n];
counter=counter-totalnumberoftests[n];
array[n]=consecpass;
totalnumberoftests[n]=consecpass;
sum=sum+array[n];
counter=counter+totalnumberoftests[n];
n++;
}
//array[n]=consecpass;
//totalnumberoftests[n]=consecpass;
consecpass=0;
consecfail++;
flag=0;
//GREEN_LED_OFF;
//RED_LED_ON;
}
if (consecpass>8000)
{
sum=sum-array[n];
counter=counter-totalnumberoftests[n];
array[n]=consecpass;
totalnumberoftests[n]=consecpass;
sum=sum+array[n];
counter=counter+totalnumberoftests[n];
n++;
}
if(consecfail>30000)
{
sum=sum-array[n];
counter=counter-totalnumberoftests[n];
array[n]=0;
totalnumberoftests[n]=consecfail;
sum=sum+array[n];
counter=counter+totalnumberoftests[n];
n++;
}
average=sum/counter;
if(average<1 && average >0)
{
GREEN_LED_ON;
RED_LED_OFF;
}else{
GREEN_LED_OFF;
RED_LED_ON;
}
}
C'était ce que je l'origine commencé par:
void display(char event, char test) {
static int size=6;
static int array[6]={0}; //array with number of passes for each n
static int n=0;
static int sum=0;//total number of passes
static double average=0;//average pass rate over n
static int consecpass=0; //consecutive passes
static int consecfail=0; //consecutive fails
static int totalnumberoftests[6]={0}; //total number of tests conducted. Counts the number of passing or failing tests for the nth value
static float counter=0; //used to count the total number of tests
while(n<=size)
{
sum=sum-array[n]; //subtacts the nth value from the total sum of passing tests
counter=counter-totalnumberoftests[n]; //subtracts the nth value of the total number of tests run
if(event == DETECTED)
{
array[n]=0;
totalnumberoftests[n]=consecfail;
consecfail=0;
consecpass++;
GREEN_LED_ON;
RED_LED_OFF;
} if(event==NOT_DETECTED){
array[n]=consecpass;
totalnumberoftests[n]=consecpass;
consecpass=0;
consecfail++;
GREEN_LED_OFF;
RED_LED_ON;
}
sum=sum+array[n];
counter=counter+totalnumberoftests[n];
average=sum/counter;
/*if(average<1)
{
GREEN_LED_ON;
RED_LED_OFF;
}else{
GREEN_LED_OFF;
RED_LED_ON;
}*/
n++;
}
if(n>size) n=0;
}
Tant que les sections seront "bloquées" car l'événement ne change pas de valeur à l'intérieur. Je suppose que vous vouliez dire "si" et non "alors" là. – Anty
@Anty J'ai effectivement essayé de remplacer les whiles par ifs et j'ai obtenu le même résultat exact –
Vous manquez toujours le point - "événement" ne changera pas la valeur pendant l'exécution de l'affichage. Comment l'affichage est-il appelé et comment l'événement est-il lu? – Anty