AVR Assembler Övningsexempel 4 (4 / 9 steg)
Steg 4: subrutiner
Något som du kommer genast att märka om hur jag skriver koden kan ses genom att titta på avsnittet efter etikett "huvudsakliga:"
viktigaste:
ser temp
ut PORTB, temp; alla PortB på 5V
ut PORTC, temp; alla PortC på 5V
rcall button_push; vänta tills knappen
rcall random; få rand tal die1, die2
rcall dice; Ställ in tärningarna lysdioder
ser härda; Set temp för cykel
rcall cykel. Animera tärningar kasta
rcall displayen. Visa resultatet
rjmp huvudsakliga
Lägg märke till att allt finns mellan etiketten "huvudsakliga:" på toppen och "rjmp huvudsakliga" längst ner. Detta innebär att det finns ingen flykt från detta avsnitt än via uttalanden av "rcall" inuti. Nu ta en titt på en av uttalandena som rcall, "rcall button_push" detta hoppar oss till avsnittet under etiketten "button_push"
button_push:
sbic PINB, 0; hoppa över om PB0 är GND
rjmp button_push
ret
Du ser att detta avsnitt finns också mellan en etikett och en "ret" så att PC är också instängd här också. Denna del av koden som kallas en "subrutin" eftersom jag kalla det från huvudblocket, det utför en uppgift, och det "returnerar" till huvudsidan på den plats där den hette. Således använder subrutiner som denna kan du blockera ut koden i bitar som utför vissa uppgifter och sedan återvända till där de kallades. Fördelarna med kodning detta sätt är följande:
- du om du befinner dig utför samma uppgift flera gånger kan bara ringa subrutinen stället har samma uppsättning kommandon upprepas om och om. Resultatet är ett kortare program som gör samma sak.
- Det är mycket lättare att läsa programmet och räkna ut vad den gör till skillnad från "spaghetti code" som vissa människor skriva där allt är ett långt avsnitt som hoppar runt och tillbaka, fram och tillbaka, överallt tills en person behöver en kanna whiskey sitter bredvid honom när man läser det att avvärja vansinne.
- Det är sättet lättare att felsöka! Om ditt program inte fungerar och du har ingen aning varför (vilket oftast är fallet när du skriver i assembler) kan du enkelt göra del detektivarbete och isolera felet till en av subrutiner och sedan räkna ut därifrån. Resultatet är timmar av sparad tid.
Så kommer du se att jag använda subrutiner "rutinmässigt" i mina program ;)
Övning 1: granska subrutinen som jag använder för att visa värden på tärningen av olika LED-belysning. Du kommer att se att jag faktiskt bläddra fram och tillbaka från en tärning till den andra. Om du ändrar förseningarna i "Visa" subrutinen visas detta flimmer. Det faktum att ögat inte kan se flimrar som är alltför snabba tillåter mig att driva två lysdioder från samma tråd och bara knäppa fram och tillbaka riktigt snabb så att ögat ser dem både som att vara på hela tiden. Så istället för att behöva en videoutgång för varje LED (så totalt 16 inklusive 0V och hamnarna i 5V) behöver vi bara 9. Kan du komma på ett bättre sätt att göra detta så att vi inte behöver använda 7 i våra hamnar för att driva dessa tärningar? Vad sägs om "Charlieplexing the lysdioder" som jag gjorde i min "instructable" om Charlieplexing? ( Skulle det vara värt det i det långa loppet med endast 14 lysdioder?
Nästa sak vi kommer att börja använda är "Makron".