Arduino millis
Arduino millis
Hur läser man av millis() på ett säkert sätt, utan att värdet påverkas av overflow ?
Re: Arduino millis
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.
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++;
}
}
Re: Arduino millis
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 ?
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 ?
Re: Arduino millis
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?
Re: Arduino millis
OK, det kände jag inte till. Då behöver jag inte krångla till det, tack för det.
Re: Arduino millis
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.
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.