KURSHEFTE AVR Kurs vår 2012



Like dokumenter
KURSHEFTE AVR Kurs vår 2016

KURSHEFTE AVR Kurs vår 2015

Slope-Intercept Formula

Arduino med Atmel studio 6.x (6.1)

Intro til Atmel Studio Bits&bytes

Trådløsnett med. Wireless network. MacOSX 10.5 Leopard. with MacOSX 10.5 Leopard

Start Here USB *CC * *CC * USB USB

Norsk (English below): Guide til anbefalt måte å printe gjennom plotter (Akropolis)

TB-615 / TB-617 Wireless slim keyboard. EN User guide SE Användarhandledning FI Käyttöohje DK Brugervejledning NO Bruksanvisning

Forelesning 5. Diverse komponenter/større system

Endelig ikke-røyker for Kvinner! (Norwegian Edition)

Bestille trykk av doktoravhandling Ordering printing of PhD Thesis

KROPPEN LEDER STRØM. Sett en finger på hvert av kontaktpunktene på modellen. Da får du et lydsignal.

INF1400 Kap4rest Kombinatorisk Logikk

Vedlegg 2 Dokumentasjon fra TVM leverandør

Hvordan føre reiseregninger i Unit4 Business World Forfatter:

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

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

Trådløsnett med Windows XP. Wireless network with Windows XP

SERVICE BULLETINE

Han Ola of Han Per: A Norwegian-American Comic Strip/En Norsk-amerikansk tegneserie (Skrifter. Serie B, LXIX)

Administrasjon av postnummersystemet i Norge Post code administration in Norway. Frode Wold, Norway Post Nordic Address Forum, Iceland 5-6.

Exercise 1: Phase Splitter DC Operation

Information search for the research protocol in IIC/IID

Trådløsnett med Windows Vista. Wireless network with Windows Vista

UNIVERSITETET I OSLO

Kapittel 7, Minne RAM DIMM, SIMM ROM, PROM, EPROM, EEPROM FLASH DIM SUM. Cache Virtuelt minne

MAT1030 Plenumsregning 3

SmartPass Mini User Manual BBNORGE.NO

Unit Relational Algebra 1 1. Relational Algebra 1. Unit 3.3

INF2270 Datamaskinarkitektur

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

BIBSYS Brukermøte 2011 Live Rasmussen og Andreas Christensen. Alt på et brett? -om pensum på ipad og lesebrett

Debugging. Tore Berg Hansen, TISIP

PATIENCE TÅLMODIGHET. Is the ability to wait for something. Det trenger vi når vi må vente på noe

LabVIEW seriekommunikasjon med mikrokontroller

DM6814/DM5814 User s Manual

Del 1 En oversikt over C-programmering

INF2270 Datamaskinarkitektur

Compello Fakturagodkjenning Versjon 10 Software as a service. Tilgang til ny modulen Regnskapsføring

Hangman. Level. Introduksjon

Compello Fakturagodkjenning Versjon 10.5 As a Service. Tilgang til Compello Desktop - Regnskapsføring og Dokument import

// Translation // KLART SVAR «Free-Range Employees»

GEOV219. Hvilket semester er du på? Hva er ditt kjønn? Er du...? Er du...? - Annet postbachelor phd

Perpetuum (im)mobile

FASMED. Tirsdag 21.april 2015

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Bruksanvisning Unitronics Vision

Dagens temaer. Architecture INF ! Dagens temaer hentes fra kapittel 3 i Computer Organisation and

Overordnet maskinarkitektur. Maskinarkitektur zoomet inn. I CPU: Kontrollenheten (CU) IT1101 Informatikk basisfag, dobbeltime 11/9

TDT4110 IT Grunnkurs Høst 2015

The regulation requires that everyone at NTNU shall have fire drills and fire prevention courses.

Hvor mye teoretisk kunnskap har du tilegnet deg på dette emnet? (1 = ingen, 5 = mye)

TDT4105/TDT4110 Informasjonsteknologi grunnkurs:

Teori og oppgaver om 2-komplement

Trådløst nett UiT Feilsøking. Wireless network UiT Problem solving

Hvor mye teoretisk kunnskap har du tilegnet deg på dette emnet? (1 = ingen, 5 = mye)

