Datorteknik 2 (AVR 2)

Relevanta dokument
AVR 5. Styrning av trafikljus. Digitala system 15 p

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

Datorteknik 1 (AVR 1)

CPU. Carry/Borrow IX. Programräknare

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Studera databladen för LCD på sid 4, 5, 7, 8, 14, 18, 19, 20 och 23. Datablad finns på kurshemsidan.

Laborationens mål är att få displayen att visa timmar, minuter och sekunder samt att kunna ställa klockan.

Laboration 5. Temperaturmätning med analog givare. Tekniska gränssnitt 7,5 p. Förutsättningar: Uppgift: Temperatur:+22 C

Att använda pekare i. C-kod

Datorprojekt, del 1. Digitala system 15 p

Kontrollskrivning Mikrodatorteknik CDT S2-704

LABORATION. Datorteknik Y

Minnets komponenter. Digitala System: Datorteknik. Programexekvering. Programexekvering. Enhet för utdata. Enhet för indata CPU.

I denna laboration undersöker vi hur aritmetiska beräkningar utförs. Vi tittar på olika variabeltyper: 8-bitars, 16-bitars, 32-bitars och flyttal.

Övningsuppgifter till föreläsning 2 Variabler och uttryck

LABORATION. Datorteknik Y

Micro:bit. Börja skapa egna program

Arduinokurs. Kurstillfälle 4

TDIU01 - Programmering i C++, grundkurs

Sphero SPRK+ Appen som används är Sphero Edu. När appen öppnas kommer man till denna bild.

Lösningar till tentamen i EIT070 Datorteknik

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

LEU240 Mikrodatorsystem

Vilken skillnad gör det var du placerar det? Prova båda.

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Logik och kontrollstrukturer

Beräkningsvetenskap föreläsning 2

Objektorienterad programmering Föreläsning 2

Klassdeklaration. Metoddeklaration. Parameteröverföring

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

JavaScript del 5 Funktioner

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Micro:bit och servomotorer

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

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

Användarhandledning Version 1.2

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Enkla datatyper minne

Drivrutiner för att hantera teckenfönster.

Lathund. C för inbyggda system

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

JavaScript Block Editor:

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Föreläsning 10. Pekare (Pointers)

Digitala Projekt(EITF40) - Larm

Legorobot. Lär dig programmera en legorobot. Teknikåttan Ola Ringdahl Lena Kallin Westin

Introduktion till programmering och Python Grundkurs i programmering med Python

Loopar och datatyper. Föreläsning 3

Loopar och datatyper. Föreläsning 3

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

2D1339 Programkonstruktion för F1, ht 2004

Data, typ, selektion, iteration

Lathund. C för inbyggda system

Att programmera arduinon

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

F4. programmeringsteknik och Matlab

C++ Lektion Tecken och teckenfält

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Lösningar till tentamen i EIT070 Datorteknik

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Föreläsning 6 pekare och pekare tillsammans med arrayer

Applikationsexempel Timer med tryckknapp

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

*Pekarvärden *Pekarvariabler & *

Projektlaboration 4, synkronisering av klockan

Programmering. Scratch - grundövningar

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Vop handledning. Användarhandledning till Vop applikationen. UPPGJORD: Mattias Gyllsdorff GODKÄND:Mattias Gyllsdorff REV: A DATUM:

Lab5 för prgmedcl04 Grafik

Innehåll. 1 Inledning 3

AVR Studio 4 Och AVRFLASH

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

Föreläsning 3. Programmering, C och programmeringsmiljö

Funktioner och programstruktur. Föreläsning 5

#include <pic.h> #include <sys.h> char LEFT,RIGHT,MOTORHASTIGHET;

Roboten. Sida 1 av 11

3.3 for-satsen. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 3

Code-Lite tutorial ( /RoJ)

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

i LabVIEW. Några programmeringstekniska grundbegrepp

KALKYLATOR LABORATION4. Laborationens syfte

1 Iteration. 1.1 for-satsen

