ChromoDisk (7 / 8 steg)

Steg 7: En promenad genom koden

En av punkterna för att utforma denna enhet var att göra det "hacka". Jag har förutsatt källkoden så att du kan både lära dig hur dessa saker är programmerade, och även att ändra den som du vill. Om du är som mig, svårt du att läsa någon annans kod, oavsett vilket språk. Assembler är kanske lite svårare, men det är snabbt och du har fullständig kontroll.

Koden är uppbyggt på en hög nivå i parametrar, kod och data. avsnittet parametrar är tänkt att föra alla viktiga kontakter som påverkar hur färgläget arbete till toppen där du kan enkelt ändra dem utan dykning i koden. Den första delen av avsnittet parametern anpassar koden till maskinvaran och, även om du är välkommen att designa din egen bräda som jag gjorde, jag ska anta att du vill använda det för detta forum och antingen ändra ett av lägena som är redan där, eller skriva egna. Så hoppa ner till:

.EQU initialMode = 4
.EQU maxModes = 6

Den första EQU s├ñtter ChromoDisk hoppar in när första driv på eller när du trycker på Reset-knappen. Leveranssätt 4 är porlande färgläget. Den nästa EQU är bara antalet lägen i koden. Kom ihåg att ändra detta om du lägger till en läge av din egen design.

Resten av EQUs är specifika för varje läge. Först ville jag skriva ett generiskt program som tillät mig att generera nya lägen bara genom att ändra några parametrar. Jag lista inte ut ett sätt att göra det, så varje läge har sin egen speciella kodavsnittet som du kommer att se senare. Jag har förutsatt att kommentarer som jag hoppas är ganska lätt att förstå, när du vet hur läget fungerar.

Du ser att det finns matematiska ekvationer i några av EQUs. Det finns två saker att komma ihåg här och hela koden: mikrokontroller är ett heltal maskin, och det vet två grundläggande sätt att arbeta med siffror. Om du skriver en formel som resulterar i ett tal med en bråkdel, kommer det att trunkeras. Räkna inte med 2/3 att ge dig 0.666667. Det ger dig 0. Detta kan tyckas självklart, men någon gång du ska glömma och undrar varför vissa bit kod inte fungerar rätt. När det gäller talsystem: du kan tolka en 8-bitars tal som en evig sanning numrerar (0-255) eller som ett heltal med tecken (0 - 127 och nummer -128-1). Jag vet detta, och ändå jag fortfarande ibland få trippade på den. Ett ännu mer subtila problem är att processorn kommer att behandla ett heltal som absolut eller signerade beroende på vilken instruktion du använder. Ge är ett bra exempel. Du förväntar dig att om du läsa timern och få 132, att om du jämför 120 med 132 och gren om det är lägre, BRLT (gren om mindre än), det skulle ta grenen. Inte så snabbt. BRLT förutsätter siffrorna är signerade, så 132 är faktiskt-125. För osignerade nummer, som i detta fall, måste du använda BRLO (gren om lägre). Ha detta i åtanke när du läser igenom koden.

Det körbara avsnittet börjar med uttrycket .cseg. Koden innehåller, i ordning:
-avbrottet vektorer den punkten till avbryta tjänsten rutiner (ISRs)
-initialisering koden, avrättades efter en återställning
-den viktigaste koden
-initialisering koden för varje läge
-ISRs
-data-området, som börjar med .dseg

Jag vill inte göra detta för länge, så jag ska försöka sammanfatta. Programmet är helt avbryta-driven, så allt som händer i de avbryta tjänst rutinerna. Huvudkoden sätter bara processorn att sova. Det vaknar antingen när du trycker på knappen Mode, eller när en timer tider ut. Timer 0 används till Dämpningstid Mode reglaget. Timer 1 används för att göra färgerna ändra med hjälp av en PWM kontroll linje och färg på/av utgångar.

Inställningsreglaget illustrerar hårdvara / programvara trade-off nämnde tidigare. Switch kontakter studsa när du trycker på dem, så du behöver för att kunna hantera en serie korta pulser, snarare än bara en hög eller låg input. Jag slutade göra detta i programvaran eftersom jag inte kunde hitta ett enkelt sätt att göra det med utrymme och hårdvara som jag hade. I grund och botten återställs på lägesknappen timern 0. Om timern 0 timeout innan den får återställa, antar koden kontakterna har slutat studsa och koden kan vidta åtgärder. Detta är lite av en hacka och du måste noggrant plocka timeout-värdet. Du ser att enheten ibland hoppar över en-läge, så den timerinställningen är inte perfekt. Det är en kompromiss mellan svarstiden till att trycka på knappen och hur ofta det hoppar en läge.

Om du vill se hur varje steg genomförs, titta på Timer 1 ISR. Det finns en variabel i minne som håller reda på vilket läge den är i. ISR ser på detta nummer och hoppar till den högra delen av koden, ungefär som ett ärende eller SWITCH uttalande. Varje steg måste hålla reda på den egna staten, lagras i RAM, till exempel vilken färg det är på. De flesta lägen sätta på röda, sedan gröna och blå, och tillbaka till rött. I allmänhet, kan inte de alla vara aktiverade samtidigt eftersom det finns bara en PWM utgången styr allt och han bredd beror på ljusstyrkan på den färg som är på.

Så det är en snabb översikt, utan att skriva en bok. I'l försöka besvara mer detaljerade frågor om du bokför dem. Ha det så kul!

Se Steg
Relaterade Ämnen