Programmeringsspråket C

STILLAS - STANDARD FORSLAG FRA SEF TIL NY STILLAS - STANDARD

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

Elektronisk termostat med spareprogram. Lysende LCD display øverst på ovnen for enkel betjening.

WORKSHOP BRUK AV SENSORTEKNOLOGI

FIRST LEGO League. Härnösand 2012

TDT4160 Datamaskiner Grunnkurs Gunnar Tufte

Elektronisk innlevering/electronic solution for submission:

Prosjektet Digital kontaktinformasjon og fullmakter for virksomheter Digital contact information and mandates for entities

Programmering. Carsten Wulff

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

INF1400 Kap 1. Digital representasjon og digitale porter

Alle hele tall g > 1 kan være grunntall i et tallsystem.

INF3430/4431. Introduksjon til VHDL Spartan starterkit Spartan-3 FPGA

EMPIC MEDICAL. Etterutdanningskurs flyleger 21. april Lars (Lasse) Holm Prosjektleder Telefon: E-post:

Du må håndtere disse hendelsene ved å implementere funksjonene init(), changeh(), changev() og escape(), som beskrevet nedenfor.

Dagens temaer. Dagens temaer er hentet fra P&P kapittel 3. Motivet for å bruke binær representasjon. Boolsk algebra: Definisjoner og regler

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

GYRO MED SYKKELHJUL. Forsøk å tippe og vri på hjulet. Hva kjenner du? Hvorfor oppfører hjulet seg slik, og hva er egentlig en gyro?

HONSEL process monitoring

Del 4 Noen spesielle C-elementer

Forelesning Datatyper Kap 5.2 Instruksjonsformat Kap 5.3 Flyttall App B

Den som gjør godt, er av Gud (Multilingual Edition)

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

Moving Objects. We need to move our objects in 3D space.

klassisk angoragenser classic angora sweater

Et lite oppdrag i bakgrunnen

Time & Attendance Timeregistrering. End User Sluttbruker

Vekeplan 4. Trinn. Måndag Tysdag Onsdag Torsdag Fredag AB CD AB CD AB CD AB CD AB CD. Norsk Matte Symjing Ute Norsk Matte M&H Norsk

Regler under svømmetrening! ENGLISH BELOW


EN Skriving for kommunikasjon og tenkning

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

Enkel og effektiv brukertesting. Ida Aalen LOAD september 2017

Introduksjon til DARK assembly

Blinkende lysdiode Introduksjon Arduino Lærerveiledning

Hvor mye praktisk kunnskap har du tilegnet deg på dette emnet? (1 = ingen, 5 = mye)

REMOVE CONTENTS FROM BOX. VERIFY ALL PARTS ARE PRESENT READ INSTRUCTIONS CAREFULLY BEFORE STARTING INSTALLATION

Feilmelding Årsak Løsning

7) Radix-sortering sekvensielt kode og effekten av cache

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

GEO231 Teorier om migrasjon og utvikling

Transkript:

KURSHEFTE AVR Kurs vår 2012 Grunnleggende om mikrokontrollere. c 2012 Omega Verksted Alle rettigheter er reserverte. Det er ikke lov å reprodusere med dette heftet, fordi det er et åndsverk. Det er ikke lov å brette papirfly av, eller på annen måte spre innholdet av denne blekka uten skriftlig tillatelse i π eksemplarer fra utgiver. Dersom det skulle komme oss for øret at noen allikevel har forbrutt seg mot oss, kommer vi hjem til deg og bruker telefonen på deg mens vi spiller trekkspill og synger Helmut Lotti. Lenge leve Omega Verksted. Printed in The Constitutional Anarchy of Norway.

2

