ChronosMEGA; ett armbandsur (5 / 16 steg)
Steg 5: Programvara med församling
Logik flödet av SW för Watch avbildas ovan. Programmering gjordes helt i församlingen, genomföra de avbrott, ADC, Power Management, GPIO och Timer funktionerna för ATmega328P. De skäl jag välja för min programmeringsspråk var att optimera min program bäst jag kunde och eftersom jag stolthet över mig själv arbetar i svårare, nivåer lägre för projekt.
5.1 första prototypen
En utvecklingssystem som ungefär emuleras det slutliga ChronosMEGA konstruerades för att genomföra SW som skulle köras på klockan. Strömtillförseln till klockan skapades först separat på en fabricerade PCB jag utformade och användes för att driva kretsen. Denna enhet var sedan inbäddade till färdig produkt.
En video som visar bakbord kretsen visas nedan:
5.2. avbryter
Det finns 4 olika avbrott rutiner för ChronosMEGA: en för HR + och MIN + knappar, en för sömnen och displayen knappar, en för Timer2 jämför match, och sist för Timer1 jämför match.
8-bitars Timer2 modulen är programmerad att räkna 10ths av en sekund asynkront från systemet. När det räknas en 10: e sekund det avbryter och ökar 10 i ett andra värde.
16-bitars Timer1 modulen används för att gå ut i 5 sekunder när användaren trycker på knappen Display tid att se tiden. När denna Timer avbryter, det stänger av bildskärmen och ChronosMEGA återgår till sitt viloläge.
5.3. energisparfunktioner och viloläge
Ett stort mål var att göra ChronosMEGA så effektiv som möjligt, med stora 400mAh batteri, klockan har förmågan att pågå mycket länge på en enda laddning. Det avslutade projektet och ChronosMEGA drar en osjälvisk 4 microAmps i viloläget och beräknas till sista 11 år på en enda laddning.
ChronosMEGA spår fortfarande tid i nuläget sömn, vakna upp bara för att öka räknaren andra och knapptryckningar. Systemklockan stoppas helt, och endast Timer2 modulen med dess asynkron 32.768kHz kristall håller igång.
När användaren trycker på knappen "Sleep", programmet sätter en flagga och släcks LED-displayen. I Main slingan, kontrolleras sömn flagg och börjar sova preparat om det är 0x01. Nedan är de viktigaste loopen:
De sova registrerar ställs in innan huvudloop att gå in i "Energisparläge" läge genom att ange SM [2:0] bitar till 0b011. "Energisparläge" läge stänger av ATmega328P men tillåter Timer2 att hålla igång förutsatt att det är asynkron. Jämför match och externa avbryter kommer att vakna upp ATmega328P tillfälligt, för att serva rutinen avbrott och somna om så behövs.
5.4. emission av LED flimrar och jitter
Efter uppladdning det inledande programmet till ChronosMEGA, märkte jag några svagt flimmer i några av lamporna när de inte skulle vara på. Detta störde mig och jag kom till slutsatsen att det måste vara något fel med min programmering konventioner som orsakade problemet.
Källan till problemet upptäcktes när jag observerade stacken under simuleringar och märkte att min generella registren var inte vara sköt och dök från stacken, alltså skruva upp min bearbetning. Detta löstes genom att trycka register på stacken när en avbrottstjänstens rutin anropas, och poppar registren när rutinen är klar. Ett avbrott exempel visas nedan:
När funktionen "IncSec10" kallas, stacken visas som nedan:
Efter "IncSec10" är klar, är registren popped tillbaka av stacken att återställa sitt ursprungliga värde.