Emne: IRE35113 / Kraftelektronikk og mikrokontrollere Lærer: Even Arntsen / Åge T Johansen / Antall vedleggsider: 27

Like dokumenter
Løsningsforslag til 2. del av Del - EKSAMEN

AVDELING FOR TEKNOLOGI

Løsningsforslag til 2. del av Del - EKSAMEN

Emne: IRE35115 / Kraftelektronikk og mikrokontrollere Lærer: Even Arntsen. Vedlegg 2: Arduino Uno pinout (1 side)

HØGSKOLEN I SØR-TRØNDELAG Avdeling for teknologi

HØGSKOLEN I SØR-TRØNDELAG Avdeling for teknologi

DM6814/DM5814 User s Manual

I oppgave 1 skal det prøves ut en binærteller i en integrert krets (IC). Telleren som skal brukes er SN74HC393N, hvor

Antall vedlegg O Tillatte hjelpemidler:

Innlevering Rapport. Datamaskinarkitektur

Datakonvertering. analog til digital og digital til analog

(tel ) Antall sider: 5 Antall vedleggssider: 10. Kandidaten må selv kontrollere at oppgavesettet er fullstendig

består av 7 sider inklusiv denne forsiden og vedlegg. Kontroller at oppgaven er komplett før du begynner å besvare spørsmålene.

Datakonvertering. analog til digital og digital til analog

Emnenavn: Datateknikk. Eksamenstid: 3 timer. Faglærer: Robert Roppestad. består av 5 sider inklusiv denne forsiden, samt 1 vedleggside.

Høgskoleni østfold EKSAMEN. Oppgavesettet består av 8 sider inklusiv denne forsiden og vedlegg.

EKSAMEN Emnekode: ITD13012

EKSAMEN. Informasjon om eksamen. Emnekode og -navn: ITD13012 Datateknikk. Dato og tid: timer. Fagansvarlig: Robert Roppestad

Litt mer om Arduino. Roger Antonsen Sten Solli INF januar 2011

Emnenavn: Datateknikk. Eksamenstid: 3 timer. Faglærere: Robert Roppestad. Hele oppgavesettet består av 8 oppgaver, samt 1 vedlegg.

Antall oppgavesider:t4 Antall vedleggsider: 1 KANDIDATEN MÅ SELV KONTROLLERE AT OPPGAVESETTET

Del 4 Noen spesielle C-elementer

PLS PC-øving nr. 3 Global Label og Local Label, flagg og CJ

SUPER DISCLAIMER. Vi endrer opplegget litt fra år til år, og vi hører på dere!

Lab 6 Klokkegenerator, tellerkretser og digital-analog omformer

E K S A M E N FAKULTET FOR TEKNOLGI OG REALFAG. Emnekode: ELE217 Emnenavn: Mikrokontrollere og styresystemer.

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

Intro til Atmel Studio Bits&bytes

ehøgskoleni østfold Av sensor

Den analoge verden blir digitalisert

Høgskoleni østfold EKSAMEN. Emnekode: Emne: ITD13012 Datateknikk (deleksamen 1, høstsemesteret) Dato: Eksamenstid: kl til kl.

VEILEDNING TIL LABORATORIEØVELSE NR 8

Bruk av interrupt og Timer i Arduino-program.

ARDUINO STUDIELABEN PROGRAMMERING DIGITALE/ANALOGE INNDATA/UTDATA LYSDIODER FRITZING. Roger Antonsen INF januar 2012

Løsningsforslag til 1. del av Del - EKSAMEN

1 Innledning. 2 Virkemåte for kortet. Bli kjent med USB I/O kort K8055. NB! Ta med multimeter og lite skrujern!

Dagens temaer. temaer hentes fra kapittel 3 i Computer Organisation. av sekvensielle kretser. and Architecture. Tilstandsdiagram.