Innhold 1 FORORD 5 2 MIKROKONTROLLERE 7 2.1 AVR............................................ 7 2.2 MODULER........................................ 8 2.2.1 I/O-PORTER.................................. 8 2.2.2 TIMERE..................................... 8 2.2.3 KOMMUNIKASJON.............................. 8 2.2.4 ANALOGE MODULER............................. 9 3 BITS og BYTES 11 3.1 TALLSYSTEMER.................................... 11 3.2 LOGISKE OPERASJONER.............................. 13 3.2.1 NOT........................................ 13 3.2.2 AND........................................ 13 3.2.3 OR......................................... 13 3.2.4 XOR........................................ 14 3.3 BINÆRE OPERASJONER............................... 14 4 PROGRAMMERING 15 4.1 C.............................................. 15 4.1.1 MEGA AVR................................... 17 5 NATURLOVER FOR DET MODERNE MENNESKET. 19 A Oppgaver 20 A.1 Kveld 1: LEDs and stuff................................. 20 A.2 Kveld 2: Interrupts & Timere.............................. 22 A.3 Kveld 3: ADC og USART................................ 23

4

1 FORORD Dette kompendiet er et sammensurium av grunnleggende ting om mikrokontrollere og hva som må til for å kunne programmere de. AVR Kurset er et kræsjkurs og er innom mange askepter, hvis man ønsker å skjønne alt som foregår i kurset og bli en god mikrokontrollerprogrammerer er det bare en ting som gjelder, øvelse! Med de -ligste hilsener og lykkeønskninger OMEGA VERKSTED 5

6

2 MIKROKONTROLLERE En mikrokontroller (MCU, µc eller uc) er en liten datamaskin på en integrert krets, den inneholder en prosessor, minne og programmerbare Input/Output moduler (I/O pheripherals). Mikrokontrollere har et programminne (flash) som ikke slettes når mikrokontrolleren mister strøm og RAM (Random Acces Memory) som brukes til mellomlagring av data mens et program kjører. I/O enhetene kan ha mange funksjoner fra helt enkle digitale pinner som kan settes til 1 eller 0 til mer avanserte moduler som timere, kommunikasjonsmoduler som USB, USART, SPI, I 2 C og CAN, analog til digital konverterere (ADC), digital til analog konverterere (DAC). Det som avgjør prisen på en mikrokontroller er i hovedsak antallet I/O-moduler og hvor avanserte oppgaver de skal gjøre, størrelse på programminne, antall pinner og størrelse på RAM. En typisk 8-bit mikrkontroller kan ha fra 512byte programminne og 32byte med RAM, opp til 256Kbyte programminne og noen Kbyte RAM og pakketyper med 6 til 144 pinner. Det fins også mikrokontrollere med noen megabyte med programminne, mye RAM og 400+ pinner. (a) TQFP64 (b) DIP14 Figur 1: Noen pakketyper Alle prosessorere trenger en klokke for å gå, på en typisk brukerdatamaskin i dag er klokkefrekvensen oppe på 3GHz+, som vil si at all logikken i prosessoren tikker og går over 3 miliarder ganger i sekundet. En typisk 8-bit mikrokontroller har en klokkefrekvens på 2-16MHz, her skjer det noe noen millioner ganger i sekundet. 2.1 AVR AVR R er en serie 8-bits og 32-bits mikrokontrollere fra Atmel R, disse mikrokontrollerne er delt inn i 4 hovedfamilier, TINY, MEGA, XMEGA og UC3. TINY er den familien med mikrokontrollere med få moduler, få pinner og lite programminne. De har mellom 6-32 pinner, 0.5-8K flash og er de billigste AVR mikroprosessorene. De brukes ofte hvis man må lage et fysisk lite design eller har en enkel oppgave som kan klare seg med en enkel mikrokontroller. MEGA er en familie med mikrkontrollere med mange moduler, mye programminne og mange pinner. De har mellom 28-100 pinner og 4-256K flash. De er allsidige 7

