Lösningar till övning CE_O CE_O6. Parallell in/utmatning (I/O). Förberedelser till laboration nios2io.

Relevanta dokument
Övning 6. Parallellport, timer

CE_O6. Parallell in/utmatning (I/O). Förberedelser till laboration nios2io.

Övning 7. Timer, serieport

IS1500 Lösningar övning CE_O CE_O7. Programmerad in/utmatning. Serieport. Förberedelser till nios2io.

CE_O3. Nios II. Inför lab nios2time

Kontrollskrivning Mikrodatorteknik CDT S2-704

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

CE_O1. Nios II. Enkla assembler-instruktioner.

Laboration 2 i Datorteknik- Assemblerprogrammering II

CE_O3. Nios II. Stackhantering och förberedelse för lab nios2time

CE_O2. Nios II. Subrutiner med mera.

Lösningar till tentamen i EIT070 Datorteknik

Lösningsförslag till tentamen i IS1500 Datorteknik

Digitala Projekt(EITF40) - Larm

AVR 5. Styrning av trafikljus. Digitala system 15 p

Datorteknik 2 (AVR 2)

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Övning2 Datorteknik, HH vt12 - Programmering

Tentamen i IS1500/IS1200/2G1518 Datorteknik fredagen den 19 augusti 2011 kl

Övningsuppgifter STYRNING - i Mikrodatorteknik för U2 2010

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

Arduinokurs. Kurstillfälle 4

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

4. Maskinnära programmering i C. Förberedelser till hemlaboration 1.

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

CE_O5. Cacheminne. Hemlaboration 2.

Digital- och datorteknik

Digital- och datorteknik

Lösningar till tentamen i EIT070 Datorteknik

A-del motsvarande KS1

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Datorsystem Laboration 2: Minnesmappade bussar

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

Lösningar till tentamen i EIT070 Datorteknik

Tentamen PC-teknik 5 p

Ett program som frågar regelbundet om något skall utföras. Exempelvis om spänningen på ett batteri sjunkit under en viss nivå.

Övningsuppgifter i Mikrodatorteknik för U2

TSEA28 Datorteknik Y (och U)

Datorteknik. Exempeluppgifter i Laborativ Examination

Lösningsförslag till tentamen i Datorteknik

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet.

(Lösningsförslag finns sist i denna fil.)

PC-teknik, 5 p LABORATION FILHANTERING

PROJEKT STAFFAN STALLEDRÄNG

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Assemblerprogrammering för ARM del 2

LABORATION. Datorteknik Y

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

CE_O9. Exceptions, interrupts, traps. Förberedelser för lab 3, nios2int

KALKYLATOR LABORATION4. Laborationens syfte

Support Manual HoistLocatel Electronic Locks

Enkla datatyper minne

Extrauppgifter för CPU12

Svar till Övning3 Datorteknik, HH vt12 Avbrott och timers

Programallokering. Programtyper. Att placera program i flashrespektive. Program i FLASH-minne. Program i RAM-minne

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

Datorteknik. Föreläsning 3. Assembler, stack och subrutiner, programmeringskonventionen. Institutionen för elektro- och informationsteknologi, LTH

Institutionen för elektro- och informationsteknologi, LTH

6 Lågnivåprogrammering

Tentamen med lösningsförslag

Studera databladen för LCD på sid 4, 5, 7, 8, 14, 18, 19, 20 och 23. Datablad finns på kurshemsidan.

c a OP b Digitalteknik och Datorarkitektur 5hp ALU Design Principle 1 - Simplicity favors regularity add $15, $8, $11

LEU240 Mikrodatorsystem

GPIO - General Purpose Input Output

Datorprojekt, del 1. Digitala system 15 p

Demonstration och konsultation Arbetsbokens avsnitt 5 och 6 LCD Grafisk display Introduktion till laboration 3

Programmera i teknik - kreativa projekt med Arduino

TSEA28 Datorteknik Y (och U)

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

