2017-02-08 4 views
0

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; 


    } 
+1

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

+0

@Anty J'ai effectivement essayé de remplacer les whiles par ifs et j'ai obtenu le même résultat exact –

+0

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

Répondre

1

* Quand je commente les tableaux dans l'instruction if, le code fonctionne comme prévu

static int size=6; 
static int array[6]={0}; //array with number of passes for each n 
static int totalnumberoftests[6]={0}; 

et ce

while(n<=size) 

Lorsque n = 6 vous passez le tableau boundary - max index est 5 et non 6 pour ceux (index min = 0).

array[n]=0; 
    totalnumberoftests[n]=consecfail; 

Ceci est UB et ceci peut produire un comportement incorrect.

Modifier la condition dans while à n < taille.

De toute façon ce code me semble "bizarre".

+0

La boucle while est-elle nécessaire? Un autre commentateur a décrit que l'appel de l'événement fonctionne essentiellement comme la boucle while et qu'un autre peut causer des problèmes avec ce que je veux arriver –

0

Pour des détails sur mon commentaire, si vous êtes dans un système événementiel, je me attends un peu de code (généralement appelé « boucle d'événement ») quelque part qui ressemble à ceci:

event_loop() 
{ 
    while (TRUE) 
    { 
     event = get_event_from_someplace(...); 

     display(...); 
    } 
} 

Il peut Soit cela au lieu d'appeler display directement, il y avait un processus où vous registre le gestionnaire d'événements . Mais le résultat est qu'il y a probablement une boucle sans fin dans un code de bibliothèque qui appelle votre fonction encore et encore et encore. Vous n'avez donc pas besoin du while() dans votre code.

Votre code doit être un machine d'état qui garde la trace de l'état interne (en utilisant les variables static, comme vous l'êtes), puis effectue toutes les mises à jour nécessaires pour chaque appel.

Quelque chose comme ceci:

void display(char event, ...) 
{ 
    static int consecutive_passes = 0; 
    static int consecutive_fails = 0; 


    if (event == DETECTED) { 
     ++consecutive_passes; 
    } 
    else if (event == NOT_DETECTED) { 
     ++consecutive_fails; 
    } 
    else { 
     // What else is there? 
    } 
} 

L'idée est que ce code est appelé chaque fois qu'il ya un événement, et il vient des mises à jour tout ensemble de choses ont besoin de mise à jour. Mais il n'y a pas de boucle while, parce que les appels proviennent de la boucle d'événements, et c'est toute la boucle dont vous avez besoin while.

+0

Je vois. Merci pour la clarification! Le point de la boucle while est que les tableaux réécrivent les données après n> size (des tableaux) et j'utilise une boucle while pour définir l'index du tableau. Est-ce que cela peut être fait avec si des instructions et des drapeaux à la place? J'ai fait une édition montrant ce que j'ai fait avec le code mais ça ne fonctionne toujours pas exactement comme je le veux. –

+0

Oui! Votre mise à jour, avec 'if (n == size) n = 0;' est parfaite. Cela gère la partie "circulaire" du tableau. Je dois admettre, cependant, que le reste de votre code me déroute. Pouvez-vous ajouter une mise à jour qui explique ce que vous testez et quel type de statistiques vous tentez de collecter? –