mikrokontrollere som kan brukes i større applikasjoner som trenger større programmer og flere dupeditter. Det meste av mikrokontroller-ting som lages på Omega Verksted bruker en MEGA AVR, nærmere bestemt ATmega128 som er en kontroller med 64 pinner og 128K flash, denne kan brukes til det meste. XMEGA er den nyeste 8-bit familien til Atmel. Den har flere moduler enn en typisk MEGA AVR, bedre analogmoduler og en del mer avansert funksjonalitet. UC3 er Atmels 32-bits mikrokonttrollere, TODO: Skrive noe mer, mindre? 2.2 MODULER Det er mye snakk om moduler når man holder på med mikrokontrollere. En modul er kort fortalt en spesiell funksjon mikrokontrolleren tilbyr, alle moduler er implementert i hardware. Dette betyr at når en modul benyttes jobber den alltid i bakgrunnen, uavhengig av hva prosessoren jobber med!, Disse modulene er i utgangspunktet slått av, de skrus på og konfigureres etter behov til applikasjonen man jobber med. 2.2.1 I/O-PORTER Den vanligste modulen er I/O-porter, i Atmels 8-bit kontrollere er en I/O-port en samling av 8 fysiske pinner på mikrokontrolleren. Disse pinnene er kan individuelt settes som en inngang eller utgang. Hvis en pinne som er satt som utgang blir satt 1/på/høy vil mikrokontrolleren lage en spenning på denne pinnen tilsvarende driftsspenningen til mikrokontrolleren, blir pinnen satt til 0/av/lav vil pinnen holde 0 volt. På samme måte kan en pinne som er satt til inngang lese om et signal er høyt eller lavt på utsiden av mikrokontrolleren. Hva kan dette brukes til? Den vanligste tingen man gjør som første mikrokontrollerpgoram er å få en lydiode til å blinke, og eventuelt bruke en knapp til å skrud en lydiode av/på. Her er I/O-pinner perfekt! Dette er en meget grunnleggende modul, alle andre moduler gjør mer avanserte ting og hvis de trenger en pinne for å lese noe / generere en spenning tar de over en standard I/O-pinne. 2.2.2 TIMERE Timere brukes i hovedsak til å holde rede på tid. Hva trenger man det til? Siden mikrokontrolleren kan gjøre noen millioner operasjoner i sekundet sier det seg selv at hvis noe skal brukes til interaksjon med mennesker rekker ikke menneskene å reagere på noen miliontedls sekunder. Timere kan brukes til å generere signaler på pinner og er en god kilde til å lage noe som skal skje periodisk. 2.2.3 KOMMUNIKASJON De fleste atmel kontrollere har USART-, TWI- (I 2 C) og SPI-moduler, dette er vanlige kommunikasjonsmetoder. TWI og SPI brukes ofte for kommunikasjon melom integrerte kretser på et kretskort. USART er seriell måte å sende data på som brukes veldig mye. Disse signalene kan konverteres til et hav av elektriske standarder som feks RS232, RS485, USB med mer. Noen Atmel kontrollere har også USB, CAN og LIN kontrollere. USB for å kommunisere med pcer, CAN og LIN er standarder som brukes mye i bilindustrien. 8

2.2.4 ANALOGE MODULER Mange Atmel mikrokontrollere har også analoge moduler, en ADC (analog to digital converter) brukes for å måle en analog spenning, og gjøre den om til en digital verdi som kan brukes i en mikrokontroller. Noen Atmel kontrollere har også DAC (digital to analog converter) for å generere analoge spenninger, dette kan feks brukes til å lage referansespenninger, lydsignaler etc. 9

10

3 BITS og BYTES Tall må representeres på en eller annen måte i en mikrokontroller, tall blir representert på binær 1 i hardware, det er også ganske vanlig årepresentere tall i hekadesmial 2 når man programmerer mikrokontrollere. Hvert siffer i et binært tall kalles et bit, en gruppe på 8-bit kalles en byte. 3.1 TALLSYSTEMER Et gitt heltall i et tallsystem er beskrevet ved siffer a n, hvert siffer har en vekt b, I desimal systemet er vekten til hvert siffer b = 10, for åangi tallsystem kan man for eksempel skrive det desimale tallet 128 som 128 10 hvor a 2 = 1 a 1 = 2 a 0 = 8. Tallet kan deles ned i vekten til hvert siffer på denne måten: 128 10 = 1 10 2 + 2 10 1 + 8 10 0, en generell måte å uttrykke heltall på er: (a n a n 1... a 2 a 1 a 0 ) b = n a k b k [k = 0, 1, 2,... n] k=0 Dette var jo greit, desimalsystemet er enkelt for oss fordi vi bruker det hele tiden uten å tenke over det på denne måten, hva hvis vi bruker et binært (to-)tallsystem hvor hvert siffer kun kan ha verdien 1 eller 0; 10011010 2, den desimale verdien av dette tallet blir da: 10011010 2 = 7 a k 2 k = 1 2 7 + 1 2 4 + 1 2 3 + 1 2 1 = 128 + 16 + 8 + 2 = 154 10 k=0 En grafisk representasjon av dette kan være: Vekt 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 1 BIN 1 0 0 1 1 0 1 0 DEC 128 0 0 16 8 0 2 0 HEX 9 A Tabell 1: Visuell Tallkonvertering 1 2-tallssystem hvor hvert siffer kan ha verdien 1 eller 0 2 16-tallssystem hvor hvert siffer kan ha verdien 0-9, A, B, C, D, E eller F 11

