AVR Assembler Övningsexempel 7 (9 / 12 steg)
Steg 9: Kod och video för version 1
Jag har bifogat min kod för denna första version av drivrutinen för tangentbordet. Här måste du trycka på tangenten och sedan trycka på knappen för att orsaka ADC att läsa indata från knappsatsen. Vad vi vill hellre ha finns ingen knapp men istället signalen att göra konverteringen kommer från knapptryckning själv.
Övning 3: Montera och ladda upp här koden och prova. Du kan behöva ändra de olika konvertering tröskelvärdena för att motsvara dina knapptryckning spänningar eftersom de sannolikt skiljer sig från mina. Vad händer om du försöker använda en input från knappsatsen både för ADC0 och för den yttre mellanjobb stiftet i stället för genom en knapp?
Jag kommer också bifoga en video av driften av denna första version av våra knapptryckning förare.
Du kommer att märka att det finns en del initierar buntpekaren i min kod. Det finns olika register som vi kanske vill push och pop från stacken när vi manipulerar variabler och vad-inte och det finns också register som vi kanske vill spara och återställa senare. SREG är exempelvis ett register som inte bevaras över avbrott, så olika flaggor som ställs och rensat till följd av verksamheten kan ändras om ett avbrott inträffar mitt i något. Så är det bäst om du trycker SREG till stacken i början av en avbrottshanterare och pop sedan det igen i slutet av avbrottshanterare. Jag har placerat det i koden att visa hur det har initierats och att förutse hur vi kommer att behöva den senare men eftersom vi inte bryr oss vad händer med SREG under avbrott i vår kod jag inte använder stacken för detta.
Också att märka att jag har använt SKIFT driften för att anger olika bitar i register när initieras. Till exempel i raden:
LDI temp, (1 << ISC01) | (1 << ISC00); kommentar till fixa Instructables formatering frågor: >>>>
STS EICRA, temp
Den "<<" kommando i den första raden i koden ovan är en SKIFT operation. Det tar i huvudsak det binära talet 1, som är 0b00000001 och skiftar det lämnade mängd nummer ISC01. Detta är placera av den bit som heter ISC01 i registret EICRA. Eftersom ISC01 är lite 1, nummer 1 skiftas till vänster 1 positionen att bli 0b00000010. På samma sätt andra, ISC00, är lite 0 av EICRA och så förskjutningen av nummer 1 är noll positioner till vänster. Om utseende tar en annan titta på filen m328Pdef.inc som du hämtade i den första självstudiekursen och har använt evrr sedan, kommer du att se att det är bara en lång lista med ".equ" uttalanden. Du kommer att ISC01 är lika med 1. Assembler ersätter alla förekomster av det med 1 innan du ens börjar sätta ihop något. De är bara namn på registret bitar för att hjälpa oss människor Läs och skriva kod. Nu, den vertikala linjen mellan de två SKIFT verksamhet ovan är ett logiskt "eller" operation. Här är ekvationen:
0b00000010 | 0b00000001 = 0b00000011
och detta är vad vi är påfyllning (med "ldi") i temp. Orsaken människor använder denna metod för att läsa in värden i ett register är att det tillåter en att använda namnet på lite istället för att bara ett nummer och detta gör koden är mycket lättare att läsa.
Det finns också två andra tekniker vi har använt. Vi använder instruktioner "ori" och "andi". Dessa tillåter oss att ställa och respektive rensa bitar utan att ändra någon av de andra bitarna i ett register. T.ex. när jag använde
Ori temp,(1<ADC0D); kommentar till fixa formatering: >
denna "eller" s temp med 0b00000001 som sätter en 1 i den zeroth lite och lämnar resten oförändrad. Också när vi skrev
Andi temp, 0b11111110
Detta ändrar den zeroth lite Temp till en 0 och lämnar resten oförändrad.
Övning 4: du ska gå igenom koden och se till att du förstår varje rad. Du kan finna det intressant att hitta bättre metoder för att göra saker och skriva ett bättre program. Det finns hundra sätt att koden saker och jag är ganska övertygad om du hittar ett mycket bättre sätt än min. Du kan också hitta (Gud förbjude!) fel och utelämnanden. I så fall vill jag visst höra om dem så att de kan fastställas.
Okej, nu ska vi se om vi kan bli av att överflödiga knappen...