TSEA28 Datorteknik Y (och U)

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 8 10, 7 april 2016

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Programexempel för FLEX

Tentamen med lösningsförslag

Tentamen i Digitala system - EDI610 15hp varav denna tentamen 4,5hp

Datorarkitektur I. Tentamen Lördag 10 April Ekonomikum, B:154, klockan 09:00 14:00. Följande gäller: Skrivningstid: Fråga

Klassdeklaration. Metoddeklaration. Parameteröverföring

Programmering av inbyggda system

PROJEKT LJUD. KOPIERINGSUNDERLAG Martin Blom Skavnes, Staffan Melin och Natur & Kultur Programmera i teknik ISBN

Assemblerprogrammering - fördjupning

Laborationens mål är att få displayen att visa timmar, minuter och sekunder samt att kunna ställa klockan.

Exempelsamling Assemblerprogrammering

Styrteknik: Binära tal, talsystem och koder D3:1

KALIBRERINGS MENY. För att komma tillbaka till Mätfunktionerna håll inne M -knappen 3s. eller vänta 1 min. 1 =MOD. 9.6 KBaud

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Modbus Seriell Kommunikation

Assemblerprogrammering, ARM-Cortex M4 del 3

CE_O9. Exceptions, interrupts, traps. Förberedelser för lab 3, nios2int

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lista på registeruppsättningen i PIC16F877A Datablad TTL-kretsar 74-serien

På den här övningen ska vi träna på att förflytta en figur med hjälp av piltangenterna.

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Transkript:

ösningar till övning CE_O6 2014 CE_O6. Parallell in/utmatning (I/O). Förberedelser till laboration nios2io. 6.1. äs in data från IN-port ( skjutomkopplare TOGGES18) a) ösningsförslag i Nios-II-assembler..equ toggles18,0x850.global Get_Data Get_Data: movia r8,toggles18 ldwio r2,0(r8) movia r8,0x3ffff and r2,r2,r8 b) ösningsförslag i C: #define TOGGES18 ( (unsigned int *) 0x850 ) int Get_data( void ) volatile unsigned int * toggles18 = TOGGES18; unsigned int tmp = *toggles18; urn( tmp & 0x3ffff ); c) Ordet volatile i en variabeldeklaration anger att variabelns värde kan komma att ändras, på ett sätt som C-kompilatorn inte kan förutse. Det gör att kompilatorn inte får optimera läsningar av och skrivningar till variabeln. Ett exempel på optimering som är förbjuden för en variabel som är deklarerad volatile, är att flytta läsning av variabeln ut ur en slinga och lägga det lästa värdet i ett register. d) Om man skriver till in-porten så ignoreras det skrivna värdet av hårdvaran, det vill säga värdet försvinner. e) Övriga bitar dvs de med index 18 och uppåt kommer vid läsning få ett värde som beror på hur hårdvaran är konstruerad, 0 eller 1 eller slumpvis 0 eller 1. ösningar till övning CE_O6, sida 1 (av 12) 2015-02-06

6.2. Skriv ut data till UT-port. (lysdioder GREENED9 ) a) ösningsförslag i Nios-II-assembler..equ greenled9,0xa10.global Put_Green_ight Put_Green_ight: andi r4,r4,0x1ff movia r8,greenled9 stwio r4,0(r8) mov r2,r4 b) ösningsförslag i C: #define GREENED9 ( (unsigned int *) 0xa10 ) int Put_Green_ight( int lightbits ) volatile unsigned int * greenled9 = GREENED9; unsigned int tmp = lightbits & 0x1ff; *greenled9 = tmp; urn( tmp ); c) Om programmet läser från ut-porten så finns två möjliga resultat. Vilket som gäller beror på hur portens hårdvara är konstruerad. Det ena möjliga resultatet är att läsningen ger det värde programmet senast skrev till ut-porten. För detta alternativ måste ut-porten ha hårdvara så att programmet kan göra läsningar, och inte bara skrivningar. Det andra möjliga resultatet är att läsningen ger ett ospecificerat, "slumpmässigt" värde. Detta alternativ inträffar om konstruktören har sparat in på hårdvaran, så att utporten endast är skrivbar (write-only). Ordet "slumpmässigt" har skrivits inom citationstecken här ovanför. Orsaken är att en write-only-utport brukar ha en mycket skev fördelning på de värden den urnerar; det gör den olämplig som slumptalsgenerator. d) Övriga bitar dvs de med index 9 och uppåt kommer vid skrivning att ignoreras. ösningar till övning CE_O6, sida 2 (av 12) 2015-02-06