Fråga 13. Skriv en loop som fyller arrayen int v[100] med talen

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell

Programmering i C, 7,5 hp

NXT LEGO-robot laboration Programmering och felsökning av en LEGOrobot

Lego Robot [ ] [ ] [ ]

Laboration 6 Formulär och stränghantering övningar/uppgifter

Felsökning av mjukvara

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Lågnivåprogrammering. Föreläsning 2 Lågnivåprogrammering. Binära tal. En enkel modell av datorns inre

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Transkript:

Namn: Laborationen godkänd: Digitala system 15 hp Datorteknik 2 (AVR 2) LTH Ingenjörshögskolan vid Campus Helsingborg Enkel in- och utmatning. Drivrutiner. Bithantering. I denna laboration ska vi förbättra kommunikationen med omvärlden och lära oss hur man testar bitar och påverkar bitar i en variabel. Förberedelser: Läs igenom laborationen. Komplettera tabellen i uppgift 1 och gör ett lösningsförslag på uttrycket till while-satsen i uppgift 3. Laborationsuppgifter. Uppgift 1. Tabell för de olika siffrorna. Ta fram förteckning över vilka bitar i PORTA som var anslutna till vart och ett av de sju segmenten på displayen (Laboration 1). Gör en tabell som innehåller alla siffrors utseenden. Med programmeringsspråk kallas en sådan tabell ofta array eller fält. En tabell är en samling värden som har numrerade platser. Ibland kan tabeller innehålla både kolumner och rader, men vår tabell har bara en kolumn och man kan alltså nå varje plats med ett enda nummer. Tabellens namn är segment_table, men skulle kunna heta vadsomhelst. const unsigned char anger att tabellvärdena ska vara 8-bitarstal som inte ska kunna ändras av programmet. Vi väljer att skriva binärt med 0b eftersom det blir tydligare i det här fallet (vi ser precis hur bitar är satta). Observera att den vänstraste biten (bit 7) alltid ska vara ett eftersom den ser till att knappens pullup-motstånd är inkopplat. Erik Larsson

Skriv in tabellen och det övriga skalet: #include <avr/io.h> const unsigned char segment_table [] = { 0b11111101, //"0" 0b11001000, //"1" }; unsigned char n; int main(void) { DDRA = 0b01111111; PORTA = 0b10000000; // Utgångar till display // Aktivera pull-up } while (1) { n=(n+1); // Öka n med ett if (n==10) n=0; // nollställ om n blir =10 PORTA = segment_table[n]; // Skriv ut med tabellen } Huvudprogrammet består nu av en oändlig slinga som skriver ut tabellvärdena för index 0 t.o.m. 9. Variabeln n som är den siffra som ska skrivas ut, är alltså index till den plats i tabellen där siffrans segmentmönster finns. Provkör programmet med AutoStep. Hur ser det ut på displayen?... Kommentera bort raden if (n==10) n=0; (sätt // längst till vänster) och kör Autostep igen. Vad skrivs ut på displayen?... Återställ programmet och kör i full fart! Hur ser det ut nu?... 2

Uppgift 2. Drivrutiner. Den som skapar själva applikationen (programmet som gör det intressanta arbetet), vill inte vara tvungen att hålla reda på detaljer i hårdvaran som inte har med uppgiften att göra. Exempelvis ska man inte behöva hålla reda på exakt hur display och knapp är inkopplad. Om man vill skriva en siffra ska man bara behöva skriva t.ex. display(5); eller display(n); om man vill skriva ut en femma om man vill skriva ut värdet av variabeln n Vi ska nu skriva en funktion (drivrutin) som sköter detta åt oss: // Funktion display: // skriver ut en decimal siffra på displayen. void display (unsigned char number) { PORTA = segment_table [number]; } Skriv in funktionen! Ändra nu i huvudprogramslingan så att den anropar funktionen istället för att skriva direkt till displayen. Observera fördelen med att använda en rutin för kommunikation med displayen. I din PC används oerhört mycket mer komplicerade drivrutiner (för tangentbord, bildskärm, nätverk m.m.) men principen är densamma. Programmeraren behöver inte bry sig om hur allt detta fungerar egentligen. 3