På samme måte kan vi bruke et heksadesmialt (16-)tallsystem hvor sifrene 0-9 og bokstavene A-F brukes, A = 10, B = 11, C = 12, D = 13, E = 14, F = 15. Det vil si at den desimale verdien av det heksadesimale tallet EC2F 16 blir: 0C2F 16 = 3 a k 16 k = 0 16 3 + 12 16 2 + 2 16 1 + 15 16 0 = 0 + 3072 + 32 + 15 = 3119 10 k=0 Dette er en kompakt måte å representere tall på, den største fordelen er når man ser på sammenhengen mellom heksadesimale tall og binære tall. Hvert heksadesimalt siffer kan ha verdiene 0-15, det kan også et firesifret binært tall også ha, det vil si at man enkelt kan konvertere mellom binære og heksadesimale tall. BIN DEC HEX 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 2 2 0 0 1 1 3 3 0 1 0 0 4 4 0 1 0 1 5 5 0 1 1 0 6 6 0 1 1 1 7 7 1 0 0 0 8 8 1 0 0 1 9 9 1 0 1 0 10 A 1 0 1 1 11 B 1 1 0 0 12 C 1 1 0 1 13 D 1 1 1 0 14 E 1 1 1 1 15 F Vekt 16 3 16 2 16 1 16 0 BIN 0001 0101 1111 1010 HEX 1 5 F A Tabell 2: BIN to HEX 12

3.2 LOGISKE OPERASJONER Når man programmerer mikrokontrollere får man bruk for å manipulere binære tall og ofte enkelte bit. Her der det fire logiske operasjoner som blir brukt ofte, de kalles NOT, AND, OR og XOR. Funksjonen til disse operasjonene er forklart under. 3.2.1 NOT En NOT operasjon er den enkleste, den inverterer et enkelt bit. 1 blir til 0 og 0 blir til 1: NOT har følgende sannhetstabell. Innputt Resultat 1 0 0 1 Innputt 1 0 1 1 1 0 1 0 Resultat 0 1 0 0 0 1 0 1 Tabell 3: Sannhetstabell: NOT 3.2.2 AND AND operasjonen gir ut 1 hvis alle argumentene er 1, eks: 1 AND 1 AND 1 = 1, mens 1 AND 0 AND 1 = 0. AND har følgende sannhetstabell: Innputt Resultat 0 0 0 0 1 0 1 0 0 1 1 1 Innputt 1 1 0 1 1 1 0 1 0 Innputt 2 1 0 0 0 1 0 1 0 Resultat 1 0 0 0 1 0 1 0 Tabell 4: Sannhetstabell: AND 3.2.3 OR OR operasjonen gir ut 1 hvis et av argumentene er 1, eks: 0 OR 1 OR 0 = 1, mens 0 OR 0 OR 0 = 0. OR har følgende sannhetstabell: Innputt Resultat 0 0 0 0 1 1 1 0 1 1 1 1 Innputt 1 1 0 1 1 1 0 1 0 Innputt 2 1 0 0 0 1 0 1 0 Resultat 1 0 1 1 1 0 1 0 Tabell 5: Sannhetstabell: OR 13