6.3. Översätt binärt till 7-segment Skriv en subrutin hex7seg som omvandlar från 4 lsbits i r4 till 7 lsbits i r2. Av figur nedan framgår vilka bitar i r2 som svarar mot vilka segment i displayen. Detta val av segment ger utskrift för värden 0-9 samt A-F (A b c d E F) Hur man skiljer man mellan 6 och b framgår av figuren nedan. a) ösningsförslag i Nios-II-assembler.data bit index TABE: # gör en tabell för tända och släckta segment noll:.byte 0b00111111 # OBS! tabellen förutsätter ett:.byte 0b00000110 # etta för tänt segment 0 tvaa:.byte 0b01011011 # vilket inte är som i labben tre:.byte 0b01001111 5 fyra:.byte 0b01100110 fem:.byte 0b01101101 6 sex:.byte 0b01111101 sju:.byte 0b00000111 4 atta:.byte 0b01111111 nio:.byte 0b01100111 3 A:.byte 0b01110111 b:.byte 0b01111100 c:.byte 0b01011000 d:.byte 0b01011110 E:.byte 0b01111001 F:.byte 0b01110001 # pust det var många ettor och nollor.global hex7seg hex7seg: movia r2, TABE # nu pekar r2 på 0(TABE) andi r8, r4, 0xF # maska fram 4 SBits add r2, r2, r8 # nu pekar r2 på byte-offset (TABE) ldb r2, 0(r2) # nu innehåller r2 koden! andi r2, r2, 0x7F # onödigt ety DB gör SignExtend av 0 # men det här blev ju lätt 1 2 ösningar till övning CE_O6, sida 3 (av 12) 2015-02-06

b) ösningsförslag i C: /* OBS! Denna tabell förutsätter en nolla för de segment som ska lysa */ /* för varje index i tabellen lagras 4 bytes dvs en int */ /* för varje index i tabellen skulle man kunna ha valt att lagra en char/byte */ int trantab[] = 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0e ; int hex7seg( int digit ) register int tmp = digit & 0xf; urn( trantab[ tmp ] ); 6.4. Skriv ut ett tal på 7-segment Display a) ösningsförslag i Nios-II-assembler.equ hex_low28,0x9f0 # hex_low28 address # program code follows.global PutoSegVal # be globally available PutoSegVal: movia r8,hex_low28 # set address stwio r4,0(r8) # write output data mov r2,r4 # setup urn value # urn to caller b) ösningsförslag i C: #define HEX_OW28 ( (volatile int *) 0x9f0 ) void PutoSegVal( int hexlowbits ) volatile int * hex_low28 = HEX_OW28; *hex_low28 = hexlowbits; 6.5. Skriv ut olika tal på 7-segment Display a) ösningsförslag i Nios-II-assembler.global main main: call Get_data # indata till r2 mov r16, r2 # spar kopia andi r4,r2,0x1ff # kopiera 9 bitars indata till r4 call Put_Green_ight # tänd/släck 8 lysdioder mov r4,r16 # 32 bitar parameter till call fixandshow # som skriver ut 4 siffror, se nedan br main ösningar till övning CE_O6, sida 4 (av 12) 2015-02-06

