olof_n skrev:
Hur är sekunder deklarerad? Är den mer än 1 byte lång måste du göra den atomic för att vara säker på att det funkar eller stänga av interrupt när du läser eller skriver till den utanför ditt IRQ.
Hade jag inte tänk på.
Nu är min variabel deklarerad som en byte (volatile uint8_t) så det är lugnt.
En fundering kring ATOMIC_BLOCK.
I mitt fall vore det värre att använda funktionen. Om interrupten stängs av missar jag pulser, typ det värsta som kan hända i en klocka.
Utan ATOMIC och användandet av int kan jag läsa fel värde. Men ställt mot att missa pulser känns det som ett bättre alternativ (nästa sekund har det rättats till).
Nej, du inaktiverar bara interrupten tillfälligt, och sedan när de aktiveras igen kommer alla väntande interrupt köras.
Enda möjligheten att missa att hantera ett interrupt är ifall du skulle ha interrupt avstängt i mer än 1 sekund. Men det borde väl bara handla om om ett tiotal cykler i ditt fall.
Behöver man verkligen göra ++-n i ett atomic block?
Är det inte bara vid vissa register som använder samma interna 8-bits temp-register när en 16-bits värde ska läsas/sättas?
Och är man i isr-en är det väl lugnt, det är väl i main-programmet som det kan bli problem.
volatile hade jag använt, men vad vet jag?
Har kört min kinesiska ds3231 för 7:- i ett drygt dygn. Hittills ligger den inom samma 1/10-dels sekund jämfört mot gps-en.
Lite klurigt att mäta för rtc-n ger bara ut hela sekunder, gps-en ger 0.01 sekunder men den kommer ut som en seriell output med 10 Hz. Men genom att mäta 1000 gånger vid lite olika tillfällen och se hur många gånger som det är exakt samma sekund och hur många gånger det skiljer en sekund så borde det visa på 0.1 sek upplösning. Ungefär i alla fall. Tillräckligt för att se att den inte drivit sekunder. Den verkar ligga stabilt. I går kväll drog den sej in i en annan 1/10-del men tydligen gått tillbaka i natt. Ds3231 har mesta tiden gått på 5V från usbn, men jag låter den gå på batteri ett dygn nu. Det är för övrigt ett cr2032, hade inget uppladdningsbart.
Nu när min ds3231 har gått i 8 dygn är det ingen tvekan om att den dragit sej 0.1 sekunder mot gps-klockan. Den låg länge kvar inom samma 1/10-del men idag slog den över till nästa 1/10-del. Denna ds3231 går alltså liiite långsammare än gps-en. Den har legat i fönstret för gps-mottagningens skull och matats med spänning från en arduino mega 2560 för enkelhetens skull..
hawakan: Då kan du ju rucka den med hjälp av "Aging Offset" registret till valfri noggrannhet... Tänk dock på att det blir mycket temperaturberoende...
Efter ungefär en månad så avviker tiden från ds3231 1.0 sekunder mot gps.
Hälften av tiden ca driven via usb, resten av tiden enbart på det lilla batteriet.