EKSAMEN (Del 2, våren 2015) Løsningsforslag Emnekode: ITD13012 Emne: Datateknikk Dato: 13.05.2015 Eksamenstid: kl 0900 til kl 1200 Hjelpemidler: to A4-ark (fire sider) med egne notater "ikke-kommuniserende" kalkulator Eksamensoppgaven: Faglærer: Robert Roppestad Sensurdato: 03.06.2015 Karakterene er tilgjengelige for studenter på studentweb senest dagen etter oppgitt sensurfrist. Følg instruksjoner gitt på: http://www.hiof.no/index.php?id=7027 Oppgave 1. (8%) Forklar hvilken oppgave databussen, adressebussen og kontrollbussen har i en datamaskin. Hva utfører en adressedekoder? Hvilken betydning har antall bit en adressebuss består av for et datasystem? ---------------- Databuss. En buss (et antall parallelle ledere) som kan frakte data/kode til/fra CPU en. Instruksjoner (kode) samt data blir overført via databussen etter hvert som CPU en trenger dem. Resultater (data) blir lagret tilbake i minne via databussen eller blir skrevet (sendt) til en IO-port. Adressebuss. Adressebussen benyttes for å angi lokasjonen (adressen) i minne hvor data skal leses/skrives til/fra CPU en.
2 Kontrollbuss. CPU en styrer alle operasjoner via kontrollsignaler som brukes internt i CPU en samt ut på kontrollbussen til minne og IO-systemet Adressedekoderen mottar en binær-verdi (adresse) og dekoder den for å finne rette byte (bytes) i minne. Minne kan være organisert på mange ulike måter, dekoderen sørger for at rette minnelokasjon blir benyttet. Antall bit som adressebussen benytter angir hvor mye (antall bytes) minne som kan adresseres. Gitt av 2 bit. Oppgave 2. (7%) Forklar hva kretsen vist på figuren over utfører. Forklar når utgangen fra bufferet er høy eventuell lav. ------------ Figuren viser en pull-down motstand. Utgangen kobles mot jord når bryteren er åpen. Sikrer at vi måler 0 Volt med åpen bryter. Når bryteren lukkes vil utgangen være gitt av Vin. Vi får et høyt signal som indikerer at bryteren er lukket. Kretsen sikrer at spenningen til digitale inngang enten er 0Volt eller Vin Volt. Uten pull-down eller pull-up motstander vil signalet kunne flyte, og dermed gi et uklart inngangssignal til et målesystem. Oppgave 3. (7%) I figuren over benyttes en transistor. Hva kan en transistor benyttes til, og hvilken oppgave har den i kretsen vist på figuren? I kretsen inngår også en diode. Hvilken funksjon har den? ----- En transistor er en halvleder som kan styres vha spenning på basis-inngangen. Vi kan dermed benytte den som en bryter (av/på) funksjon eller for å indikere 0 eller 1 i et digitalt system. En transistor har også den egenskapen at den kan benyttes som en forsterker. En svak strøm inn på basis vil kunne gi en proporsjonalt mye større strøm fra kolletor til emitter. F.eks som forsterkning av lyd. På figuren har transistoren en oppgave som av/på bryter. En svak strøm fra Arduino-utgangen slår transistoren på, slik at den kan drive en mye større strøm fra et powersupply til DC-motoren. Arduino kan kun gi ut 40mA, og en DC-motor trenger mer strøm som da mates gjennom transistoren.
3 En diode leder kun strøm i en retning. Fra anode til katode. Den sperrer i motsatt retning. Dioden på figuren sperrer for strøm fra + til jord, men den vil kunne lede strøm i motsatt retning. Dette er aktuelt når vi slår av spenningstilførselen til motoren. Da vil motoren fortsette å rotere en stund, og genere en indusert spenning. Hvis ikke dioden leder den strømmen bort vil andre komponenter rundt motoren kunne ryke. Oppgave 4. (8%) Anta at du skal digitalisere et lyd-signal der den høyeste frekvensen i signalet er 10 KHz. Forklar hvilke operasjoner som må utføres for å få signalet fra analog til digital form. Hvilken samplingsfrekvens bør benyttes? Anta at det benyttes en 16 bit A/D omformer. Beregn hvilken %-vis nøyaktighet vi kan forvente av A/D-omformeren. ------- Signalet fra lyd-kilden bør først filtres med et lavpassfilter for å fjerne mulige aliasfrekvenser. Det betyr at vi bør filtrere bort alle signaler over 10 khz før sampling. Etter aliasfilteret går signalet til en sample/hold enhet som avleser den analoge verdien og holder i samplingstiden T. A/D-omformeren kan benytte ulike prinsipper, men suksessiv approksimasjon er mye benyttet. Den konverterer det analoge signalet til en bit-verdi. Antall bit A/D-omformeren består av gir området. O -> (2bit-1) Ex 16 bit gir et digital område fra 0 til 65535. Samplingsfrekvensen er gitt av Shannon/Nyquist teorem. Den bør være minst det dobbelte av den høyeste frekvensen i signalet. I dette tilfelle bør samlingsfrekvensen være minst 2* 10kHz = 20 khz = 20.000 Hz. A/D-omformeren vil aldri kunne gi et bede resultat en pluss/minus 0.5 LSB. I dette tilfell er 1 LSB = 1/2 bit = 1/ 2 16 = 1.5*10-5 Prosentvis utgjør 1 LSB = 1.5*10-5 *100% = 1.52*10-3 % = 0.00152 % Kan også angi svaret som pluss/minus 0.5 LSB -> +/- 0.00075 % Det betyr at en 16 bit A/D i seg selv har en god nøyaktighet, men andre feil rundt A/Domformeren kan innføre større unøyaktigheter.
4 Oppgave 5. (8%) Hva blir skrevet ut i monitoren hvis følgende program blir kjørt på en Arduino-enhet. ( Tips! Ascii-verdien til A er 65 ). void setup() Serial.begin(9600); void loop() char *navn="usa"; char tekst[40]="lehighton"; unsigned int verdi = 15, test = 1, resultat = 0; strcat(tekst,"-"); strcat(tekst,navn); Serial.println(tekst); for (int i = 1; i < 4 ; i++) tekst[13 - i] = 68 -i; Serial.println(tekst); Serial.println(""); for (int k = 15; k >= 0; k--) test = (1 << k); resultat = (verdi & test); if (resultat!= 0) Serial.print("1"); else Serial.print("0"); for(;;) ------ Utskrift: Lehighton-USA Lehighton-ABC 0000000000001111
5 Oppgave 6. (12%) Hva blir skrevet ut i monitoren hvis følgende program blir kjørt på en Arduino-enhet? Skriv svaret ditt i vinduet etter programlistingen. void setup() Serial.begin(9600); void loop() float verdier[3]; int ant = 3; int teller1 = 5, teller2 = 10 Utskrift: Verdien = 0.00 Verdien = 1.00 Verdien = 2.00 Verdien = 0.00 Verdien = 1.00 Verdien = 4.00 Teller1 = 5 Teller2 = 10 Teller1 = 5 Teller2 = 40
6 Oppgave 7. ( 22%) Anta at du har et Arduino starterkit tilgjengelig og en PC for programmering av enheten. Du skal lage et program for Arduino-enheten som løser følgende oppgave; Egg-timer. Du skal benytte 6 lysdioder med tilhørende motstander som skal kobles til 6 digitale utganger (2, 3, 4, 5, 6, 7 ). Det skal benyttes en buzzer for alarm som kobles til digital utgang 8. Du skal benytte en standard trykk-bryter som skal tilkobles til digital inngang 9 med en pull_down motstand. (Lav når bryteren ikke er trykket, og høy når bryteren trykkes). Du skal benytte millis()-funksjonen for å løse oppgaven (Se vedlegg). (Ikke en timer-funksjon). Når brukeren trykker på trykk-bryteren skal egg-timeren starte tidtakingen. Når det har gått 1 minutt skal lysdiode 1 tennes. Når det har gått 2 minutter skal både lysdiode 1 og lysdiode 2 tennes, og slik skal egg-timeren fortsette til alle 6 lysdioder er tent etter 6 minutter. Når lysdiode nummer 6 tennes skal det gis en alarm som skal vare i 5 sekunder med buzzeren på digital utgang 8. Deretter skal egg-timeren, slukke alle lysdioder og avvente at noen trykker på trykk-bryteren igjen. Hvis brukeren av systemet trykker på trykk-bryteren når egg-timeren er i ferd med å telle oppover skal den resettes og starte opptelling forfra igjen. Skriv et program som løser oppgaven beskrevet ovenfor. Du behøver ikke tegne koblings-skjema. Forklar med kommentarer eller etterfølgende tekst hvordan ditt program skal virke. ---------------- Mulig løsning. /* egg_timer Utganger: 6 LED styres. Innganger: En bryter med pull_up motstand. RR 2015 egg_timer_1.ino */ int old_switch_state = 0; int new_switch_state = 0; int timer_init = false; int led = 2; unsigned long start_time = 0; unsigned long current_time = 0; int intervall = 60000; // 1 minutt. void setup() Serial.begin(9600); // initialize the digital pin as an output. for ( int pin=2; pin < 8; pin++) pinmode(pin, OUTPUT); // Ikke nødvendig å initialisere utgang 8 for tone()-funksjonen. pinmode(9, INPUT); // tilkobling for trykk-bryter.
7 void loop() new_switch_state = digitalread(9); Serial.print("Trykkbryter er: "); Serial.println(new_switch_state); if ( (old_switch_state == 0) && (new_switch_state == 1)) // Bryter er trykket fra av til på timer_init = 1 ; // Resetter alle Led. Starter uansett forfra for (int i = 2; i < 8; i++) digitalwrite(i, LOW); notone(8); led = 2; start_time = millis(); // setter tilstanden timer_init til i1 (true) // slaår av lyd. old_switch_state = new_switch_state; // tar vare på tidsverdien if (timer_init == 1) current_time = millis(); if ( (current_time - start_time) > intervall ) start_time = current_time; digitalwrite(led, HIGH); led++; if ( led == 8 ) tone(8, 2000, 5000); delay(5000); // venter 5 sekunder før lyd og lys slås av. for (int i = 2; i < 8; i++) digitalwrite(i, LOW); led = 2; timer_init = 0; Serial.print("timer_init = "); Serial.println(timer_init);
8 Oppgave 8. ( 28%) Du skal i denne oppgaven benytte Arduino-enheten til å lage et overvåknings/alarmsystem for en fritidsbåt. Følgende er gitt; Til Arduino-enheten er det tilkoblet en analog temperatursensor til den analoge inngangen A0. Sensoren kan måle temperatur fra -500C til 1000C med et analogt utgangssignalet som vil ligge mellom 0 volt og 5 Volt. Det er også tilkoblet en analog nivåsensor til den analoge inngangen A1 som måler vann-nivået i bunn av båten. Måle-området er 0cm til 10cm med et analogt utgangssignal som vil ligge mellom 0 volt og 5 Volt. I tillegg er det tilkoblet en alarm-bryter (av/på) på døra til kabinen som detekterer om døra er lukket/åpen. Når døra er lukket er bryteren av. Når døra er åpen er bryteren på. Bryteren er tilkoblet digital inngang 2. Denne alarmbryteren skal tilkobles en interrupt-funksjon som detekterer om bryteren går fra av til på (stigende flanke). Det er også tilkoblet en av/på bryter til digital inngang 4. Bryteren er enten av eller på for å angi at alarmsystemet er passivt (av) eller aktivt (på). Til pinne 8 (digital I/O) er det tilkoblet en sirene (buzzer) som skal fungere som lydalarm. Du skal lage et program som løser følgende oppgave. 1. I loop()-funksjonen skal det hvert 5 sekund skrives til monitoren hva temperaturen er i grader Celsius, hva vann-nivået er i cm, og om døra er åpen/lukket. 2. Hvis døra til kabinen åpnes når alarmsystemet er aktivt skal interrupt-rutina kalle opp en funksjon void gsmvarsel(void). (Du behøver ikke lage den, anta at den eksisterer fra tidligere). Samtidig skal det gis en alarm med tone() funksjonen på pinne 8 i 10 minutter eller inntil brukeren passiviserer systemet med av/på bryteren. Skriv et program som løser oppgaven beskrevet ovenfor. Forklar med kommentarer eller etterfølgende tekst hvordan ditt program skal virke. ------ Mulig løsning. /* alarm_system. Oppg 8. Innganger: 2 analoge: A0 - Temperatur. A1 - Nivå Digital inn: Pinne 4. Passiv/aktivt alarm-system. Digital inn: Pinne 2. Dørbryter. Utganger: tone() på pinne 8. RR 2015 alarm_sys1.ino */ //Button pins const int BUTTON_INT = 0; //Interrupt 0 (pin 2 on the Uno) const int tempsensor = A0; const int nivaasensor = A1; volatile int startswitch = 0; void setup() pinmode (4, INPUT); // Passivt eller aktivt alarmsystem pinmode (2, INPUT); // Dørbryter, samt start av interrupt-rutina. pinmode (8, OUTPUT); // Lydalarm med tone() pinmode (10, OUTPUT); // Rød Led kun for test. Serial.begin(9600); attachinterrupt(button_int, interrupt, RISING); // setter opp interrupt-rutina.
9 void loop() float temperatur = 0.0; float nivaa = 0.0; float tempvolt =0.0; int doorswitch = 0; int tempbitverdi = 0; int nivaabitverdi = 0; doorswitch = digitalread(2); startswitch = digitalread(4); // Hvis Alarmen går kan vi slå av lyden ved å slå startbryter av. if (startswitch == 0 ) notone(8); // slår av eventuell alarmlyd // Leser av temperatursensor og skalerer tempbitverdi = analogread(a0); temperatur = (tempbitverdi/1024.0)*150.0-50.0; // Leser av nivåsensor og skalerer nivaabitverdi = analogread(a1); nivaa = (nivaabitverdi/1024.0)*10.0; Serial.println(""); Serial.print("Startbryter er: "); Serial.println(startSwitch); if (doorswitch == 0 ) Serial.println("Doerbryter er lukket."); else Serial.println("Doerbryter er aapen."); Serial.print("Temperaturen er: "); Serial.print(temperatur); Serial.println(" grader Celcius"); Serial.print("Nivaaet er: "); Serial.print(nivaa); Serial.println(" cm"); delay(5000); void interrupt(void) if ( startswitch ) // Bruker gsm og alarm kun når systemet er aktivt. digitalwrite( 10, HIGH); // Kun for test. Led lyser når interrupt rutine kjøres. tone(8, 1000,600000); // Sender en lyd på 1000Hz i 10 minutter gsmvarsel(); // Kaller opp gsmvarsel-rutina. void gsmvarsel(void) Serial.println(""); Serial.println("Sender tekstmelding til eier!!!!! ");