# Och här kommer en subrutin som skriver ut fyra siffror # endast de 16 minst signifikanta bitarna används fixandshow: push r31 # skydda uradress push r16 # vi behöver ett register som hex7seg inte ändrar push r17 # och ett till register som hex7seg inte ändrar mov r16,r4 # spara data i r16 call hex7seg # översätt 4 bitar till 7 bitar mov r17,r2 # och spar siffra 1 i r17, 7 bitar srli r4,r16,4 # högerskifta fram 4 nya bitar till r4 call hex7seg # översätt 4 bitar till 7 bitar slli r2,r2,7 # och skifta 7 bitar vänster or r17,r2,r17 # kombinera in siffra 2 i r17 med bitvis OR srli r4,r16,8 # högerskifta fram 4 nya bitar till r4 call hex7seg # översätt 4 bitar till 7 bitar slli r2,r2,14 # och skifta nu 14 bitar vänster or r17,r2,r17 # kombinera in siffra 3 i r17 srli r4,r16,12 # högerskifta fram 4 nya bitar till r4 call hex7seg # översätt 4 bitar till 7 bitar slli r2,r2,21 # och skifta 21 bitar vänster denna gång or r4,r2,r17 # kombinera in siffra 4 i r4 denna gång call PutoSegVal # skriv ut på 7-segmentsdisplay pop r17 # återställ sparat registervärde pop r16 # återställ sparat registervärde pop r31 # återställ sparad uradress b) ösningsförslag i C: int main() unsigned int tmp; while( 1 ) tmp = Get_Data(); (void) Green_ight( tmp ); fixandshow( tmp ); void fixandshow( unsigned int bitstoshow ) unsigned int hexresult; hexresult = hex7seg( bitstoshow ); hexresult = hexresult ( hex7seg( bitstoshow >> 4 ) << 7 ); hexresult = hexresult ( hex7seg( bitstoshow >> 8 ) << 14 ); hexresult = hexresult ( hex7seg( bitstoshow >> 12 ) << 21 ); PutoSegVal( hexresult ); ösningar till övning CE_O6, sida 5 (av 12) 2015-02-06

6.6. Timer a) ösningsförslag i Nios-II-assembler.equ period, 49 999 # ger 1 millisekund mellan varje TimeOut # om man vill ha en hel sekund mellan varje TimeOut väljer man värdet 49 999 999.equ Timer1Base, 0x920.global inittimer inittimer: movia r8, Timer1Base # nu pekar r8 på timer-ksen, 0x920 movia r9, period # r9 innehåller lämpligt värde stwio r9, 8(r8) # periodl skrivs srli r9, r9, 16 # skifta höger 16 bitar stwio r9, 12(r8) # periodh skrivs movi r9, 0b0110 # Run and Continous stwio r9, 4(r8) # Write Control stwio r0, 0(r8) # reset TO-biten ösningsförslag i C: #define TIMER1( (unsigned int *) 0x920 ) #define PERIOD (49999) void inittimer( void ) volatile unsigned int * Timer1Base = TIMER1; Timer1Base[2] = (PERIOD & 0xFFFF); Timer1Base[3] = PERIOD >> 16; Timer1Base[1] = 0x6; /* Start + Continuous */ Timer1Base[0] = 0; b) ösningsförslag i Nios-II-assembler:.global checktimer checktimer: movi r2, -1 # default-värde till r2, betyder No Time-Out movia r8, Timer1Base # nu pekar r8 på timer-ksen ldwio r9, 0(r8) # nu finns status i r9 (rättat) andi r9, r9, 1 # nu finns Time-Out-biten i r9 (rättat) beq r9, r0, NoTimeOut # hoppa om Time-Out-biten är n0ll stwio r0, 0(r8) # nollställ Time-Out-biten movi r2, 0 # nollställ r2, betyder Time-Out NoTimeOut: # och så ur med rätt värde i r2: 0 / -1 ösningar till övning CE_O6, sida 6 (av 12) 2015-02-06

