Tentamen med lösningsförslag



Relevanta dokument
Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen. EDA485 Maskinorienterad programmering Z DAT015 Maskinorienterad programmering IT. Tisdag xx yyyy 2006, kl

Tentamen. DAT015 Maskinorienterad programmering IT DIT151 Maskinorienterad programmering GU. Tisdag 15 december 2009, kl

Tentamen med lösningsförslag

Exempel på tentamen 1

Tentamen med lösningsförslag

Maskinorienterad programmering

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

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Maskinorienterad programmering. Mekatronikingenjör åk 2/ lp 3. Lars-Eric Arebrink. Av institutionen utgiven. vid flera tillfällen.

Maskinorienterad programmering

Maskinorienterad programmering. Mekatronikingenjör åk 2/ lp 3. Lars-Eric Arebrink. Av institutionen utgiven. Lars-Eric Arebrink

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Tentamen med lösningsförslag

Digital- och datorteknik

Tentamen med lösningsförslag

Tentamen med lösningsförslag

LEU240 Mikrodatorsystem

Tentamen med lösningsförslag

Tentamen i Programmering grundkurs och Programmering C

Programmering av inbyggda system 2014/2015

Tentamen. EDA485 Maskinorienterad programmering Z. Måndag 6 mars 2006, kl i V-salar

Programmering av inbyggda system 2012/2013. Kodningskonventioner och programbibliotek. maskinnära programmering i C och assemblerspråk

EDA215 Digital- och datorteknik för Z

Maskinorienterad programmering

Tentamen. EDA432 Digital och datorteknik IT INN790 Digital och datorteknik GU. Måndag 23 oktober 2006, kl i V-salar

Digital- och datorteknik

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

Tentamen med lösningsförslag

Tentamen. DAT015 Maskinorienterad programmering IT. Fredag 21 april 2006, kl i V-salar

Digital- och datorteknik

Att använda pekare i. C-kod

EDA Digital och Datorteknik

Kodningskonventioner (XCC12) Specifikation av strncpy: Övningsexempel: Maskinorienterad Programmering 2011/2012

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

Klasser och objekt i C#

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmeringsteknik med C och Matlab

7) Beskriv tre sätt att överföra parametrar mellan huvudprogram och subrutin.

Tentamen. EDA432 Digital- och datorteknik, It DIT790 Digital- och datorteknik, GU. Onsdag 12 Januari 2011, kl

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

Tentamen med lösningsförslag

TENTAMEN (med svar och vissa lösningar)

Assemblerprogrammets struktur; exempel

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

Maskinorienterad Programmering 2010/11

Lösningsförslag till Tenta i Mikrodator

Digital- och datorteknik

Föreläsning 5: Rekursion

Programmera en NXT Robot

Stack och subrutiner Programmeringskonventionen

Effektpedal för elgitarr

Assemblerprogrammering

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Assemblerprogrammering del 3

Java M1 V2 L2 K2 TM W. Tentamen i Programmering , kl LUNDS TEKNISKA HÖGSKOLA Institutionen för datavetenskap.

Enkla datatyper minne

Tentamen. Datorteknik Y, TSEA28

Digital- och datorteknik. Mekatronik-, data- och elektroingenjör Åk 1/ lp 1o2. Lars-Eric Arebrink. Av institutionen utgiven. vid flera tillfällen

Programexempel: tärningsspel

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

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

Tentamen. DIT150 Maskinorienterad programmering GU DAT015 Maskinorienterad programmering IT. Söndag 17 december 2006, kl

729G04 - Hemuppgift, Diskret matematik

Tentamen. EDA432 Digital- och datorteknik, IT DIT790 Digital- och datorteknik, GU. Måndag 18 Oktober 2010, kl

F5: Högnivåprogrammering

Repetition C-programmering

Assemblerprogrammering för HCS12

Assemblerprogrammering, ARM-Cortex M4 del 3

F5: Högnivåprogrammering

Assemblerprogrammets. struktur; exempel

Programexempel för FLEX

Digital- och datorteknik

Efter att du har installerat ExyPlus Office med tillhörande kartpaket börjar du med att göra följande inställningar:

