AVR dubbla RGB Matrix föraren (9 / 12 steg)
Steg 9: Firmware - del 2: färg skapandet
Den kompletta källkoden är tillgänglig i denna GitHub databaser.
Som previosly nämnde, används en 8-bitars timer för att styra alla LED färger. Varje bränning av den Jämför matcha A ISR signalerar en timing händelse. En upplösning på 4 innebär verkliga värden 0, 1, 2 och 3. En variabel används för att räkna vad ISR trigger klockan är just nu, och en switch-case -sats används för att göra några olika saker vid olika tidpunkter. När räkningen är lika med max upplösning, händer ingenting eftersom alla lysdioder bör stanna på om de redan är på, eller stanna utanför om de redan bort. Vid 0 är det dags att växla kontroll till nästa 8 kolumner. Alla lysdioder är då inställd på, men faktiskt inte påslagen. Koden fortsätter sedan till standard fallet som hanterar alla andra gånger.
I detta sista fall itererar en loopen igenom varje RGB LED i kolumnen aktivt för båda matriser. Om nuvarande räknaren är lika med off tiden för R, G eller B lysdioder för önskad färg, sätts det LED att vara avstängd. Slutligen, data skiftas ut till de konstant ström föraren att faktiskt vända lysdioderna på eller av. Denna förskjutning är en bit-bang version av faktiska SPI protokoll, med varje LED driver chip att ha en separat rad så att de kan alla vara lastat på en gång.
//-----------------------------------------------
LED-färg kontrollram
---/ / Timer 0 jämför matcha en avbryta tjänsten RoutineISR (TIMER0_COMPA_vect)
{
Byta räknarvärdet från '0' till LED Max Resolutionswitch (OCR0A_cnt) {
//--------------------------
Max Resolution, inte göra någonting!
Vid denna punkt, bör lysdioder bo
---MAX_COLOR_RESOLUTION i mål:
break;//--------------------------
LED Period börjar
//--------------------------case 0:
Starta en positiv puls att skifta genom kontroll register / / slå alla lysdioder på / / Fortsätt till nästa case...//---
Alla andra gånger
-Loopa igenom alla färger för alla lysdioder
-Inaktivera enskilda lysdioder i rätt tid
//--------------------------default:
Hitta lysdioder att vända off...do {
Loopa igenom alla LED för både matriser / / uppdatering "LED" array med nya värden / / urval för röda lysdioden för den aktuella raden eller kolumnen i matrisen 0
this_color = färger [0] [kolumn] [ledde];
om (OCR0A_cnt == COLOR_LEVELS[this_color][RED_LEVEL])
lysdioder [0] [kolumn] [RED_LEDS] & = ~(_BV(led));
} medan (...);
Flytta kontrollen till nästa kolumn / / överföring "LED" array data till LED driversdo {
Loopa igenom 8 bitar av en databyte (Bit Bang SPI) / / Set databitar / / SKIFT bitars ut till LED drivrutiner
} medan (...);
Spärren data och aktiverar LEDsbreak;
}
Starta om countif (++ OCR0A_cnt > MAX_COLOR_RESOLUTION)
OCR0A_cnt = 0;
}
Därefter ska vi prata om standard driften av föraren.