Stap 9: Firmware - deel 2: kleur van creatie
De complete broncode is beschikbaar in Deze repository GitHub.
Als previosly vermeld, wordt een 8 bits timer gebruikt om alle van de LED kleuren te controleren. Elke afvuren van de vergelijk overeenkomen met A ISR signalen een timing-gebeurtenis. Een resolutie van 4 impliceert werkelijke waarden van 0, 1, 2 en 3. Een variabele wordt gebruikt om te tellen hoe ISR trigger laat het momenteel is, en een schakelaar-case -instructie wordt gebruikt om te doen een paar verschillende dingen op verschillende tijdstippen. Wanneer het aantal gelijk aan max resolutie is, gebeurt er niets omdat alle LEDs moeten blijven als ze al op, of blijf af als ze al uitgeschakeld zijn. Op 0 is het tijd om de schakelaar naar de volgende 8 kolommen. Alle LED's zijn vervolgens instellen op, maar niet daadwerkelijk ingeschakeld. De code blijft vervolgens aan het standaardhoofdlettergebruik die alle andere tijden behandelt.
In dit laatste geval is een lus doorlopen van iedere RGB LED in de actieve kolom voor beide matrices. Als de huidige teller gelijk aan de weg tijd voor de R, G of B LEDs voor de gewenste kleur is, ligt dat LED worden uitgeschakeld. Ten slotte wordt de gegevens verschoven uit de constante huidige stuurprogramma's eigenlijk de LEDs op of uit te schakelen. Deze verschuiving is een versie van de bits-bang van werkelijke SPI-protocol, met elke LED driver chip hebben een aparte data-lijn zodat ze allemaal geladen in een keer worden kunnen.
//----------------------------------------------- // LED Color Control Framework //-----------------------------------------------// Timer 0 Compare Match A Interrupt Service RoutineISR (TIMER0_COMPA_vect) { // Switch the Counter value from '0' to LED Max Resolutionswitch (OCR0A_cnt) { //-------------------------- // Max Resolution, don't do anything! // At this point, LEDs should stay on //--------------------------case MAX_COLOR_RESOLUTION: break;//-------------------------- // Start of LED Period //--------------------------case 0: // Start a positive pulse to shift through the control register// Turn all LEDs on// Continue to next case...//-------------------------- // All Other times // - Loop through all colors for all leds // - Turn individual LEDs off at the right time //--------------------------default: // Find LEDs to turn off...do { // Loop through every LED for both matrices// Update "leds" array with new values// Sample for the Red LED of the current row and column in matrix 0 this_color = colors[0][column][led]; if (OCR0A_cnt == COLOR_LEVELS[this_color][RED_LEVEL]) leds[0][column][RED_LEDS] &= ~(_BV(led)); } while ( ... ); // Shift control to next column// Transfer "leds" array data to LED driversdo { // Loop through 8 bits of a data byte (Bit Bang SPI)// Set data bits// Shift bit out to LED drivers } while ( ... ); // Latch data and enable LEDsbreak; } // Restart the countif (++OCR0A_cnt > MAX_COLOR_RESOLUTION) OCR0A_cnt = 0; }
Vervolgens zullen we praten over de standaardbewerking voor het stuurprogramma.