Arduino millis

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
persika
EF Sponsor
Inlägg: 1347
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Arduino millis

Inlägg av persika »

Hur läser man av millis() på ett säkert sätt, utan att värdet påverkas av overflow ?
ToPNoTCH
Inlägg: 4882
Blev medlem: 21 december 2009, 17:59:48

Re: Arduino millis

Inlägg av ToPNoTCH »

Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Arduino millis

Inlägg av Micke_s »

Om du kör skillnad mellan två tider så är det ingen fara så länge skillnaden inte är över 49 dagar.

Behöver du längre tider så finns det några sätt att göra den längre.

En variant är att titta på millis() och titta på differansen varje gång den har flyttat sig 1000ms och räkna upp en "unsigned long".
då får du en ny räknare som räknar is sekunder 4294967295 sekunder => ca 136år.
Din arduino har nog dött/startat om minst en gång innan 136 år har gått.

Kod: Markera allt

unsigned long last_millis=0;
unsigned long seconds=0;

void setup() {

}

void loop() {
  //Run every 1second.
  if( (millis() - last_millis) >= 1000){
    last_millis += 1000;
    seconds++;
  }
  
}
persika
EF Sponsor
Inlägg: 1347
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: Arduino millis

Inlägg av persika »

Tack för svar till er båda!

Nu har jag funderat ett tag på det här.
Först vill jag förtydliga att med overflow menade jag "internt" overflow, alltså
när det slår om från ex.vis 0x0000FFFF till 0x00010000.

Om interruptet för millis() kommer under tiden huvudprogrammet läser av värdet kan det bli felaktigt resultat, eftersom processorn inte hanterar hela 32-bits talet utan tar 8 bitar åtgången.

Men, om man då gör så att man först läser av millis() en gång och sen direkt en gång till och jämför de två talen, om de då är lika så måste millis() blivit rätt avläst.
Vad säger ni här på forumet om detta ?
bearing
Inlägg: 11250
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Arduino millis

Inlägg av bearing »

Arduino-miljön har redan sett till att värdet är korrekt. Användaren av funktionen millis behöver inte tänka på register eller interrupts. Har du fått annan information?
persika
EF Sponsor
Inlägg: 1347
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: Arduino millis

Inlägg av persika »

OK, det kände jag inte till. Då behöver jag inte krångla till det, tack för det.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino millis

Inlägg av sodjan »

Nu vet jag inte hur Arduino/AVR miljön löser det, men du tänker nog på
en lite lägre nivå med 8-bitars register antar jag. Som sagt, jag vet inte
hur det är löst i AVR, men i (lite modernare) PIC är det löst så att då man
läser ena "halvan" av en 16-bitars räknare så kopieras den andra halvan
vid samma ögonblick till ett skuggregister som sedan används då man
läser den andra halvan, även om själva räknaren har fortsatt en bit.
Men måste läsa i en viss ordning och enligt dokumentationen.
Skriv svar