3.2.4 XOR XOR gir ut 1 hvis et oddetall av argumentene er 1, eks: 1 XOR 0 = 1, 1 XOR 1 = 0. XOR har følgende sannhetstabell: Innputt Resultat 0 0 0 0 1 1 1 0 1 1 1 0 Innputt 1 1 0 1 1 1 0 1 0 Innputt 2 1 0 0 0 1 0 1 1 Resultat 0 0 1 1 0 0 0 1 Tabell 6: Sannhetstabell: XOR 3.3 BINÆRE OPERASJONER RIGHT SHIFT og LEFT SHIFT er to operasjoner som brukes mye i mikrokontrollerprogrammering, disse operasjonene dytter alle bittene i et binært tall til henholdsvis høyre eller venstre. Et binært tall: 10110011 RIGHTSHIFT 2 vil dytte tallet to hakk til høyre og padde med nullere, resultatet blir 00101100. En tilsvarende LEFT SHIFT vil gi svaret 11001100. 14

4 PROGRAMMERING Mikrokontrollerprogrammering handler i hovedsak om å konfigurere diverse moduler til å gjøre det man vil. Modulene lagrer all konfigurasjon i registre, registerne er 8-bit på 8-bits mikrkontrollere og hvert av bittene i registret har en spessiell funksjon. Når et register er konfigurert og strømmen skrus av, vil registeret nullstilles til standardverdier, dette betyr at programkoden som skrives må konfigurere alle modulene som skal brukes. Hvor fins det informasjon om moduler, tilhørende register og hva de forskjellige bittene i registerne gjør? Hver mikrokontroller har sitt eget datablad. For å programmere mikrokontrollere er det en ting som betyr noe: RTFD! Den eneste måten å finne informasjonen som trengs for å programmere mikrokontrollere er i databaldet, de som har sett i et Atmel datablad kan da si, men det er jo 600+ sider, ingen gidder å lese alt det bare for å programmere litt. Det er helt riktig, triket er å lære seg å plukke ut informasjoen som trengs. Hver modul har et eget kapittel, det inneholder masse tekst om hvordan den fungerer og bakert i hvert kapittel er det en seksjon som heter Register Description. Denne delen inneholder en oversikt over alle registre som tilhører modulen og en beskrivelse av hva hvert enkelt bit gjør. De første gangene man bruker en modul kan det være greit å skumlese litt om modulen og så studere registrene nøye, hvis man lurer på hva noe i registerbeskrivelsen betyr, kan man lese mer om det i kapittlet over. Når man har brukt et par moduler ender det ofte opp med at man hopper rett på registerbeskrivelsen og i mange tilfeller er det nok! 4.1 C Mikrokontrollerprogrammering er på et lavt nivå med bits og bytes, derfor brukes også lav-nivå programmeringsspråk. De fleste mikrokontollere (alle Atmels kontrollere) kan i dag programmeres i C, før ble det brukt mye assembly som er det nermeste man kommer maskinkoding med 1-ere og 0-ere. 15

Et skall for et AVR c-program kan se slik ut; Listing 1: main.c 1 // Tekst etter "//" kalles kommentarer, disse ignoreres av kompilatoren 2 /* 3 For lengre kommentarer kan man bruke denne stilen. 4 Dette gir mulighet for kommentarer over flere linjer. 5 */ 6 7 #include <avr/io.h> // Inneholder definisjoner for AVR uc 8 9 void IoInit() { 10 11 // DDRB er et register, definisjonen for dette fins i <avr/io.h> 12 DDRB = (1 << DDB0) (1 << DDB1) (1 << DDB2); // Sier at DDBne0,1 og 2 skal settes som utgang, skriver over registret. 13 DDRB = (1 << DDB3); //forkortelse for DDRB = DDRB (1 << DDB3). 14 } 15 16 int main(){ 17 18 uint8_t tall = 0; 19 20 // Initialiserings kode 21 IoInit(); 22 23 while(1) { 24 25 // Hoved programkode 26 tall++; // forkortelse for tall = tall + 1; 27 28 PORTB ^= 0xFF; // forkortelse for PORTB = PORTB ^ 0xFF; Inverterer alle bit 29 30 } 31 32 } Et C program må ha en main() funksjon, dette er hvor programmet starter. En typisk måte å strukturere et mikrokontrollerprogram på er å gjøre modulinitialisering, og så kjøre et program i en evig løkke slik at programmet aldrig slutter. Data kan lagres i variabler, variabler kan brukes i regnestykker og lignende. Før en variabel kan brukes må den deklareres med en type, datatyper som er vanlig å bruke i AVR er vist under: Vanlige datatyper Beskrivelse uint8 t 8-bits heltall, verdi fra 0-255 uint16 t 16-bits heltall, verdi fra 0-65 535 char 8-bits heltall, brukt til å lagre tegn (ASCII). float 32-bits flyttall, brukes når man trenger desimaler. bool Sannhetsverdi, TRUE eller FALSE. (#include <stdbool.h>). void Tom variabel. Tabell 7: Variabeltyper En deklarasjon av en variabel skal inneholde en variabeltype og et navn, den kan også initialiseres med en verdi; variabeltype navn = initialiseringsverdi eks: uint8 t minvariabel = 4; Trenger man en liste med variabler av samme type kan man lage et Array et array deklareres 16