En mengde andre typer som DVD, CD, FPGA, Flash, (E)PROM etc. (Kommer. Hukommelse finnes i mange varianter avhengig av hva de skal brukes til:

C:\web\service-elektronikk\fagprover\Anders\flashlite_program_Anders.pas Page 1

Fys 3270/4270 høsten Laboppgave 2: Grunnleggende VHDL programmering. Styring av testkortets IO enheter.

E K S A M E N S O P P G A V E

Løsningsforslag til EKSAMEN

WORKSHOP BRUK AV SENSORTEKNOLOGI

Gruppe(r): 2EY Eksamenstid, fra-til: Eksamensoppgaven består av. Antall sider: 4 (Inkludert denne)

Monostabil multivibrator One shot genererer en enkelt puls med spesifisert varighet kretsen har en stabil tilstand

Arduino med Atmel studio 6.x (6.1)

1. del av Del - EKSAMEN

Dagens temaer. Dagens temaer hentes fra kapittel 3 i Computer Organisation and Architecture. Sekvensiell logikk. Flip-flop er

HØGSKOLEN I SØR-TRØNDELAG Avdeling for teknologi

Datakonvertering. analog til digital og digital til analog

Synkron logikk. Sekvensiell logikk; to typer:

MIK 200 Anvendt signalbehandling, Lab. 5, brytere, lysdioder og logikk.

Analog til digital omformer

NY EKSAMEN Emnekode: ITD13012

UNIVERSITETET I OSLO

Steg 1: Installere programvaren

Blinkende lysdiode Introduksjon Arduino Lærerveiledning

EKSAMEN (Del 2, våren 2015) Løsningsforslag

Produkt informasjon 2009

KYBERNETIKKLABORATORIET. FAG: Industriell IT DATO: OPPG.NR.: LV4. LabVIEW Temperaturmålinger BNC-2120

Elektronikk og IT DIGITALTEKNIKK

Analog til digital omforming

EKSAMEN Løsningsforslag Emne: Fysikk og datateknikk

E K S A M E N S O P P G A V E

Analog til digital omforming

CodevisionAVR. Start CodevisionAVR. Velg Settings Terminal og sett opp kommunikasjonsparametrene som figur 1 viser. avrlab07a.doc HVE RI Arnfinn Lunde

Forelesning 5. Diverse komponenter/større system

EKSAMEN (Del 1, høsten 2015)

Høgskoleni østfold EKSAMEN. Dato: Eksamenstid: kl til kl. 1200

Dagens temaer. Dagens temaer hentes fra kapittel 3 i læreboken. Oppbygging av flip-flop er og latcher. Kort om 2-komplements form

EKSAMEN I FAG TFE4101 KRETS- OG DIGITALTEKNIKK

Bruk av interrupt og Timer i Arduino-program.

Oppgave Nr.og navn LABORATORIEØVELSE NR 6 Revidert utgave desember 2014 T. Lindem, K. Ø. Spildrejorde, M. Elvegård

Forelesning 7. Tilstandsmaskin

INF1411 Obligatorisk oppgave nr. 3

TELE2010A Digital Systemkonstruksjon

Det matematisk-naturvitenskapelige fakultet

Løsningsforslag til eksamen i INF2270

IN1020. Sekvensiell Logikk

Ultralydsensor. Introduksjon. Litt om ultralydsensorer. Arduino. Skrevet av: Martin Ertsås & Morten Minde Neergaard

Forelesning nr.13 INF 1411 Elektroniske systemer

Rapport Øving 2 TDT4258 Mikrokontroller Systemdesign

Avdeling for ingeniørutdanning Elektrogrunnlagslaboratoriet DIGITALE SYSTEMER

Eksamen i Elektronikk 24. Mai Løsningsforslag Knut Harald Nygaard

CLS. DMX16 16 kanals DMX Lys mikser. Bruksanvisning 2001 V1.0 Laget i Norge av Compact Light System AS office@cls.no

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

ENC ENKEL AKSE og KLIPPE LENGDE KONTROLLER for PLATESAKSER

! Ytelsen til I/O- systemer avhenger av flere faktorer: ! De to viktigste parametrene for ytelse til I/O er:

Forslag B til løsning på eksamen FYS august 2004

INF1510: Bruksorientert design

LØSNINGSFORSLAG 2006

Erik Grindheim - fagprøve Kildekode til mikrokontroller << led_ctrl.asm >> side 1/6.

INF2270. Sekvensiell Logikk

Dagens tema. Dagens tema hentes fra kapittel 3 i Computer Organisation and Architecture. Sekvensiell logikk. Flip-flop er. Tellere og registre

Eksamensoppgaven: Hele oppgavesettet består av 8 oppgaver. Hver oppgave har en %-angivelse som angir hvor mye den teller ved sensurering.

Kapittel 5 Tilstandsmaskin

WO 65 ONLINE WEATHER STATION

Kandidaten må selv kontrollerer at oppgavesettet er fullstendig. Innføring skal være med blå eller sort penn

Øvingsforelesning 5 Python (TDT4110)

Transkript:

Høgskolen i Østfold avdeling for Ingeniørfag EKSAMENSOPPGAVE Emne: IRE35113 / Kraftelektronikk og mikrokontrollere Lærer: Even Arntsen / 997 17 806 Åge T Johansen / 482 49 109 Grupper: 11ELE-D+ 11ELEY-D Dato: 19.12.2013 Tid: 09.00-13.00 Antall oppgavesider: 5 (med denne) Sensurfrist: 22.01.2014 Antall vedleggsider: 27 Vedlegg 1: Formler (3 sider) Vedlegg 2: Driverfunksjoner Vedlegg 3: TIMER 1 (10 sider) Vedlegg 4: ADC (6 sider) (8 sider) Hjelpemidler: Selvskrevet formelsamling og godkjent kalkulator KANDIDATENMÅ SELVKONTROLLEREAT OPPGAVESETITTERFULLSTENDIG Oppgave 1 Prosjektoppgave uten navn merkes med studentens eksamensnummer og leveres sammen med resten av besvarelsen.

Høgskolen i Østfold avdeling for Ingeniørfag 2 Oppgave 2 Figur 1 Vi har en vanlig enfase diodebru, med en drossel som sikrer glatt likestrøm. Nettspenningen U =230 V. Lasten R = 4,14 ohm. Hvor mye strøm får vi gjennom R? Det er for lite effektutvikling i R, i forhold til kravet, og vi kobler inn en brugren til, slik at vi får en trefaselikeretter. Nå er nettspenningen 400 V. Hvor stor effekt forbruker vi i R? I nettet har vi en induktans pr. fase Ls = 0,18 mh. Hva blir likestrømmen i kretsen nå? Som kjent vil en diode i en trefasekrets, ideelt lede i 120 grader. Finn et uttrykk for middelverdien av likestrømmen i en diode. Diodene i trefasebrua er i felles modul. Samlet tap i denne er 260 W. Termisk motstand mellom Si- sjiktet og kjøleflaten på modulen er RTHskca = 0,077 C/W. Kjøleflensen har en termisk motstand RTH=0,15 C/W. Med en omgivelsestemperatur på 30 C, hva blir temperaturen i Si- sjiktet?

Høgskolen i Østfold avdeling for Ingeniørfag 3 Oppgave 3 Figur 2. Likestrømsmotordrift Figur 2 viser en fremmedmagnetisert likestrømsmotor, som styres av en step-ned chopper. Styreprinsippet er baser på Puls Bredde Modulasjon. U = 100 V Vi vil styre spenningen over motoren mellom 0 og 75 V, innenfor hvilket intervall må vi kunne variere duty- cycelen? Vi benytter en IGBT. Hvilke positive egenskaper har denne sammenlignet med andre halvledere som er aktuelle alternativ? Hva er funksjonen til Cl? Det viser seg at man får spenningstransienter over dioden D1, ved påslag av 01. Dette skyldes et uheldig valg av diodetype. Forklar årsaken til transientene ut i fra karakteristikken til dioden. Det er ikke likegyldig hvordan kretsen arrangeres fysisk. Forklar hva man bør tilstrebe med hensyn til kritiske sløyfeareal, og lengde på ledere.

Høgskolen i Østfold avdeling for Ingeniørfag 4 Oppgave 4 Studer følgende C-program for ATMega32A på STK500, med LEDstilkoblet PORTD.Programmet benytter driverfunksjonene for Timer1 som er lagt som vedlegg til oppgaven. Klokkefrekvensen er 15 360 000 Hz. #include #include <avr/io.h> "../TCNT1_drv_m32.h" ISR (TIMER1_0VF_vect, ISR_BLOCK) TCNT1 = 65535-15000; // 2A16-15000 PORTD = 0xFF; int main(void) int16_t counter; DDRD= OxFF; TCNT1_Set_PRESCALER(TCNT1_stop_gc); // Stop klokke TCNT1_Set_WGM(TCNT1_WGM_normal_gc); // WGMnormal TCNT1_Set_COM1A(TCNT1_COM1A_00_gc); // COM1A normal TCNT1_Set_COM1B(TCNT1_COM1B_00_gc); // COM1B normal TCNT1_Clr_TOV1(); // Reset eventuelt flagg TCNT1_Enable_T0IE1(); // Enable TOV1 avbrudd TCNT1 = 65535-15000; // 2A16-15000 TCNT1_Set_PRESCALER(TCNT1_prescale_1024_gc); // Start klokke sei(); while(1) cli(); counter = TCNT1 - (65535-15000); if (counter > 7500) PORTD &= 0xFE; sei(); Programmet får &.1LEDtil å blinke. Hvilken LEDblinker? Med hvilken frekvens blinker denne? Hva er duty-cycle (buls-bredde-forholdet) for blinkingen. Programmet er avbruddsbasert. Hvilket avbrudd benyttes? Hva er betingelsen for at avbruddsrutinen skal starte for denne avbruddstypen? Hvorfor er kallene til cli() og sei() gjort i løkken i hovedprogrammet? Anta at du ikke har tilgang til driverfunksjonene som er vist i programmet. Skriv dette programmet på nytt ved å benytte kontrollregistrene til ATMega32A direkte.

Høgskolen i Østfold avdeling for Ingeniørfag 5 Oppgave 5 Du skal nå lage et enkelt system for å generere 3 PWM-signaler - R, G og B som skal benyttes til å styre ut 3 sett av lysdioder med hhv rødt, grønt og blått lys. Hensikten er å kunne framstille alle mulige fargesjatteringer i lyset fra lysdiodene. På grunn av tiden som er til rådighet på prøven, skal ikke alle forhold rundt dette løses her. (Du kan gå ut fra at lysdiodene er koblet direkte til PORTDpå en slik måte at de lyser når en 1 på aktuell bitposisjon blir sent til porten.) Tilkobling for signaler: R: PORTDbit 5 G: PORTDbit 6 B: PORTDbit 7 Frekvensen skal være den samme for alle pulsene: f p= 150 Hz Område for kontroll av pulsbredden 0 % - 99 %. I oppgaven skal Timerl benyttes i normalmodus, altså ikke i PWM-modus. Det betyr at programeksempelet i forrige oppgave også kan benyttes som utgangspunkt for denne oppgaven. Anta at puls-bredde-forholdet styres av tre globale variable pwm_r, pwm_g og pwm_b. I denne deloppgaven kan du sette disse variablene fast til henholdsvis 25 %, 50 % og 75 %. Skriv nå et program som styrer ut de tre diodesignalene (R, G, B) etter spesifikasjonene som er gitt her. (Det er fritt om du vil benytte funksjonsbiblioteket for Timerl eller om du vil benytte kontrollregistrene direkte.) Anta at signalene som skal sette variablene som er omtalt i forrige deloppgave stammer fra tre analoge signaler som styres fra 3 potensiometre. Alle analoge signaler varierer mellom 0 V og 2.56 V som tilsvarer hhv 0 % og 100 % puls-bredde-forhold. Du skal i denne deloppgaven kun betrakte det analoge signalet som styrer R (det røde lyset) på kanal ADC2. Skriv en utvidelse av programmet som leser inn analoge verdier fra potensiometeret og styrer lysdiodene ut fra disse verdiene. Alle tre dioder styres likt. Det er ikke nødvendig å skrive alle programlinjene på nytt i besvarelsen. Gjør rede for hva og hvor du må sette inn av nytt og hva du må slette/beholde fra forrige deloppgave. (Det er fritt om du vil benytte funksjonsbiblioteket kontrollregistrene direkte.) for ADC (vedlagt) eller om du vil benytte

Formelark side Vedlegg 1 Formelark. Kraftelektronikk Dette er ment som en hjelp til de som har "jernteppe". Således er ikke forutsetning for bruk av formelen tatt med. Ud = fotu(t)dt Middelverdi URMS= T JO ft u 2(t) dt Effektivverdi Ud= 0,9U 5 Middelverdi, diodebru, &ifase Ud=0,9U,cos(a) Middelverdi, tyristorbru, &ifase 2wLsId 2Xkld It n- Kommuteringsspenningsfall, &Ifase Is = Id Vekselstrøm, &Ifase = )91d Grunnharmonisk, &ifase Ud= 1,35U 5 Middelverdi, diodebru, trefase Ud=1,35Uscos(a) Middelverdi, tyristorbru, trefase 3wLs/d 3Xkld Kommuteringsspenningsfall, trefase 2xkid cosii = 1 Kommuteringsvinkel. (Merk X k = (i)ls) = 0,8164 Effektivverdi. Trefase vekselstrøm 41. = 0,78Id Grunnharmonisk. Trefase vekselstrøm U2 = U1D Step-ned chopper AU2 =2 (1 D) Rippel, step-ned U2 8LC U2 = 1 D AU2 DTs U2 RC Step-up Rippel, step-up

Formelark side N1 D " N2 1 D Fly-back U2 = D N 2 Forward Asynkronmaskin: cos= K1f ( ds COr S = ws f2= sft Ui K2øagf /2 Ks Qiag f2 Tem 1(61Øtgf2 Im = Kgøag 2 sinus nia = r, trekant PBM, amplitudemodulasjonsindeks m ftrekant fsinus PBM, frekvensmodulasjonsindeks Likestrømsmaskin: E = wk1ø ø = K2I,n Ten, = 1(31a(2) di, U = Raia + La= + E dt

