Bygger en batteritestare för 24V. Den lägger på en konstant last tills polspänningen understiger ett visst värde som jag kallar 'CutOffVoltage', varvid testet är klart och avslutas.
Processorn är en ATMEAG168 programmerad med ICCAvr v8.
CurrentValues[CurrentVoltage] innehåller polspänningen i mV och uppdateras via interupt ett antal gånger per sekund.
CurrentValues[CurrentTime] innehåller det antal minuter testet pågått och uppdateras via interup varje hel minut.
TestSetup[] innehåller de testparametrar jag vill att testaren skall använda sig av. Dessa laddas ner innan testet påbörjas. TestSetup[CutOffVoltage] ligger på 20400 mV
Jag vill att polspänningen skall understiga 'CutOffVoltage' minst en minut i sträck för att testet skall avslutas.
Kod: Markera allt
#define CurrentVoltage 9
#define CutOffVoltage 8
#define CurrentTime 2
unsigned int TempTime;
unsigned int CurrentValues[18];
unsigned int TestSetup[30];
main(void)
{
...
...
...
if(CurrentValues[CurrentVoltage] > TestSetup[CutOffVoltage])
TempTime = CurrentValues[CurrentTime];
...
...
...
if(CurrentValues[CurrentTime] > TempTime + 2)
//Skriv ut CurrentValues[CurrentTime], CurrentValues[CurrentVoltage] och TempTime och gå därefter till klart.
}
De värden som skrivs ut kan typiskt vara "CurrentValues[CurrentTime]= 512 CurrentValues[CurrentVoltage]=23890 TempTime=511
Så vitt min defekta hjärna anbelangar så borde inte '512 > 511+2' utvärdera som sant...någonsin....eller???
Alla gånger det faktiskt fungerar som jag tänkt mig så ligger värdena typiskt som "CurrentValues[CurrentTime]= 560 CurrentValues[CurrentVoltage]=20983 TempTime=557", dvs. 3 minuter mellan CurrentValues[CurrentTime] och TempTime.
Det som är lite intressant är att de gånger det inte fungerar så är CurrentValues[CurrentTime] = 256 eller 512 eller 1024. Det kan inte vara en slump. Jag har observerat problemet ett tiotal gånger och det har följt detta mönster VARJE gång.
De flesta test jag kört så har testet pågått till runt 1000 minuter, alltså passerat både 256, 512 minuter utan problem. En del tester har också passerat 1024, och inte haft några problem med det.
Jag lurar på att eftersom det är relativt sällan som det inte fungerar så kanske det är så att det går åt skogen om interupten går in och ökar CurrentValues[CurrentTime] efter att TempTime tilldelats men före jämförelsen "if(CurrentValues[CurrentTime] > TempTime+2)" eftersom det alltid skiljer 1 minut mellan CurrentValues[CurrentTime] och TempTime på utskriften i de fall det inte fungerar.
Kollade manualen för ICCAvr och naturligtvis står det att '+' har högre prioritet än '>'.
Visst skulle jag kunna testa mig fram som man brukar göra, men det blir lite tidsödande efter som jag kommer att få köra i genomsnitt 7-10 test innan felet uppenbarar sig, och varje test bör gå åtminstone 1030 minuter. Sedan måste batterierna laddas upp igen mellan varje test vilket kommer att göra att provkörningen efter varje programändring kommer att ta åtminstone en vecka.
Man skulle kanske kunna göra något "snabbprogram", men jag tycker det är en bättre lösning att faktiskt reda ut vad som händer.
Så, vart har jag klantat till det?
Edit: Ändrade 'temptime' till 'TempTime'