Hensikt I denne øvelsen viser vi hvordan vi kaller subrutiner og kommer tilbake fra subrutiner i assemblerprogrammering. Demonstrasjonsprogrammet nedenfor skal vi benytte. Oppgaven går ut på å forklare hvordan dette programmet virker med hovedvekt på begrepet stack som lagringsplass for adresser. Programmet I denne øvelsen benytter vi assemblerprogrammet som vist i Listing 1 Du skal foreløpig ikke skrive inn dette programmet det kommer vi til i en senere del av øvelsen. Vi skal først se på en del detaljer. ;-------A003.ASM------------- ; Programmet setter utport B ; til 00001111 (lydioder) ; Så venter det til vi trykker ; bryter 1 og setter utport B ; til 10101010.nolist.include "8535def.inc".list ;Husk.include "8515def.inc" ;------lagringsplass---------.def temp=r16.org 0 rjmp init.org 0x20 ;sett opp portb til utport init: ldi temp,0xff out ddrb,temp ;PortD er innport, vi bør aktivere pullup out portd,temp ; sett ut bitmønster 00001111 ldi temp,0x0f out portb,temp ;sett stackpekeren bakerst i ram ldi temp,low(ramend) out spl,temp ldi temp,high(ramend) out sph,temp rjmp loop1 ;---------subrutiner---------.org 0x50 sub1: ldi temp,0xaa out portb,temp ret.org 0x80 ;test for nedtrykt bryter 1 loop1: sbic pind,1 rjmp loop1 rcall sub1 loop2: rjmp loop2 Listing 1. 35lab03.doc side 1 av 6 Arnfinn Lunde
Oppgave 1 Filen 8535def.inc Start et nytt WORD dokument. Skriv inn navn på deltagerne, klasse, dato og navn på labøvelsen Kopier inn filen /avrtools/work/8535def.inc til WORD. Vi skal plukke ut en del informasjon fra denne filen. Dette gjør vi lettest ved å legge rammer rundt de områdene vi ønsker å bevare og så fjerner vi resten. I denne delen av øvelsen skal du finne de områdene som er markert på denne siden. ;* DESCRIPTION ;* When including this file in the assembly program file, all I/O register ;* names and I/O register bit names appearing in the data book can be used. ;* In addition, the six registers forming the three data pointers X, Y and ;* Z have been assigned names XL - ZH. Highest RAM address for Internal ;* SRAM is also defined Listing 2a Merk at denne informasjonen er skrevet i assembler Semikolon foran vil si at vi her har kommentarlinjer ;***** I/O Register Definitions.equ SREG =$3f.equ SPH =$3e.equ SPL =$3d Listing 2b.equ bruker vi når vi skal gi et ord en verdi (tilsvarer likhetstegn) Her ser dere: SREG statusregisteret (en byte i I/O området) SPH og SPL utgjør tilsammen stackpekeren. Dette er 2 bytes i I/O området som vi bruker som en 16 bits peker. I praksis vil dette si at vi senere skal fylle disse lagerområdene med data.equ PORTB =$18.equ DDRB =$17.equ PINB =$16 Listing 2c PORTB er den lagringsplassen vi bruker for å lagre data til lysdiodene DDRB data direction for port B her setter vi alle bits til 1 for å kunne benytte port B til utport. PINB Dette er inngangsbits til port B og de brukes hvis vil benytte Port B som innport..equ PORTD =$12.equ DDRD =$11.equ PIND =$10 Listing 2d PORTD, DDRD og PIND er tre bytes i I/O området tilknyttet port D. Vi bruker portd til trykk-knappene og henter derfor data inn fra PIND..def XL =r26.def XH =r27.def YL =r28.def YH =r29.def ZL =r30.def ZH =r31.equ RAMEND =$25F ;Last On-Chip SRAM Location XL og HL, YL og YH, ZL og ZH utgjør 3 16 bits pekere i registerområdet..def bruker vi når det gjelder lagringsplasser i registerområdet. RAMEND er et tall som sier oss hvor mye RAM hukommelse vi har i vår mikrokontroller. Listing 2e 35lab03.doc side 2 av 6 Arnfinn Lunde
Oppgave 2 Assemblering I listing 1 har vi et program som benytter en subrutine. Vi skal hente inn programmet fra en webserver, assemblere det og etter hvert finne ut hva det gjør. Programmet finner du lagret i filkatalog www-ri.hive.no/atmel/source/ (som a003.asm) Hent programmet inn til din datamaskin ved hjelp av for eksempel Netscape Lagre programmet som a003.asm i avrtools\work katalogen Start AVR studio med nytt prosjekt a003. Velg processor 8535 Project Add File a003.asm Project Project settings velg output fileformat for AVR Studio Project Build and Run (assemblering foretas og simulator startes opp) Kopier og lim inn programmet til ditt WORD dokument. Tips: Når du skal sette inn filer er det kjekt å se filtypen. Ofte blir denne skjult. Bruk Windows Explorer Vis mappealternativer Fjern avkryssingen for skjul filnavn for kjente filtyper Du vil da se filtypene. Kontroller at assembleren lager filene a003.lst og a003.obj Oppgave 3 Vinduene i simulatoren I ditt WORD dokument skal du etter denne øvelsen ha dette bildet på plass. Her kommer beskrivelsen du bør følge for å få til dette. figur 1 Organiser programvinduet så det viser seg til venstre som vist her. View Processor kan du bruke for å få inn prosessorbildet. View new memory view gir deg en del av RAM hukommelsen vist nederst. View Registers gir oversikt over registrene View new I/O ekspander Port B og Port D Ta så Alt- Printscreen og lim bildet inn i ditt WORD dokument Lagre dokumentet. Du er nå klar til å begynne simuleringen. 35lab03.doc side 3 av 6 Arnfinn Lunde
Oppgave 4 Områdene i programhukommelsen View New Memory View gir deg ennå et område Velg Program Memory i stedet for data memory Programhukommelsen benytter 16 bit ordbredde. Skift derfor til 16 bit (med 8/16 knappen) Bruk en bilde-editor (paintshop pro) for å lage bildet som du så limer inn i word. Merk at grunnet bruk av.org 0,.org20,.org 50 og.org 80 så vil vi ha kode på flere forskjellige steder i programhukommelsen. Vi skal nå kontrollere at det som blir lagt i programhukommelsen tilsvarer det vi har i listfilen.. Listing 3 Oppgave 5 Listfilens innhold.org 0 000000 c01f rjmp init Listing 4A.org 0x20 ;sett opp portb til utport. 000020 ef0f init: ldi temp,0xff 000021 bb07 out ddrb,temp ;PortD er inport, vi bør aktivere pullup 000022 bb02 out portd,temp ; sett ut bitmønster 00001111 000023 e00f ldi temp,0x0f 000024 bb08 out portb,temp ;sett stackpekeren bakerst i ram 000025 e50f ldi temp,low(ramend) 000026 bf0d out spl,temp 000027 e002 ldi temp,high(ramend) 000028 bf0e out sph,temp 000029 c056 rjmp loop1 Listing 4B Hent inn filen a003.lst til WORD. ta med de fire programbitene: her har vi vist de to første.ta også med subrutinen og hovedprogrammet. Sett gjerne på noen kommentarer i ditt WORD-dokument. Husk du kan ta det med til eksamen. Merk at vi her både har data og lagringsadresser. Husk å lagre ditt WORD dokument. 35lab03.doc side 4 av 6 Arnfinn Lunde
Oppgave 6 Sett alle trykk-knappene til startstilling. Ved oppstart er alle bitene i innport D satt til 0. Dette tilsvarer at alle trykk-knappene var trykt ned. Slik vil vi ikke ha det og markerer derfor at alle er satt til logisk 1 som på vårt kit. Dette gjør du i PortD vinduet ved å krysse av alle Input Pins bitene Avkryssing gir logisk 1, ikke avkrysset rute gir logisk 0. Oppgave 7 singlestep I vinduet med assemblerfilen ser du en gul pil. Den peker på den instruksjon som skal utføres. Ved å trykke menyen Debug finner du ut hvilke funksjonstaster Du kan bruke F11 for å utføre en og en instruksjon (singlestep). Trykk F11 til du kommer til instruksjonen ldi temp, low(ramend) figur 3 Klipp ut I/O vinduet og lim det inn i ditt WORD dokument. I figuren ser du at initialiseringen av I/O er foretatt. Merk at når vi setter 0000 0000 i DDRD er porten innport. Når vi samtidig setter 1111 1111 i Ports aktiveres pullup Resistorene (se Port D Schematic Diagram i 8535 manualen) Vi har initialisert lysdiodene så de fire øverste bits er Satt til 0 (lysdiodene lyser). Oppgave 8 Sett stackpeker og kontroller at programmet går i evig løkke. Singlestep videre til du ser at simuleringen går i evig løkke til loop1. Instruksjonen sbic pind, 1 hopper over neste instruksjon hvis vi har trykket ned trykk-knapp 1. Her er den ikke trykket ned hvis vi har gjort riktig (se figur 3 for kontroll). Merk at stackpeker nå er satt til å peke bakerst i RAM ( 025F) Oppgave 9 Simuler trykk av trykk-knapp for å komme ut i subrutinen Sett bit 1 til 0 i pind (se figur 3). Singlestep deg langsomt videre. Nå skal programmet kalle subrutinen. Fortsett til programteller står ved verdi 0052 (instruksjonen RET skal utføres) 35lab03.doc side 5 av 6 Arnfinn Lunde
Oppgave 10 Vi ser på stackbruk når vi er i subrutine Klipp ut prosessorvinduet (som i fig 4) Klipp ut port I/O vinduet (fig. 5) for å vise at vi har trykt en tast Klipp ut memory vinduet (fig. 6)for å vise hva som er lagt på stacken Du er nå inne i subrutinen Merk at stackpeker er gått to bytes frem fra 25F til 25D figur 4 Trykk-knappene er her markert. Vi ser at vi har trykket ned den trykk-knappen som korresponderer til bit 1 figur 5 figur 6 Kommentar: Merk at vi har lagt tallet 00 83 på stacken I praksis vil dette si at vi har lagret den adressen programmet skal hoppe til etter at vi er kommet tilbake fra subrutinen Oppgave 11 Vi avslutter ved å vise programteller og stackpeker etter tilbakehopp fra subrutinen. Singlestep deg videre til programteller står på 00 83 Klipp ut en detalj fra prosessorvinduet som viser PC og SP figur 7 Du er nå ferdig med øvelsen. Renskriv den og lever den inn for kontroll. ta en diskette-kopi av WORD dokumentet i tilfelle noe må gjøres om 35lab03.doc side 6 av 6 Arnfinn Lunde