Uppgift 3. Tärning Lägg till en sats i programslingan så att programmet stoppas när knappen är uppe. När knappen hålls ner kommer programmet att snurra en massa gånger och man får ett ganska slumpmässigt resultat på displayen. Uppgiften kan formuleras: så länge som (knappen är uppe) gör inget; eller while (knappen uppe){ }; Bestäm vad som ska stå inuti parentesen (dvs. vad ska skrivas i stället för knappen uppe )? För att komma fram till C kod kan man först förklara problemet på svenska och sedan stegvis omformulera det till C. Skriv in satsen och testa! Uppgift 4. Vanlig 6-sidig tärning Ändra ditt program så du får en vanlig 6-sidig tärning. Den ska alltså visa siffrorna 1, 2, 3, 4, 5 eller 6. Testa. 4

Uppgift 5. Avkänna enskilda knapptryckningar. Uppgiften är att räkna upp displayens värde en enda gång för varje gång man trycker ner knappen. Vi beskriver först programmets uppgifter i en flödesplan: Knappen nere? Nej Ja Öka n Öka n N = 10? Ja Sätt n = 0 Öka n Nej Skriv ut n Öka n Knappen nere? Nej 1. Vänta här tills någon trycker på knappen 2. Öka n med ett. 3. Om n blir 10, sätt n till noll. 4. Anropa utskriftsfunktionen med n som inparameter. 5. Vänta här tills knappen är släppt. 6. Gå till punkt 1. Punkterna 1 4 är avklarade i föregående uppgift, så du bör kunna klara av 5 Ja

punkt 5 på egen hand: Testa programmet. Fungerar det bra? Räknas värdet upp med ett för varje knappnedtryckning? Vad beror det på? Uppgift 6. Fördröjningsslinga. Problemet med tangentstudsarna kan hanteras med en vänteslinga. Deklarera ett 16-bitars positivt tal (k) och stoppa in for-satsen nedan på de ställen som behövs. for (k=0; k<10; k++); Fungerar det bra nu? Vad händer om du gör for-slingan bara en gång, dvs. skriver k<1? Vad händer om du skriver k<60000 istället? Välj ett värde att testa med som 1. är tillräckligt stort för en absolut säker funktion. 2. är tillräckligt litet för att det inte ska kännas segt. Mitt värde:...(antal loopar) För att denna for-loop ska fungera, så måste kompileringen göras utan någon som helst optimering. Prova med att ändra optimeringen till -O1. Ladda ner och kör i full fart! 6

Kompilatorn tycker att denna for-loop är helt meningslös och struntar i att skapa kod för den. Det är inte bra. Om vi vill tvinga kompilatorn att inte ignorera variabeln k, så måste den deklareras såhär: volatile unsigned int k; Uppgift 7. Beräkning av tid. Vi ska ta reda på hur lång tid vår fördröjning verkligen tar. Öppna fönstret Disassembler under menyn View eller med knappen. Sätt igång programmet på autostep och se efter hur många instruktioner (rader) som pilen vandrar igenom när fördröjningsslingan genomlöps. Man kan räkna med en mikrosekund per rad. Hur lång tid tar ett varv i din vänteloop? Hur lång tid (ungefär) kommer din väntetid att vara? Om du använder simulatorn i stället för att ladda ner koden i labbutrustrningen, så kan du använda det som kallas Stop Watch och lätt se hur lång tid olika programdelar tar. Sätt en brytpunkt framför for-loopen och en framför satsen strax efter. Hur lång tid tar din väntetid med denna mätning? 7

Uppgift 8. Privatuppgiften. Du ska nu testa den uppgift du fick i början av laborationen. Eftersom ni laborerar två och två, så ska ni testa bådas uppgifter. 8