Introduktion C-programmering

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Exempelsamling Assemblerprogrammering

Tentamen med lösningsförslag

Programmering i maskinspråk (Maskinassemblering)

Övningsuppgifter i Mikrodatorteknik 4p/5p

Föreläsningsanteckningar 3. Mikroprogrammering II

Tentamen i EIT070 Datorteknik

FRÅN A TILL Ö LäraMera Ab / och Allemansdata Ab / FRÅN A TILL Ö

Digital- och datorteknik

Extrauppgifter för CPU12

Skriva B gammalt nationellt prov

Transkript:

Institutionen för data och informationsteknik CHALMERS TEKNISKA HÖGSKOLA Tentamen med lösningsförslag DAT015 Maskinorienterad programmering IT EDA480 Maskinorienterad programmering D EDA485 Maskinorienterad programmering Z DIT151 Maskinorienterad programmering GU Måndag 27 augusti 2012, kl. 14.00-18.00 Examinatorer Roger Johansson, tel. 772 57 29 Jan Skansholm, tel. 772 10 12 Kontaktpersoner under tentamen Roger Johansson/Jan Skansholm Tillåtna hjälpmedel Häftet Instruktionslista för CPU12 Inget annat än rättelser och understrykningar får vara införda i häftet. Du får också använda bladet C Reference Card samt en av böckerna: Vägen till C, Bilting, Skansholm The C Programming Language, Kerninghan, Ritchie Inget annat än rättelser och understrykningar får vara införda i boken. Tabellverk och miniräknare får ej användas! Lösningar anslås senast dagen efter tentamen via kursens hemsida. Granskning Tid och plats anges på kursens hemsida. Allmänt Siffror inom parentes anger full poäng på uppgiften. För full poäng krävs att: redovisningen av svar och lösningar är läslig och tydlig. Ett lösningsblad får endast innehålla redovisningsdelar som hör ihop med en uppgift. lösningen ej är onödigt komplicerad. du har motiverat dina val och ställningstaganden assemblerprogram är utformade enligt de råd och anvisningar som givits under kursen och tillräckligt dokumenterade. C program är utformade enligt de råd och anvisningar som getts under kursen. I programtexterna skall raderna dras in så att man tydligt ser programmens struktur. Betygsättning För godkänt slutbetyg på kursen fordras att både tentamen och laborationer är godkända. Tentamenspoäng ger slutbetyg (DAT/EDA): 20p betyg 3 < 30p betyg 4 < 40p betyg 5 respektive (DIT): 20p betyg G < 35p VG

Maskinorienterad programmering Tentamen 27 augusti 2012 2(9) Uppgift 1 (6p) Avbrott Under laborationer med borrmaskinen har du utökat systemet, så att operatören via två switchar skall kunna: Switchar för avbryta pågående program och ge ett larm (via extern styrning subrutinen SIGNAL). Operatör nödstoppa systemet och förbereda det för en ny Tangentbord Mikrodator för borruppgift. (En omstart av systemet från adress borrkommand BORRSTART). Genom tillägget får systemet det blockmässiga utseendet enligt figuren till höger. De två nya funktionerna realiseras m h a avbrott som begärs på CPU12 processorns IRQ ingång. enligt följande koppling: Event 1 (Nödstopp) 1 1D C1 R Q 1 Till port IRQSRC bit 0 Event 2 (Signal) 1 1D C1 R Q 2 1 Till port IRQSRC bit 1 Anpassningselektronik Till processorns IRQ -ingång Borrmaskin CS vid skrivning på port IRES1 CS vid skrivning på port IRES2 Switcharna ansluts till avbrottsingången via var sin D vippa och en NOR grind. En nedtryckning (= positiv puls) av någon av switcharna medför att IRQ signalen (Interrupt ReQuest) aktiveras. D vipporna är anslutna till bitpositionerna 7 och 6 av inporten IRQSRC, som alltså innehåller avbrottsvippornas status. a) Skriv initieringsrutinen IRQINIT i CPU12 assemblerspråk. b) Skriv avbrottsrutinen IRQR i CPU12 assemblerspråk. IRQINIT och IRQR har beskrivningarna: IRQINIT Beskrivning: Rutinen initierar kopplingen och CPU12 för IRQ-avbrott. Den använder laborationsdatorns inportar IRES1 och IRES2 för eventuella "dummy-läsningar". Anrop: BSR IRQINIT Indata: Inga Utdata: Inga Registerpåverkan: Ingen Anropade subrutiner: Inga IRQR Beskrivning: Anrop: Indata: Utdata: Registerpåverkan: Anropade subrutiner: Avbrottsrutinen reagerar på begäran om nödstopp och larm beroende på på vilken switch som aktiverats. Förloppen är mycket snabba varför man kan förutsätta att endast en av switcharna begär avbrott åt gången. Skulle både nödstopp och larm begäras samtidigt så skall nödstopp ha högre prioritet än larm. Därför skall också ett larm avbrytas av en begäran om nödstopp. Avbrottsbegäran på IRQ Status på port IRQSRC Inga Ingen SIGNAL

