Stap 48: Software: tijd vertragingen en animaties
Een van de meest effectieve manieren om dit te doen is het gebruik van een globale teller die in een interrupt routine wordt opgehoogd. In de interrupt service routine voor Timer3 is er een globale variabele voor 32-bits (count32) die op elke interrupt wordt opgehoogd. Deze variabele zal gebruikt worden in de meeste van onze interrupt vertragingen samen met een functie genaamd ' Time_Check (UINT32 * mark, UINT16 interval)' te laten toe om de vertragingstijd terwijl nog steeds het programma overlopen bij te houden. We zullen een voorbeeld animatie dat elke rij op de LED-grid een tegelijk oplicht maken. Wij noemen het 'Our_Test_Animation(void)'.
Our_Test_Animation(void)
1) in het Globals.h bestand, seq [x] te wijden aan uw functie die u maakt. wordt een ongebruikte variabele in de matrix van seq [] 'x'. Voor dit voorbeeld zullen we gebruiken seq [24].
2) de functie-prototype aan uw headerbestand toevoegen en instellen van de functie in het C-programmabestand. Voor dit voorbeeld zullen onze 'UINT8 Our_Test_Animation(void)'.
3) verklaren een 'statische UINT8 last_seq' die gelijk is aan 0xFF en een 'statische UINT32 tmark' variabele die gelijk is aan 0. Deze variabelen moeten statische zodat de routine hun waarden onthoudt wanneer het doorlopen terug de animatie.
4) zullen we ten minste één lokale variabele met de naam 'vertraging', die wordt gebruikt om te verwijzen naar 'count32' in de Time_Check() functie. 'vertraging' doet precies wat het heet, het het programma een bepaalde hoeveelheid tijd vertragingen (8ms/onderbreken * waarde van 'vertraging').
5) De waarde van de reset voor seq [x] is 0xFF. Wanneer de routine begint zal het uitvoeren van de ' als (seq [24] == 0xFF)' stuk van code, dit is waar we bepaalde variabelen voor de opstart van onze animatie instellen.
6) de volgende ' als (seq [24]! = last_seq) "instructie controleert om te zien of er een nieuwe reeks. Als er, last_seq wordt bijgewerkt met de huidige waarde van seq [24], het zal vervolgens update onze timing referentie (tmark) en vervolgens de code van de animatie.
7) ' als (Time_Check (& tmark, vertraging))' controles om te zien als de opgegeven hoeveelheid tijd is verstreken sinds de laatste lus door middel van de functie. Als het gebeurd, seq [24] de volgende volgorde wordt bijgewerkt en de animatie zal worden bijgewerkt op de next-lus door middel van de functie.
8) ' als (seq [24] > 31)' zal controleren om te zien of alle van de sequenties zijn uitgevoerd en indien de animatie is voltooid. De waarde van '31' hangt af van hoeveel sequenties hebt in uw routine (we hebben 32 sequenties in deze routine, 0 - 31). Als alle van de sequenties zijn uitgevoerd, zullen wij seq [24] ingesteld op de standaardwaarde van 0xFF en retourneren een 0 die aangeeft dat de animatie is voltooid.
9) als de animatie nog niet alle van de sequenties uitgevoerd een 1 wordt geretourneerd.
Kruis verwijst naar de bovenstaande stappen met de afgewerkte code in foto #4. Door het creëren van een animatie deze manier, zijn wij beperkt tot 255 reeksen (255 reeksen + 1 reset volgorde) omdat we een 8-bits variabele voor seq [x gebruiken]. Moet u meer dan 255 frames, kunt u wijzigen seq [x] aan een 16-bits variabele en hebben tot 65535 sequenties. Moet u nauwkeuriger timing dan Timer3 (~ 8ms per interrupt) kunnen bieden, kunt u Timer5 verplaatsen de globale teller (count32) er te vroeg onderbreken instellen. Tot slot, de standaardhoeveelheid animaties die de code ondersteunen is 50. Als u meer dan 50 interrupt vertraagd animaties moet, moet u enkel Verhoog de waarde van de constante SEQ_AMOUNT (typedefs.h) aan de waarde die u nodig hebt.
De belangrijkste beperking aan het gebruik van een interrupt vertraging zoals dit is dat onze hoofdlus moet efficiënt en we kunnen niet teveel tijd in een routine in de hoofdlus. Het programma moet de hele weg door blijven stromen omdat als het stopt voor het te lang de timing van de rest van de routines mee zal vertragen. Foto #5 bevat een ander voorbeeld voor een animatie genaamd Cycle_Colors(void) die dezelfde interrupt vertraging indeling gebruikt.