ösningsförslag i C: int checktimer ( void ) volatile unsigned int * Timer1Base = TIMER1; if ((Timer1Base[0] & 1) == 0) urn(-1); /* else */ Timer1Base[0] = 0; urn(0); c) ösningsförslag i Nios-II-assembler:.global delayt delayt: ble r4, r0, slutt # hoppa om r4 mindre än eller lika med 0 push r31 # skydda uradressen baa: call checktimer # läs av Time-Out-biten blt r2, r0, baa # invänta urvärde 0 (Time-Out) slutt: subi r4, r4, 1 # minska r4 med 1 bgt r4, r0, baa # fortsätt så länge r4 större än noll pop r31 # återställ uradressen ösningsförslag i C: void delayt ( int millisek ) int i; for (i = millisek; i>0; i = i - 1) while ( checktimer() ) /* wait for TO-bit */ ; urn(); while ( checktimer() ) /* wait for TO-bit */ ; kan bytas mot while ( checktimer()!= 0 ) /* wait for TO-bit */ ; eller bytas mot while ( checktimer() == -1 ) /* wait for TO-bit */ ; ösningar till övning CE_O6, sida 7 (av 12) 2015-02-06

6.7. äs in data från IN-port ( KEYS4 ) a) ösningsförslag i Nios-II-assembler.equ keys4,0x840.global Get_Button Get_Button: movia r8,keys4 # nu pekar r2 på in-porten ldwio r2,0(r8) # data läses in andi r2,r2,15 # nollställ bit 31 04 b) ösningsförslag i C #define KEYS4( (int *) 0x840 ) int Get_Button( void ) volatile int * keys4 = KEYS4; int tmp = *keys4; urn( tmp & 0xf ); ösningar till övning CE_O6, sida 8 (av 12) 2015-02-06

6.8. Subrutinen TACK Tick back (för idag) Programkod i C: void tickback( int * timep ) /* Get current value, store locally */ int t = * timep; t -= 1; /* Decrement local copy */ /* If result was not a valid BCD-coded time, adjust now */ if( (t & 0x0000000f) >= 0x0000000a ) t -= 0x00000006; if( (t & 0x000000f0) >= 0x00000060 ) t -= 0x000000a0; /* Seconds are now OK */ if( (t & 0x00000f00) >= 0x00000a00 ) t -= 0x00000600; if( (t & 0x0000f000) >= 0x00006000 ) t -= 0x0000a000; /* Minutes are now OK */ if( (t & 0x000f0000) >= 0x000a0000 ) t -= 0x00060000; if( (t & 0x00ff0000) >= 0x00240000 ) t -= 0x00d60000; /* Hours are now OK */ if( (t & 0x0f000000) >= 0x0a000000 ) t -= 0x06000000; if( (t & 0xf0000000) >= 0xa0000000 ) t -= 0x60000000; /* Days are now OK */ * timep = t; /* Store new value */ ösningar till övning CE_O6, sida 9 (av 12) 2015-02-06

6.9. Ett helt stort program Rita ett flödesschema för nedanstående program och skriv programmet Skriv ut 2 siffror på 7-segment varje sekund. Använd en NON-blocking delay för att uppnå detta Dessutom ska knapparna KEYS4 kännas av och leda till följande. Nedtryckning av KEY1 ska nollställa tiden. Nedtryckning av KEY2 ökar tiden ett steg (med TICK) Nedtryckning av KEY3 minskar tiden ett steg (med TACK som är Tick back) Programmet ska avvakta tills man släpper knappen förstås. (Det förväntas att man inte trycker på två knappar samtidigt) ösningar till övning CE_O6, sida 10 (av 12) 2015-02-06