Maskinorienterad programmering Tentamen 27 augusti 2012 3(9) Uppgift 2 (10p) Kodningskonventioner I denna uppgift ska du förutsätta samma konventioner som i XCC12, (bilaga 2). Följande C deklarationer har gjorts på toppnivå (global synlighet): char *e,f; a) Visa hur variabeldeklarationerna översätts till assemblerdirektiv för HCS12. b) Visa också hur följande funktionsanrop översätts till assemblerkod för HCS12: func( e, f ); c) Inledningen (parameterlistan och lokala variabler) för en funktion ser ut på följande sätt: void function( char * b, float a ) float c; int d; char e; e = 0; d = 1; b = (char *) 0x1000; a = 1.0;... Visa hur utrymme för lokala variabler skapas och hur tilldelningarna kan utföras. Ledning: Flyttalet 1.0 kodas $3F800000 Uppgift 3 (8p) Assemblerprogrammering Följande funktion finns given i C. Implementera en motsvarande subrutin i assemblerspråk för HC12. Du ska inte förutsätta några speciella kompilatorkonventioner i denna uppgift. Parametern cp skickas i register X med anropet, returvärdet från subrutinen ska finnas i register D efter att subrutinen utförts. char * arrayconvert(char *cp ) while( *cp ) *cp = *cp & 0x7F; cp++; return cp; Uppgift 4 (3p) a) I realtidskärnan som beskrevs på en av föreläsningarna ingick två avbrottsrutiner. Vilka typer av avbrott tog dessa hand om? b) I realtidskärnan beskrevs varje process (aktivitet) med hjälp av en struct, av slaget process_struct. Vilken information fanns i en sådan struct?

Maskinorienterad programmering Tentamen 27 augusti 2012 4(9) Uppgift 5 (7p) Programmering med pekare Standardfunktionen strcmpi kan beskrivas på följande sätt: int strcmpi (const char *String1, const char *String2 ); The strcmpi subroutine compares strings in memory. The String1 and String2 parameters point to strings. A string is an array of characters terminated by a null character. The strcmpi subroutine performs a comparison of the string pointed to by the String1 parameter and the string pointed to by the String2 parameter ignoring case, and analyzes the extended ASCII character set values of the characters in each string. The strcmpi subroutine compares unsigned char data types. The strcmpi subroutine then returns a value that is: Less than 0 if the value of string String1 is lexicographically less than string String2. Equal to 0 if the value of string String1 is lexicographically equal to string String2. Greater than 0 if the value of string String1 is lexicographically greater than string String2. Exempel på användning: #include <stdio.h> #include <string.h> char string1[] = "The quick brown dog jumps over the lazy fox"; char string2[] = "The QUICK brown dog jumps over the lazy fox"; int main() char tmp[20]; int result; result = strcmpi( string1, string2 ); if( result > 0 ) printf( string1 is greater than string2\n ); else if( result < 0 ) printf( string1 is less than string2\n ); else printf( string1 is equal to string2\n ); Utskriften blir: string1 is equal to string2 Din uppgift är att, i C, skriva en egen definition av funktionen strcmpi. Du får inte använda dig av indexering, utan måste utnyttja pekare. Du får endast använda följande standardfunktion: Syntax #include <ctype.h> int tolower(int c) Function tolower converts an uppercase letter to its lowercase equivalent, leaving all other characters unmodified. Uppgift 6 (6p) Maskinnära programmering i C Två strömbrytare och två displayenheter, enligt figuren till höger, är anslutna till adresser 0x600 och 0x601, respektive adress 0x400 och 0x401 i ett MC12 mikrodatorsystem. Konstruera en funktion void AddSigned8bitTo16( void ) som adderar de två värdena som läses från strömbrytarna (tolka som tal med tecken) och därefter presenterar resultatet som ett 16 bitars tal på displayindikatorerna.

