TFE/pk/hj 02-03-23 ver 1.2 DATORTEKNIK Laboration: 277 Tutorial för IAR Embedded Workbench och C-Spy mot MC68HC11 i Assembler och C
1. Översikt Denna tutorial innehåller tre exempel för HC11:an. De exempel som ingår är: Ett mycket grundläggande exempel i assembler Ett något mer avancerat exempel i assembler (kan hoppas över i datorteknik 1) Ett exempel med olika filer, includefiler och enkel porthantering, I/O, som skrivs i C Filer som används visas med filnamnet i fet stil och innehållet i typsnitt courier new. Det finns även liknande - men mer utförliga träningsvägledningar i IAR:s manualer! Workbench Interface Guide och C-Spy User Guide (Se gröna pärmar i lab.sal A410 & A411.) 2. Innan du startar Skapa biblioteket c:\hc11\demo. (Det kan hända att någon före dig redan gjort denna övning. Isåfall, radera alla filer i c:\hc11\demo.) Kopiera alla filer som normalt ska finnas i biblioteket: C:\IARdemo\ till c:\hc11\demo. (Dina nya kopior kommer antagligen vara skrivskyddade. Markera alla [de nya] filerna i C:\hc11\demo\, högerklicka på dem, välj Egenskaper, avaktivera skrivskyddet.) Före de egentliga övningarna, undersök filen asm.xlc, länkfilen som kommer att användas. ASM.XCL: -! xcl-file for assembler-only projects -! -c68hc11 -! code starting at 0x1000 -! -Z(CODE)CODE=1000 -! zero page data -! -Z(DATA)IDATA0,UDATA0,DATA=00-FF -! betyder kommentar. Andra raden specificerar processor 68hc11. De resterande raderna anger hur koden ska placeras i minnet. Koden som produceras kommer att hamna i segmentet CODE och är av typen CODE (specificerat genom det "CODE" som står inom parentes), med placering från adressen 1000h. Variabler i segment IDATA0,UDATA0,DATA kommer att placeras i adresserna mellan 00h och ffh. Detta kan ändras om man har ett projekt som kräver detta. ETT 3. Att skapa projekt, targets och grupper Starta Embedded Workbench. Välj New från File-menyn. Välj projekt, klicka OK. 2
Du får då upp en ny dialogruta. Skriv projektnamn tutorials och välj katalog enligt bild: Klicka OK. Projektfönstret kommer att visa sig. Om det behövs, välj Debug från drop-downlisten för Targets. Efter detta ska du välja New Group från menyn Project, och skriva i namnet på gruppen, tutor1. Förinställt är både gruppen Debug och Release. Klicka OK för att välja gruppen. Då kommer projektrutan att få följande utseende 4. Inställning av länkfil Nu ska man välja förinställningar för denna grupp. Markera Debug i projektfönstret och välj Options i Project-menyn. Välj sedan General från kategorilistan. Välj fliken Target, markera Overide default, för XCL-filen. Klicka på knappen... och välj asm.xcl i ditt bibliotek. Du har då valt länkfil för ditt projekt. Klicka OK för att spara inställningarna. 3
5. Struktur i utvecklingsystemet IAR använder sig av begreppet projekt, target (målgrupp) och grupper. Då man utveckar ett program gör man detta i ett projekt. Ett projekt kan innehåller flera målgrupper, vanligtvis två stycken, samt en grupp. Default för targets är Debug och Release, och ett vanligt namn på gruppen är Common Sources. Översatt till studentmiljö skulle varje laboration representeras av ett eget projekt. Namn på projekten kan t.ex. vara lab_265.prj. Varje projekt innehåller sedan två targets, Debug och Release, och en grupp Commun Sources. Inställningar görs för respektive target. Debug-target kan t.ex. vara med listfiler och Release-target kan vara utan. Eller också kan man göra så att en target är avsedd för ROM-debugger och en för mjukvaru-simulator. Man bör då anpassa namnen till detta. Vanligtvis ställer man in Debug och Release så att de filer som finns i gruppen Commun Sources är gemensamma. 6. Att skriva första programmet Välj New från File-menyn. Välj Source/Text och klicka OK. Du kan sedan skriva i följande kod: (exemplet är från boken Datorteknik av Dagermo sid 78) main_1.s07: NAME PUBLIC RSEG main main CODE main ldaa $10a9 inca staa $10ec halt jmp halt end Spara filen i biblioteket c:\hc11\demo\ med namnet main_1.s07. Gör så här för att knyta filen till projektet. Välj Files i Projectmenyn. Ställ in filtyp - Assembler. Välj filnamnet main_1.s07. Tryck på knappen Add och därefter på knappen Done. main Under Files in group kan man se att det bara är en fil i projektet. 4
7. Att assemblera och länka Tryck på knappen Compile, längst till vänster på nedre raden, så assembleras koden. Tryck sedan på raden Make, närmast till höger om Compile-knappen. Aktivera Projektfönstret och spara projektet (File/Save eller Spara-knappen - 3e fr vänster, övre knappraden.) Efter detta kan man undersöka vilka filer som har skapats. I mappen c:\hc11\demo\ ska det [bl.a.] finnas tre filer, main_1.s07 programfil, tutorials.dtp och tutorials.prj. I mappen c:\hc11\demo\debug\exe\ tutorials.d07 samt i mappen c:\hc11\demo\debug\obj main:1.r07. Ingen av dessa filer är en listfil som visar hur Assemblatorn har översatt koden. 8. Inställningar för assembleringen För att skapa en listfil ska man välja Options i Project-menyn. Markera sedan Assemblatorn, A6811, och välj fliken List och bocka för följande alternativ: Klicka OK, assemblera igen och titta vilka filer som skapats. Main_1.lst i listmappen innehåller listfilen. Då filen ännu inte är länkad kommer adressen till koden att starta på 0000h. Jämför med koden på sid 79 i Dagermos bok 1. ( Varför står det ingen adress efter op-koden för jmp, 7E? ) 9. Inställning för länkningen Välj target Debug i Project-menyn. Välj sedan Options i Project-menyn och markera XLINK. Bocka för under fliken List, enligt bild: 1 Per Dagermo: Datorteknik - med inriktning mot 68HC11 (Studentlitteratur) 5
Länka som förut och läs igenom map-filen i mappen List. Hur långt är programmet? Du har nu skrivit ett program, assemblerat och länkat. Det som återstår är att prova hur det fungerar. 10. Test av programmet main_1.s07 Koppla in EVB kortet till din PC. Anslut seriekabeln till COM1 och matningsspänningen till kortet. Ställ sedan in C-SPY, som är Debuggern, på ROM-monitor. Detta görs på samma sätt som då man ställer in Assemblatorn och Debuggern. Se figur: Klicka på OK och starta sedan Debuggern genom att klicka på den tredje knappen, Debugger, till höger om Compile-knappen. C-Spy ska då starta, koden laddas ned till målsystemet och man ska få en bild liknande denna: 6
(Det kan hända att det uppstår trassel vid nerladdningen. En sak man då kan pröva är att kontrollera inställningarna för seriekommunikation: Project/Options/C-SPY flik Serial Communication, pröva att byta till en ann COM-port.) Fönstret "Report" ska innehålla följande text: 68HC11 ROM Monitor (EVB) ver 2.30A, (C) Copyright IAR Systems 1996 Download completed, 10 bytes loaded Warning[16]: Only assembler level debugging available Warning[12]: Exit label missing Warning[13]: No break on program exit Stäng Rapportfönstret. Markera Register och Memory i menyn Window, samt välj Tile Horizontal. Det bör då se ut p detta vis: 7
För att enkelstega programmet, tryck på knappen Step into i nedre knappraden. Efter tre steg, kommer programmet att stanna på raden halt. Eventuellt får du ett meddelande som säger att instruktionen hoppar till sig själv. Den uppmärksamme kanske såg vad som hände i registerfönstret. Och vill du, så kan du kontrollera vad minnet innehåller. Flytta mellan olika minnesadresser med rullmenyn till höger. Försök att hitta de adresser som läses och skrivs av programmet, samt den del av minnet där programmet ligger. 11. Uppgift till övningen med första programmet Vilken adress står det nu efter op-koden för JMP. ( Svar: 1007h ). TVÅ 12. Ett annat enkelt exempel Skapa ett nytt projekt Second med targets Debug och Release, och gruppen Common Sources. Gör inställningar under Options så att det fungerar som föregående exempel. Kort repetition och ändringar från förra exemplet: 1. General - välj länkfil för assembler,???.xcl. 2. A6811 - välj listning av listfil 3. XLNK - välj att skapa map-fil (under listflik) 4. CSPY - välj ROM-monitor som Debugger Det är mycket viktigt att du lär dig det centrala i projektinställningrna. Glöm inte att välja filer till gruppen. 13. Kod till detta exempel MAIN_2.C: Assemblera och länka! När detta är gjort ska du försöka att hitta adresserna till mem1, mem2 och result1. I filen second.map kan du läsa dessa och i C-Spy kan du hitta dessa minnesceller i fönstret Memory. Starta Debuggern. Ta bort förstret med meddelanden. Öpnna fönstren Memory och Register under menyn Windows. Använd sedan kommandot Tile Horizontal. Du ska nu se tre fönster i C-Spy: Source, Memory och Register. Avslutar du C-Spy redan nu kommer programmet att återta dessa inställningar vid omstart. Lokalisera variablerna överst i Memory-fönstret! Stega igenom programmet (F3 eller Step into.) en gång och kontrollera att summan av mem1 och mem2 finns i result1 (4088h). Loopen vid more är oändlig. Avbryt stegningen efter ca 10 steg. 8
14. Ändra i minnet Genomför Reset av programmet. Antingen genom att tycka på knappen på nedre raden till vänster eller genom kommandot Reset i menyn Execute. Ändra innehållet för vaiabeln mem2 till 8000h genom att dubbelklicka på värdet i Memoryrutan för att du upp ytterligare ett fönster (se figur) där det går att ändra. Stega igenom programmet ytterligare en gång och kontrollera att summan av mem1 och mem2 finns i result1 (8088h). Avbryt stegningen efter ca 10 steg. Ändra tillbaks varibelns värde till 4000h. 15. Ändra registervärden Genomför ytterligare en Reset av programmet. Stega igenom programmet ytterligare en gång, men ändra register ACCB till 44h efter rad två. Dubbelklicka på värdet i Register-rutan så går det att ändra. Stega igenom programmet ytterligare en gång och kontrollera att summan av mem1 och mem2 finns i result1 (4088h). Avbryt stegningen efter ca 10 steg. 16. Autostep Den oändliga loopen nederst kan vara besvärlig att stega. Testa funktionen Autostep i Executemenyn. Notera hur ACCD ändras. Stoppa programexekveringen med Stop-knappen (2a fr vänster nedre raden). TRE 17. Det sista exemplet med två filer och en includefil Vanligtvis arbetar men med ett antal olika filer. Detta exempel ska visa en normal uppläggning. De filer som använda är: main_3.c - huvudprogram pia_init.c - initiering av en periferikrets, PIA6821 pia.h - deklarationen av PIA:n För programkod, se avsnitt 23 sist i detta häfte. 18. Steg för att bygga projekt med flera filer Skapa ett nytt projekt, third.prj. 9
Skapa gruppen Common sources under Debug och Release. Införliva c-filerna i gruppen (2 st). Se bild: Ange sedan korrekt adress för include-filerna. Detta görs under Project, Options, ICC6811, se bild nedan: I detta exempel inkluderas filen pia.h lokalt. Detta markeras med "pia.h" i källkoden till main_3.c och pia_init.c. Om man däremot skriver <pia.h> kommer preprocessorn (försteg till kompileringen) att leta efter filen i katalogen r:\iar\ew\6811\include. Kompilera och länka. Efter kompilering kommer det att markeras plusrutor framför de filer som inkluderar pia.h. Klicka på dessa så listas de inkluderade filnamnen. Ange sedan korrekt länk-fil. Då koden skrivs i C ska man använda den ordinarie länkfilen (en annan än den vi använde i de två första exemplena). Detta görs genom att man inte kryssar i rutan "Override default" i menyn Projekt, Options, General., se figur: 10
19. Kompilering Programmet håller ordning på vilka filer som ska länkas samman. Det blir de filer som är markerade i projektfönstret. Med direktivet extern i C-källkoden markerar man de rutiner som anropas från annan fil. Man kompilerar som vanligt med knappen för Compile. Om man vill kompilera och länka samman på en gång kan man använda Make-knappen, eller Build all, i menyn "Project". Du bör då få en meddelande-ruta där samtliga källkodsfiler nämns. På det viset kan man vara säker på att alla filer kompileras och länkas. Denna text kan komma i message window: Rebuilding target Debug... main_3.c pia_init.c Linking... Total number of errors: 0 Total number of warnings: 0 20. Debuggning Programexemplet innehåller hårdvara som initieras och används för in och utmatning. För att se hur detta fungerr ska man koppla in PIA:n på ett korrekt sätt. Koppla 8 st lysdioder från PIA:ns portb till jord, 0V, med långa benet mot PIA:n. Koppla ingångarna på PIA:ns porta till omväxlade jord och +5V. Programmet kommer att läsa pians porta och skicka detta innehåll till pians portb. Anslutningarna är placerade längst till höger på EVB-kortet. Tips vid debuggning: För att programmet ska dyka upp i source-rutan, tryck F3 (step into). Om man sedan vill veta värdet på variabeln temp, kan man hålla markören över variabelnamnet, samt högerklicka på musen. Det dyker då upp en meny. Lägg till en "Quick watch" i denna meny. Då kan du hela tiden kontrollera temp, i ett eget fönster. 21. Uppgifter: * Skriv om programmet så att värdet i pia-porta inverteras innan det skickas till pia-portb. * Skriv om programmet så att halva portb, bit0 - bit3, används som ingång och andra halvan som utgång. * Skriv sedan ett program som läser bit0 - bit3 och kopierar detta värde till bit4 - bit7. 22. Avslutning Efter denna tutorial ska du känna till något av grunderna i C-Spy och Embedded Workbench. Du ska även ha en viss förståelse för hur en debugger arbetar. Om du är osäker på någon funktion så kan du prova hjälpmenyerna eller titta i någon av manualerna User Guide till C-spy eller Interface Guide till Workbench. (Kompletta manualer till IAR-systemen finns i gröna pärmar i Lab.sal A410 och A411, två ex i varje sal.) Synpunkter på denna tutorial tas tacksamt emot av mig, Per Kvarnbrink. Hoppas att det fortsatta arbetet går lätt. 11
23. Appendix 1 - kod till sista exemplet. MAIN_3.C: #ifndef PIA_INCLUDED #define PIA_INCLUDED = 1 #include "pia.h" #endif extern void pia_init(void); void main (void){ char temp; pia_init(); while(1){ temp = PIAORA; PIAORB = temp; PIAORB = temp*2; } } PIA_INIT.C: #ifndef PIA_INCLUDED #define PIA_INCLUDED = 1 #include "pia.h" #endif void pia_init(void){ PIACRA = PIACRB = 0x00; PIADDRB = 0xff; PIADDRA = 0x00; PIACRA = PIACRB = 0x04; } PIA.H: #ifndef PIA_REG_OFFSET #define PIA_REG_OFFSET 0x8000 /* Default for 68HC11 EVB */ #endif /*==========================*/ /* PIA I/O Port Definitions */ /*==========================*/ /*pia porta control*/ #define PIACRA (* (volatile unsigned char *) (PIA_REG_OFFSET + 1)) /* pia portb control */ #define PIACRB (* (volatile unsigned char *) (PIA_REG_OFFSET + 3)) /* pia porta datadirection register */ #define PIADDRA (* (volatile unsigned char *) (PIA_REG_OFFSET + 0)) /* pia I/O Port A */ #define PIAORA (* (volatile unsigned char *) (PIA_REG_OFFSET + 0)) /* pia portb datadirection register */ #define PIADDRB (* (volatile unsigned char *) (PIA_REG_OFFSET + 2)) /* pia I/O Port B */ #define PIAORB (* (volatile unsigned char *) (PIA_REG_OFFSET + 2)) 12