ösningsförslag i Nios-II-assembler main: call inittimer # Run and Continous once per second mainloop: call checktimer # kolla om Time-Out (Non-Blocking) blt r2, r0, GoOn # hoppa till GoOn om TO-biten var 0 Time: movia r4, Value call tick # från lab nios2time movia r4, Value ldw r4, 0(r4) # siffra till r4 call Put27 # skriv ut 2 siffror GoOn: call Get_Button # (Non-Blocking) nor r2, r2, r0 # invertera (här eller i GetButton) andi r2, r2, 0xE # och maska fram bit 3, 2 och 1 beq r2, r0, mainloop # om ingen knapp nedtryckt IF1: andi r9, r2, 0b0010 # kolla om KEY1 är nere bne r9, r0, KEY1 # IF KEY1 down goto KEY1 IF2: andi r9, r2, 0b0100 # kolla om KEY2 nere bne r9, r0, KEY2 # IF KEY2 down goto KEY2 IF3: andi r9, r2, 0b1000 # kolla om KEY3 nere bne r9, r9, KEY3 # IF KEY3 down goto KEY3 br mainloop # ingen knapp nere ERROR!!! KEY1: movia r4, Value stw r0, 0(r4) # clear time Value br Bottomup KYE2: movia r4, Value call tick # från lab n2time br Bottomup KEY3: movia r4, Value call tack # ny rutin, se uppgift nedan BottomUp: call Get_Button nor r2, r2, r0 # invertera andi r2, r2, 0xE bne r2, r0, BottomUp # invänta alla knappar uppe # Now all buttons are released br mainloop OBS! Fungerar dåligt (tiden står still) med en knapp nedtryckt mer än 1 sekund. Beaktar ej fallet att flera knappar trycks ner samtidigt. ösningar till övning CE_O6, sida 11 (av 12) 2015-02-06

6.10. En separat timer, timer_2 (överkurs) a) ösningsförslag i Nios-II-assembler, skillnad mot timer_1 i bold text..equ period, 49 999 # ger 1 millisekund mellan varje TimeOut.equ Timer2Base, 0x940.global inittimer2 inittimer2: movia r8, Timer2Base # nu pekar r8 på timer-ksen, 0x940 movia r9, period # r9 innehåller lämpligt värde stwio r9, 8(r8) # periodl skrivs srli r9, r9, 16 # skifta höger 16 bitar stwio r9, 12(r8) # periodh skrivs movi r9, 0b0110 # Run and Continous stwio r9, 4(r8) # Write Control stwio r0, 0(r8) # reset TO-biten b).global checktimer2 checktimer2: movi r2, -1 # default-värde till r2 movia r8, Timer2Base # nu pekar r8 på timer-ksen ldwio r9, 0(r8) # nu finns status i r2 andi r9, r9, 1 # nu finns Time-Out-biten i r2 beq r9, r0, NoTimeOut # hoppa om Time-Out-biten är n0ll stwio r0, 0(r8) # nollställ Time-Out-biten movi r2, 0 # nollställ r2 NoTimeOut: # och så ur med rätt värde i r2: 0 / -1 c).global delayt2 delayt2: ble r4, r0, slutt # hoppa om r4 mindre än eller lika med 0 push r31 # skydda uradressen baa: call checktimer2 # läs av Time-Out-biten blt r2, r0, baa # invänta urvärde 0 subi r4, r4, 1 # minska r4 med 1 bgt r4, r0, baa # fortsätt så länge r4 större än noll pop r31 # återställ uradressen slutt: d) restart_timer2: movia r8, Timer1Base2 # nu pekar r8 på timer-ksen, 0x940 ldwio r9, 8(r8) # läs värdet från Period ow stwio r9, 8(r8) # och skriv tillbaks samma värde # periodl skrivs och därmed kopieras Period till Counter som då börjar om movi r9, 0b0110 # Run and Continous stwio r9, 4(r8) # Write Control stwio r0, 0(r8) # reset TO-biten # detta är ju nästan allt som görs i inittimer2, så man kan ju använda inittimer2 i stället. ösningar till övning CE_O6, sida 12 (av 12) 2015-02-06