Halmstad University School of Information Science, Computer and Electrical Engineering Tomas Nordström, CC-lab Lösningsförslag TENTA Datorteknik (DO2005) D1/E1/Mek1/Ö1 Datum: 2012-05- 23 Maxpoäng: 60p Betyg 3 24p Betyg 4 36p Betyg 5 48p Notera att för alla uppgifter gäller att assemblerkod ska skrivas för den mikroprocessor som har används vid laborationerna, en ATMEL SAM3U, vilken i sin tur innehåller en ARM Cortex M3 processor. Utdrag ur datablad och annat referensmaterial som behövs för att lösa tentauppgifterna finns i kompendiet "Tentahjälpmedel Datorteknik". Notera även att all kod som skrivs måste vara väl kommenterad för att ge full poäng.
sida 2 av 22 Uppgift 1. (5p) (0.5p/rätt, felaktigt alternativ = 0.5p. Dock lägst noll poäng. Max 5p) Kombinera en term i den vänstra kolumnen med tillhörande fras(er) i den högra kolumnen. l. Instruktionsregister a. signal från givare omvandlas till lämplig form för datorbearbetning 2. Refresh b. här finns styrkoder för instruktioner c. används vid adressering 3. A/D- omvandling d. DRAM e. krets för seriell in- utmatning 4. ALU f. alfanumerisk kod g. här hamnar instruktioner för avkodning 5. Startbit h. pekar på nästa instruktion i. här sker beräkningar 6. RISC j. kan delas upp i flera tillstånd k. en instruktionsuppsättning 7. ASCII l. programmerad in- utmatning m. assemblator 8. Baud n. PROM o. asynkron seriell överföring 9. Cache p. krets för parallell in- utmatning q. snabbt minne nära processorn 10. Thumb r. handskakning s. load/store arkitektur t. statusregister u. enhet för signaleringshastighet v. assemblerinstruktion x. digital- analog omvandling Uppgift 1. Svar: 1. g; 2. d; 3.a; 4. i; 5. o; 6. s; 7. f; 8. u; 9. q; 10. k (även v har godkänts);
sida 3 av 22 Uppgift 2. (4p) Du har fått en datafil med innehållet 1010 6A93 40F0 0000 tolkat i hexadecimal kod. Du tar reda på att de 16 första bitarna är ett positivt heltal. Därefter följer 2 st 8- bitars 2- komplementtal och slutligen ett 32- bitars flyttal a) Översätt det positiva heltalet till ett decimaltal. b) Översätt de två 2- komplementtalen till decimaltal. c) Översätt flyttalet till decimaltal. Ledning: Flyttalet är kodat i IEEE- standarden får enkel precision. För denna gäller d) Om strängen Hej Hopp! lagras som ASCII, vilka värden (i hex) motsvarar detta? Uppgift 2. Svar: a) 0x1010 = 1*16 3 + 1*16 1 = 4096 + 16 = 4112 b) 0x6A = 01101010 = 64+32+8+2 = 106 0x93 = 1001 0011 = 128+16+3 = 109 c) 0x40F00000 = 0 10000001 111000000000000000000 S=0 (positivt) E= 100000012 =12910 M= 11100.002 Flyttalet = ( 1) 0 1.111*2 129 127 = +111.12 = 7.510 d) Hej Hopp! = 0x48 0x65 0x6A 0x20 0x48 0x6F 0x70 0x70 0x21
sida 4 av 22 Uppgift 3. (4p) I denna uppgift förutsätts 8 bitars ordlängd och 2- komplementkodning. Ange svaren på följande additioner, dels i binär form och dels som decimaltal. Sätt också ut värdet får Carry (C), Overflow (V) och Negate (N) och redovisa som tabellen nedan. Hex Binärt Decimalt Carry Overflow Negate a) 7E+ 2A b) BF+C1 Uppgift 3. Svar: a) 1 1111 11 0x7E 0111 1110 = 126 10 +0x2A +0010 1010 = 42 10 ----- = ---------- 0xA8 1010 1000 = -88 10 C=0, V=1, N=1 b) 1 1111 111 0xBF 1011 1111 = -65 10 +0xC1 +1100 0001 = -63 10 ----- = ---------- 0x180 1 1000 0000 = -128 10 C=1, V=0, N=1
sida 5 av 22 Uppgift 4. (4p) Ovanstående figur visar en 4- bitars A/D- omvandlare av typen successiv approximationsomvandlare. a) Antag att den "okända" analoga ingången har ett värde 8/16 < Uin < 9/16 av fullt utslag. Vad blir det digitala värdet <x3 x2 x1 x0 >efter omvandling? Motivering med ett tidsdiagram som visar omvandlingen, med förklarande text, krävs. b) Hur många klockpulser kräver denna omvandling? c) Hur många bitar skall en AD- omvandlare ha for att upplösningen ska vara l% av största värdet? Uppgift 4. Svar: a) Steg Fas Digital utg. Analog utgång Komparatorn 1 X3=1 Dutg = 1000 Autg = 8/16 UKänd < Uin =>X3=1 2 X2=1 Dutg = 1100 Autg = 12/16 UKänd > Uin =>X2=0 3 X1=1 Dutg = 1010 Autg = 10/16 UKänd > Uin =>X1=0 4 X0=1 Dutg = 1001 Autg = 9/16 UKänd > Uin =>X0=0 5 Res Dutg = 1000 b) 4+1 = 5 klockpulser (en klockpuls behövs för stabil utläsning av resultatet!) c) 7- bitar => 1/2 7 = 1/128 = 0.78%
sida 6 av 22 Uppgift 5. (2p) Vid dokumentation av en subrutin i assembler vilka delar/egenskaper bör åtminstone vara beskrivna för att dokumentationen ska vara acceptabel. Uppgift 5. Svar: Man bör ge tillräcklig dokumentation så att en användare av subrutinen inte behöver undersöka dess interna struktur. Bland de nödvändiga specifikationerna är: En beskrivning av vad subrutinen gör En lista över in- och ut- parametrar (och hur de överförs, tex i register eller på stacken) Vilka register som används och inte bevaras ( förstörs ) samt minnesplatser som används (som globala variabler eller periferienheters styrregister) Ett exempel på användningen inkluderat anropssekvensen
sida 7 av 22 Uppgift 6. (5p) Skriv ett program som omvandlar tal som ligger på adress 0x2000 till dess absolutvärden. Talet skall sparas på adress 0x3000 och framåt. Talen avslutas med talet 0. Uppgift 6. Svar: Adresserna stämmer inte riktigt med principen är den samma:
sida 8 av 22 Uppgift 7. (3p) I en vanlig ARM kod kan vi finna följande instruktion: STMFD R13!,{R0-R4, LR} a) Förklara vad instruktionen gör! b) Var i koden är det mest sannolikt att denna typ av instruktion dyker upp? c) Anta att R13 = 0x20004000 innan instruktionen. Vad är innehållet i R13 efter att ha exekverat instruktionen? Uppgift 7. Svar: a) Den lägger registren LR,R4,R3,R2,R1, och R0 på stacken (i den ordningen) som pekas ut av R13. R13/SP kommer att uppdateras och pekar på R0 efter instruktionen exekverat. b) Man finner denna instruktion typiskt i början av en subrutin. c) R13 = 0x20004000 6*4 = 0x20003FE8 Uppgift 8. (3p) Anta man vill läsa in talet 0x12345678 till R1. Detta går att göra på tre sätt. Skriv kod för att göra detta a) Genom att nyttja assemblerdirektiv EQU samt instruktionen LDR b) Genom att nyttja assemblerdirektiv DC32 samt instruktionen LDR c) Genom att bara nyttja instruktionen LDR Uppgift 8. Svar a) TAL EQU 0x12345678 LDR Rl, =TAL b) TAL LDR Rl,TAL DC32 0x12345678 Alternativt) LDR Rl, =TAL LDR Rl, [Rl] TAL DC32 0x12345678 c) LDR Rl, =0x12345678
sida 9 av 22 Uppgift 9. (6p) Man brukar ofta prata om 5 steg i instruktionscykeln för en RISC processor. a) Namnge vilka steg som finns och tala om vad som sker i respektive steg med högst en mening var. b) Om följande instruktioner finns i minnet ifrån adress 0x20000000 TEST LDR R9,[R6,#5] SUBS R1, R1, R9 BNE TEST Förklara vad som händer i alla stegen av instruktionscykeln för de tre instruktionerna. Ange speciellt vad som finns på adressbussen under de olika stegen. Anta att R6 har värdet 0x20001234 innan dessa instruktioner och att en von Neumann arkitektur används (med gemensamt instruktions och data minne) utan pipelining. Uppgift 9. Svar: Basic five- stage pipeline in a RISC machine IF = Instruction Fetch, Instruktionen hämtas ifrån minnen som PC pekar ut och lägger det i ett instruktionsregister. ID = Instruction Decode, Instruktionen avkodas och registervärden hämtas EX = Execute, Själva operationen utförs eventuell ladda/lagra instruktion räknar ut var datat ska hämtas ifrån MEM = Memory access, Vid en ladda/lagra instruktion så hämtas datat ifrån minnet i detta steg. WB = Register write back, Återskrivning av resultatet ifrån operationen till registret.
sida 10 av 22 Stage IF ID EX MEM WB Operation MAR<=PC; PC<=PC+4 IR <= LDR R9,[R6,#5] MAR<= R6+5 MDR <= m[addr] Adress bus 0x20000000 0x20001239 R9 <= MDR Databus Instr Data Stage IF ID EX MEM WB Operation Adress bus MAR<=PC; PC<=PC+4 0x20000004 IR <= SUBS R1, R1, R9 ALUout<= R1-R9; Flagout set R1 <= ALUout Flags = Flagout Databus Instr Stage IF ID EX MEM WB Operation Adress bus MAR<=PC; PC<=PC+4 0x20000008 IR <= BNE TEST If Z==0 PC <= PC 12 (dvs PC <= 0x20000000) Databus Instr
sida 11 av 22 Uppgift 10. (4p) a) Förklara, kortfattat, vad som menas med löpandebandprincipen (pipelining) inom datorteknik. b) Med superscalar - teknik så utförs flera instruktioner samtidigt. Vad begränsar möjligheterna att använda superscalar - tekniken? Uppgift 10. Svar: a) Datorns arbetssätt kan liknas vid ett löpande band där varje instruktion transporteras mellan stegen i instruktionscykeln. Utan pipeline hämtas nästa instruktion från minnet först när en instruktion utförts i sin helhet. Medan man med pipelining startar nästa instruktion redan när första delsteget instruktionshämtning (IF) är klart. Detta sker med samma löpandebandsprincip som när man i en bilfabrik samtidigt (men med olika delmoment) monterar flera bilar på ett löpande band. Med pipelining så utförs flera instruktioner samtidigt (lika många som man har steg i sin pipeline) och man ökar genomströmningen. Se även http://en.wikipedia.org/wiki/instruction_pipeline Man brukar dela in de problem med en trivial pipeline implementering i tre grupper av faror (hazards): Strukturella faror (structural hazards). Kan uppstå om processorn inte har tillräckligt med resurser att utföra vissa instruktioner parallellt (tex inte tillräckligt med adderare för att utföra relativt hopp, dvs PC+offset, och en aritmetisk instruktion samtidigt) Datafaror (data hazards). Om en instruktion gjordes utan hänsyn till denna fara skulle använda data före data är tillgängligt i registret. Beroende på hur dessa registerberoenden dyker upp pratar man om: o Read- after- write (RAW) o Write- after- write (WAW) o Write- after- read (WAR) Styrfaror (control hazards). Beror på ovillkorliga och villkorliga hopp.
sida 12 av 22 b) Det som begränsar möjligheterna att använda superscalar - tekniken, med avsende på potentiell prestanda ökning är Tillgänglig instruktionsprallelism Implementationskostnaden för instruktionsschemaläggaren och den logik som behövs för att ha kolla på alla beroenden. De kostnader som är associerade med hopp Available performance improvement from superscalar techniques is limited by three key areas: The degree of intrinsic parallelism in the instruction stream, i.e. limited amount of instruction- level parallelism. The complexity and time cost of the dispatcher and associated dependency checking logic. The branch instruction processing.
sida 13 av 22 Uppgift 11. (6p) a) Skriv den kod som behövs för att konfigurera SYSTICK i den processors som labsystemet använder (ARM Cortex M3 / ATMEL SAM3U) så att avbrott sker 25000 gånger per sekund, anta att processorns klockfrekvens är 5MHz. b) Förklara allt vad som händer i processorn då ett avbrott ifrån SYSTICK kommer. c) Skriv även den kod som behövs för att lägga till en SYSTICK_Handler i den aktuella avbrottsvektorn. Notera att avbrottsvektorn har flyttats till SRAM av en bootloader/debugger så du måste först ta reda på var vektorn ligger i minnet innan den modifieras! Uppgift 11. SVAR a) ; Enable SYSTICK timer operation and enable SYSTICK interrupt ; Interrupt 25000 times/s at 5MHz => 5000000/25000 = 200 LDR R0, =0xE000E010 ; SYSTICK_CTRL control and status register MOV R1, #0 STR R1, [R0] ; Stop counter to prevent spurious interrupt LDR R1, =199 ; Trigger every 200 cycles (since counter decrement ; from 199 to 0, total of 200 cycles, reload value is set to 199) STR R1, [R0,#4] ; Write reload value to reload register address, ; Systick_LOAD STR R1, [R0,#8] ; Write any value to current value register Systick_VAL ; to clear current value to 0 and clear COUNTFLAG MOV R1, #0x7 ; Clock src = MCK, Enable Interrupt, Enable SYSTICK STR R1, [R0] ; Start counter b) Processor state is automatically stored to the stack on an exception, and automatically restored from the stack at the end of the Interrupt Service Routine (ISR). The vector is fetched in parallel to the state saving, enabling efficient interrupt entry. When the processor invokes an exception, it automatically pushes the following eight registers to the SP in the following order: Program Counter (PC) Processor Status Register (xpsr) r0- r3 r12 Link Register (LR).
sida 14 av 22 c) ; Setup SYSTICK exception handler (Vector in RAM) MOV R0, #0xF ; Exception type 15 LDR R1, =SysTick_handler ; address of exception handler LDR R2, =0xE000ED08 ; Vector table offset register LDR R2, [R2] STR R1, [R2, R0, LSL #2] ; Write vector to VectTblOffset+ExcpType*4
sida 15 av 22 Uppgift 12. (6p) a) Skriv den kod som behövs för att konfigurera PIO PortB som utgångar utan pull- up motstånd på bit1 och bit0. b) Skriv den kod som behövs för att konfigurera PIO PortA som ingångar med pull- up på bit19 och bit18. Konfigurera dessa ingångar också så att de ger avbrott då en knapp kopplad till dessa ingångar trycks in (och drar signalen låg). c) Skapa en avbrottsrutin PIOA_InteruptHandler som tar hand om knappnertryckningsavbrottet. Rutinen ska i sin tur anropa en hanteringsrutin ButtonHandle med R0 som inparameter (R0=2 om knappen till bit19 har tryckts ner; R0=1 om knappen till bit18 har tryckts ner; R0=3 om båda knappar tryckts ner). Uppgift 12. SVAR: a) ; Configure PIO PortB bit1-0 as output without pull-up ; Port B Registers ------------------------------------ PIOB_PER EQU PIOB_OER EQU PIOB_PUDR EQU PIOB_IDR EQU 0X400E0E00 0X400E0E10 0X400E0E60 0X400E0E44 ; Initializing PortB as output LDR R0,=PIOB_PER ;enable PIOB LDR R1,=3 STR R1,[R0] LDR R0,=PIOB_IDR ; Disable PIOB interrupts STR R1,[R0] ; Probably not needed but ; still a good idea LDR R0,=PIOB_OER ;bit0-1 output STR R1,[R0] LDR R0,=PIOB_PUDR ;pull-up disable STR R1,[R0]
sida 16 av 22 b) ; Configure PIO PortA bit19-18 as input with pull-up. They ; should generat interrupt on high-to-lo edge. PIOA_PER EQU 0X400E0C00 ; PIO Enable Register PIOA_ODR EQU 0X400E0C14 ; Output Disable Register PIOA_IER EQU 0X400E0C40 ; Interrupt Enable Register PIOA_IDR EQU 0X400E0C44 ; Interrupt Disable Register PIOA_ISR EQU 0X400E0C4C ; Interrupt Status Register PIOA_PUER EQU 0X400E0C64 ; Pull-up Enable Register PIOA_ESR EQU 0x400E0CC0 ; Edge select Register PIOA_FELLSR EQU 0x400E0CD0 ; Falling Edge/Low level ; Select Register PIOA_AIMER EQU 0x400E0CB0 ; Add. Inter. Modes Enable NVIC_SETENA0 EQU 0xE000E100 NVIC_CLRENA0 EQU 0xE000E180 NVIC_CLRPEND0 EQU 0xE000E280 ; NVIC enable interrupt, grp0 ; NVIC disable interrupt, ; grp0 ; NVIC clear pending ; interrupt, grp0 ; Note that we also should have turned on the clocks of the ; PIO units (but not needed in the exam) PMC_PCER EQU 0x400E0410 ; Peripheral Clock Enable Register PMC_PCDR EQU 0x400E0414 ; Peripheral Clock Disable Register PMC_PCSR EQU 0x400E0418 ; Peripheral Clock Status Register ; Turn on clocking of both PIOA and PIOB LDR R0,=PMC_PCER LDR R1,=0XC00 STR R1,[R0]
sida 17 av 22 ; Set up PIOA for interrupts LDR R0,=PIOA_IDR ; Disable all PIOA interrupts LDR R1,=0xFFFFFFFF ; Not to disturb our setup STR R1,[R0] ; with spurious interrupts LDR R0,=PIOA_ISR ; Dummy read to clear pending LDR R0,[R0] ; interrupts LDR R0,=PIOA_PER ; Enable PIOA LDR R1,=0XC0000 ; on bit18&19 STR R1,[R0] LDR R0,=PIOA_ODR ; Output disable on bit18&19 STR R1,[R0] LDR R0,=PIOA_PUER ; Pull_up enable on bit18&19 STR R1,[R0] LDR R0,=PIOA_ESR ; Set Edge select on bit18&19 STR R1,[R0] ; LDR R0,=PIOA_FELLSR ; Set Falling Edge/Low level STR R1,[R0] ; Select on bit18&19 LDR R0,=PIOA_AIMER ; Allow additional interrupt STR R1,[R0] ; mode (ESR & FELLSR) ; on bit18&19 ; Set up NVIC for PIOA interrupts LDR R0,=NVIC_CLRENA0 ; Disable PIOA interrupt LDR R1,=0400 ; PIOA = bit 10 STR R1,[R0] ; LDR R0,=NVIC_CLRPEND0 ; Clear pending PIOA STR R1,[R0] ; interrupt LDR R0,=NVIC_SETENA0 ; Allow interrupt from PIOA STR R1,[R0] ; ; Now finally allow PIOA interrupts on bit 18 & 19 LDR R0,=PIOA_IER ; Enable PIOA interrupt LDR R1,=0XC0000 ; on bit18&19 STR R1,[R0]
sida 18 av 22 c) ; Interrupt service routine PIOA_InteruptHandler ; Should set up R0 with correct button press info ; and the call ButtonHandle PIOA_ISR EQU 0X400E0C4C ; Interrupt Status Register PIOA_PDSR EQU 0X400E0C3C PIOA_InteruptHandler PUSH {LR} ; Need to save the special LR value LDR R0,=PIOA_ISR ; Clear interrupt LDR R1,=0XC0000 ; for pin 18 and 19 LDR R0,[R0] ; ANDS R0,R0,R1 BEQ PIH_Return ; and determine which pin gave interrupt. ; Leave if no button was pressed ; That is, some spurious PIOA interrupt LDR R0,=PIOA_PDSR ; Get current button status LDR R0,[R0] ; We need this for sensing both buttons ANDS R0,R0,R1 ; Mask out our buttons LSR R0,#18 ; Shift button info into position BL ButtonHandle ; Call the button handler ; (remember to have saved LR before!) PIH_Return POP {PC} ; Return from interrupt, with LR on stack
sida 19 av 22 Uppgift 13. (8p) a) Skriv ett program som genererar en PWM (pulsbreddsmodulerad) utsignal på PortB (bit0). Sätt bit0 hög N gånger och låg 250 N gånger, jämför med figuren nedan. Talet N (0<=N<=250) som styr PWM signalen antas vara lagrat i minnet på adress N_VAL. Periodtiden för PWD signalen måste vara sådan att om detta styr en lampa så får den inte fladdra (dvs > 50 Hz). Därför är SYSTICK initierats så att den genererar ett avbrott (anropar SYSTICK_Handler) 25000 gånger per sekund. Skriv den kod som behövs i SYSTICK_Handler så att datorn genererar den önskade PWM signalen. Amplitud N 250 N Oscilloskopbild Tid
sida 20 av 22 Uppgift 13. SVAR: a) ; SYSTICK_Handler to generate a PWM signal. It uses ; the global N_VAL parameter to control the PWM length. ; SYSTICK is set up to generate interrup 25000 times/s ; A suitable PWM cycle time is then 100 Hz ; This would have been much easier if 0<=N<=255 as we ; then could have used the systick counter value in it self to ; keep track of where we are in the PWM cycle. If we still ; insists of using the systick counter it would involve some ; difficult modulo 250 operation. Thus, it seems better to ; introduce a new global counter that counts at every systick ; and wraps around at 250. We call this counter CUR_PWM. PIOB_SODR EQU PIOB_CODR EQU 0X400E0E30 0X400E0E34 CUR_PWM DS 1 ; Current PWM counter value 0<=n<=250 SYSTICK_Handler LDR R0,=N_VAL LDR R0,[R0] LDR R1,=CUR_PWM LDR R2,[R1] ADD R2,R2,#1 ; Let R0 = N_Val ; Let R2 = cur_pwm ; Increment cur_pwm CMP R2,#250 IFT GT ; If cur_pwm val is >250 MOVGT R2,#0 ; then cur_pwm = 0 STR R2,[R1] ; Store the updated value of cur_pwm CMP R2,R0 ; If cur_pwm > n_val IFTE GT MOVGT R3,#0 ; then R3 (output) = 0 MOVLE R3,#1 ; else R3 (output) = 1 ; Set PWM output pin according to R3 LDR R0,=PIOB_SODR ; Set if 1 STR R3,[R0] LDR R0,=PIOB_CODR ; Clear if 0 EOR R3,R3,#1 STR R3,[R0] BX LR; Return from interrupt
sida 21 av 22 SVAR: b) b) Vi vill självfallet även kunna ändra talet värdet på N som styr PWM signalen (och lagras på adress N_VAL) och valt att göra detta genom knapptryckningar. Skriv den kod som gör att N ökas om upp- knapp (bit18) eller minskas om nerknapp (bit19) trycks ner. Om båda trycks ner ska N återgå till sitt startvärde = 128. Du kan anta att koden i uppgift 10 12 finns och att du bara behöver implementera ButtonHandle. Notera att SYSTICK_Handler måste kunna anta att N håller sig inom sina gränser (0<=N<=250). ; Subroutine ButtonHandle Will change N_VAL according ; to the value of the two buttons ; Input: R0 =2 Button-bit19 pressed; ; =1 Button-bit18 pressed; ; =3 if both buttons are pressed.) ; Output: Changes the N_VAL value ; Sideeffect: None ButtonHandle PUSH {R2,R3} ; Save working registers LDR R2,=N_Val LDR R3,[R2] ; R3 = current value of N_Val CMP R0,#3 ; See if input R0 (buttons) are on BEQ BH_NValReset ; Goto NValReset if R0==3 (both) CMP R0,#2 BEQ BH_NValInc ; Goto NValInc if R0==2 (left-button) ; If we are here(right-button) we want to decrement N_Val SUBS R3,R3,#1 ; Decrement N_Val BPL BH_SaveNValAndReturn ; If still positiv then done MOV R0,#0 ; else set N_Val to 0 B BH_SaveNValAndReturn BH_NValInc ADD R3,R3,#1 ; Increment N_Val CMP R3,#251 ; If still <=250 then done BLT BH_SaveNValAndReturn MOV R0,#250 ; else bound N_Val to 250 B BH_SaveNValAndReturn BH_NValReset MOV R0,#128 ; Reset returns N_Val to 128 BH_SaveNValAndReturn STR R3,[R2] ; Store R3 into N_Val POP {R2,R3} BX LR ; Return from ButtonHandle
sida 22 av 22 c) Då det blir väldigt många knapptryckningar för att komma till ändlägena skulle man vilja ha en repeat- funktion. Modifiera rutinerna ovan så att en sådan funktion skapas. Om man håller en knapp nedtryckt i minst en sekund {ska} N- värdet därefter börja uppdateras 2 gånger per sekund. SVAR: Något lösningsförslag ges inte. Men idén är att man behöver införa en tillståndsvariabel som kommer ihåg det gamla tillståndet (knapp bit- 19 nedtryckt, knapp bit- 18 nedtryckt, eller inget nedtryckt) och om ingen tillståndsändring skett på 0.5 s och samma knapp fortfarande är nedtryckt så uppdateras N_VAL.