Maskinorienterad programmering Tentamen 27 augusti 2012 5(9) Uppgift 7 (10p) Programmering i C Man har längs vissa vägsträckor utrustat hastighetsskyltarna med radiosändare som sänder ut information om den högsta tillåtna hastigheten. De fordon som passerar kan vara utrustade med radiomottagare som tar emot denna information. Den mottagna informationen lagras i ett register i mottagarna. Detta register kopplas till fordonets dator så att det kan avläsas från denna. Registret är 16 bitar långt och har kopplats till den oktala adressen 17750 i datorn. Om en radiomottagare inte mottagit någon information den senaste minuten nollställs automatiskt detta register. I ett fordon finns också en intelligent digital hastighetsmätare som har en display som på vanligt sätt visar den aktuella hastigheten. Till hastighetsmätaren hör dessutom två register vilka kan anslutas till datorn, ett stryrregister på den oktala adressen 17760 och ett dataregister på den oktala adressen 17762. Båda dessa register består av 16 bitar. För att slå på intelligensen i hastighetsmätaren skall man sätta bit nr 0 i styrregistret till 1 och för att slå på avbrottsmekanismen skall bit nr 6 sättas till 1. Bitarna 12 15 i styrregistret innehåller felinformation (felkoder). Om inget fel inträffat är dessa bitar alla 0. I hastighetsmätarens dataregister kan man lägga in den högsta tillåtna hastigheten. Om fordonets aktuella hastighet överstiger hastigheten i dataregistret genererar hastighetsmätaren automatiskt en avbrottssignal till datorn. En förutsättning för detta är dock att intelligensen och avbrottsmekanismen slagits på. Avbrottsvektorn ligger på adressen 60 oktalt. Avbrottet upprepas var tredje sekund tills hastigheten inte längre överstiger hastigheten i dataregistret. Hastighetsmätaren kan även generera avbrott om något fel uppstått. Till datorn finns slutligen kopplat en krets som genererar en ljudsignal. Till denna krets hör ett 16 bitars styrregister på den oktala adressen 17770. Om man lägger en etta i bit nr 0 i detta register kommer en signal att ljuda under ett kort ögonblick (kortare än tre sekunder). Därefter tystnar signalen och bit nummer 0 återställs automatiskt till 0 Uppgiften är att i C skriva det program som behövs i fordonets dator för att samordna de kretsar som beskrivits ovan. Programmet skall var 10:e sekund avläsa den högsta tillåtna hastigheten från radiomottagaren. Om radiomottagaren mottagit information skall den högsta tillåtna hastigheten läggas i hastighetsmätarens dataregister och hastighetsmätaren skall initieras så att den kan generera avbrott. Om ingen information mottagits skall hastighetsmätaren inte kunna generera avbrott. Om ett avbrott genererats av hastighetsmätaren och det inte är något fel skall ljudsignalen slås på. Om något fel uppstått man kan ignorera detta och helt enkelt nollställa de bitar som innehåller felkoden. Du måste också initiera avbrottsvektorn och skriva den assemblerrutin man kommer till då avbrott inträffar. I denna uppgift får du förutsätta att funktionen hold som du konstruerade på laborationerna är färdigskriven och kan användas. Den ger som du minns en fördröjning med så många millisekunder som dess parameter anger. Du får också förutsätta att typen short int implementeras med 16 bitar.