Formelark side P = V-5111coscp Q = - 111Isincp P PF =,, DPF = coscp1 Generell trefase Generell trefase Effektfaktor Forskyvningseffektfaktor 1 1 1 is =.N/. 0,781d(sin(wt) sin(5wt) + 7sin(7wt) Tisin(11wt) 5 1 + -5.sin(13wt).. +) Fourerrekke til vekselstrøm i trefase likeretter 1r2-. 0,78/ 1 1 1 i s = d (sin(o)t) 1 sin(11wt) + 13sin(13w0 3 sin(23(a) Al 1 + sin(25wt).. +) Fourierrekke til vekselstrøm i tolvpuls likeretter

Vedlegg 2 C:\Users\aa*\Desktop\ADC drv m32.h 1 /**************************************************************************** ADC_driver.h #ifndefadc_driver_h #defineadc_driver_h /**************************************************************************** IncludeFiles #include<avr/io.h> //Changeaccordingto device #include<avr/interrupt.h> /**************************************************************************** Macrodefinitions ****************************************************************************/ #defineadc_enable() do ADCSRA1= (1 «ADEN); while(0) #defineadc_disable() do ADCSRA&= UINT8_C(1«ADEN); while(0) #defineadc_reset() do ADCSRA= 0; ADMUX= 0; SFIOR&= UINT8_C(ADC_TS_gm); while(0) #defineadc_setadlar() do ADMUX 1= (1 «ADLAR); while(0) #defineadc_clradlar() do ADMUX&= UINT8_C(1«ADLAR); while(0) #defineadc_setadie()do ADCSRA1= (1 «ADIE); while(0) #defineadc_clradie()do ADCSRA&= UINT8_C(1«ADIE); while(0) #defineadc_clradif() do ADCSRA1= (1 «ADIF); while(0) /**************************************************************************** Functiondefinitions //void ADC_setup(uint8_t chan,uint8_tvref,uint8_tpre,uint8_tie); void ADC_setAuto(uint8_t trigsrc); int16_tadc_read1o(void); uint8_tadc_read8(void); void ADC_startSingle(void); //void ADC_disable(); uint8_tadc_inprogress(void); uint8_tadc_if(void); void ADC_setChannel(uint8_t chan); void ADC_setVref(uint8_t vref); void ADC_setPrescaler(uint8_t pre); /**************************************************************************** Dataregisters: ADCH ADCL ****************************************************************************/ /**************************************************************************** Control& Statusregisters: ADMUX : Bit 7 6 5 4 3 2 1 O REFS1REFSOADLARMUX4MUX3MUX2MUX1MUXO REFS1REFSO:VoltageReferenceSelection ADLAR: ADC LeftAdjustResult MUX4:0: AnalogChanneland GainSelectionBits ADCSRA:Bit 7654321 ADENADSCADATEADIFADIEADPS2ADPS1ADPSO ADEN:ADC Enable ADSC:ADC StartConversion ADATE:ADC AutoTriggerEnable ADIF:ADC InterruptFlag ADIE:ADC InterruptEnable ADPS2:0:ADC PrescalerSelectBits SFIOR: ADTS2ADTS1ADTSO- * * *

C:\Users\aa'\Desktop\ADC dry m32.h 2 ADTS2:0: ADC Auto Trigger Source ****************************************************************************/ /**************************************************************************** Interrupt vetors: ADC_vect - ADC complete ****************************************************************************/ /**************************************************************************** Bit and byte definitions #define ADC_Ref_AREF_gc ((e «REFS1) + (0 «REFS0)) #define ADC_Ref_AVCC_gc ((ø «REF51) + (1 «REFS0)) #define ADC_Ref_Reserved_gc ((1 «REF51) +(E, «REFS0)) #define ADC_Ref_Internal_gc ((1 «REF51) + (1 «REFSØ)) #define ADC_Ref_gm ((1 «REFS1) + (1 «REFSØ)) #define ADC_prescale_2_gc ((0 «ADPS2) + (0 «ADPS1) + (1 «ADPSØ)) #define ADC_prescale_4_gc ((0 «ADPS2) + (1 «ADPS1) + (0 «ADPS0)) #define ADC_prescale_8_gc ((ø «ADP52) + (1 «ADPS1) + (1 «ADPSØ)) #define ADC_prescale_16_gc ((1 «ADP52) + (0 «ADP51) + (0 «ADPS0)) #define ADC_prescale_32_gc ((1 «ADPS2) + (ø «ADP51) + (1 «ADP50)) #define ADC_prescale_64_gc ((1 «ADPS2) + (1 «ADP51) + (0 «ADP50)) #define ADC_prescale_128_gc ((1 «ADPS2) + (1 «ADPS1) + (1 «ADP50)) #define ADC_prescale_gm ((1 «ADPS2) + (1 «ADPS1) + (1 «ADPS0)) #define ADC_TS_FreeRunning_gc ((ø «ADTS2) + (ø «ADTS1) +(ø «ADT50)) #define ADC_TS_ExtInte_gc ((0 «ADTS2) + (ø «ADTS1) +(1 «ADTSØ)) #define ADC_TS_AnalogComp_gc ((ø «ADTS2) + (1 «ADT51) +(ø «ADTS0)) #define ADC_TS_T0Compare_gc ((ø «ADTS2) + (1 «ADT51) +(1 «ADTSØ)) #define ADC_TS_TOOvf_gc ((1 «ADTS2) + (0 «ADTS1) +(ø «ADTSØ)) #define ADC_TS_T1Compare_gc ((1 «ADTS2) + (0 «ADTS1) +(1 «ADTSØ)) #define ADC_TS_TlOvf_gc ((1 «ADT52) + (1 «ADTS1) +(ø «ADTS0)) #define ADC_TS_TlCapt_gc ((1 «ADTS2) + (1 «ADTS1) +(1 «ADTSØ)) #define ADC_TS_gm ((1 «ADTS2) + (1 «ADTS1) +(1 «ADTS0)) #define ADC_CH_Sø_gc((0 «MUX4)+(0 «MUX3)+(0 «MUX2)+(0 «MUX1)+(e «MUX0)) #define ADC_CH_S1_gc((0 «MUX4)+(0 «MUX3)+(0 «MUX2)+(0 «MUX1)+(1 «MUX0)) #define ADC_CH_S2_gc((0 «MUX4)+(0 «MUX3)+(0 «MUX2)+(1 «MUX1)+(0 «MUX0)) #define ADC_CH_S3_gc((0 «MUX4)+(0 «MUX3)+(0 «MUX2)+(1 «MUX1)+(1 «MUXØ)) #define ADC_CH_S4_gc((0 «MUX4)+(0 «MUX3)+(1 «MUX2)+(0 «MUX1)+(0 «MUX0)) #define ADC_CH_55_gc((0 «MUX4)+(0 «MUX3)+(1 «MUX2)+(0 «MUX1)+(1 «MUX0)) #define ADC_CH_S6_gc((0 «MUX4)+(e «MUX3)+(1 «MUX2)+(1 «MUX1)+(0 «MUXØ)) #define ADC_CH_S7_gc((0 «MUX4)+(e «MUX3)+(1 «MUX2)+(1 «MUX1)+(1 «MUX0)) #define ADC_CH_PeN0_10_gc((0 «MUX4)+(1 «MUX3)+(0 «MUX2)+(0 «MUX1)+(0 «MUX0)) #define ADC_CH_P1N0_10_gc((ø «MUX4)+(1 «MUX3)+(0 «MUX2)+(0 «MUX1)+(1 «MUX0)) #define ADC_CH_PON0_200_gc ((0 «MUX4)+(1 «MUX3)+(0 «MUX2)+(1 «MUX1)+(e «MUX0)) #define ADC_CH_P1Ne_200_gc ((0 «MUX4)+(1 «MUX3)+(0 «MUX2)+(1 «MUX1)+(1 «MUX0)) #define ADC_CH_P2N2_10_gc((ø «MUX4)+(1 «MUX3)+(1 «MUX2)+(0 «MUX1)+(0 «MUX0)) #define ADC_CH_P3N2_10_gc((0 «MUX4)+(1 «MUX3)+(1 «MUX2)+(0 «MUX1)+(1 «MUX0)) #define ADC_CH_P2N2_200_gc ((ø «MUX4)+(1 «MUX3)+(1 «MUX2)+(1 «MUX1)+(0 «MUXØ)) #define ADC_CH_P3N3_200_gc ((0 «MUX4)+(1 «MUX3)+(1 «MUX2)+(1 «MUX1)+(1 «MUXØ)) #define ADC_CH_PON1_gc((1 «MUX4)+(0 «MUX3)+(e «MUX2)+(0 «MUX1)+(0 «MUX0)) #define ADC_CH_P1N1_gc((1 «MUX4)+(0 «MUX3)+(0 «MUX2)+(0 «MUX1)+(1 «MUXØ)) #define ADC_CH_P2N1_gc((1 «MUX4)+(0 «MUX3)+(0 «MUX2)+(1 «MUX1)+(0 «MUX0)) #define ADC_CH_P3N1_gc((1 «MUX4)+(0 «MUX3)+(0 «MUX2)+(1 «MUX1)+(1 «MUX0)) #define ADC_CH_P4N1_gc((1 «MUX4)+(0 «MUX3)+(1 «MUX2)+(0 «MUX1)+(0 «MUX0)) #define ADC_CH_P5N1_gc((1 «MUX4)+(0 «MUX3)+(1 «MUX2)+(0 «MUX1)+(1 «MUXØ)) #define ADC_CH_P6N1_gc((1 «MUX4)+(0 «MUX3)+(1 «MUX2)+(1 «MUX1)+(e «MUX0)) #define ADC_CH_P7N1_gc((1 «MUX4)+(0 «MUX3)+(1 «MUX2)+(1 «MUX1)+(1 «MUX0)) #define ADC_CH_P0N2_gc((1 «MUX4)+(1 «MUX3)+(0 «MUX2)+(0 «MUX1)+(0 «MUXØ)) #define ADC_CH_P1N2_gc((1 «MUX4)+(1 «MUX3)+(0 «MUX2)+(0 «MUX1)+(1 «MUXØ)) #define ADC_CH_P2N2_gc((1 «MUX4)+(1 «MUX3)+(0 «MUX2)+(1 «MUX1)+(e «MUXØ)) #define ADC_CH_P3N2_gc((1 «MUX4)+(1 «MUX3)+(0 «MUX2)+(1 «MUX1)+(1 «MUXØ)) #define ADC_CH_P4N2_gc((1 «MUX4)+(1 «MUX3)+(1 «MUX2)+(0 «MUX1)+(0 «MUXØ)) #define ADC_CH_P5N2_gc((1 «MUX4)+(1 «MUX3)+(1 «MUX2)+(0 «MUX1)+(1 «MUX0)) #define ADC_CH_Vbg_gc((1 «MUX4)+(1 «MUX3)+(1 «MUX2)+(1 «MUX1)+(0 «MUX0)) #define ADC_CH_GND_gc((1 «MUX4)+(1 «MUX3)+(1 «MUX2)+(1 «MUX1)+(1 «MUX0)) #define ADC_CH_gm((1 «MUX4)+(1 «MUX3)+(1 «MUX2)+(1 «MUX1)+(1 «MUX0)) #endif

C:\Users\aa'\Desktop\ADC drv_m32.c 1 /**************************************************************************** ADC_driver.c #include<avr/io.h> #include<stdint.h> #include"hiofdefs.h" #include"adc_drv_m32.h" voidadc_setauto(uint8_t trigsrc) uint8_tmadcsra; SFIOR = (SFIOR& UINT8_C(7«ADTS0))1 (trigsrc«adts8); madcsra = ADCSRA; madcsra1= UINT8_C(1«ADATE);// Set autotrig madcsra1= UINT8_C(1«ADIF); // ClearInterruptflag ADCSRA = madcsra; int16_tadc_read1o(void) ø uint16_thi, lo; lo = ADCL& OxFF; hi = ADCH& oxff; if((admux& (1 «ADLAR))== o) // ADLAR== e return(hi«8) + lo; else// ADLAR== 1 return(hi «2) + (lo» 6); uint8_tadc_read8(void) uint8_thi, lo; lo = ADCL& oxff; hi = ADCH& oxff; if((admux& (1 «ADLAR))== (3)// ADLAR== ø return(hi «6) + (lo» 2); else return(adch); voidadc_startsingle(void) ADCSRA1= (1 «ADSC); uint8_tadc_inprogress(void) return(adcsra& (1 «ADSC))!= false; uint8_tadc_if(void) return(adcsra& (1 «ADIF))!= false; voidadc_setchannel(uint8_t chan) ADMUX = (ADMUX& ADC_CH_gm)1 (chan);

C:\Users\aa'\Desktop\ADC_drv_m32.c voidadc_setvref(uint8_t vref) ADMUX = (ADMUX& ADC_Ref_gm)1 (vref); voidadc_setprescaler(uint8_t pre) ADCSRA = (ADCSRA&= ADC_prescale_gm) 1 pre;

C:\Users\aa'\Desktop\TCNT1 drv m32.h 1 #include<avr/io.h> #ifndefincfile1_h_ #defineincfile1_h_ #definetcnt1_stop_gcoxøø #definetcnt1_prescale_l_gcexel #definetcnt1_prescale_8_gcex02 #definetcnt1_prescale_64_gc0x83 #definetcnt1_prescale_256_gc0x04 #definetcnt1_prescale_1024_gc 0>:05 #definetcnt1_t1neg_gcex06 #definetcnt1_tlpos_gc0x07 #definetcnt1_prescale_gm0h<87 #definetcnt1_prescale_bpexøø #definetcnt1_com1a_00_gc ((0 «COM1A1) (ø «COM1AØ)) #definetcnt1_com1a_0l_gc ((0 «COM1A1) (1 «COM1A0)) #definetcnt1_com1a_10_gc ((1 «COM1A1) (0 «COM1AO)) #definetcnt1_com1a_11_gc ((1 «COM1A1) (1 «COM1AØ)) #definetcnt1_com1a_gm((1 «COM1A1) (1 «COM1A0)) #definetcnt1_com113_00_gc ((E)«COM1B1) (Ø «COM1BO)) #definetcnt1_com1b_01_gc ((0«COM1B1) (1 «COM1B0)) #definetcnt1_com1b_le_gc ((1 «COM1131) (ø «COM1B0)) #definetcnt1_com1b_11_gc ((1 «COM1B1) (1 «COM1Bø)) #definetcnt1_com1b_gm((1 «COM1B1) (1 «COM1BO)) #definetcnt1_no_pwm_oc1a_gctcnt1_com1a_00_gc #definetcnt1_normal_pwm_oc1a_gctcnt1_com1a_l0_gc #definetcnt1_inverted_pwm_oc1atcnt1_com1a_11_gc #definetcnt1_no_pwm_oc1b_gctcnt1_c0m1b_00_gc #definetcnt1_normal_pwm_oc1b_gctcnt1_com1b_10_gc #definetcnt1_inverted_pwm_oc1btcnt1_com18_11_gc #definetcnt1_wgm_normal_gc((ø «WGM13)I(ø «WGM12)I(ø «WGM11)I(ø «W WGM10)) #definetcnt1_wgm_phase_correct_8_bit_gc((ø «WGM13)I(0 «WGM12)I(ø «WGM11)I(1 «W WGM10)) #definetcnt1_wgm_phase_correct_9_bit_gc((ø «WGM13)I(0 «WGM12)I(1 «WGM11)I(0 «W WGM10)) #definetcnt1_wgm_phase_correct_10_bit_gc((0 «WGM13)I(ø «WGM12)I(1 «WGM11)I(1 «W WGM1ø)) #definetcnt1_wgm_ctc_ocr1a_gc((0 «WGM13)I(1 «WGM12)I(0 «WGM11)I(0 «W WGM10)) #definetcnt1_wgm_fast_pwm_8_bit_gc((ø «WGM13)I(1 «WGM12)I(ø «WGM11)I(1 «W WGM10)) #definetcnt1_wgm_fast_pwm_9_bit_gc((ø «WGM13)I(1 «WGM12)I(1 «WGM11)I(0 «W WGM10)) #definetcnt1_wgm_fast_pwm_l0_bit_gc((0 «WGM13)I(1 «WGM12)I(1 «WGM11)I(1 «W WGM10)) #definetcnt1_wgm_phase_and_frequency_correct_icr1_gc((1 «WGM13)I(0 «WGM12)I(ø «WGM11)I(0 «W WGM1Ø)) #definetcnt1_wgm_phase_and_frequency_correct_ocr1a_gc((1 «WGM13)I(ø «WGM12)(ø «WGM11)I(1 «W WGM1ø)) #definetcnt1_wgm_phase_correct_icr1_gc((1 «WGM13)I(ø «WGM12)I(1 «WGM11)(0 «W WGM1O)) #definetcnt1_wgm_phase_correct_ocr1a_gc((1 «WGM13)I(0 «WGM12)I(1 «WGM11)I(1 «W WGM1O)) #definetcnt1_wgm_ctc_icr1_gc((1 «WGM13)I(1 «WGM12)I(ø «WGM11)I(ø «W WGM1O)) #definetcnt1_wgm_reserved_gc((1 «WGM13)I(1 «WGM12)I(ø «WGM11)I(1 «W WGM1ø)) #definetcnt1_wgm_pwm_icr1_gc((1 «WGM13)I(1 «WGM12)I(1 «WGM11)I(ø «W WGM1Ø)) #definetcnt1_wgm_fast_pwm_ocr1a_gc((1 «WGM13)I(1 «WGM12)I(1 «WGM11)I(1 «W WGM10)) #definetcnt1_wgm_gm((1 «WGM13)I(1 «WGM12)I(1 «WGM11)I(1 «W WGM1ø)) #definetcnt1_wgm_tccr1a_gm((0 «WGM13)I(ø «WGM12)(1 «WGM11)I(1 «W WGM1ø))

C:\Users\aa'\Desktop\TCNT1 drv m32.h 2 #definetcnt1_wgm_tccr1b_gm ((1 «WGM13)1 (1 «WGM12)1 (0 «WGM11)I (0 «kl WGM10)) #definetcnt1_is_icf1()((tifr& (1 «ICF1))!= 0) #definetcnt1_is_ocf1a() ((TIFR& (1 «OCF1A))!= 0) #definetcnt1_is_ocf1b() ((TIFR& (1 «OCF1B))!= 0) #definetcnt1_is_tov1()((tifr& (1 «TOV1))!= 0) #definetcnt1_wait_icf1()do while((tifr& (1 «#definetcntl_wait_ocf1a() do while((tifr& (1 «#definetcnt1_wait_ocf1b() do while((tifr& (1 «#definetcnt1_wait_tov1()do while((tifr& (1 «ICF1))== 0) ; while(0) OCF1A))== 0) ; while(0) OCF1B))== 0) ; while(0) TOV1))== 0) ; while(0) #definetcnt1_enable_output_oc1a() (DDRD= DDRD 1 (1 «#definetcnt1_enable_output_oc1b() (DDRD= DDRD 1 (1 «DDRD5)) DDRD4)) #definetcnt1_clr_tov1() do TIFR= (1 «TOV1); while(0) voidtcnt1_set_wgm(uint8_twgm); /* SETTINGPRESCALERBITS Registers:TCCR1B wgm: 3 bit wordfromtable16.6 in doc8155.pdf */ voidtcnt1_set_prescaler (uint8_tpresc); /* SETTINGCOMPAREOUTPUTMODE BITSA Registers:TCCR1A com1a:2 bit word fromtables16.2-16.4in doc8155.pdf */ voidtcnt1_set_com1a (uint8_tcom1a); /* SETTINGCOMPAREOUTPUTMODE BITSB Registers:TCCR1A com1b:2 bit word fromtables16.2-16.4in doc8155.pdf */ voidtcnt1_set_com1b (uint8_tcom1b); voidtcnt1_enable_ticie1(void); voidtcnt1_disable_ticie1(void); voidtcnt1_enable_ocie1a(void); voidtcnt1_disable_ocie1a(void); voidtcnt1_enab1e_ocie1b(void); voidtcnt1_di5ab1e_ocie1b(void); voidtcnt1_enable_toie1(void); voidtcnt1_disable_toie1(void); #endif/* INCFILE1_H_*/

C:\Users\aa'\Desktop\TCNT1_drv_m32.c 1 #include"tcnt1_drv_m32.h" voidtcnt1_pwm_phase_and_freq_correct_set_rate(uint8_t ratio) OCR1B= (ratio* ICR1)/ 108; voidtcnt1_pwm_phase_and_freq_correct_init(uints_t presc,uint16_ttop ) uint8_tb2, bl, bø; bø = (presc» 0) & 1; bl = (presc» 1) & 1; b2 = (presc» 2) & 1; TCCR1A= (ø «WGM11) 1 (ø «WGM18) // PWM - Phaseand Fre.correct:ICR1-> TOP 1 (ø «FOC1A) 1 (Ø «FOC1B) 1 (0 «COM1A1)1 (0 «COM1A0) // No output 1 (1 «COM1B1)1 (0 «COM1130);// NormalPWM-output TCCR1B= (0 «ICNC1) // IC noisecanceler 1 (8 «ICES1) // InputCaptureEdgeSelect 1 (1 «WGM13) 1 (ø «WGM12) // PWM - Phaseand Fre.correct:ICR1 -> TOP 1 (b2«cs12 ) 1 (b1 «CS11 ) 1 (b0 «CS1O ); // PRESCALER8 x TCNT1 = 0; // initialvalueof T/C1 ICR1 = top; // initialvalueof TOP (9600givesFpwm=188Hz) OCR1B = top/2; // initialvalueof Comparereg.B (50%) DDRD = DDRD 1 (1 «DDRD4); /* SETTINGWGM BITS Registers:TCCR1A,TCCR1B wgm:4 bit wordfromtable16.5in doc8155.pdf- use predefinedconstants */ voidtcnt1_set_wgm(uint8_twgm) TCCR1A= (TCCR1A& --TCNTl_WGM_TCCR1A_gm) 1 (wgm& TCNT1_WGM_TCCR1A_gm); TCCR1B= (TCCR1B& --TCNT1_WGM_TCCR1B_gm) 1 (wgm& TCNT1_WGM_TCCR1B_gm); /* SETTINGPRESCALERBITS Registers:TCCR1B wgm: 3 bit wordfromtable16.6in doc8155.pdf */ voidtcnt1_set_prescaler (uint8_tpresc) TCCR1B= (TCCR1B& TCNT1_prescale_gm) 1 (presc); /* SETTINGCOMPAREOUTPUTMODE BITSA Registers:TCCR1A com1a:2 bit word fromtables16.2-16.4in doc8155.pdf */ voidtcnt1_set_com1a (uint8_tcom1a) TCCR1A= (TCCR1A& -,TCNT1_COM1A_gm) 1 com1a; /* SETTINGCOMPAREOUTPUTMODE BITSB Registers:TCCR1A com1b:2 bit word fromtables16.2-16.4in doc8155.pdf */ voidtcnt1_set_com1b (uint8_tcom1b) TCCR1A= (TCCR1A& TCNT1_COM1B_gm) 1 com1b; voidtcnt1_enab1e_ticie1(void)

C:\Users\aa'\Desktop\TCNT1_drv_m32.c 2 TIMSK= TIMSK I (1 «TICIE1); voidtcnt1_d1sab1e_ticie1(void) TIMSK= TIMSK& (1 «TICIE1); voidtcntl_enab1e_ocie1a(void) TIMSK= TIMSK I (1 «OCIE1A); voidtcnt1_disab1e_ocie1a(void) TIMSK= TIMSK& (1 «OCIE1A); voidtcnt1_enab1e_ocie1b(void) TIMSK= TIMSK I (1 «OCIE1B); voidtcnt1_disab1e_ocie1b(void) TIMSK= TIMSK& (1 «OCIE1B); voidtcnt1_enab1e_toie1(void) TIMSK= TIMSK I (1 «TOIE1); voidtcntl_disab1e_toie1(void) TIMSK= TIMSK& (1 «TOIE1); ø

Vedlegg 3 HØGSKOLEN I ØSTFOLD AVDELING FOR INGENIØRFAG / ELEKTRO / DIGITAL ELEKTRONIKK 3.1 Oversikt Dette er en beskrivelse av funksjonsregistre og virkemåte for de mest anvendte funksjonene i timere/tellere for AVR-familien av mikrokontrollere. Følgende funksjonsenheter beskrives: Timer_O (8 bit) Timer_1 (16 bit) Timer_2 (8 bit) TIMER 0 TIMER 1 - high TIMER 1 - low TIMER 2 Figur 3.3: De 3 timer-enhetene som finnes i de mest anvendte AVR-kontrollerne. Innledningsvis vises de mest aktuelle funksjonsregistrene med symbolske navn på de enkelte bit. Disse navnene benyttes i ATMEL's dokumentasjon og også i headerfiler som følger WinAVR GCC-kompilator og assembleren i AVR Studio 4. NB! Vær oppmerksom på at bitposisjonene for kontrollbit med samme navn forandrer seg mellom kontrollertypene - f. eks. mellom at90s8515 og ATMega32. Det er derfor en stor fordel å benytte de symbolske navnene framfor numeriske konstanter. De viste registrene i dette kapittelet er fra dokumentasjonen for ATMega32. Sjekk alltid med originalt datablad (avrm3209) før du benytter registrene i et program. 3.1.1 Avbruddsrelaterte registre Følgende to register vil være sentrale i beskrivelsen for flere av AVR-familens timerkretser og gjengis derfor her i oversiktsdelen. TIMSK (Timer Interrupt Mask Register). Dette registeret kontrollerer hvilke avbruddsfunksjoner som skal tillates. En ener på angitte posisjon vil åpne for vedkommende avbrudd. Om avbruddet virkelig skal utføres, avhenger også av om det globale l-flagget i statusregisteret (SREG) er satt til 1. Setting og nullstilling av l-flagg utføres vedhjelp av makroene sei() og cii(). $39 ($59) OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 TIMSK Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 3.4: Timer Interrupt Mask Register TIFR(Timer Interrupt Flag Register). Dette registeret forteller hvilke fysiske avbrudd som har inntruffet. En ener på angitte posisjon angir dette. De enkelte bit i dette registeret settes automatisk til 1, men kan nullstilles fra programvare ved polling eller automatisk når avbruddsmekanismen benyttes. NB! TIFRer spesielt ved at et bit nullstilles ved å skrive en 1-er til vedkommende bitposisjon. FORFATTER: 48 DATO:

HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAG ELEKTRO/ DIGITAL ELEKTRONIKK $38 ($58) OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOVO TIFR Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 3.5: Timer Interrupt Flag Register De enkelte bit i disse registre skal omtales etter hvert som de benyttes i eksempler. En skisse av disse TIMASK og TIFR vil også gjentas i tilknytning til hver teller i det neste avsnittene. 3.2 Timer 0 I dette dokumentet beskrives kun de mest grunnleggende egenskapene til Tim _0. I praksis 3.2. Generelt ar Timer_O og Timer_2 mange av de samme funksjonene. Timer_O e en 8-bits timer/teller som kan telle fra 0 til OxFF. Neste kl kepuls etter at toppverdien FF er nådd, fører til overflow; dvs. tellerverdien set s tilbake til 0. Timer_O overflow kan tri et avbrudd hvis det eller er klargjort for det I timer-modus benytt et internt klokkesignal, mens det i t er-modus benyttes et eksternt klokkesignal på PBO kalt. Begge operasjonsmodi blir b krevet. Begge modi kan benyttes både med avbruddsstyring o med polling. TCNTO - telleverdi 255/ OxFF 0 Tid OVO TOVO TOVO Figur 3.6: Ti spunkter for TOVO-avbruddvedfull tellesekvens r Timer 0. Figuren ovenfor v. er at avbruddshendelsen TOVO inntrer hver gang Timer_ år ovetflow. Figuren nede r viser et relativt detaljert blokkskjema for Timer_0. I figuren ska erstattes med 0 i reg. ernavnene. FORFATTER: 49 DATO:

HØGSKOLENI ØSTFOLD AVDELING FORINGENIØRFAG ELEKTRO/ DIGITAL ELEKTRONIKK 3.3 Timer_l 3.3.1 Generelt motsetning til Timer_O og Timer_2, er Timer_1 en 16-bits teller (timer). Derfor kan Timer_1 benyttes i anvendelser der lengre tellesekvenser er nødvendig ønskelig. Tellesekvensen strekker seg fra Ox0000 til OxFFFFog så direkte tilbake til Ox0000 (overflow). Timer_1 realiseres ved hjelp av to sammenkoblede 8-bits tellerregistre (TCNT1Hog TCNT1L).For øvrig tilbyr Timer_1 også funksjonene "output compare" og "input capture" i tillegg til en PWM utgang (puls-bredde-modulert utgang). TCNT1 - telleverdi FFFF 0000 Tid viv ylv TOV1 TOV1 TOV1 Figur 3.15: Tidspunkterfor TOV1-avbrudd vedfull tellesekvensfor Timer 1. Timer_1 kan også settes opp til å telle både oppover og nedover, selv om dette ikke vises i programeksemplene. Blokkskjemaet for Timer_1 vises nedenfor, der n skal erstattes med 1. FORFATTER: 57 DATO:

HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAGI ELEKTRO DIGITA1ELEKTRONIKK Count Clear Chrectort Control Log,c C TOVn Cleck Saiect E. DiNiziar Tn TOP BOTTOM TirtNeriCourqur TCNTn = (Frcrn Proscaw OCnA (Irt Rez Vålvef fr ratfl OCnA OCRnA TOP VaIulas OCnB (Int.Rez ) V4v6fDrni Gir.43rafion OCnB OCRnB CFn (IrtRa;.) Arakcs CDmparatr CRn Ej;i1 Datoctof NO Sli Canze4r CPn TOCRnA TCCRnB Figur 3.16: Blokkskjemafor Timer 1. (avrm3209) Som det framgår av figuren er Timer_1 en mer komplisert konstruksjon enn Timer_O. Vi kjenner likevel igjen binærtelleren TCNT1 (16 bit). Vi identifiserer også: 2 x output compare registre: OCR1A, OCR1B 1 x input capture register: ICR1 1 x ekstern telleinngang: T1 1 x ekstern capture inngang: ICP1 2 x eksterne utganger fra output compare enhetene: OC1A, OC1B 2 x kontrollregistre TCCR1A, TCCR1B Merk at alle dataregistrene er dobbeltregistre (2 x 8 bit) og må programmeres byte for byte med assemblyinstruksjoner. C-kompilatoren lar oss imidlertid jobbe direkte mot 16 bits registre, uten å måtte dele de opp. Dette sparer oss for en del brydderi. Kontrollregistrene er 8-bits registre på vanlig vis. 3.3.2 Funksjonsregistre TCNT1 (Timer Register 1). Dette er et sammensatt register på til sammen 16 bit. Registeret innholder aktuell telleverdi for Timer_1. Fysisk sett er TCNT1 bygget opp av to 8 bits registre TCNT1H (high byte) og TCNT1L (low byte). Disse må programmeres og avleses i en bestemt sekvens for at riktig verdier skal garanteres. FORFATTER: 58 DATO:

HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAG ELEKTRO DIGITALELEKTRONIKK Ved programmering (skriving): Skriv først til TCNT1H Deretter til TCNT1L Ved lesing: Les først fra TCNT1L Deretter fra TCNT1H Disse prosedyrene fører til at alle 16 bit skrives og leses samtidig fra de fysiske registrene. Et C-program refererer som regel til alle 16 bit samtidig ved å angi TCNT1. Kompilatoren ordner med den riktige lese- eller skrivesekvensen av 8-bitsregistrene etter de angitte regler. Timer_1 kan klokkes av et utvalg klokkekilder som velges i kontrollregister TCCR1B. $2D ($4D) MSB TCNT1H Read/Write R/W R/W R/W R/W R/W R/W R/W R/W $2C ($4C) LSB TCNT1L Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 3.17: Timer/Counter 1. OCR1A (Output Compare Register A) Dette registeret er et 16-bits dobbelregister som består av OCR1AH og OCR1AL. Programmering og lesing av disse registrene må utføres i henhold til metoden som er beskrevet for TCNT1 ovenfor. Registerets innhold sjekkes kontinuerlig mot innholdet av TCNT1 (hardwaremessig). Bit OCF1A I flaggregisteret TIFR settes til 1 så snart match inntreffer. Et "output compare" avbrudd vil trigges hvis bit OCIE1A i maskeregisteret TIMSK er satt til 1. OCF1A må nullstilles fra programmet om man benytter polling. OCF1A resettes automatisk ved bruk av avbrudd. $2B ($4B) MSB OCR1AH Read/Write R/W R/W R/W R/W R/W R/W R/W R/W $2A ($4A) LSB OCR1AL Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 3.18: Output Compare RegisterA FORFATFER: 59 DATO:

HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAGI ELEKTRO/ DIGITAL ELEKTRONIKK OCR1B (Output Compare Register B) Dette registeret er et 16-bits dobbelregister som er organisert og virker på samme måte som OCR1A. De aktuelle bit i TIFR og TIMSK registrene er henholdsvis OCF1B og OCIE1B. $29 ($49) MSB OCR1BH Read/Write R/W R/W R/W R/W R/W R/W R/W R/W $28 ($48) LSB OCR1BL Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 3.19: Output Compare Register B ICR1 (Input Capture Register) Dette registeret er et 16-bits dobbelregister. Registeret klokkes av et ytre signal fra pinne ICP. Når registeret klokkes, kopieres innholdet fra TCNT1 direkte inn i ICR1 (alle 16 bit samtidig). Det blir altså mulig å fryse telleverdien i TCNT1 ved hjelp av et ytre signal. Igjen er det viktig at de to 8-bitsregistrene som ICR1 består av leses av i riktig rekkefølge som forklart for TCNT1 ovenfor. $27 ($47) MSB ICR1H Read/Write R/W R/W R/W R/W R/W R/W R/W R/W $26 ($46) LSB ICR1L Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 3.20: Input Capture Register TCCR1A (Timer/Counter Control Register A) Innholdet av dette registeret styrer store deler av "output compare" og PWM funksjonaliteten til Timer_1. De enkelte kontrollbit beskrives nærmere i forbindelse med de enkelte operasjonsmodi. $2F ($4F) COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 TCCR1A Read/Write R/W R/W R/W R/W W W R/W R/W Figur 3.21: Timer/Counter 1 Control RegisterA. FORFATTER: 60 DATO:

HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAG ELEKTROI DIGITAL ELEKTRONIKK TCCR18(Timer/Counter Control Register B) Innholdet av dette registeret styrer "input capture" funksjonen, valg av klokkesignal til Timer_1. Et kontrollbit, CTC1, er også med på bestemme noe av funksjonaliteten i "output compare" modus. De enkelte kontrollbit beskrives nærmere i forbindelse med de enkelte operasjonsmodi. $2E ($4E) ICNC1 ICES1 WGM13 WGM12 CS12 CS11 CS10 TCCR1B Bit Read/Write R/W R/W R R/W R/W R/W R/W R/W TIMSK (Timer Interrupt Mask Register). Figur 3.22: Timer/Counter 1 Control Register B. 7 6 5 4 3 2 1 0 $39 ($59) OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 TIMSK Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 3.23: Timer Interrupt Mask Register. TIFR(Timer Interrupt Flag Register). $38 ($58) OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOVO TIFR Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figuren Figur 3.24: Timer Interrupt Flag Register. nedenfor viser inn- og utganger tilknyttet Timer_1. FORFATTER: 61 DATO:

HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAGELEKTRO / DIGITALELEKTRONIKK PDIP (XCK/TO) PBO 1 40 PAO (ADCO) (T1) PB1 2 39 Rk1 (ADC1) (INT21AINO) PB2 3 38 PA2 (ADC2) (OCOIAI N1) P83 4 37 PA3 (ADC3) (n) PB4 5 36 PA4 (ADC4) (MOSI) PB5 6 35 R5 (ADC5) (M ISO) P86 7 34 PA6 (ADC6) (SCK) PB7 8 33 R!1/47(ADC7) RESET 9 32 AREF VCC 10 31 GND GND 11 30 AVCC XTAL2 12 29 PC7 (TOSC2) XTAL 1 13 28 PU (TOSC1) (RXD) PDO 14 27 FC5 (TDI) (TXD) PD1 15 26 PC4 (TDO) (I NTO) P02 16 25 PC3 (TMS) (I NT1) PD3 17 24 PC2 (TCK) 1 11 (0C1B) PD4 18 23 PC1 (SDA) (0C1A) PD5 19 22 PCO (SCL) (ICP1) P06 20 21 P07 (0C2) Figur 3.25: Inn-/Utganger for Timer 1. (avrm3209) 3.3.3 Timer-modus denne operasjonsmodus blir Timer 1 klokket av et internt signal avledet fra systemklokken (fosc) For hver klokkecycle inkrementeres registerverdien til Timer 1 med 1. Klokkefrekvensen frirvu = fosc n, der n kan innta verdiene: 1, 8, 64, 256, 1024. Verdien n settes i kontrollregisteret TCCR1Bi oppstartedelen av programmet i henhold til tabell 2. TABELL2: CS12 TCCR1B Valg av klokkesignal CS11 0 0 0 0 CS10 Beskrivelse 0 Stopp, Timer_l er stoppet 1 fosc 0 1 0 1 1 0 1 0 1 1 1 1 0 fosc / 8 1 fosc / 64 0 fosc / 256 1 fosc / 1024 0 Ekstern pinne T1, negativ flanke 1 Ekstern pinne Tl, positive flanke 3.3.3.1 Bruk av polling Det vises et program som tilsvarer det som ble presentert for Timer_0, men med forskjellen at det her benyttes en 16 bits timer, "Timer_1". FORFATTER: 62 DATO:

HØGSKOLEN I ØSTFOLD AVDELING FOR INGENIØRFAG ELEKTRO / DIGITAL ELEKTRONIKK #include unsigned <avr/io.h> char led; int main( void ) DDRB = OxFF; // use all pins on PORTB for output TCNT1 = Ox0000; // start value of T/C1 TCCR1A = 0; // T/C1 in timer mode TCCR1B = (1 << CS10); // prescale ck/1 led 0; for (;;) ( while ((TIFR & (1 << TOV1)) == 0) () // wait for overflow PORTB = - led; // write to LEDs on PORTB led++; TCNT1 = 0; // start value of T/C1 (unnecessary) TIFR = (1 << TOV1); // clear TOV1 I eksempelet er TCCR1Aprogrammert med verdien 0 som får Timer 1 til å arbeide i timer modus. TCCR1B får verdien 1 (CS10) som angir at timer-klokken skal være fosc. Startverdien til telleren settes til 0 (TCNT1). Etter hver klokkepuls inkrementeres altså verdien til telleren med 1 helt til verdien OxFFFF nås. Neste klokkepuls fører til overflow i telleren og verdien settes tilbake til Ox0000. En while-løkke overvåker tilstanden til Timer 1 ved å lese av flaggregisteret TIFR.Det er spesielt bit TOV1 som vi er interessert i. TOV1 angir om timeren har hatt overflow. Når TOV1 inntar verdien 1, betyr det at telleren er nullstilt, og while-løkken avbrytes. Innholdet av variabelen led (bit-invertert) sendes til PORTB. Variabelen led inkrementeres før flagget TOV1 nullstilles ved å skrive en 1 til bitposisjonen for dette flagget. Denne nullstillingen må utføres for et program som benytter polling i motsetning til avbrudd. I et avbruddsbasert program vil TOV1 automatisk (hardware-messig) bli nullstilt når avbruddsfunksjonen startes. Det er ganske overflødig i dette eksempelet å nullstille TCNT1 for hver gang vi har hatt overflow. Imidlertid vil det være aktuelt hvis vi ønsket å telle f. eks. 40 000 klokkepulser. I dette tilfellet ville setningen TCNT1 = 0; bli erstattet med TCNT1 = Ox10000-40000; // Merk bruk av hex- og desimaltall 3.3.3.2 Bruk av avbrudd Denne operasjonsmodus benyttes oftere enn polling. Statusbit TOV1 trenger ikke overvåkes fra programmet. Mikrokontrollerhardwaren sørger selv for å starte riktig avbruddsfunksjon når overflow inntreffer. TOV1 blir også nullstilt automatisk, som nevnt ovenfor. FORFATTER: 63 DATO:

HØGSKOLENI ØSTFOLD AVDELING FORINGENIØRFAG ELEKTRO/ DIGITAL ELEKTRONIKK Når avbruddsfunksjonen avsluttes, fortsetter hovedprogrammet som om ingenting skulle ha skjedd. I følgende eksempel går hovedprogrammet i en endeløs løkke og gjør ingenting. #include #include unsigned <avr/io.h> <avr/interrupt.h> char led; ISR(TIMER1._OVF vect, ISR BLOCK) [ PORTB = - led; // write value of led on PORTB led++; // Increment output value TCNT1 = Ox0000; // reload timer with initial value int main( void ) DDRB = OxFF; // use all pins on PORTB for output TIMSK = (1 << TOIE1); // enables the T/C1 overflow interrupt TCNT1 = Ox0000; // start value of T/C1 TCCR1A = 0; // T/C1 in timer mode TCCR1B = (1 << CS12) 1 (1 << CS10); // prescale ck/1024 led = 0; sei(); // set global interrupt enable for (;;) Avbruddsfunksjonen starter med nøkkelordet ISR.Det aktuelle avbruddet identifiseres med en symbolsk konstant definert i headerfilene. Så snar overflow inntreffer, startes avbruddsfunksjonen. Det nødvendige avbruddet må åpnes i initialiseringsdelen av hovedprogrammet: Bit TOIE1settes i TIMSK, og det globale avbruddsflagget (I) må settes i statusregisteret (SREG)vha av hjelpefunksjonen sei0, som fører til at assemblyinstruksjonen "SEI" blir utført. 3.. Teller-modus denne mo forandres innholdet i telleren TCNT1 av et eksternt klokkesig å pinne T1. Dette signalet ka mme fra en ekstern generator, eller kan stamme sensorer eller lignende som aktiveres fysiske hendelser i omgivelsene; f. ek biler passerer på en vei eller at en gjenstand passerer et samlebånd. På samm ate som i timermodus, vil et avbrudd kunne trigges ved ovetflo. Et programeksempel for denne operasjon us vil være svært lik tilsvarende for Timer 0. Vær oppmerksom på at T1 ligger p TB hvis p1 e (PB1) må defineres som inngang. Tellermodus velges ved å rammere TCCR1B.[2-0] = 7 lokking på positiv flanke av T1 og 6 for klokking på arende negative flanke. Se tabell 2. FORFATTER: 64 DATO:

Vedlegg 4 HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAG ELEKTRO DIGITALELEKTRONIKK 4.1.2 ADC-omformeren i AVR Internt bruker ADC-en i AVR metoden med "suksessiv approksimasjon". Dette prinsippet innebærer at det tar like mange klokkepulser som antall bits oppløsning for ADC-en å utføre konverteringen. I praksis går det med et par pulser ekstra for synkronisering og startbetingelser. For AVR vil dette si 13 klokkepulser. Figuren nedenfor viser hvilke pinner på ATMega32 som benyttes i forbindelse med ADC-en. PDIP (XCKITO) PBO 1 40 Ff O (ADCO) Analog (TI) PBI 2 39 PA1 (ADC 1) referansespenning (INT2/AINO) PB2 3 38 PA2 (ADC2) (OCO/AIN I ) PB3 4 37 PA3 (ADC3) (n) PB4 5 36 PA4 (ADC4) (MOSI ) PBS 6 35 PAS (ADC5) (M ISO) PB6 7 34 PA6 (ADC6) (SCK) PB7 8 33 PA7 (ADC7) 111 RESET 9 32 AREF VCC 10 31 GND GND 11 30 AVCC. XTAL2 12 29 PC7 (TOSC2) Analog driftspenning XTAL 1 13 28 FC6 (TOSC1) (RXD) PDO 14 27 PC5 (TD I) (TXD ) P01 15 26 PC4 (TDO ) (INTO) PD2 16 25 PC3 (TMS) (INT 1) PD3 17 24 PC2 (TCK) (0C1B) PD4 18 23 PC1 (SDA) (0C1A) PD5 19 22 PCO (SCL) (ICPI ) P06 20 21 P07 (0C2) Figur 4.3: Aktuelle innganger for AD-omformer. En intern multiplekser er koblet inn foran ADC-en. Inngangene på multiplekseren er koblet til pinnene PA7-0 som også er koblet til PORTA. Hvis man ønsker, kan derfor opp til 8 analoge spenningskilder kobles direkte til mikrokontrolleren. Pinnene på Port A som ikke brukes til analog innganger, kan fremdeles benyttes til digital 10 på vanlig måte. PA7 PA6 PA5 PA4 PA3 PA2 PA1 PAO ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADCO 3 2 10 8 ADRAUX ADCSR Figur 4.4: Blokkskjemafor AD-omformer. Resultatet kan leses av fra dobbeltregisteret ADC (ADCH/ADCL) som har de minst signifikante 8 bit i ADCL og de 2 mest signifikante bit i ADCH. Disse registrene må leses i sedvanlig rekkefølge med ADCL først for å sikre at innholdet begge registre hører til samme FORFATTER: 89 DATO:

HØGSKOLEN I ØSTFOLD AVDELING FOR INGENIØRFAG ELEKTRO / DIGITAL ELEKTRONIKK konvertering. Som ved tilsvarende dobbeltregistre, slipper vi å tenke på dette hvis vi benytter C-programmering og registernavnet ADC. Som forklart nedenfor, er det også mulig å konfigurere ATMega32 slik at de 8 mest signifikante bit havner i ADCH og de 2 minst signifikante i ADCL. Kontrollbit ADLARi registeret ADMUX bestemmer hvordan de 10 konverterte bitene i resultatet skal organiseres i ADCH/ADCL. Med ADLAR= 0: Bit 15/7 14/6 13/5 12/4 11/3 10/2 9/1 8/0 $05 ($25) ADC9 ADC8 ADCH Read/Write R R R R R R R R $04 ($24) ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADCO ADCL Read/Write R R R R R R R R Figur 4.5: ADCRegister med ADLAR= 0. Denne konfigurasjonen passer bra hvis man ønsker å benytte alle de konverterte bitene i resultatet. Hvis derimot det man kun trenger de 8 mest signifikante bitene, kan følgende konfigurering være mer effektiv. Med ADLAR= 1: Bit 15/7 14/6 13/5 12/4 11/3 10/2 9/1 8/0 $05 ($25) ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH Read/Write R R R R R R R R $04 ($24) ADC1 ADCO ADCL Read/Write R R R R R R R R Figur 4.6: ADC Registermed ADLAR= 1. 4.1.2.1 Kanalvalg ADC-en til ATMega32 er noe mer avansert enn framstilt i dette avsnittet. Vi konsentrerer oss om hovedvirkemåten. Blant annet skal vi ikke omtale mulighetene som finnes for at differensialinnganger kan benyttes. Det er bare én analog konvertering som kan utføres om gangen. Den aktuelle inngangen (kanalen) velges ut av kontrollregister ADMUX. FORFATTER: 90 DATO:

HØGSKOLENI ØSTFOLD AVDELINGFORINGENIØRFAG ELEKTRO/ DIGITAL ELEKTRONIKK $07 ($27) REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ADMUX Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 4.7: AD-multiplekserregister REFS1-REFSOvelger kilden for den analoge referansespenningen etter følgende tabell: REFS1 REFS0 Voltage Reference Selection 0 0 AREF, Intemal Vref turned off 0 1 AVCC with external capacitor at AREF pin 1 0 Reserved 1 1 Internal 2.56V Voltage Reference with external capacitor at AREF pin Legg merke til at med den interne referansespenningen på 2.56V, vil oppløsningen for for 10 bit tilsvare nøyaktig 2.5mV. Selve kanalen velges med multiplekserbitene MUX4-0. Her skal vi forutsette at MUX4-3 er 0. Da får vi denne tabellen for kanalvalg. Tabell : ADMUX - Kanalval MUX4-0 Used channel 00000 ADCO 00001 ADC1 00010 ADC2 00011 ADC3 00100 ADC4 00101 ADC5 00110 ADC6 00111 ADC7 4.1.2.2 Klokkefrekvens ADC-en trenger et klokkesignal mellom 50kHz og 200kHz. Denne frekvensen aviedes fra systemklokken ved hjelp av preskaiering på tilsvarende måte som for timer-funksjonene. Preskalering styres via ADCSRA registeret. $06 ($26) ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPSO ADCSRA Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Figur 4.8: AD Control/Status RegisterA FORFATTER: 91 DATO:

HØGSKOLENI ØSTFOLD AVDELING FORINGENIØRFAG ELEKTRO/ DIGITAL ELEKTRONIKK ADEN Reset CK 7-BIT ADC PRESCALER co ou(-) 0000 ADPSO ADPS1 ADPS2 ADC CLOCK SOURCE Figur 4.9: Blokkskjemafor AD prescaler. Preskaleringen utføres i henhold til følgende tabell: Tabell: ASCR- Preskalering ADPS2 ADPS1 ADPSO Skaleringsfaktor 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 Eksempel: Fo = 4MHz 50kHz < fad < 200kHz Skaleringsfaktor = 32 fad = fosz/32 = 4000000/32 = 125000 = 125 khz (T=8p.S) 50kHz < 125kHz < 200kHz ADPSO = 1, ADPS1 = 0, ADPS2 = 1 KONVERTERINGSTID: 13 X 8 = 104 4.1.2.3 Andre kontrollfunskjoner Aktiviteten i ADC-en styres for øvrig via status- og kontrollbit i ADCSRA registret. ADC-en klargjøres for aktivitet ved å sette bit ADEN til 1. Siden AD-omformeren bruker litt effekt, når den er klargjort, bør man kun gjøre dette hvis man har til hensikt å benytte den. ADC-en kan kjøres i to hovedmodi styrt av bit ADATE. Enten kjøres den i autotrig modus (ADATE=1) eller normal modus (ADATE=0). Autotrig modus betyr at diverse hardware- FORFATTER: 92 DATO:

HØGSKOLEN I ØSTFOLD AVDELING FOR INGENIØRFAG ELEKTRO / DIGITAL ELEKTRONIKK enheter kan trigge start av en AD-konvertering. Hardware-enheten velges ved konfigurering av register SFIOR,vist nedenfor. Et av valgene når ADATE = 1, er frittløpende modus. Dette betyr at når AD-omformeren først er startet, vil den fortsette å konvertere verdier fortløpende. Når ADC-registeret avleses, er det alltid sist konverterte verdi som ligger der. I normal modus, må AD-omformeren startes på nytt etter hver konvertering. Konvertering startes ved å skrive ved å skrive en 1 til kontrollbit ADSC. Dette bit vil leses som 1 så lenge konvertering pågår, men blir nullstilt automatisk når konverteringsprosessen er ferdig. Tabell: ADCSRA Konverteringsmodi bit name description 5 ADATE Automatic Trig Enable (control): If you set this bit, the AD converter operates in the mode determined by bits ADTS2-0 in register SFIOR 6 ADSC A/D Start Conversion (control): If you set this bit and the ADEN bit is set a Conversion is started. 7 ADEN A/D Enable (control): To enable the A/D - converter you have to set this bit. 4.1.2.4 Avbrudd Siden det tar i størrelsesorden 100 mikrosekunder å utføre en konvertering, vil det kunne være behov for å la mikrokontrolleren gjøre andre ting mens konverteringen pågår. Avbrudd vil kunne genereres når en igangsatt konvertering er ferdig utført. Tabellen nedenfor viser hvilke bit som er aktive når AD-omformeren kjøres i avbruddsmodus. Legg merke til at det ikke er noe eget maske- og flaggregister for ADomformeren. Flagg ADIF i register ADCSRAsettes alltid automatisk til 1 når konvertering er ferdig, men må nullstilles ved å skrive en 1 til bitposisjon 4 hvis ikke avbrudd benyttes. Tabell: ADCSRA Avbruddsfunksjon bit name description 3 ADIE A/D Interrupt Enable (control): if set, A/D conversion complete interrupt is enabled. 4 ADIF A/D Interrupt Flag (status) This bit is set, when a A/D conversion is complete. FORFATTER: 93 DATO:

HØGSKOLENI ØSTFOLD AVDELING FORINGENIØRFAG ELEKTRO/ DIGITAL ELEKTRONIKK 4.1.2.5 Valg av autotrig-modus $06 ($26) ADTS2 ADTS1 ADTS0 ACME PUD PSR2 PSR10 SFIOR Read/Write R/W R/W R/W R R/W R/W R/W R/W Figur 4.10: SpecialFunction 10Register ADTS2 ADTS1 ADTS0 Trigger Source 0 0 0 Free Running mode 0 0 1 Analog Comparator 0 1 0 External Interrupt Request 0 0 1 1 Timer/Counter0 Compare Match 1 0 0 Timer/Counter0 Overflow 1 0 1 Timer/Counterl Compare Match B 1 1 0 Timer/Counter1 Overflow 1 1 1 Timer/Counter1 Capture Event 4.. Programeksempler for AD-omforming V skal vise enkle programeksempler der ADC-en tas i bruk. I første ekse el benyttes normalmodus, onverteringen startes fra en avbruddsrutine. Ne eksempel viser frittløpende modus, o med avbrudd. 4.1.3.1 Normal modus med avbr Eksempelet viser hvordan konverterin en nningsverdi på analog kanal 0 kan utføres i normal modus (single conversion de). Det konfigureres bruk av i rn spenningsreferanse på 2.56 egister ADMUX. ADCSRA er progr ert til normal modus, en preskaleringsfaktor p og avbruddsmodus. Når konv eringen er komplett, startes avbruddsrutinen. Begge dataregistre avleses og de est signifikante bit i resultatet skrives til PORTB. Merk at de 8 mest signifika bit innes i ADCH fordi bit ADLAR er konfigurert til 1. FORFATI-ER: 94 DATO: