Institutionen för data och informationsteknik. 2009-10-22 Laborationer i Maskinorienterad programmering, It/GU Detta häfte innehåller anvisningar om förberedelser och genomförande av 6 (3) laborationer. Inför varje laboration skall häftet studeras. Uppgifter i detta häfte och ur Arbetsbok för MC12 skall vara utförda och uppvisade inför varje laborationstillfälle. Eventuella lösningar på elektronisk form skall vara tillgängliga på ditt CTH-konto vid laborationstillfället. Bristfälliga förberedelser kan medföra avvisning från bokad laborationstid. Laborationerna utförs sekventiellt, momenten 1-3 ska klaras av under de första tre laborationstillfällena. Respektive moment ska studeras i god tid före laborationstillfället. Du ska också ha studerat dokumentation av den utrustning som skall användas under laborationen före laborationstillfället. Sådan dokumentation finns tillgänglig på elektronisk form via kursens resurssida. Skriv ditt namn och personnummer med bläck. Kontrollera att du får nedanstående tabell ifylld efter redovisad laboration. Detta försättsblad är ditt kvitto på att du är godkänd på respektive laborationsmoment. Laboration 1 2 3 4 5 6 Ifylls med bläck! Laborant: Personnummer Datum Godkännande av laboration Laborationshandledares underskrift Namn (textat) Godkännande - laborationsserie: Laborationshandledares underskrift Datum
Laboration 1 Laboration nr 1 behandlar MC12 med Monitor dbg12, Displaymodul Tangentbord Borrmaskin Följande uppgifter ur Arbetsbok för MC12 ska vara utförda innan laborationen påbörjas. Du ska på begäran av laborationshandledare redovisa dessa. Uppg. 61-64 74 91 92 Sign. Följande hemuppgift ska vara utförd innan laborationen påbörjas. Hem- Uppgift Följande laborationsuppgifter ur denna del av laborations-pm skall redovisas för en handledare för godkännande under laborationen. Laborationsuppgift Sign. 1.4 1.5 Följande beskrivningar finns tillgängliga på elektronisk form via kursens resurssida. STUDERA DESSA! Laborationskort ML4, multifunktionskort för MC12 Laborationskort ML5, gränssnitt mot tangentbord/display (ML23), för MC12 Laborationskort ML15, gränssnitt mot tangentbord/display (ML23), för MC12 Laborationskort ML23, tangentbord/display, för MC12 DBG12 monitor/debugger för MC12 Följande fil finns tillgänglig via kursens resurssida laddfil.s19 2
Laboration 1 Innledning Du har tidigare använt ETERM. Med ETERM för MC12 kan du redigera, assemblera och testa dina program i simulatorn för MC12. Du kan också ansluta laborationssystemet MC12 till terminalfunktionen i ETERM via persondatorns COM-port. Följande enheter ingår i laborationsmiljön: En persondator (PC) med utvecklingsprogramvaran ETERM för MC12, laborationssystemet MC12 med monitor/debugger DBG12, en borrmaskin och ett antal laborationskort. Borrmaskinen ansluts till MC12 s inport och utport via en 26-polig flatkabel. Serieanslutning till COM-port Borrmaskin MC12 med monitor debugger dbg12 26-polig flatkabel Vidare så finns ett tangentbord ML2 och ett displaykort ML3 som ansluts till mikrodatorsystemet med hjälp av I/O-korten ML5 och ML15. Tangentbordet ML2 ansluts till MC12 via ML15. Displaykortet ML3 ansluts till MC12 via ML15. Detaljerade beskrivningar av dessa kort hittar du på resurssidan. ML19 är en avbrottsmodul som används under laboration 3. Beskrivs i Arbetsbok och laborations-pm. 3
Laboration 1 När vi nu ansluter labsystemet MC12 till en COM-port på PC:n och startar ett terminalfönster (Fliken Debug/Terminal) fungerar PC:n som en dum terminal bestående av tangentbord och bildskärm. (ETERM = Emulera terminal = härma terminal). Allt som nu skrivs på tangentbordet skickas direkt ner till labsystemet. Om monitor:n DBG12 är startad i MC12 (sker vid reset av MC12) kommer denna att eka alla tecken från tangentbordet och skicka dessa direkt till skärmen. Vidare, när vi trycker på Enter (krävs inte alltid) avkodas tecknen och monitorn startar upp tillhörande rutin. Rutinen avslutas oftast med att någon text skrivs ut på skärmen. Monitorn DBG12 lyssnar hela tiden på kommandon från tangentbordet bortsett från när monitorn är i läge go dvs MC12 kör ditt program. För att återgå till monitorn i detta fall krävs reset av MC12. Att undersöka minnesinnehåll och att disassemblera minnesinnehåll är exempel på programrutiner som finns i DBG12. Studera figuren nedan och bekanta dig med MC12 s monitor/debugger DBG12. Reset av labdatorn = Start av monitor Monitorn väntar på ett kommando Memoryprocedur Disassembleprocedur Traceprocedur Loadprocedur mm? Nej dasm? Nej tr? Nej l? Nej go? Nej Ja Ja Ja Ja Ja Goprocedur Kör programavsnitt. Man kan återgå till monitorn via Reset. 4
Laboration 1 MC12 s minne är konfigurerat enligt följande: I/O Adress $0000-$0FFF Med plats för I/O-kort och interna (HC12-) portar RWM Adress $1000-$3BFF Med plats för dina program och data RWM Adress $3C00-$3FFF Variabelarea för Monitorn DBG12 ROM Adress $4000-$FFFF Med plats för bland annat Monitorn DBG12 HCS12 med processorn CPU12 och minne med monitorn DBG12 Anslutning 5V 26-polig anslutning för laborationsutrustning. Exempelvis ML4 Inport (Buffert 74HC245) och utport (register 74HC273 Serie-anslutning för som kopplas till COM-porten på PC:n 4 st hörnkontakter för att ansluta ett eller flera I/O-kort ovanpå MC12 Klockkristall 5V s indikator Laborationssystemet MC12 med microcontroller HCS12 RESET-knapp för MC12. (monitorn startas om) Laborationsuppgift 1.1: Studera MC12 och labutrustningen som skall vara uppkopplade vid på din laborationsplats. Starta Eterm och anslut en terminal (COM1) under fliken Debug. Tryck på RESET på laborationssystemet MC12 och observera att text skrivs till terminalfönstret. Kontakta en handledare om ingen text skrivs till skärmen eller om texten är oläslig. Terminalfönstret bör se som figuren nedan visar. Du har nu genom att trycka på RESET startat monitorn som skriver ut en välkomsttext till dig. 5
Laboration 1 detta kallas DBG12 s prompter Den sista raden kallas för monitorns prompter och innebär att monitorn är redo att ta emot kommandon (order) från dig. Tryck Enter (<Enter>) ett par gånger på tangentbordet. Det du skriver på tangentbordet skickas direkt till MC12 för att avkodas och eventuellt utföras. Skriv Help<Enter> Monitorn gör vad du begär och skriver ut en hjälptext. Se figuren till höger. Undersök de olika kommandon genom att skriva exempelvis help mm om du vill undersöka mm-kommandot närmare. Undersök nu minnesinnehållen i de olika minnesområden vi har i systemet. Skriv: dm 0<Enter> för att studera adressområdet där vi har in-och utenheter. Skriv: dm 1000<Enter> för att studera adressområdet där du kan placera dina program. Skriv: dm e000<enter> för att studera adressområdet där vi har PROM (FLASH). Adressangivelsen anges till vänster, minnesinnehåll i mitten och till höger tolkas minnesinnehållet som ASCII-koder. Försök att ändra minnesinnehåll genom att använda kommandot mm. Skriv först: help mm<enter> för att studera en hjälptext. Skriv sedan mm 1000<Enter> för att studera och ha möjlighet att ändra minnesinnehållet på adress 1000 där du har RWM. Tryck Enter ett par gånger. I figuren intill finns det tydligtvis 33 på denna adress. Tryck på + (plus) för att studera minnesinnehållet på nästa adress. Tryck på + på nytt och ändra minnesinnehållet på adress 1002 till 55 genom att skriva 55<Enter>. Studera figuren intill. Testa även (minus) tangenten. 6
Laboration 1 Vilka två sätt kan du använda för att avsluta mm-kommandot och återgå till monitorns prompter? Försök ändra minnesinnehållet på adress 4000, 5D16 och E01F. Använd mm-kommandot som ovan. Vad händer och varför? Försök nu att ändra innehållet på adress 00ca till 03. Skriv mm ca<enter> och ändra till 03. Vad händer och varför Undersök RESET-vektorn. Var i minnet är denna placerad? Vilken startadress laddas till PC vid RESET? För att starta ett program i MC12 används go-kommandot. Skriv go (startadressen du hittade ovan)<enter> Du bör nu observera att monitorn startas på nytt, på samma sätt som när du trycker på RESET-knappen på MC12. Simulatoruppgift 1.1: På kursens resurssida, finner du en laddfil.s19 som du ska använda under laborationen. Denna skall testas med hjälp av simulatorn. Starta simulatorn och öppna ett konsolfönster på följande sätt: Välj först Simulator Setup 7
Laboration 1 Välj därefter SCI 0 Asynchronous Serial Interface och klicka på Connect. Du har nu valt en av seriekretsarna på MC12. Du får upp nästa fönster där du väljer att ansluta ett konsolfönster till seriekretsen. Välj Consol och klicka på Connect. Du får nu upp konsolfönstret. Klicka slutligen OK i det första fönstret. Ladda nu ner den givna laddfilen till simulatorn och välj Run Fast. (Startadressen är $1000). Du bör få upp text i konsolfönstret. Observera att först körs programmet du laddade ner. Efter detta startades monitorn dbg12.du kan nu använda olika monitorkommandon för att undersöka programmet du kört i simulatorn. OBSERVERA ATT DU FÖR TILLFÄLLET SIMULERAR dbg12. Vissa kommandon, exempelvis trace, fungerar inte fullständigt. Du kan dock undersöka program och minnesinnehåll med övriga kommandon. Jämför med utskriftsrutinen och flödesplanen på sidan 24 i arbetsboken. Laborationsuppgift 1.2: Använd max 20 min på denna uppgift. Spara filen laddfil.s19 i din arbetskatalog. Ladda sedan laddfil.s19 till MC12 genom att högerklicka i terminalfönstret. Starta programmet med go 1000. Du bör observera att text skrivs till skärmen. 8
Laboration 1 Undersök programmet med de monitorkommandon du har sett ovan. Använd dasm och jämför med hemuppgift 1. Fokusera i första hand på huvudprogammet och sedan på subrutinen. Försök att stega dig genom programmet med trace ett antal instruktioner och sätt även några brytpunkter bp. Fungerar detta eller inte? Försök förklara eller diskutera med en handledare senare. Sätt en brytpunkt och kör programsnurran varv för varv. Hur uppfattas texten nu? När programmet stannat på en brytpunkt krävs ett tr -kommando för att komma vidare innan du gör go på nytt Rita en skiss hur data och kod är placerade i minnet och rita även en flödesplan över programmet. Kontakta en handledare efter tre-fyra minuter för handledning. Försök komma underfund med vad som händer på skärmen när du först skriver $48 till adress $00CF med mm-kommandot. (Tips: Studera sidan 30 i Instruktionslistan för CPU12). Skriv sedan $65 och slutligen $6A. Vad läses på adress $00CF efter varje skrivning? Diskutera med en handledare nu eller senare. Laborationsuppgift 1.3: Du ska nu undersöka hårdvaran ML3/ML5. Använd mm-kommandot och skriv något segmentmönster till adress $C02. Skriv sedan exempelvis $55 till adress $C03. Skriv ut olika värden till dessa två adresser tills du förstår hur display-modulen fungerar. Simulatoruppgift 1.2: Utför uppgifter 61 till 64 i Arbetsbok för MC12. (Du behöver inte använda villkorlig assemblering; #define/#ifdef/#else/#endif). Studera display-modulen ML3/ML5 under Eterms hjälp-meny (IO-simulatorer). Lämpliga adresser är $C02 för ML5_SEG och $C03 för ML5_POS. Du får användning för din Display-rutin i en senare laboration, spara därför koden Använd + och under mmkommandot för att stega upp respektive ner adressen Se till att använda ML5 som interface för ML3 i simulatorn. Laborationsuppgift 1.4: Ladda nu ner din Display-rutin och testa denna. Justera fördröjningen så att denna anpassas MC12 s snabba arbetstakt. Du får användning för din Display-rutin i en senare laboration, spara därför koden. I labbet! Börja alla program med en nop-instruktion. Detta ger bättre utskrift vid trace (tr). 9
Laboration 1 Simulatoruppgift 1.3: Utför uppgifter 91 och 92 i arbetsboken. Studera tangentbords-modulen ML2/ML15 under Eterms hjälp-meny (IO-simulatorer). Lämplig adress är $9C0 för tangentbordet När du testar dina rutiner i simulatorn kan det vara lämpligt att använda lysdioderna Parallell Output för att verifiera att du har korrekt värde ut från dina tangentbordsrutiner. Se nedan. NOP Loop: JSR KEYB1 ; Läs tangentbord STAA OutPort ;..visa på ljusdioder BRA Loop Se till att använda ML15 som interface för ML2 i simulatorn. ; Börja med nop, enklare att köra trace Tryck ner en tangent och läs registret på nytt, släpp upp och läs ännu en gång. Testa tills du känner dig säker på hur det fungerar. Du får användning för din tangentbordsrutin i en senare laboration, spara därför koden Laborationsuppgift 1.5: Du ska nu undersöka tangentbordet ML2/ML15. Använd mm-kommandot och läs adress $9C0. Vad läses första gången när ingen tangent är nedtryckt? Varför? (Studera programmerarens bild av ML15 på sidan 56) Verkar hårdvaran fungera på samma sätt som simulatorn du använde tidigare? Ladda ner och testa din tangentbordsrutin med följande huvudprogram. NOP ; Börja med nop, enklare att köra trace Loop: JSR KEYB1 ; Läs tangentbord NOP ; Lämpligt ställe att sätta en brytpunkt (bp) BRA Loop För att testa rutinen är det här lämpligt sätta ut en brytpunkt. Studera register A varje gång du stannar på brytpunkten och verifiera att registret innehåller korrekt tangentkod (se uppgift 92 i arbetsboken). Du får användning för din tangentbordsrutin i en senare laboration, spara därför koden. 10
Laboration 1 Laborationsuppgift 1.6: Studera borrmaskinen framför dig. Undersök hårdvaran genom att använda samma förfarande som i uppgift 74 i Arbetsbok för MC12. Här finns dock inga strömbrytare att läsa indata ifrån. Använd därför en rutin liknande den nedan (editera, assemblera och ladda) ORG $1000 NOP Loop NOP ; Ge indata till register A STAA DCtrl ; Skriv till borrmaskinen LDAB DStatus ; Läs statusregistret BRA Loop Då det inte finns några strömbrytare att ge indata med kan vi vid NOP-instruktionen ge register A värde direkt genom att ändra detta. Använd monitorns reg-kommando. Undersök kommandot genom att skriva help reg. Stega genom programmet med trace när du undersöker borrmaskinen. Testa att starta borret och sänka det. Observera lysdioderna på borrmaskinen. Gröna lysdioder är statusregistret och gula är styrregistret. Vrid även på arbetsstycket för att ställa detta i referensposition och observera att lysdioden på borrmaskinen aktiveras och att du läser status till register B. Ge kommandot tr + som gör att du i fortsättningen kan trycka. (punkt) för att stega en instruktion. Bit 3-7 är ej definierade i statusregistret och kan anta vilka värden som helst. Tryck RESET på MC12. Studera lysdioderna (statusregistret) på borrmaskinen och pressa ner borret för hand till bottenläge. Observera hur statusbitarna ändras. (Kanske är tryckfjädern som lyfter borret lite klen lyft borret upp i så fall) Du har nu undersökt och lärt dig hur du kan använda monitorn DBG12 provat på hårdvaran (ML2, ML3, ML5 och ML15 och borrmaskinen) verifierat att programdelar för kommande laborationsmoment fungerar (display- och tangentbordsrutin). Om du har du tid över och vill, kan du nu direkt förbereda och fortsätta med laboration 2. 11
Laboration 2 Laboration nr 2 behandlar Assemblerprogrammering för styrning/övervakning av en borrmaskin Följande uppgifter ur Arbetsbok för MC12 ska vara utförda innan laborationen påbörjas. Du ska på begäran av laborationshandledare redovisa dessa. Uppg. 85-87 89-90 93-97 Sign. Följande hemuppgift ska vara utförd innan laborationen påbörjas. Hem- Uppgift Följande laborationsuppgifter ur denna del av laborations-pm skall redovisas för en handledare för godkännande under laborationen. Laborationsuppgift Sign. 2.1 2.2 Laborationsuppgift 2.1: Du skall nu arbeta med filen Main1.s12 du skrev i Uppgift 94 i arbetsboken. Observera att ditt program skall börja på adress $1000. Ändra eventuella I/O-adresser. Du kan lämpligen använda dig av två olika filer med konstantdefinitioner (se uppgift 93, IODEFS.S12), en som används för hårdvaran i labbet och en som används för simulering. Lagg till en NOP-instruktion direkt efter ORG $1000 för att få en bättre utskrift på skärmen när du kör trace. Assemblera den ändrade filen Main1.s12 och rätta eventuella fel. Ladda programmet till MC12 genom att högerklicka i terminalfönstret och välja filnamn. Undersökning av Main1 i MC12. Maskinprogrammet är nu laddat till MC12. Öppna listfilen för Main1 och ha denna tillgänglig på skärmen framför dig. Kontrollera att Main1 är placerat i minnet på MC12 genom att utnyttja monitorns dasmkommando. Skriv dasm 1000. Jämför det du ser på skärmen med listfilen. Leta upp startadressen för subrutinen COMMAND i listfilen och använd dasm-kommandot på nytt för denna adress. Troligen ser de dissassemblerade instruktionerna efter RTSinstruktionen konstiga ut. Försök förklara vad detta är (eller diskutera med en handledare, nu eller senare) 12
Laboration 2 Studera listfilen för huvudprogrammet som innehåller dummy-rutinerna SUB0 - SUB7 på begynnelseadressen för respektive subrutin. Använd monitorns dasm-kommandot och undersök dessa. Adresserna till subrutinerna SUB0 - SUB7 ligger i en tabell i minnet med begynnelseadressen JUMPTAB. Eftersom adresserna är 16 bitar breda krävs det 2 st. minnesord för att rymma (lagra) varje adress. Adresserna lagras på standardformat med den mest signifikanta byten på minnesadressen med lägst värde. Använd mm-kommandot för att studera JUMPTAB i minnet och jämför dessa startadresser med vad du erhöll med dasm-kommandot ovan. Diskutera med en handledare (nu eller sedan) om du är osäker. Test av Main1. När du använde simulatorn studerade du en simulerad utport för att verifiera att ditt program fungerade korrekt och att du hoppade till rätt subrutin SUB0, SUB1, etc. Det finns dock inte tillräckligt med utportar på MC12 så vi måste utnyttja brytpunkter för att verifiera programmet. Välj därför att studera listfilen på skärmen och undersök på vilken adress NOP-instruktionen i huvudprogrammet är placerad på. Se nedanstående utdrag av huvudprogrammet. Loop JSR KEYB1 ; Invänta vald operation NOP ; Instruktion för brytpunkt JSR COMMAND ; Utför vald operation Starta med trace och sätt en brytpunkt på NOP-instruktionen. Välj därefter go för att starta exekveringen. Efter det att du tryckt ner en tangent på tangentbordet kommer du att observera en utskrift på skärmen framför dig. (Tangentbordsrutinen hänger tills en tangent aktiveras.) Be om hjälp efter att ha felsökt i 5 minuter om du inte får någon utskrift. Studera nu innehållet i register A som är ditt önskade kommandonummer. För att fortsätta exekveringen måste du först ge ett tr-kommando för att komma bort från din brytpunkt. Därefter fortsätter du exekveringen med ett go-kommando. Välj go på nytt för att testa en ny tangent, osv. Studera listfilen på nytt och sätt nya brytpunkter på MOVB-instruktionerna i SUB0, SUB1 och SUB7. Använd samma testförfarande som ovan och verifiera att du stannar i dessa subrutiner när du ger kommandonummer 0, 1 och 7. 13
Laboration 2 Du har nu testat att programmet i Main1 fungerar. Med detta har du verifierat att du har ett korrekt fungerande programskal till borrmaskinuppgiften. Nu återstår att testa ut alla de subrutiner som implementerar de olika funktionerna hos borrmaskinen. Spara alla dina filer. Laborationsuppgift 2.2: Test av Main2, uppgift 97 i arbetsboken Din Main1 som du gjort ett fåtal ändringar i skall nu fungera korrekt. Välj själv om du önskar jobba vidare med denna fil eller om du vill göra liknande ändringar i Main2 som fortfarande är anpassad för simulatorn. Oberoende av vilken fil du arbetar vidare med så skall ditt filnamn nu vara Main2.s12 och du skall testa funktionerna START och STOP hos borrmaskinen. Studera för övrigt vad du utförde under uppgift 97 i arbetsboken. Observera att du nu ska ha ändrat DELAY så att denna är anpassad den verkliga miljön och inte den simulerade. Utför ändringarna, assemblera, rätta eventuella fel och ladda Main2 till labsystemet. Starta Main2 med tr 1000 för trace. Välj nu först att sätta brytpunkter i SUB2 och SUB7. ge kommandot go för att starta exekveringen. Tryck sedan på tangentnummer 7 och 2 och verifiera att du fortfarande hamnar i dessa (tomma) subrutiner. Rätta eventuella fel. Tryck RESET på MC12 och kör, go 1000. Välj sedan att starta borrmaskinen genom att ge kommando nr 0. Kontrollera att borret roterar och att en ljusdiod på borrmaskinen tänds. Välj sedan att stanna borrmaskinen genom att ge kommando nr 1. Kontrollera att borret stannar och att lysdioden på borrmaskinen släcks. Utför följande oberoende av om ditt program fungerar eller inte eftersom detta ger dig övning i felsökning. Om exempelvis START inte fungerar bör du studera listfilen och undersöka vilken startadress denna subrutin har. Kanske skall du även ladda Main2 på nytt till MC12 då ett felande program kan skriva sönder sig själv. Starta med trace från adress 1000, ange brytpunkt för START och välj go. När du gett kommando 0 bör programmet stanna på START s första instruktion. Om så inte är fallet borde ditt hopp inte fungera som tänkt. (Hopp till SUB2 och SUB7 fungerade ju ovan.) Om du kommer till START kan det vara lämpligt att i fortsättningen utnyttja go n - kommandot under trace då detta kör en hel subrutin. Stega dig vidare men go n tills du utfört OUTZERO. (Stanna på instruktionen nedanför). Du bör nu observera att bit 2 är ettställd på borrmaskinen och övriga bitar skall vara oförändrade. Om så inte är fallet kan det vara problem OUTZERO eller kanske kopian av styrordet. Undersök DCCopy genom att använda mm-kommandot för att läsa kopians värde. Adressen till DCCopy hittar du i listfilen. Du kan återstarta trace genom att enbart ge kommandot 14
Laboration 2 tr (utan adress) efter att du utnyttjat mm-kommandot. Du kommer då att återstarta trace på den adress du var tidigare med samma registerinnehåll och samma stack. Fortsätt med go n -kommandot genom resterande del av START. Observera speciellt vad som händer när du ger detta kommandot när du står på RTSinstruktionen. Det verkar som det hänger. När du ger go n -kommandot under trace begär du att stanna på nästföljande instruktion i minnet, dvs. instruktionen efter RTS. Det är bara det att du inte kommer dit då du gör ett återhopp. START har därmed slutförts och det troliga är att du nu hänger i tangentbordsrutinen och inväntar ett nytt kommando. Rätta eventuella fel, spara alla dina filer och visa upp resultatet för en handledare. Laborationsuppgift 2.3: Fortsätt nu med Main3 där du lägger till rutinerna DOWN och UP om du förberett dessa. Om inte kan du försöka göra dessa nu. Om du vill jobba vidare i simulatorn eller vidare med labbsystemet bestämmer du. Observera bara att du bör ha två definitionsfiler, där en gäller för hårdvaran och en gäller för simulator. Du har nu använt olika monitorkommandon för felsökning och test verifierat att ditt huvudprogram för borrmaskinen fungerar korrekt testat dina två första subrutiner (OUTZERO och OUTONE) på borrmaskinen ett fungerande programskal som du enkelt kan lägga till nya subrutiner för de övriga funktionerna hos borrmaskinen. BRA JOBBAT!!!! 15
Laboration 3 Laboration nr 3 behandlar Pseudoparallell exekvering Följande uppgifter ur Arbetsbok för MC12 ska vara utförda innan laborationen påbörjas. Du ska på begäran av laborationshandledare redovisa dessa. Uppg. 42-45 98-101 102-106 Sign. Följande hemuppgifter ska vara utförda innan laborationen påbörjas. Utför uppgifterna 42, 43, 44 och 45 i arbetsboken. Dessa illustrerar hur avbrott sker i ett MC12-system. Försäkra dig om att du behärskar IO-simulatorn ML19 då denna är en kopia av hårdvaran du ska jobba med i labbet. Studera ML19 (IO-simulator) under ETERMS hjälpmeny Hem- Uppgift 3.1 3.2 3.3 3.4 Följande laborationsuppgift ur denna del av laborations-pm skall utföras och redovisas för en handledare för godkännande. Laborationsuppgift Sign. 3.2 Hemuppgift 3.1: Implementera resterande borrmaskinrutiner fram tom uppgift 106 (Main7) i arbetsboken. Testa alla rutiner i simulatorn och verifiera korrekt funktion enligt specifikationerna. Laborationsuppgift 3.1: Förra gången du var i labbet testade du din Main2, 3 eller 4-rutin beroende på hur långt du kom. Testa ut din senaste rutin på nytt för att verifiera att hårdvaran är korrekt och att din senaste Mainx är intakt. Laborationsuppgift 3.2: Ändra adressdefinitioner, konstanter mm så att du kan testa din Main7 på hårdvaran i labbet. Ladda nu ner Main7 till labbsystemet. Verifiera att alla kommandon (0-7) fungerar som tänkt. (OBS! Vi förutsätter här att du i Laborationshäfte 1 åtminstone jobbade med Main2 där du testade hela programskalet. Om du inte gjort detta tidigare, gå tillbaka till Laborationshäfte nr 1 och säkerställ att Main2 fungerar.) Du ska nu ha ett fungerande borrprogram. Gör Save All för att spara Main7. Vi skall utnyttja denna fil längre fram. Hemuppgift 3.2: 16
Laboration 3 Basadressen för ML19 är $0DC0 (se även Appendix A i arbetsboken). Det innebär som bekant att en skrivning på adress $0DC2 nollställer vippa ett och en skrivning på adress $0DC3 nollställer vippa två. Laborationsuppgift 3.3: Studera komponenttrycket (vita texter och figurer) på ML19 som sitter överst på mikrodatorsystemet. Jämför med bilden av IO-simulatorn. Du har två tryckknappar (S1 och S2) som motsvarar Event1 och 2 på IO-simulatorn. Vidare finns ett antal ljusdioder. Försök lista ut ljusdiodernas betydelse när du fortsätter denna laborationsuppgift. Tryck på S1 och på S2. Om lysdioderna på ML19 var släckta från början tändes dessa nu. Avbrotten var/är aktiverade och avbrottsvipporna var/är ettställda. För att kvittera ett avbrott ger du ni en skrivning med mm-kommandot på adress $0DC2 och sedan en skrivning på adress $0DC3. Avbrottsvipporna nollställs oberoende av vilket värde du skriver. Lysdioderna släcks. Gör en läsning på adress $0DC0 som är ML19 s statusregister. Detta skall nu vara nollställt. Studera lysdioderna på ML19 och tryck på S1. Gör därefter en ny läsning av statusregistret och verifiera att b 0 är ettställd. Studera lysdioderna på nytt och tryck på S2. Gör därefter ännu en läsning av statusregistret och verifiera att b 1 också är ettställd. Ett teoriavsnitt: Parallell programexekvering. Din slutgiltiga laborationsuppgift är att köra borrprogrammet (Main7) och displayrutinen (Display) på MC12 så att det verkar som att dessa körs samtidigt: de körs pseudoparallellt. Du skall nu köra två program samtidigt med ett mikrodatorsystem. Programmen skall till synes styras parallellt och därför inför vi ett avbrottsdrivet system där processorn växelvis styr den ena och sedan den andra. Växlingen går så snabbt att användaren upplever att de styrs parallellt. Programväxlingen sker med avbrottsrutinen SWITCH. Programmen (Borr och Display) och dess dataareor skall placeras i minnet enligt Figur 3.1. Borr (Main7) har sin dataarea med tillhörande stack och Display har sin dataarea med tillhörande stack. I laborationssystemet (på laborationskort ML19) finns en klockgenerator med frekvensen 400 Hz. Denna används för att generera avbrott till processorn. Detta innebär att avbrott sker var 2,5 ms. Varje gång avbrott sker startas avbrottsrutinen (SWITCH) som växlar program. Vi betecknar detta processbyte. Adr 0000 1000 4000 - - - FFFF HC12 Regs IO-Portar INIT och SWITCH BORR Dataarea B DISPLAY Dataarea D Ledigt RWM ROM (DBG12 Monitor) Figur 3.1 17
Laboration 3 Tidigare har vi haft ett huvudprogram som blivit avbrutet. Huvudprogrammet har återstartats när avbrottsrutinen är slut. Jämför med Figur 3.2. Du bör vara väl bekant med vad som sker vid ett avbrott, nämligen: huvudprogrammets status sparas på stacken (avbrotts-) servicerutinen startar och betjänar avbrottet orsaken till avbrott avlägsnas huvudprogrammets status återhämtas från stacken återhopp till huvudprogrammet Avbrotts -signal Figur 3.2 Huvudprogram Avbrottsrutin När vi nu har två (huvud-) program så ändras förutsättningarna något. Figur 3.3 visar hur programmet BORR exekverar. När nu ett avbrott inträffar startas avbrottsrutinen i vanlig ordning. Först sparas BORR:s status på stacken. Avbrottsrutinens uppgift är stanna BORR och starta Display. Avbrottsrutinen avslutas som bekant med ett återhopp till huvudprogrammet. Detta innebär att avbrottsrutinens uppgift är att förbereda för ett återhopp till Display. Avbrottssignal BORR SWITCH DISPLAY Detta sker genom att ändra stackpekaren så att denna pekar ut Display s stack. På så sätt (åter-) startas Display vid RTI. När nästa avbrott inträffar skall en liknande händelse inträffa. Nu är det Display som skall stanna och BORR som skall starta (Figur 3.4). På detta sätt kommer programmen växelvis att exekvera. Då växlingen sker 400 ggr per sekund upplevs detta som att programmen körs samtidigt (pseudoparallellt). BORR SWITCH Figur 3.3 DISPLAY Avbrottssignal Studera nu Figur 3.5. Tiden som SWITCH upptar kan du bortse från i detta sammanhang. BORR och Display exekveras ca 2,5 ms vardera. Figur 3.4 I vår miljö definierar vi det program som för tillfället exekveras av processorn att vara i tillståndet RUNNING. Det program som inte exekveras och är redo att startas om på nytt, säger vi är i tillståndet READY. Så alltså när BORR är i tillståndet RUNNING så är Dispaly i READY och vice versa. BORR DISPLAY RUNNING READY READY RUNNING SWITCH 2,5 ms 2,5ms 2,5ms Figur 3.5 18
Laboration 3 Observera att vid avbrott så startas SWITCH och vid utförande av RTI så startas det program som var READY. BORR DISPLAY IRQ SWITCH 2,5 ms 2,5ms 2,5ms RTI Figur 3.6 Vi sammanställer här vad som skall ske i SWITCH Förutsätt att BORR exekveras. Då skall följande ske: BORR s statuts placeras på stacken BORR s stackpekare skall sparas DISPLAY s stackpekare skall hämtas Orsaken till avbrottet måste avlägsnas (nollställa avbrottsvippan) Slutligen, RTI Hemuppgift 3.3: Skriv en avbrottshanterare SWITCH som byter stackpekare mellan BORR och Display. Spara SWITCH under filnamnet MainStart.s12. Ta inte hänsyn till hur det startas första gången när du skriver SWITCH utan fokusera på att ett antal processbyten redan har skett. Hur det startas första gången återkommer vi till nedan. En skrivning på den symboliska adressen IrqRes nollställer avbrottsvippan. Du behöver inte assemblera filen. Vi skall strax lägga till rutinen INIT som gör att hela systemet startar. Slut på hemuppgift 3.3 Hur startas detta första gången? Det krävs en rutin INIT som initierar systemet så att avbrott registreras och att de två processerna startas korrekt första gången de sätts i tillståndet RUNNING. Vi förutsätter att efter att INIT körts så startas BORR som första process. Första frågan: Hur startas BORR första gången? BORR startas lämpligen med en vanlig JMP till BORR s startadress efter det att INIT har exekverat klart. Andra frågan: Hur startas DISPLAY första gången? Display startar genom ett RTI efter det att SWITCH körts första gången. Detta innebär att stacken till DISPLAY måste iordningställas innan det första avbrottet inträffar. 19
Laboration 3 Studera DISPLAY s stack i marginalen vid första RTI. När RTI exekveras i samband med IRQ-avbrott hämtas hela processorns status (alla register hämtas från stacken). Vidare krävs det att CC-registret som hämtas måste ha sin I-flagga nollställd. När Bottom Of Stack (BOS) är definierad måste därför stacken byggas upp enligt Figur 3.7. Studera avsnitt 2 i arbetsboken som beskriver avbrott. Använd följande programskal för MainStart: * Filen MainStart.s12 USE IODEFS.S12 ORG START NOP LDS #BOS JSR INIT JMP BORR USE BORR.s12 USE Display.s12 CC som BORR läser in måste ha sin I-flagga nollställd för att kunna bli avbrutet Återhoppsadressen måste vara DISPLAY s startadress BOS-9 BOS Figur 3.7 CC B A X H X L Y H Y L PC H PC L Hemuppgift 3.4: Skriv initieringsrutinen INIT som du placerar först i filen MainStart.s12 (innan rutinen SWITCH) se ovan. Rutinen skall: skapa stackar för BORR och Display (INIT och BORR kan utnyttja samma stack). initiera systemet, så att det känner av avbrott och slutligen startar upp BORR Kopiera MAIN7.s12 till BORR.s12 jobba vidare med detta filnamn. Ändra programmets startadress till $1500. (ORG $1500). Fundera igenom hur du vill ha dina IO-definitioner (USE IODEFS.s12). Du kan ha alla definitioner i MainStart.s12 eller några i MainStart.s12 och några i BORR.s12. Ändra vid behov. Kommentera bort initieringar som görs i MainStart.s12, exempelvis initiering av stacken. Kopiera Display.s12 till Display2.s12 jobba vidare med detta filnamn. Ändra programmets startadress till $2000. (ORG $2000). Fundera igenom hur du vill ha dina IO-definitioner (USE IODEFS.s12). Du kan ha alla definitioner i MainStart.s12 eller några i MainStart.s12 och några i Display2.s12. Ändra vid behov. Kommentera bort initieringar som görs i Display2.12, exempelvis initiering av stacken. Assemblera Mainstart.s12 och rätta eventuella fel. Kanske har du använt samma symboler som Loop, Snurra etc. och definierat IO-portar två gånger mm. 20
Laboration 3 Kontrollera nu listfilen och försäkra dig om att programmen inte överlappar varandra i minnet. Ändra ORG-direktiven i BORR/Display2 om så är fallet. Slut på hemuppgift 3.4 Att testa programmen i simulatorn. I den simulerade miljön är svårt att behandla sådana snabba processbyten (400 processbyten per sekund). Vidare är det definitivt omöjligt att följa händelseförloppet vid test av programvaran i denna hastighet. Därför är det lämpligt att under simuleringsarbetet utnyttja en av de avbrottsvippor som finns tillgängliga i IOsimulatorn. (Figur 3.8). Då det är du som klickar på Eventknappen i IO-simulatorn är det du som bestämmer när SWITCH skall starta. Du kan därför lugnt studera händelseförloppet när du själv klickar i fönstret för avbrottsvippan. BORR kommer att stanna, SWITCH utför processbytet och DISPLAY startas. Hemuppgift 3.5: När du testar nu kan det vara lämpligt att använda Run Fast, brytpunkter och Step. Se till att du har rätt konstanter för dina delay-rutiner. Ladda MainStart till simulatorn. Välj nu att sätta följande brytpunkter: En i SWITCH (Studera listfilen för aktuell adress) En i BORR ($1500) Och en i Display2 ($2000) Aktivera sedan de IO-simulatorer du behöver under simuleringen, nämligen en avbrottsvippa, en borrmaskin, ett tangentbord (Interface ML15) och en Display (Interface ML5). Starta nu programmet MainStart ($1000) och verifiera att du stannar på brytpunkten i BORR. Verifiera att I-flaggan i CC-registret är nollställd. Klicka nu på Run för att starta BORR. Figur 3.8 $0000 $1000 $1500 $2000 $4000 Undersök ett par funktioner hos borrmaskin och att denna fungerar som tänkt. Figur 3.9 Välj nu att generera ett avbrott genom att klicka på Event 1 på avbrottsvippan. HC12 Regs IO-Portar INIT SWITCH BORR Dataarea B DISPLAY Dataarea D Ledigt RWM ROM (DBG12 Monitor) 21
Laboration 3 Du bör nu stanna på brytpunkten i SWITCH. Om så inte är fallet bör du studera din avbrottsvektor, då denna troligen är fel. Studera även simulatorns Interruptfönster. Stega dig nu fram, instruktion för instruktion och observera speciellt vad som händer när RTI utförs. Du bör efter RTI-instruktionen ha kommit till början av Display2. Du bör observera en brytpunkt och att PC har värdet $2000. Sker inte detta, starta då om på nytt och studera innehållet i register S när du står vid RTIinstruktionen. Ställ dig sedan frågan: Pekar S på CC-registret som skall finnas överst på Display s stack? Vidare utför RTI på nytt och studera PC s innehåll, verkar detta PC-värde rimligt? Rätta eventuella fel. När SWITCH fungerar ta då bort brytpunkterna, och starta exempelvis REFPO eller AUTO på borrmaskinen. Klicka sedan på Event 1 för att växla process och starta Displayrutinen. Du kan nu klicka på Event1 upprepade gånger för att verifiera att systemet verkar fungera korrekt - att BORR och Displays arbeten fortsätter växelvis på ett korrekt sätt när du klickar på Event-knappen. Klarar du att klicka ett par hundra gånger per sekund upplever du det som borrmaskinerna styrs parallellt. Slut på hemuppgift 3.5 När du nu simulerat är det du med Event1-knappen som växlat program. I ett verkligt system finns någon form för klock- eller pulsgenerator som är ansluten till processorns avbrottsingång. Se Figur 3.10. Pulsgenerator 400 Hz CS vid skrivning 1 1D C1 R Q' Till processorns IRQ Att generera 400 avbrott per sekund har vi tyvärr inte möjlighet till i vår simulerade miljö så vi får nöja oss med den verifiering vi genomfört ovan och eventuellt testa våra program BORR och Display2 på ett verkligt system i stället. Laborationsuppgift 3.4: Figur 3.10 Modifiera eventuellt konstanterna i din programvara så att det fungerar i hårdvaran. Observera att när du använder labbsystemet så ska du använda avbrottsvektorn $3FF2 Ladda och testa din MainStart.s12 på hårdvaran. Testa programmen i hårdvaran på samma sätt som du gjorde tidigare i simulatorn. Sätt brytpunkter i BORR och Display. Verifiera att du stanna på dessa brytpunkter när du trycker på S1. Se till att hela programpaketet fungerar. 22
Laboration 3 Ett bra visuellt sätt att se programväxlingen är att starta upp REFPO för borrmaskinen när du trycker på S1. Det ser då ut som borrmaskinen dör och Display startas upp när du trycker på S1. Då du gör ännu ett tryck på S1 verkar det som Display dör och borrmaskinen fortsätter. Ge ett antal tryck på S1 och studera förloppet. När du känner dig nöjd, kontakta då en assistent som hjälper dig att växla till pulsgeneratorn så att du får ca 400 avbrott i sekunden. Testa rutinen REFPO!. Går denna långsammare än tidigare???? Studera även Display. Verkar det som om denna blinkar/fladdrar på ett annat sätt nu än vad den gjorde i förra labbet???? Försök förklara varför och diskutera nu eller sedan med en assistent. Du har nu implementerat ett mini-realtidssystem (tidsstyrd) där du kört två processer på ett mikrodatorsystem. (Detta kan enkelt ökas till flera processer) skrivit en massa assemblerprogram (vid laboration 6 använder du programspråket C och gör ungefär samma sak fast på ett smidigare sätt.) BRA JOBBAT!!!! 23
Appendix Appendix: MC12 IO-adresser för laborationskort Laborationskort Noter ML4 Borrmaskin är också ansluten till dessa adresser. OBS: Skillnad mellan IOsimulator och fysisk hårdvara. Register/Port Symboliska namn Adress (hexadecimal form) Simulator (lämpligt val) Out 0400 0400 In 0600 0401 ML5 De här angivna adresserna för ML5 gäller PAL-revision 2. Out 0C00 0C00 In 0C01 0C01 Out 0C02 0C02 Out 0C03 0C03 ML13 ML15 ML19 Ctrl/Status 0B00 0B00 IRQ Ctrl/Status 0B01 0B01 Kbd Data 09C0 09C0 Kbd Status 09C1 09C1 Led Mode 09C2 09C2 Led Ctrl/Data 09C3 09C3 Status 0DC0 0DC0 Kvittera ev 1 0DC2 0DC2 Kvittera ev 2 0DC3 0DC3 24