Introduktionsuppgift till enchipsdatorn. I den här övningen skall du bekanta dig med enchipsdatorn MC68HC705P6A och utvecklingssystemet CE-SAM2000. Du skall läsa in data från en tryckströmställare och mata ut data på ett antal lysdioder. Som slutövning skall du skriva ut lite text på en LCD-display. Vi kommer att använda lab-modul nr.17. Enchipsdatorn MC68HC705P6A har fyra portar, kallade A,B,C och D, via vilka datorn hämtar in data från omvärlden och skickar ut sina resultat. Enchipsdatorn placeras i en nollkraftsockel på ett litet kretskort där även strömförsörjningen är ordnad. Vi kallar detta kort för modermodulen. Till detta kort kan man sedan ansluta olika dottermoduler anpassade för olika uppgifter. Vi skall arbeta med modul 17, som är ett enkelt in- och utmatningskort. På detta kort är port A ansluten till 8 lysdioder, där man alltså kan skicka ut ett resultat. På portarna B, C och D sitter en 8-bitars DIP-switch, via vilken man kan mata in infomation, och på bit 0 i C-porten sitter en tryckströmställare. Den exakta kopplingen framgår av schemat. Alla ingångar är försedda med pullup-motstånd på 4.7 kohm. VCC RES GND DS1233D RESET 1 27 26 24 2 25 RESET OSC1 OSC2 TCMP IRQ TCAP/PD7 10 PA0 9 PA1 8 PA2 7 PA3 PA4 6 5 PA5 PA6 4 3 PA7 18 AD2/PC4 17 AD1/PC5 16 AD0/PC6 15 VR/PC7 23 PD5 11 SDO/PB5 SDI/PB6 12 13 SCK/PB7 22 PC0 21 PC1 20 PC2 19 AD3/PC3 1 2 3 4 5 6 7 8 16 15 14 13 12 11 10 9 MC68HC705P6A Lysdioder och omkopplare anslutna till datorns portar. Vi kommer att använda utvecklingssystemet CESAM2000 för att skriva, översätta, simulera och promma ditt program. Utvecklingssystemet består av ett program (P6.EXE) och en speciell burk för promningen som ansluts till printerporten på datorn. Hela programmet är menystyrt, med en huvudmeny och ett antal undermenyer. Från huvudmenyn kan du starta editorn, assemblatorn, simulatorn och promningen. Vi skall gå igenom uppgiften steg för steg för att visa hur du löser en uppgift: 2001-11-15 Introduktionsuppgift- 1 PN
1. Din första uppgift blir att tända lysdioderna 0,2,4,6 och släcka de övriga. Starta P6-programmet genom att dubbelklicka på ikonen. Du kommer då att få upp programmets huvudmeny med endast tre knappar aktiverade, nämligen Select Project, Setup och Exit. Klicka på Select projekt och sök dig fram till din projektkatalog. Om du skall fortsätta på ett gammalt projekt klickar du bara på det och sedan OK. Du skapar i stället ett nytt projekt genom att skriva in ett nytt namn, och därefter klicka på OK. Då kommer du tillbaka till programmets huvudmeny. Nu är alla knappar aktiverade. Härifrån kan man välja att starta editorn, att uföra översättningen till maskinkod (assemblera), att simulera programmet eller att bränna in koden i enchipsdatorns minne. Editering. Starta editorn. I setup-menyn har du kunnat välja mellan några olika editorer, t.ex. den i windows inbyggda Notepad (Anteckningar). Du har också möjlighet att använda Uedit32 som har s.k syntax-färgning, dvs reserverade ord och andra delar av programmet får olika färger. Pröva den, det underlättar avsevärt För att göra det lätt att komma igång från början har vi skrivit stommen till ett program, där det mesta man behöver redan finns deklarerat. Direkt efter det att du startat editorn, importerar du denna stomme genom att göra copy och paste. Om du använder Notepad öppnar du filen Frame.P6 och markerar all text. Därefter öppnar du ditt nya program och klistrar in textem med hjälp av paste. Lämna filen Frame.P6 utan att spara några ändringar i den. I editorn UEdit32 ställer du markören på den plats i ditt program där du vill importera texten. Så går du via File och Special functions till Insert file. Då kan du leta dig fram till den fil du vill importera, markerar den och klickar på öppna. I alla program måste vissa satser alltid finnas, bl.a. dessa: Definiera de symboler som behövs. I detta fall PORTA och DDRA. Definiera startvektorn. Sätt en label på första exekverbara satsen i programmet. Denna label utnyttjar du även vid definitionen av startvektorn. Avsluta programmet med END. Du ser att det är just dessa delar som den inlästa filen FRAME.P6 innehåller. Nu skall du skriva de satser som utför uppgiften. För att tända och släcka lysdioderna på PORT A skall du skicka ut information på portens alla bitar. Portens alla bitar skall alltså riktas utåt. Det åstadkomms genom att skriva ettor till portens riktningsregister. Det gör vi i två steg. Först laddar du accumulatorn med ett tal som innehåller ettor i alla 8 bitarna. Därefter skickar du ut detta accumulatorinnehåll till portens riktningsregister, DDR A. Vi får alltså följande två satser: LDA #%11111111 ;ladda accumulatorn med 8 ettor STA DDRA ;skicka ut ettorna till riktningsregistret. Tänk på den syntax (grammatik) som är definierad för det här programmerings-språket. Den finns beskriven i Appendix C i läroboken Konstruera med Enchipsdatorer. Alla satser, utom lägen och andra namn, måste börja minst ett mellanslag in på raden. Nu har du riktat dataflödet utåt på PORT A. Nu skall vi skicka ut själva data som tänder eller släcker lysdioderna. Som framgår av kopplingsschemat sitter lysdioderna kopplade till + 2001-11-15 Introduktionsuppgift- 2 PN
via ett motstånd på 220 Ohm. För att få ström genom en lysdiod och därmed tända den, måste du lägga ut en låg spänning, dvs en nolla på biten i porten. Vi skall alltså lägga ut nollor på bitarna 0,2,4,6 i porten och ettor på de övriga. Även här är vi tvugna att göra utmatningen i två steg, först ladda accumulatorn med ettorna och nollorna, och därefter skicka ut accumulatorns innehåll på portens dataregister. Vi får alltså följande satser: LDA #%10101010 ;ladda accumulatorn med bitmönstret STA PORTA,skicka ut det på portens dataregister När du skrivit programmet med hjälp av utvecklingssystemets editor, sparar du programmet och går tillbaka till huvudmenyn. Assemblering Begär sedan assemblering av programmet.genom att klicka på knappen Assemble. Då läser assemblatorn igenom raderna i ditt program och skriver ut eventuella felmeddelanden. Läs felmeddelandena och försök att förstå vad du har gjort för fel. Om du får felmeddelanden startar du åter editorn samtidigt som du har fönstret med felmeddelandena uppe. Ibland kan ett enda fel dra med sig följdfel så att det ser värre ut än det är. Rätta de fel du ser, spara filen och assemblera om. Efter några vändor har du säkert klarat av dina syntaxfel. Eftersom felmeddelandena refererar till radnummer är det ju ytterst lämpligt att använda en editor som visar radnummer. Simulering När du kommit igenom assembleringen utan fel, är det dags att börja provköra ditt program. Det gör du med hjälp av simulatorn. Simulatorn att ett program som efterliknar själva enchipsdatorn in i minsta detalj, men som körs i PCn. Det ger dig möjligheten att exakt följa vad som händer i datorn när du kör programmet. Du kan se vad som händer i register och portar och hur mikro-sekunderna tickar fram. Starta simulatorn genom att klicka på knappen Simulate. Då laddas automatiskt ditt programs maskinkod och assembleringslista. Stega dig sedan igenom programmet instruktion för instruktion (single stepping) och se att ditt program går rätt. Du ser i PORT-fönstret hur först riktningen på alla bitar i A-porten vänds utåt. (innehållet växlar från iiiiiiii till oooooooo). Därefter blir databitarna satta till 10101010. Vad händer när datorn kommit till sista satsen i ditt program?? Just det - du får konstiga felmeddelanden. Det beror på att processorn hela tiden fortsätter och hämtar och utför operationskoder från minnet, även om du inte har skrivit dit några. Du måste därför hela tiden sysselsätta processorn även om det inte finns något mera att göra. Du måste avsluta programmet genom att kommendera processorn på stället marsch. Det gör du genom att skriva en sats där processorn hela tiden hoppar tillbaka till samma sats. Det gör du så här: HIT: BRA HIT ;Gå in i en oändlig loop När du är nöjd med simuleringen av ditt program, är det dags att prova det i hårdvaran. Emulering. För att kunna provköra programmet i den riktiga hårdvaran men ändå behålla datorns kontroll över programexekveringen använder vi oss av en emulator. Det är ett kort som monteras in i PCn och som är försett med en flatkabel. I ändan på flatkabeln sitter en 28 pinnars kontakt som ser exakt lika dan ut som enchipsdatorn. Dessutom har emulatorn tillsammans med PCn och dess program exakt samma funktion som enchipsdatorn! Man kan 2001-11-15 Introduktionsuppgift- 3 PN
alltså ersätta enchipsdatorn med kontakten från emulatorn och köra sin hårdvara med emulatorn i stället för med enchipsdatorn och få exakt samma resultat. Dock med den stora fördelen att med emulatorn kan vi på datorns skärm se vad som händer ute i vår hårdvara när programmet går. Anslut emulatorn till labkortet och när du ligger i simulatorn aktiverar du emulatorn genom att klicka i I/O-fönstret där det hittills har stått Keyboard. Om du har ett emulatorkort monterad i din dator och drivaren är laddad kommer texten att växla till Emulator. Du kan nu inte längre påverka bitarna i portarna från tangentbordet, utan denna information tar nu programmet in via emulatorn. All data som programmet skickar ut på sina portar kommer nu ut i emulatorn och styr labkortet. I portfönstret visas naturligtvis all information som finns på portarna så att du kan se vad som händer när programmet går. Kör nu ditt program med emulatorn inkopplad så skall du se att labkortet reagerar som du har tänkt dig i ditt program. Promning. Som sista steg i utvecklingen av ditt program skall du överföra maskinkoden in i enchipsdatorns programminne och provköra labkortet med enchipsdatorn monterad. Det gör du genom att ansluta den speciella promningsburken till datorns printerport och klicka på prom -knappen. Då öppnas programmeringsmenyn. Där anger du vilken port som programmeraren sitter ansluten till och hur snabb din dator är. Enchipsdatorn är känslig för ljus under själva promningen, så då måste den täckas över, t.ex. med en bok. I menyn måste du därför även kvittera att du har täckt över enchipsdatorn, innan du kan promma den. Därefter klickar du på prom - knappen. Då kommer maskinkoden att föras över till promningsburken och brännas in i enchipsdatorns minne. När du fått meddelande om att enchipsdatorn är programmerad och verifierad tar du loss den från promningsburken och sätter in den i lab-modulen. Matningsspänningen till lab-modulen måste vara bortkopplad när du stoppar in enchipsdatorn. Man kopplar aldrig under spänning, för då vet man aldrig vad man förstör! Enchipsdatorns ben 1 skall vara mot nollkraftssockelns spak. När du ansluter matningsspänningen startar enchipsdatorn från början av programmet (power up reset), och lysdioderna bör nu lysa så vackert. När programmet är färdigtestat tar du ut assembleringslistan på printern och sparar den i din kurspärm. 2. Nästa program skall ligga i en oändlig loop och läsa in statusen från tryckomkopplaren. Om den är uppsläppt skall alla lysdioder lysa, och om man trycker ned knappen skall lysdioderna slockna. Börja ett nytt program genom att ladda in FRAME.P6 till ditt nya program. Tänk på att när du läser av tryckomkopplaren så går informationen in i datorn, så den biten måste programmeras att vara riktade inåt. Gå igenom samma procedur med editering, assemblering, simulering, emulering och promning som i första uppgiften, och spara assembleringslistan när du är klar. Som du ser i kopplingsschemat sitter tryckomkopplaren ansluten till bit 0 i C-porten. Börja med att programmera upp riktningarna på portarna: START: LDA #%11111111 ;Rikta hela Port A utåt STA DDRA 2001-11-15 Introduktionsuppgift- 4 PN
LDA #%0000 ;Rikta hela Port C inåt STA DDRC När portarna nu är initierade låter du programmet gå runt i en oändlig loop. Inuti loopen känner du av statusen på bit 0 i C-porten och beroende på om den är en 1 eller 0 laddar du accumulatorn med åtta nollor eller ettor som du sedan skickar ut på lysdioderna: LOOP: BRSET 0,PORTC,NOLL ;Är knappen uppsläppt BRCLR 0,PORTC,ETT ;eller nedtryckt? NOLL: LDA #%00000000 ;Ladda nollor = tänd BRA UT ETT: LDA #%11111111 ;Ladda ettor=släck UT: STA PORTA ;Skicka ut BRA LOOP ;Gå runt i loopen Assemblera och provkör programmet. Använd gärna emulatorn för att testa att programmet fungerar med den riktiga hårdvaran. 3. I den sista introduktionsuppgiften skall du skriva ditt eget namn på en display av flytande kristaller ansluten till enchipsdatorn. En display av flytande kristaller (Liquid Crystal Display - LCD) är uppbyggd av två glasskivor mellan vilka den vätska finns som är det aktiva mediet (de flytande kristallerna). Om vätskan utsätts för en elektrisk spänning ändrar den sina optiska egenskaper, bl.a. sin transmissionsförmåga för ljus. För att kunna lägga spänningen över vätskan har man lagt ett mycket tunnt metallmönster på insidan av de båda glasen. Detta metallmönster leder ström och gör att man kan få spänningen över olika partier av vätskan. Elektroderna i metallmönstret är utformade som punktmatriser och genom att aktivera olika punkter kan man generera olika bokstäver, siffror och tecken. För att kunna hantera displayen på ett enkelt sätt är den utrustad med ett kretskort med styr- elektronik. För att skriva tecken på displayen, behöver enchipsdatorn bara skicka ut ASCII-tecken till LCD-displayens styrelektronik. Denna tar sedan hand om tecknen och aktiverar de olika punkterna i displayen så att det bildas motsvarande tecken på displayen. För att underlätta programmeringen av LCD-displayen finns det en programbiblioteksmodul kallad LCD2.LIB. (Siffran 2 indikerar att biblioteket gäller för CESAM2000). Där finns alla de rutiner du behöver för att initiera displayen och sedan använda den. Kopiera in denna biblioteksmodul i slutet av ditt eget program så att du sedan kan anropa de olika subrutiner du behöver, på samma sätt som du tidigare kopierade in programramverket FRAME. 2001-11-15 Introduktionsuppgift- 5 PN
Innan man kan börja skriva tecken på displayen måste den initieras. Det sker genom att du helt enkelt anropar subrutinen LCDINI2 i biblioteksmodulenmed satsen: JSR LCDINI2 ;Tvåradig display Om du fortfarande använder den enradiga displayen initierar du den med satsen: JSR LCDINI ;Enradig display Därefter kan du skicka ut enstaka tecken eller hela textsträngar till displayen genom att använda olika subrutiner i modulen. Läs igenom den inledande texten i biblioteksmodulen så att du vet vilka subrutiner som finns och hur de skall användas. Därefter skall du skriva ut ditt eget namn på displayen. Då måste du först lagra ditt namn i enchipsdatorns minne. Det gör du enklast med satsen: NAMN: DB Kalle Anka,0 Obs! att denna sats för att definiera minnesinnehåll inte får ligga insprängd bland de körbara satserna, utan skall ligga före dessa vid en adress lägre än $100.., i det minnesområde där det står Här läggs programmets konstanter, textsträngar och tabeller. Nollan på slutet måste finnas för att utskriftsrutinen skall veta att det är slut på texten. Labeln NAMN har du satt på texten för att du skall kunna veta var i minnet (vid vilken adress) som texten ligger. När du anropar rutinen för utskrift av en textsträng till LCD-displayen, måste du tala om för rutinen var i minnet som texten ligger. Det gör du genom att ladda indexregistret med adressen till texten innan du anropar rutinen. Den laddningen av indexregistret gör du med satsen: LDX #NAMN LDX innebär att du laddar indexregistret, och #NAMN att du laddar med adressen till labeln NAMN. När denna förberedelse är klar kan du anropa utskriftsrutinen med satsen: JSR LCDSTR Subrutinen LCDSTR kommer då att skriva ut de tecken som den hittar i minnet vid den adress som indexregistret pekar på, ända tills den stöter på nollan som avslutade ditt namn. Då avslutas subrutinen och datorn hoppar tillbaka till ditt huvudprogram. Eftersom uppgiften är klar i och med utskriften av namnet måste du stanna processorn på något sätt. Det kan du exempelvis göra genom att låta programmet gå in i en oändlig loop där man hela tiden hoppar tillbaka till samma sats, så här: HIT: BRA HIT Som sista sats i hela programmet måste det finnas ett END för att tala om för assemblatorn att nu är det slut på texten i programmet. Assemblera, simulera, emulera och promma ditt program på samma sätt som i de tidigare uppgifterna. I rutinen för initiering av LCD-displayen finns en vänterutin som kommer att ta några sekunder att utföra i emulatorn, men hav tålamod! 2001-11-15 Introduktionsuppgift- 6 PN