Stap 7: Een wandeling door de Code
Een van de punten van het ontwerpen van dit apparaat moest maken het "gehackt". Ik heb de broncode verstrekt, zodat u zowel hoe deze dingen zijn geprogrammeerd leren kunt, en ook om het te wijzigen als u nodig hebt. Als u als me bent, vinden u het moeilijk om te lezen van andermans code, ongeacht de taal. Assembly language is misschien een beetje moeilijker, maar het is snel en je hebt volledige controle.De code is gestructureerd op een hoog niveau in parameters, code en gegevens. de sectie parameters is bedoeld om alle belangrijke contactpersonen die invloed hebben op de werking van de kleurenmodi naar de top waar u gemakkelijk hen wijzigen kunt zonder het duiken in de code. Het eerste deel van de parameter sectie past de code aan de hardware, en hoewel u welkom bent bij het ontwerpen van uw eigen bestuur als ik deed, ik ga om te veronderstellen dat u wilt gebruiken voor dit bord en een van de wijzigingen een van de modi die is er al, of schrijf je eigen. Dus ga naar beneden naar:
.EQU initialMode = 4
.EQU maxModes = 6
De eerste EQU Hiermee stelt u de modus die de ChromoDisk springt in wanneer eerst ingeschakeld of wanneer u op de Reset-knop drukt. Modus 4 is de kabbelende kleur. De volgende EQU is alleen het aantal modi geïmplementeerd in de code. Vergeet niet om dit te veranderen als u een modus van uw eigen ontwerp toevoegt.
De rest van de EQUs zijn specifiek voor elke modus. Ik wilde aanvankelijk een generieke programma schrijven dat stond me toe om het genereren van nieuwe modi net een paar door parameters te wijzigen. Ik bedenken niet een manier dat te doen, zodat elke modus heeft zijn eigen speciale codesectie die je later zult zien. Ive ' voorwaarde opmerkingen die ik hoop dat redelijk makkelijk zijn te begrijpen, als je eenmaal weet hoe de modus werkt.
U zult zien dat er rekenkundige vergelijkingen in een aantal van de EQUs zijn. Er zijn twee dingen om te onthouden hier en de rest van de code: de microcontroller is een geheel getal machine, en het kent twee basismethoden om te werken met getallen. Als je een vergelijking die in een getal met een breuk schrijft resulteert, 's it gonna worden afgekapt. Verwacht niet dat 2/3 te geven u 0.666667. Het geeft je 0. Dit lijkt vanzelfsprekend, maar op een gegeven moment zul je om te vergeten en vraag me af waarom sommige stukje code werkt niet goed. Met betrekking tot systemen voor getalnotatie: je kan het interpreteren van een 8-bits getal als een absoluut getal (0-255) of als een integer (0 - 127, en-128 op -1). Ik weet dat dit goed, en toch ik nog steeds soms krijgen gestruikeld daarop. Een zelfs subtieler probleem is dat de processor integer beschouwen zal als absolute of ondertekende afhankelijk van op welke instructie die u gebruikt. Vertakking is een geweldig voorbeeld. Je zou verwachten dat als je de timer leest en 132 krijgen, dat als u 120 met vergeleken 132 en tak als het lager, BRLT (tak als minder dan), duurt het bijkantoor. Niet zo snel. BRLT wordt ervan uitgegaan dat de nummers zijn ondertekend, dus 132 eigenlijk-125 is. Voor niet-ondertekende getallen, zoals in dit geval, moet u gebruiken BRLO (Branch indien deze lager is). Houd dit in gedachten als je door de code leest.
Het uitvoerbare gedeelte begint met de verklaring van de .cseg. De code bevat, in volgorde:
-de interrupt vectoren dat punt aan de interrupt service routines (ISRs)
-de initialisatiecode, uitgevoerd na een reset
-de belangrijkste code
-de initialisatiecode voor elke modus
-de ISRs
-het gegevensgebied, die met .dseg begint
Ik wil niet om dit te lang, dus ik proberen zal om samen te vatten. Het programma is volledig interrupt-gestuurde, zodat alles in de interrupt service routines gebeurt. De belangrijkste code zet enkel de processor om te slapen. Het wakker wanneer de modus-knop wordt ingedrukt, of wanneer een timer een time-out optreedt. Timer 0 wordt gebruikt om de debounce van de modus-schakelaar. Timer 1 wordt gebruikt om de kleuren wijzigen met behulp van een enkele lijn van de PWM-besturing en de kleur aan/uit-uitgangen.
De modusschakelaar illustreert de hardware / software trade-off eerder vermeld. Schakelaar contacten stuiteren wanneer u druk op hen, dus u moet kunnen omgaan met een aantal korte pulsen, in plaats van gewoon een hoog of laag vermogen. Uiteindelijk heb ik dit te doen in software omdat ik niet kon vinden een gemakkelijke manier om het te doen met de ruimte en de hardware die ik had. In principe stelt de modusschakelaar Timer 0. Als timer 0 een time-out optreedt voordat het wordt gereset, neemt de code de contacten zijn gestopt met het stuiteren en de code actie kan ondernemen. Dit is een beetje van een hack en je moet zorgvuldig kiezen van de time-outwaarde. U zult zien dat het apparaat soms een modus, slaat zodat de timerinstelling is niet perfect. Het is een trade-off tussen responstijd op te drukken op de knop en hoe vaak wordt een modus.
Als u zien hoe elke modus wordt uitgevoerd wilt, kijken naar de Timer 1-ISR. Er is een variabele in het geheugen waarmee wordt bijgehouden welke modus er in. De ISR kijkt naar dat nummer en springt naar het rechter gedeelte van de code, soort van als een geval of de schakelaar verklaring. Elke modus moet bijhouden van zijn eigen staat, opgeslagen in het RAM, zoals welke kleur er op. De meeste functies draai op de rode, dan de groene en de blauwe, en weer terug naar rood. In het algemeen, kunnen niet ze alles worden ingeschakeld op hetzelfde moment omdat er slechts een PWM-uitgang beheren alles en hij breedte is afhankelijk van de helderheid van de kleur die op.
Dus dat is een snel overzicht, zonder het schrijven van een boek. I'l proberen vragen te beantwoorden meer gedetailleerde als u deze boekt. Veel plezier!