Table of Contents
Projekt 1
Detta projekt gör egentligen inget meningsullt. En LED kommer helt enkelt att lysa efter att du programmerat din krets. Projektet är ämnat åt att värma upp dina kodfingrar och orientera dig runt AVR Stuido.
Ritning
(stoppa in ritning här på koppling)
Källkod & Kommentarer
Observera! I nedan kodexempel används '0b', detta för att förtydliga kodens funktion men kan ge problem på vissa kompilatorer. Ett säkert alternativ är att räkna om det till hex.
#include <avr/io.h> //(0) int main (void) { //(1) DDRD = 0xff; //(2) PORTD = 0b11110000; //(3) while(1) { //(4) //här kan man stoppa in kod } }
(0), Här inkluderas en headerfil (io.h) som ligger i en katalog som heter “avr”. Denna headerfil kan du själv undersöka och se vad den innehåller. En snabb överblick visar att den länkar vidare till iom8.h som till stor del definerar namn så att man kan komma åt de olika funktionerna hos mikrokontrollern.
(1), Här börjar den viktigaste funktionen i programmet. I programmeringsammanhang kallas detta för “entry point”, alltså den punkt där programmet börjar att exekvera. “void” betyder för den ovane enbart att main funktionen inte tar emot en parameter. Även om main inte behöver returnera till något så vill kompilatorn helst ändå ha en int som returtyp. Annars får du en varning.
(2), DDRD står för: Data Direction Register (Port) D. Här ställer man in vilka pinnar på ic-kretsen som är in eller utgångar för data. Som standard är alla pinnar inställda som ingångar för att inte påverka yttre kretsat av misstag. Här har vi valt att skriva i hexadecimalt att alla pinnar är utgångar med 0xFF. Dess ekvivalent i binär form är givetvis anges som b11111111. Med andra ord innebär en etta att pinnen sätts som ut och nolla som in.
[bild på mikrokontroller och portarna]
(3) Nu är det dags att ställa om pinnarnas tillstånd. Vi gör detta genom att överföra ett värde direkt till PORTD. En nolla sätter pinnen som låg och en etta som hög. Hög innebär en spänning nära 5 volt eller nära den matningsspäningen som du har till mikrokontrollern medans låg ligger nära noll (dvs jord). Bitordningen korresponderar till ordningen hos portens pinnar. Bit0 (längst till höger) bestämmer tillståndet hos Pin0 för en givet port. Här har vi valt att ställa in fyra första högre pinnarna/bitarna till ett medans de lägre pinnarna är sänkta till jord.
På sidan 73 (12.2.x) i databladet för atmega168 kan du läsa om olika sätt som man kan konfigurera mikrokontrollerna portar.
(4) Här försätter vi i programmet i en evighetsloop där inget händer.
Vidare instruktioner
Nu när du fått en god översikt av vad källkoden gör för något skall vi testa att kompilera och länka kalaset. Build kallas det för och detta kan du göra antingen genom att trycka på F7 på tangentbordet eller gå upp till “Build” menyn (längt upp, tredje från vänster) och välja “Build”. Nu borde det ha genererats en del information i den nedre rutan under källkodsfönstret. Om något har gått snett så visas dina varningar och fel här tydilgt.
Nu kommer du ha en färdig binär och hexfil som du han hitta i en katalog som heter “default” som ligger i samma katalog som din källkodsfil befinner sig inom.
Hexfilen är den du använder när du skall programmera din AVR krets. Men innan vi programmerar vår krets ska vi simulera programmet med debuggern och undersöka vad som händer rad för rad.
OBS! Först måste du se till att ha kört “build”.
Nu kan du gå till “Debug” i menyn och trycka på “Start Debugging” som är överst i menyn.
Tips: Ett sätt att slipa trycka på två olika ställen i menyerna för att komma igång med debuggern är att köra “Build and Run” i “Build”-menyn (eller Crtl+F7).
Nu kommer du både på vänster och höger om källkoden ha information om mikrokontrollerns tillstånd. Till vänster har du infomration om programräknaren, stackpekaren, m.m. Fönstret till höger som tidigare nämnts är nu aktiv och du ska nu expandera “PORTD” så att du ser allt som händer med denna port när vi stegar igenom programmet.
För att stega genom programmet trycker du på F11 på tangentbordet.
När du gör detta hoppar den från “main”-raden till den rad där vi sätter Data Direction registret. Notera att inget händer förrän du tycker på F11 igen. Alltså bara när pilen har gått över en exekveringsrad så förändras tillståndet i mikrokontrollern. Man kan tänka det som att pilen har som avsikt att exekvera raden efter att du steget igenom den med F11.
Nu kommer du se att DDRD har förändrats i fönstret till höger. Alla tidigare vita rutor bör vara svartfyllda och bredvid står värdet i hexadecimal form. Stega igenom en gång till så kommer PORTD's övre bitar att ettställas. Detta innebär att fyra av pinnarna på mikrokontrollern kommer att ligga på hög nivå.
Vid nästa stegning kommer vi att fastna i while loopen och inget mer konkret kommer att hända.
Programmera & Kör!
Nu är det äntligen dags att programmera vår krets och se vad som händer. Koppla in din AVRisp mkII på ditt utvecklingsbräde samt din dator. Du även behöver ha din krets uppkopplad med spänning på för att programmeringen ska fungera. Gå nu till “Tools”-menyn och väl sedan “Program AVR → Connect”.
….. work in progress ….