AVR Assembler Övningsexempel 7 (12 / 12 steg)
Steg 12: Kod och Video för den fungerande versionen
Som vi såg av den senaste versionen, fungerar på knappen avbryta mycket väl eftersom avbrottet utlöses på en stigande kanten till stift PD2 och avbrottshanterare anropar sedan ADC konvertering. Dock får ADC sedan spänning läsa innan det har stabiliserats och så den läser nonsens.
Vad vi behöver är att införa en fördröjning mellan avbrottet på PD2 och ADC läsa på PC0. Vi kommer att göra genom att lägga till en timer/counter, en counter overflow avbryta och en försening rutin. Lyckligtvis vet vi redan hur man gör detta från handledning 3! Så vi bara kopiera och klistra in den relevanta koden därifrån.
Jag har gett den resulterande kod och en video som visar det i drift.
Du kommer att märka att avläsningarna inte är lika exakt som man skulle hoppas. Detta är sannolikt ett antal källor:
- Vi är avlyssning från Matningsspänning på knappsatsen att utlösa på PD2 som påverkar behandlingen i PC0.
- Vi vet inte riktigt hur länge fördröja efter avtryckaren för att få den bästa behandlingen.
- Det tar ett par cykler för att ADC konverteringen ska slutföra vilket innebär att vi inte kan snabb brand på knappsatsen.
- Det finns förmodligen brus i knappsatsen själv.
- osv...
Så även om vi lyckades få tangentbordet ska fungera, och vi kan nu använda det i program genom att använda knapptryckning värdena på något annat sätt istället för att bara mata dem till analyzer displayen, det är inte mycket exakt och det är mycket irriterande. Det är därför jag tror att det bästa sättet att koppla knappsatser är helt enkelt att sticka varje utgång från knappsatsen till en annan port och besluta vilken tangent trycks på av vilka portar se en spänning. Det är lätt, mycket snabb och mycket noggrann.
I själva verket finns det bara två skäl varför man skulle vilja köra en knappsats på sätt som vi har gjort här:
- Den använder endast 2 stift på våra microcontroller istället för 8.
- Det är ett stort projekt att visa olika aspekter av ADC på mikrokontroller som skiljer sig från de vanliga sakerna du kan hitta där ute som temperaturavläsningar, roterande potentiometrar, etc. Jag ville ha ett exempel av utlösta enda avläsningar och externa pin auto-utlösande snarare än bara gratis CPU-glufsa igång.
Hursomhelst, här är ett sista par övningar för dig:
Övning 6: skriva ADC konvertering komplett avbrottshanterare för att använda en Look-up Table. Dvs. så att det testar analoga värdet med det första objektet i tabellen och om det är större returnerar från avbrottet, om det inte är sedan det tillbaka steg Z till nästa objekt i tabellen och grenar på prov igen. Det kommer att förkorta koden och rensa upp rutinen avbrott och det ser trevligare. (Jag kommer att ge en möjlig lösning som nästa steg)
Övning 7: koppla upp din knappsats till 8 stift på mikrokontroller
och skriva enkla drivrutinen för det och erfarenhet hur mycket trevligare det är. Kan du komma på några sätt för att få vår metod att fungera bättre?
Det är allt för den här läraren. Jag har bifogat den slutliga versionen med pekare. När vi gör vår väg närmare vårt slutliga mål, kommer att vi använda tangentbordet gång Tutorial 9 för att visa hur att styra sju segment visar med det (och bygga något intressant som använder de extra knapparna på knappsatsen) och då vi kommer att byta till kontrollera saker med knapptryckningar istället (eftersom den metoden passar bättre med slutprodukten vi bygger in mot med dessa tutorials) och vi kommer bara lägga på hyllan knappsatsen.
Vi ses nästa gång!