Я пишу прошивку для устройства MSP430, которое использует светодиоды и фотодиоды для обнаружения конкретных типов чернил. Устройство сканирует около 155 единиц, а образцы под сканером - от скоростей от 0,1 м/с до 3,3 м/с. Целью устройства является проверка чернил и измерение чернил (прохода) для проверки (без прохода) и включение зеленого светодиода, когда соотношение между соответствующим значением и включение красного светодиода, когда это не так. Я использую статические целые массивы для хранения значений последовательных проходов и тестовых значений с одним и тем же номером индекса для каждого массива. После последнего индекса массива индекс возвращается к нулю и старые значения записываются.Circular Array Застрял в операторах
GREEN_LED_ON; и аналогичные определения являются определениями портов для моего MCU и подтверждены как правильные.
событие - результат теста. Если чернила обнаружено, событие = ОБНАРУЖЕНО и наоборот
тест будет средний набор на GUI, но сейчас это ничего, потому что я не имею эту часть моей функции рабочего
Обычно я не будет GREEN_LED_ON; и т. д. в циклах if (event), но я помещаю их туда, чтобы визуально, где мой код идет не так. Кажется, что код застрял, когда даже петля даже начинается. Например, если я начну с устройства без чернил, светодиод останется красным, а когда устройство закончит чернила, устройство останется зеленым, несмотря ни на что. Кто-нибудь знает, что я делаю неправильно и как это исправить?
Примечание:
* Я также попытался изменить время (событие), ей в случае заявления, и я получаю тот же результат
* Когда я комментирую массивы внутри если заявления, что код работает, как ожидалось
* Top версия текущая часть кода и внизу, что я начал с
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;
}
}
Это было то, что я первоначально начал с:
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;
}
Оба раздела будут «застревать», потому что событие не изменяет значение внутри. Наверное, вы имели в виду «если», а не «пока». – Anty
@Anty Я на самом деле попытался заменить whiles на ifs и получил тот же точный результат. –
Вы по-прежнему пропустите пункт - «событие» не изменит значение во время выполнения дисплея. Как вызывается отображение и как считывается событие? – Anty