nesten likt som en variabel; variabeltype navn[n]; eks: uint8 t minvariabel[10] Her opprettes det 10 variabler, minvariabel[0] til minvariabel[9]. Variabler kan være del av regnestykker, under er noen vanlige operasjoner: Operasjon C-syntax Beskrivelse A + B A + B Addisjon A B A B Subtraksjon A/B A/B Divisjon A B A B Multiplikasjon NOT A A Bitvis NOT A AND B A & B Bitvis AND A OR B A B Bitvis OR A XOR B A B Bitvis XOR A RIGHT SHIFT B A >> B Skifter A, B possisjoner til høyre A LEFT SHIFT B A << B Skifter A, B possisjoner til venstre Eksempel på bruk av variable: Tabell 8: C-Syntax Listing 2: math.c 1 int main() { 2 3 uint8_t var = 0; 4 5 var = 1 + 3 + 5; // var blir 9 6 var = var - 5; // var blir 4 7 var += 3; // var blir 7 8 var = var/2; // var blir 3, desimaler forsvinner. 9 var++ // var blir 4 10 11 while(1){ 12 13 } 14 15 } 4.1.1 MEGA AVR #include < avr/io.h > i eksempelprogrammet for AVR inkluderer definisjoner for Registre og bit i registre. Navnene på registerne og bittene er helt identiske med det som står i databladet. Et eksempel på et register fra en MEGA kontroller er DDRB, dette registeret bestemmer om pinner er innganger eller utganger. Bitnummer 7 6 5 4 3 2 1 0 Bitnavn DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0 DDRB Tabell 9: DDRB Registeret er definert slik at det kan skrives til/leses fra, bitnavnene er definert som bitnummeret i registeret. Det vil si at vi kan sette bestemte bit ved å skrive slik: 17

Listing 3: register.c 1 DDRB = (1 << DDB5); //Disse to linjene er ekvivalente. 2 DDRB = 0b00100000; // Vi venstreskifter et 1-tall inn 5 posisjoner. Her er eksempler på vanlige måter å manipulere registre på, for å forstå hva som skjer se på de logiske operasjonene beskrevet tidligere. Listing 4: logikk.c 1 DDRB = (1 << DDB5) (1 << DDB6); // Skriver over registeret. 2 DDRB = (1 << DDB5) (1 << DDB6); // Setter bit5 og bit6 til 1, beholder resten av registeret. 3 DDRB &= ~((1 << DDB5) (1 << DDB6)); // Setter bit5 og bit6 til 0. 4 DDRB ^= (1 << DDB5) (1 << BIT6); // Toggler bit5 og bit6, hvis det er 1 blir det 0 og omvendt. 18

5 NATURLOVER FOR DET MODERNE MENNESKET. Her har vi tatt med noen lover som er ment å være til oppmuntring om noe av en eller annen grunn ikke skulle virke perfekt første gang: Murphys lov: Hvis noe kan gå galt, går det galt. Dersom det ikke går galt, viser det seg at det senere ville vært best om det gikk galt allikevel. Boobs law: You always find things in the last place you look. Finagle s fourth law: Once a job is fouled up, anything done to improve it only makes it worse. H.L. Mencken s law: Those who can do Those who can t teach Those who can t teach administrate Lowreys law: If it jams force it. If it breaks it needed replacement anyway. Harrisberger s fourth law of the lab: Experience is directly proportional to the amount of equipment ruined. Jone s law: The man who smiles when anything goes wrong has thought of someone to blame it on. Oliver s law: Experience is something you don t get until just after you need it. Olke s law: There is no such ting as foolproofness. Speer s 1st law: The visibility of an error is inversely proportional to the number of times you have looked at it. Loven om forelesere: Enhver foreleser antar at du ikke har noe som helst annet å gjøre enn å arbeide med det faget denne foreleseren foreleser. Sattinger s law: It works better if you plug it in. O Toole s Commentary on Murphy s Law: Murphy was an unrealistic optimist. Ohm s lov sier noe om motstanden som var imot elektrisiteten til å begynne med. Dersom disse lovene ikke skulle gi deg noe hjelp med problemet ditt så sett deg ned og spør deg selv: Hvordan ville MacGyver håndtert denne situasjonen? Printet på 100% resirkulerte trær 19

A Oppgaver A.1 Kveld 1: LEDs and stuff In this session we will get to know AVR Studio and hopefully compile our first program. Task 1 will take you through starting AVR Studio, opening a project, compiling it, uploading it and debugging it. Task 2 will force you to look in the datasheet for information and if gods willing make your board respond to switch presses. Task 3 will throw you into the arcane world of assembly and register addresses. But we will hold your hand. (a) Connecting JTAGICEmkII to the Xplain board (b) Pull-up Task 0 1. Connect the devices as shown above. Also to the computer via USB cables. 2. Start AVR Studio, don t create or open any project. 3. Choose Tools AVR Programming. 4. Choose Tool as JTAGICE mkii. 5. Choose Device as ATmega1284P. 6. Choose Interface as JTAG. 7. Press Apply. 8. If asked to upgrade, upgrade. Afterwards, remove and reinsert the device from the computer. Restart AVR Studio. 9. Press Read. If no errors are presented, celebrate discreetly. 10. Close the window. 20

Task 1 1. Unzip the session1.zip file provided and open session1/code/task1/task1.avrsln either in windows explorer directly or file open Project/Solution... in AVR Studio. 2. If it s not open, open task1.c from the file list to the left. 3. Have a good gander at the code. Guess its purpose. 4. Look in the datasheet on the pages referenced in the comments. Read a bit about I/O Ports in general. 5. Going back to task1.c, press F7 to compile your project. No errors? 6. Connect as shown in the picture above. 7. Press the Play/Pause button (ALT + F5). Notice the yellow arrow indicating which line is about to be executed. 8. Select JTAGICE mkii as debug tool in the menu that pops up. 9. Open the I/O view by pressing the button that looks like this. 10. Find PORTB in the I/O View to the right. 11. Press F11 to single-step. See if you can track the changes each line does. 12. Right click the variable leds in the code, choose Add to Watch. The variable can now be monitored at the bottom of the screen. 13. When you get bored, press F5. Now you can t read the registers until you pause. Task 2 1. Open session1/code/task2/task2.avrsln in AVR Studio. 2. Now you have to do some things to be able to read button presses. 3. Because of the way the buttons are connected, pressing a button will ground the pin the button is connected to, giving 0V and logical zero. 4. This is only interesting if the voltage on the pin is something other than 0V to begin with, otherwise there will be no change to detect. 5. Insert code to activate the internal pull-up (connecting the pin to 3V3 VCC through an internal resistor), ensuring a positive voltage on the pin. 6. Read in the datasheet, especially under Ports and Register Description to get a quick overview over capabilites. 7. This way of wiring the button will in fact make the bit representing each button be 0 when the button is pressed and 1 when unpressed(!) Exactly the opposite of what s intuitive. Task 3 1. Open session1/code/task1/task1.avrsln in AVR Studio again. 2. Press play, and when the yellow arrow appears, press Debug Windows Disassembly (ALT + 8). 3. You are now watching more or less the list file (task1/debug/task1.lss). 4. Press F11 to single step. 5. Look at page 557 in the datasheet for the instruction set summary. 6. Look at section 8.1 page 19 of the datasheet for memory overview. 7. Can you figure out what s going on? 8. Look at the right side, on the Processor View (if invisible:debug Windows Processor View). 9. There you can see the program counter, the status register (SREG), etc. 21

A.2 Kveld 2: Interrupts & Timere Her kommer oppgavene til kveld 2. 22

A.3 Kveld 3: ADC og USART Her kommer oppgavene til kveld 3. 23