Interaktiva LED öl Pong tabell (48 / 87 steg)
Steg 48: Programvara: tid förseningar och animationer
En av de mest effektiva sätten att göra detta är att använda en global räknare som får ökas i rutinen avbrott. I avbrottstjänstens rutin för Timer3 finns det en global 32-bitars variabel (count32) som får ökas på varje avbrott. Denna variabel kommer att användas i flesta av våra avbrott förseningar tillsammans med en funktion kallad "Time_Check (UINT32 * mark, UINT16 intervall)" att tillåta oss att hålla reda på fördröjningstiden samtidigt hålla programmet flöda. Vi kommer att skapa en exempel animering som lyser upp varje rad på rutnätet LED en i taget. Vi kommer att kalla det "Our_Test_Animation(void)".
Our_Test_Animation(void)
1) i filen Globals.h, ägna seq [x] att din funktion som du skapar. att vara en oanvänd variabel i matrisen seq [] 'x'. För detta exempel använder vi seq [24].
2) lägga till funktionen prototypen i din header-fil och konfigurera funktionen i filen C. Det här exemplet blir vår "UINT8 Our_Test_Animation(void)".
3) deklarera en "statisk UINT8 last_seq" som är lika med 0xFF och en "statisk UINT32 tmark" variabel som är lika med 0. Dessa variabler måste vara statiska så att rutinen kommer ihåg deras värden när det loopar tillbaka igenom animationen.
4) vi kommer att behöva minst en lokal variabel kallas "försening" som används för att referera till "count32" i funktionen Time_Check(). "försening" gör exakt vad det heter, det förseningar i programmet en viss tid (8 ms/Avbryt * värdet av "försening").
5) Återställa värdet för seq [x] är 0xFF. När rutinen börjar kommer den att köra i "om (seq [24] == 0xFF)' bit kod, det är där vi satt upp vissa variabler för start av vår animation.
6) nästa "om (seq [24]! = last_seq)" uttalande kontrollerar om det finns en ny sekvens. Om det finns, det kommer att uppdatera last_seq med nuvarande seq [24] värdet, sedan uppdatera vår timing referens (tmark) och sedan uppdatera animation koden.
7) ' om (Time_Check (& tmark, fördröjning)) "kontroller för att se om en viss tid har gått sedan sista öglan genom funktionen. Om det har, det kommer att uppdatera seq [24] till den nästa sekvensen och animeringen kommer att uppdateras på nästa loop genom funktionen.
8) ' om (seq [24] > 31) "kontroll för att se om alla sekvenser har utförts och om animeringen är klar. Värdet av "31" beror på hur många sekvenser du har i din rutin (vi har 32 sekvenser i denna rutin, 0 - 31). Om alla sekvenserna har avrättats, vi har seq [24] dess standardvärde för 0xFF och returnera 0 indikerar att animeringen är klar.
9) om animeringen inte har fullgjort alla sina sekvenser den vilja återvända en 1.
Cross referera till ovanstående steg med färdiga koden i foto #4. Genom att skapa en animering detta sätt, är vi begränsade till 255 sekvenser (255 sekvenser + 1 Återställ sekvens) eftersom vi använder en 8-bitars variabel för seq [x]. Om du behöver mer än 255 ramar, kan du ändra seq [x] till en 16-bitars variabel och har upp till 65535 sekvenser. Om du behöver mer exakt timing än Timer3 kan erbjuda (~ 8 ms per avbrott), kan du ställa in Timer5 att avbryta förr och flytta den globala räknaren (count32) där. Slutligen, standard animeringar som har stöd för koden är 50. Om du behöver mer än 50 avbryta fördröjd animationer, behöver du bara att öka värdet av det konstanta SEQ_AMOUNT (typedefs.h) till det värde som du behöver.
Den huvudsakliga begränsningen till att använda ett avbrott dröjsmål som detta är att våra huvudloop måste vara effektiv och vi kan inte slösa för mycket tid i någon rutin i de viktigaste loopen. Programmet måste hålla flyter hela vägen igenom eftersom om det stannar för länge det fördröjer tidpunkten för resten av rutinerna tillsammans med den. Foto #5 innehåller ett annat exempel för en animering som kallas Cycle_Colors(void) som använder samma avbrott fördröjning format.