Maskinorienterad programmering Tentamen 27 augusti 2012 6(9) Bilaga 1 Assemblerdirektiv för MC68HC12. Assemblerspråket använder sig av mnemoniska beteckningar som tillverkaren Freescale specificerat för maskininstruktioner och instruktioner till assemblatorn, s.k. pseudoinstruktioner eller assemblerdirektiv. Pseudoinstruktionerna framgår av följande tabell: Direktiv Förklaring ORG N Placerar den efterföljande koden med början på adress N (ORG för ORiGin = ursprung) L RMB N Avsätter N bytes i följd i minnet (utan att ge dem värden), så att programmet kan använda dem. Följden placeras med början på adress L. (RMB för Reserve Memory Bytes) L EQU N Ger label L konstantvärdet N (EQU för EQUates = beräknas till) L FCB N1, N2 Avsätter i följd i minnet en byte för varje argument. Respektive byte ges konstantvärdet N1, N2 etc. Följden placeras med början på adress L. (FCB för Form Constant Byte) L FDB N1, N2 Avsätter i följd i minnet ett bytepar (två bytes) för varje argument. Respektive bytepar ges konstantvärdet N1, N2 etc. Följden placeras med början på adress L. (FDB för Form Double Byte) L FCS "ABC" Avsätter en följd av bytes i minnet, en för varje tecken i teckensträngen "ABC". Respektive byte ges ASCII värdet för A, B, C etc. Följden placeras med början på adress L. (FCS för Form Caracter String) Bilaga 2: Kompilatorkonvention XCC12: Parametrar överförs till en funktion via stacken och den anropande funktionen återställer stacken efter funktionsanropet. Då parametrarna placeras på stacken bearbetas parameterlistan från höger till vänster. Prolog kallas den kod som reserverar utrymme för lokala variabler. Epilog kallas den kod som återställer (återlämnar) utrymme för lokala variabler. Den del av stacken som används för parametrar och lokala variabler kallas aktiveringspost. Beroende på datatyp används för returparameter HC12 s register enligt följande tabell: Storlek Benämning C typ Register 8 bitar byte char B 16 bitar word short int och pekartyp D 32 bitar long float long int float Y/D

Maskinorienterad programmering Tentamen 27 augusti 2012 7(9) Lösningsförslag uppgift 1 a) ; ****************************************************************** ; SUBRUTIN-IRQINIT ; Beskrivning: Rutinen nollställer D-vipporna, adress ; till avbrottsrutinen läggs på adress FFF2, ; I-flaggan nollställs. ; Anrop: BSR IRQINIT ; Indata: Inga ; Utdata: Inga ; Reg-påverkan: Ingen ; Anrop subr: Ingen ; ****************************************************************** IRQINIT: PSHA PSHX LDX #IRQR ; adressen till avbrottsrutinen läggs STX $FFF2 ; på adress FFF2 LDAA IRES1 ; nollställer D-vippa 1 LDAA IRES2 ; nollställer D-vippa 2 CLI ; I-flaggan nollställs PULX PULA RTS b) ; ****************************************************************** ; AVBROTTSRUTIN-IRQR ; Beskrivning: Om swith 1 har aktiverats, dvs BITPOS 7=1 så görs ; nödstopp. Om swith 2 har aktiverats, dvs ; BITPOS 6=1 så körs larmrutinen. ; Anrop: via IRQ ; Indata: Inga ; Utdata: Inga ; Reg-påverkan: Ingen ; Anrop subr: SIGNAL ; ****************************************************************** IRQR: LDAA IRQSRG ; hämtar vippornas status ASLA ; shiftar in BITPOS 7 i c-flaggan BCC NO_STOP ; undersöker statusbit för nödstopp LDAB IRES1 ; nollställer vippa 1 BRA DRPGM ; återstarta DRPGM NO_STOP: ASLA ; skiftar in BITPOS 6 i c-flaggan BCC NO_SIGNAL ; undersöker statusbit för larm LDAB IRES2 ; nollställer vippa 2 BSR SIGNAL ; om c=1 hoppa till subrutinen SIGNAL NO_SIGNAL: RTI ******************************************************************* Lösningsförslag uppgift 2 a) _e RMB 2 _f RMB 1 b) LDAB _f PSHB LDD _e PSHD JSR _func LEAS 3,SP c) _function: LEAS -7,SP ; e = 0; CLR 0,SP ; d = 1; LDD #1 STD 1,SP ; b = (char *) 0x1000; LDD #$1000 STD 9,SP

