1
2
TSIU50 Mikrodatorprojekt LAB1 AVR-introduktion och logikanalysator Michael Josefsson Januari 2007
Detta häftes syfte är att tjäna som en snabb introduktion till utvecklingsmiljön AVRStudio och den logikanalysator, Agilent 54621D, som används i projekten. Häftet är också laborationsinstruktion till kursens första laboration. Se till att förstå hur de olika momenten i programframtagningen fungerar. Prova gärna att modifiera programmet men först efter att mätupgifterna med logikanalysatorn är gjorda. Experimentera! 3
4
1 AVRStudio Utvecklingsmiljön AVRStudio innehåller en editor för att mata in programmet, en simulator för att under kontrollerade former enkelstega genom programmet och slutligen en programmerare som kan användas för att ladda ner den färdiga koden till målsystemet. Målsystemet är alltid en processor men den kan sitta på olika utvecklingskort eller direkt i en brännarenhet. 1.1 Från kod till processor Det hela börjar med att koden matas in i en editor. Denna kod måste sedan kompileras. Kompileringen innehåller flera steg men de viktigaste för användaren är att man får en lista med syntaktiska fel så att man har möjlighet att korrigera sin kod. En korrekt kompilering resulterar i en hex-fil, en fil med all nödvändig programinformation i ett nedladdningsformat. En hex-fil är inte direkt läsbar. Innehållet är programmets opkoder i hexadecimal form tillsammans med deras adresser. Även om den inte är tänkt att läsas av människor är den inte helt obegriplig: :020000020000FC :1000000018E011BB22B3212722BB00E40395D1F3F2 :02001000FDCF22 :00000001FF Nja, ok då, det kanske den är. Efter kompileringen kan koden simuleras. Det innebär att hex-filen används som indata till AVRStudio. Under denna process har några andra filer också tillverkats för AVRStudios interna bruk, bland annat en fil som håller ihop det projekt vi bygger upp, dvs information om vilka olika källkodsfiler (asssembler) som ingår. Man kan alltså låta det slutliga programmet härröra från flera filer om man vill. Det är inget vi bryr oss om här. 1.1.1 Starta AVRStudio Efter inloggning finns ikonen Shortcut to AVRStudio på skrivbordet. Dubbelklicka på den för att dra igång utvecklingsmiljön. Du kan nu välja att öppna ett befintligt projekt eller skapa ett nytt. Ett projekt i detta sammanhang är den samling filer och konfigureringar som behövs för AVRStudio. Här har vi inget gammal projekt att öppna. Alltså: 5
1 AVRStudio Välj Project/New project. Välj Atmel AVR-assembler. Fyll i Project Name. Ändra Location till din hemkatalog på vanheden. Klicka på..., och sedan tills du kommer till mplabnn on Samba server (vanheden) (Q:) Välj denna katalog, din hemkatalog. Här kan du nu skapa en egen katalog för projektet om du vill. Avsluta med att klicka på Select och sedan Finish. Du har nu ett editorfönster där du direkt kan skriva in kod. 1.1.2 Skriva program Här visas i kort form vilka mått och steg man måste vidta för att få igång ett enkelt program. Programmet ska bara flippa bit 3 på PORTD. Programmet är inte avsett att vara exempel på det bästa sättet att göra detta, utan bara visa hur assemblerfilen kan se ut med de speciella reserverade ord som kan användas. AVRStudio ställer några få krav på hur den inmatade koden ska se ut för att kunna kompilera den. Här kommer koden som den ska se ut när den är klar så tar vi detaljerna efteråt:.include "m8def.inc".def loopraknare.def temp.equ start = r16 = r17 = 0x40 main: flip: loop: ldi temp,0b00001000 ; bit 3 utgång out ddrd,temp ; konfigurera! in r18,portd ; läs av portd eor r18,temp ; r18 = r18 XOR temp out portd,r18 ; skicka till porten ldi loopraknare,start inc loopraknare ; sätter flaggor (Z) breq flip rjmp loop 6
1.1 Från kod till processor.def definierar ett annat namn på ett register. Det underlättar betydligt om man använder förståndiga namn på sina register..equ används för att sätta en konstant till något värde. Här är konstanten angiven i hexadecimal form men det går att ange den decimalt eller binärt också. Första radens.include laddar en (rätt stor) fil med många fördefinierade namn på register och konstanter. Det gör att vi kan skriva out portd,r18 till exempel. portd är definierat med.equ i den filen. Alla lables, symboliska adresser, måste börja i första kolumnen och avslutas med :. Opkoderna börjar åtminstone ett tabb-stopp in. Det finns inget krav att operanderna behöver skiljas med tab-stopp. Kommentarer inleds med semikolon. Filen behöver inte avslutas med END e dyl. 1.1.3 Simulera programmet För att kunna simulera projektet måste det först kompileras och en hexfil skapas. För att göra detta: Välj Build ur menyalternativen. Eller använd tangenten F7 direkt. Detta kan ge felmeddelanden i det nedre fönstret. Klicka på respektive felmeddelande så kommer du till den felande kodraden. Ändra och kompilera om till allt gått igenom. Under Debug -menyn väljer du nu Start Debugging. I menyn Debug/ Select Platform and Device... väljer du AVR Simulator och ATMega8, sedan Finish. Nu dyker ett fönster (kallat I/O View) upp till vänster med processorns register, I/O-portar mm. Här visas all processorstatus. Du kan högerklicka på raderna för att få mer information. Under Debug -menyn kan du nu välja Step Into eller trycka F11 eller klicka direkt på symbolen { }. Effekten är i vart fall att du startat exekveringen med att gå en programrad i programmet. I I/O View-fönstret kan du inspektera de berörda registren osv. 1.1.4 Hur fort går det I I/O View-fönstret finns alternativet Processor. Under denna finns programräknarens värde men också en praktisk instruktionsräknare Cycle Counter, och ett stoppur du kan använda för att ta tid på fördröjningsloopar osv. Simulatorn antar att processorn kör med klockfrekvensen 4 MHz men detta värde går att ändra under Debug->AVR Simulator Options. 7
1 AVRStudio 1.1.5 Bränna koden till processorn Det finns en hel uppsjö med olika metoder att bränna in koden i processorn. Här visas hur det går till om man använder Atmels utvärderingskit STK500. Brännarkortet STK500 vill ha 10-12 volt och bryr sig inte om polariteten så det är bara att koppla in rätt spänningsnivå. På själva kretskortet sitter en liten strömbrytare upp till vänster. Se till att maxspänningen inte överskrids innan du slår på strömbrytaren! När kortet är spänningssatt lyser en lysdiod. Välj sedan från menyn i AVRStudio Tools-> Program AVR -> Auto Connect för att få fram programmeringsmenyn. Här kan man sedan under fliken Program välja vilken krets man avser att bränna. Kortet STK500 kan acceptera åtskilliga typer men i vårt fall är det bara ATMega8 som är aktuellt. Se till att ISP (In-Circuit Serial Programming) är valt som Programming mode. Kontrollera också under fliken Fuses att: Kryssrutan för watch-dog timer är rätt inställd Rätt klockalternativ används. Antingen Ext Clock, yttre klocka, eller Int RC Osc, intern klocka i form av en RC-oscillator med rätt frekvens, måste väljas. Kryssrutan för brown-out detection är ikryssad. Programmeringen i sig sker genom att trycka på knappen Program i rutan för Flash, och genomförs på några sekunder. Därefter resetas processorn och programmet startas. Om programmet skvallrar sin funktion på en utgående port kan denna kopplas till en av lysdioderna och man får omedelbart en bekräftelse på att programmet körs. 8
2 Logikanalysator och mätuppgift Logikanalysatorn är arbetshästen vid all felsökning av lite större digitala system. Man kan fortfarande komma rätt långt med en enkel logikprob men analysatorn ger mycket större möjligheter. I korthet är en logikanalysator (kortare logikare ) en inspelare för digitala sekvenser. Den logikare du har på labplatsen kan dessutom spela in 15 kanaler samtidigt. Och fungerar dessutom som ett tvåkanals oscilloskop. En enkel mätning, på en kanal, förklarar dess funktion: Anslut en av kanalerna från pod:en till mätobjektet. Anslut också den svarta jordledningen till mätobjektets 0V (GND). Tryck på knappen AutoScale. Logikaren känner av sina inkanaler och aktiverar den som har varierande insignal. Du bör nu se mätobjektets signal. Om logikaren meddelar No signal detected betyder det att du inte har någon signal inkopplad (är mätobjektet spänningssatt?). Med ratten Horizontal kan du ändra tidsskalan. Tryck på knappen Cursors. Två vertikala linjer dyker upp på skärmen. Dessa kan flyttas i sidled med -ratten. Med de s.k. soft key-tangenterna i skärmens nederdel kan du välja vilken av de två cursorerna som ska vara aktiv. Samtidigt meddelas avståndet mellan cursorerna både som frekvens och som skillnad i tid. Vilken frekvens har insignalen? Med knappen Quick Meas kan ett antal standardmätningar snabbt göras. Använd soft key-tangenterna för att: Välja insignal (source) Välja typ av mätning Genomföra mätningen Vilken frekvens har insignalen med denna mätmetod? Utöver dessa enkla mätningar vill man ofta låta en av insignalerna trigga, dvs påbörja inläsningen av data. Med knappen Trigger fås nya funktioner för soft key-tangenterna. Nu kan du välja om trigggningen ska ske på stigande eller fallande flank om oscillatorkanal 1 eller 2 ska vara triggkälla eller på vilken digital kanal triggingen ska ske 9
2 Logikanalysator och mätuppgift Mätuppgift Anslut en kanal till processorns klocka. Anslut en ytterligare kanal till bit 3 på port D som programmet nu ständigt växlar logiskt värde på. Använd ett lämpligt triggvillkor för att avläsa hur lång tid och hur många klockpulser det tar mellan omslagen på bit 3? Hur många instruktioner motsvarar detta? Hur många klockpulser behöver processorn per instruktion? 10
3 Egen programmeringsuppgift Välj en av uppgifterna nedan. Mata in koden i editorn, assemblera, simulera och ladda slutligen ner koden till målsystemet. Rinnande ljus. Tänd i tur och ordning varje lysdiod på målsystemet. Välj en lagom hastighet. Programmet ska avslutas då en tryckknapp nedtrycks. Skrämma prick. Tänd en lysdiod. När den lyser ska man trycka på motsvarande tryckknapp för att släcka den. Men då ska omedelbart en annan lysdiod tändas. Om man trycker på fel tryckknapp ska inget hända. Samtidig nedtryckning av två eller fler knappar avslutar programmet. Ping-pong. Vid programstart tänds en lysdiod i mitten och börjar gå åt vänster eller höger. För att blippen inte ska trilla över kanten måste den hindras genom att vänster eller höger tryckknapp nedtrycks. Riktningen ändras då osv. Samtidig nedtryckning av båda knapparna avslutar programmet. (Man kan fundera på vad som ska hända när den trillar av kanten?) 11