; a = 1.0; LDD #0x3F80 STD 11,SP LDD #0x0000 STD 13,SP... Lösningsförslag uppgift 3 ;char * arrayconvert(char *cp ) ; Parametrar. cp i register X vid anrop ; resultatet i register D vid utträde arrayconvert: ; ; while( *cp ) TST,X BEQ arrayconvert_1 ; *cp = *cp & 0x7F; LDAB,X ANDB #$7F STAB 1,X+ ;.. cp++; BRA arrayconvert arrayconvert_1: ; ; return cp; TFR X,D ; RTS Lösningsförslag uppgift 4 a) avbrott från realtidsklockan och software interrupts b) pekare till det utrymme som allokerats för processens stack, pekare till stackens topp, processens prioritet, processens tidigaste tillåtna starttid Lösningsförslag uppgift 5 int strcmpi(char *s1, char *s2) while (1) if ( tolower(*s1)!= tolower(*s2) ) return(*s1 - *s2); if (*s1 == 0) return(0); s1++; s2++; Lösningsförslag uppgift 6 typedef char *port8ptr; typedef short *port16ptr; #define ML4OUT_ADR 0x400 #define ML4IN_ADR1 0x600 #define ML4IN_ADR2 0x601 #define ML4OUT16 *((port16ptr) ML4OUT_ADR) #define ML4IN1 *((port8ptr) ML4IN_ADR1) #define ML4IN2 *((port8ptr) ML4IN_ADR2) void AddSigned8bitTo16( void ) short s; while( 1 ) s = ( short ) ML4IN1; s = s + ( short ) ML4IN2; ML4OUT16 = s; Maskinorienterad programmering Tentamen 27 augusti 2012 8(9)

Lösningsförslag uppgift 7 // Filen hastighet.h // grundläggande definitioner typedef short int port; typedef port *portptr; typedef void (*vec) (void); typedef vec *vecptr; Maskinorienterad programmering Tentamen 27 augusti 2012 9(9) // hastighetsmätaren #define HASTIGHET_REG_ADR 017760 #define HASTIGHET_DAT_ADR 017762 #define HASTIGHET_VEC_ADR 060 #define HASTIGHET_REG *((portptr) HASTIGHET_REG_ADR) #define HASTIGHET_DAT *((portptr) HASTIGHET_DAT_ADR) #define HASTIGHET_VEC *((vecptr) HASTIGHET_VEC_ADR) #define ENABLE_BIT 0x1 #define INTERRUPT_BIT 0x40 #define ERROR_BITS 0xF000 // mottagaren #define MOTTAGARE_DAT_ADR 017750 #define MOTTAGARE_DAT *((portptr) MOTTAGARE_DAT_ADR) // alarm #define ALARM_DAT_ADR 017770 #define ALARM_DAT *((portptr) ALARM_DAT_ADR) #define ALARM_ON_BIT 0x1 // Filen time.h void hold(long int); // Filen inter.h void hast_trap(); // Filen inter.s12 segment text define _hast_trap extern _hast_inter _hast_trap: jsr _hast_inter rti // Filen main.c #include "hastighet.h" #include "time.h" #include "inter.h" main() short int avlast; HASTIGHET_VEC = hast_trap; while(1) if ((avlast=mottagare_dat) > 0) HASTIGHET_DAT = avlast; HASTIGHET_REG = ENABLE_BIT INTERRUPT_BIT; else HASTIGHET_REG = 0; hold(10000); void hast_inter() if (HASTIGHET_REG & ERROR_BITS) HASTIGHET_REG = HASTIGHET_REG & ~ERROR_BITS; else ALARM_DAT = ALARM_ON_BIT;