laboration 1 - eit.lth.se

13
1 Laboration 1 EITF12

Upload: others

Post on 06-Nov-2021

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Laboration 1 - eit.lth.se

1

Laboration 1

EITF12

Page 2: Laboration 1 - eit.lth.se

2

I denna laboration ska ni bekanta er med programvaran Atmel Studio 7.

Atmel Studio 7 startas och stoppas med hjälp av programvaran Cloudpaging Player .

Om det gått en tid sedan man senast startade Atmel Studio 7, visas felmeddelandet ”Not validated”. Då måste man

logga in på https://apps.lu.se/ och invänta . Leta upp Atmel Studio 7 och klicka på ”Launch”. Vänta sedan någon minut.

Under tiden startas först Cloudpaging Player och därefter Atmel Studio 7.

Skapa ett projekt

Klicka på ”New Project”.

Välj ”GCC C Executable Project”, namnge projektet och tala om var det ska sparas. Klicka . Det skapas en mapp och ett projekt med samma namn.

I nästa dialogruta väljes processorn.

OK

Skriv först Atmega1284 Markera därefter

översta raden och klicka OK.

Page 3: Laboration 1 - eit.lth.se

3

När du kommit så här långt är det först några inställningar som ska göras.

Under ”Project”, välj ”[project_name]” Properties.

Markera ”Tool” (till vänster).

Markera ”Toolchain” Gå vidare till ”Oprimization”

Avmarkera rutan ”Relax branches (-mrelax). Välj ”None (-O0)”, Ingen optimering. Annars kan kompilatorn optimera bort vissa variabler.

Spara inställningarna genom att klicka på den blå rutan.

Välj fliken ”main.c.

Här väljer du ”Simulator” eftersom du troligen inte har någon processor inkopplad när du jobbar hemma.

Ett tomt program visas.

Page 4: Laboration 1 - eit.lth.se

4

Skriv in följande program.

Nu har vi skrivit ett enkelt program. Man kan spara det genom att trycka på samma blåa ruta som tidigare. Nästa steg är att kompilera programmet vilket göres i fliken Build och där i välja build solution (se i figur nedan ) Om inga syntaxfel hittas och allt är OK får man meddelandet Build succeeded. Om inte rätta till felen och gör om.

Nästa steg är att starta debuggern. Vi vill ha kontroll över hur programmet exekveras och olika variabler beteende. Tidigare valde vi simulator i inställningar då vi inte har någon hårdvara att testa på.

Start debugging and brake

Start debugging (run)

Stop

Step into

Step over

• Klicka på knappen ”Start debugging and brake” (till vänster i menyn).

Observera den gula pilen. Den visar vilken sats som ska utföras. När pilen syns vet du att programmet är i debug-läge.

Nere till vänster i Atmel Studio finns ”Watch window” som för närvarande är tomt.

Högerklicka på variabeln b i filen ”main.c”.

Vänsterklicka på

Variabeln b kommer nu att visas i ”Watch window”.

Page 5: Laboration 1 - eit.lth.se

5

Variabeln b har fått startvärdet 0. Typen är ” uint8_t”, dvs. Åttabitars (en byte) positivt talområde, se tabell 1 nedan. Kolumnen ”Type” anger vilken datortyp variabeln b har och adressen till den plats i minnet där variabeln finns.

• Stega nu programmet med knappen Step Into och se hur värdet ändras.

Brytpunkter

Programmet kan stoppas genom att infoga en brytpunkt vid en viss rad i programkoden.

• Klicka ”Reset”

• Klicka på raden ”b = b +1”. Tryck F9 ”Toggle breakpoint”. En röd punkt visar att en brytpunkt har infogats.

• Kör programmet med F5 eller grön pil Programmet körs nu fram till brytpunkten och stoppar där.

• Klicka igen och lägg märke till hur värdet på variabeln b räknas upp i Watch window. Brytpunkten tas bort genom att klicka på raden och trycka F9.

Vi har nu tittat på några vikttiga och användbara funktioner i debuggern. Med hjälp av brytpunkter , stegvis exekvering och watch får man bra kontroll över sitt program och hur det beter sig.

Tabell 1.

Datatyper i C Namn Storlek(byte) Min Max

char 1 -128 127 unsigned char 1 0 255 int8_t 1 -128 127 uint8_t 1 0 255 int16 2 -215 215 -1 uint16 2 0 216 -1 int 2 -215 215 -1 unsigned int 2 0 216 -1

Kanske du måste dra kolumnen åt vänster för att se värdet.

Page 6: Laboration 1 - eit.lth.se

6

Uppgift 1.

• Kolla så att debuggern är stoppad. • Ta bort alla brytpunkter. • Ändra nu i programmet så att b räknas ner istället. Behåll resten av koden

oförändrad!

• Starta debuggern med debug and break . • Stega igenom programmet upprepade gånger till variabeln b inte ändras mer.

Vad händer nu med variabeln b?

Varför?

• Ändra nu deklarationen av b till ” int8_t”. Uppgift 2.

Vad händer nu när b räknas ner?

Varför?

Variabelminnet

Med hjälp av Atmel Studio kan vi visa innehållet i processorns minne.

• Skapa ett nytt projekt i Atmel Studio (Se sidan 1 och 2). Glöm inte stänga av optimeringen. • Skriv in detta lilla program.

• Kompilera och starta debuggern med debug and break . • Lägg till variablerna i ”Watch window”.

Variablerna får sitt värde efter hand som man stegar igenom programmet. Efter att man stegat igenom programmet kan det se ut så här:

Page 7: Laboration 1 - eit.lth.se

7

Watch window Memory window Minnet kan studeras i fönstret nere till höger (memory window). Där kan man se hur variablerna lagras. Först måste man komma fram till var i minnet variablerna finns. I ”Watch window”, kolumnen ”Type” står vilken av datortyp variabeln är, samt på vilken minnesadress den finns.

• Läs variablernas minnesadresser i ”Watch window” • Skriv in en lämplig minnesadress i rutan ”Address” i Memory window, tex. 0x40f0.

Nu ser du variablernas plats i minnet och deras värde. Om värdet på en plats i minnet ändras indikeras detta med röd färg.

• Variabeln ”Var3” är av typen ”uint16_t”. • Läs av värdet på ”Var3” i ”Watch window” och jämför med minnet.

Uppgift 3. Hur lagras 16-bitarsvärdet i minnet? En byte eller två?

Uppgift 4.

Variabeln ”arr” är en array med tre 8-bitarsvärden.

Hur lagras de i minnet?

Uppgift 5.

I uppgift 1 är variabeln b globalt deklarerad och i uppgift 2 är variablerna lokala.

På vilka adresser lagras lokala variabler och var lagras de globala?

Variabelnamn: Var1: Värde: 0x41 Datatyp: char Finns på minnesadress: 0x40f5

Page 8: Laboration 1 - eit.lth.se

8

Platsen för lokala variabler är ett speciellt område i minnet, vilket?

Swap!

Följande två labbövningar är något artificiella, men ändå viktiga. De kommer att visa en egenskap hos programmeringsspråket C (och många andra för den delen). Båda dessa C-program förväntas byta ut innehållet i de två variablerna a och b. Om det lyckas sätts alla IO-pinnare på PORTB till 1.

Swap Swap med pekare

• Skapa ett nytt projekt. • Kopiera in programmet ”Swap” i projektet (programmet till vänster). • Kompilera och starta debuggern med debug and break. • Lägg till variablerna a, b, var1 och var2 i watch window.

OBS minnesadresserna för a och b syns endast när man är i funktionen ” void swap(uint8_t a, uint8_t b)”. Variablerna a och b är lokala, medan var1 och var2 är globala variabler.

• Sätt en brytpunkt på första raden i funktionen ”void swap(uint8_t a, uint8_t b)” dvs. uint8_t temp = a;.

• Stega igenom programmet med step into .

Uppgift 6. Ändras värdena för var1 och var2 och varför blir det så?

#include <avr/io.h> void swap(uint8_t a, uint8_t b);

uint8_t var1 = 1; uint8_t var2 = 2;

int main(void) {

DDRB |= 0xFF;

while (1) { swap(var1, var2);

if (var1 == 2) { PORTB = 0xFF; } else { PORTB = 0; } }

} void swap(uint8_t a, uint8_t b) {

// swap the content of a and b uint8_t temp = a; a = b; b = temp;

}

#include <avr/io.h> void swap(uint8_t *a, uint8_t *b);

uint8_t var1 = 1; uint8_t var2 = 2;

int main(void) {

DDRB |= 0xFF;

while (1) { swap(&var1, &var2);

if (var1 == 2) { PORTB = 0xFF; } else { PORTB = 0; } }

} void swap(uint8_t *a, uint8_t *b) {

// swap the content of a and b uint8_t temp = *a; *a = *b; *b = temp;

}

Page 9: Laboration 1 - eit.lth.se

9

Pekare till undsättning

Anledningen till att funktionen void swap (uint8_t, uint8_t), till vänster, inte fungerar är att alla in-parametrar till en funktion i programmeringsspråket C kopieras. Funktionen ”swap(uint8_t, uint8_t)” tar emot var1 och var2. Inne i funktionen är var1 och var2 bara lokala kopior av de globala variablerna var1 och var2. När du ändrar de lokala kopiorna påverkas inte originalvariablerna. För att lösa detta problem kan något som kallas pekare användas. En pekare i C är en variabel som innehåller en adress till en minnesplats som processorn kan komma åt. Om in-parametrarna till funktionen är pekare som pekar på minnesplatserna för var1 och var2, ändras i stället data på platserna i minnet där var1 och var2 finns.

Swap med pekare

• Kopiera nu i stället in programmet ”Swap med pekare”. • Öppna fönstret I/O.

• Klicka på PORTB. • Utsignaler och insignaler på PORTB visas i nedre fönstret.

• Kompilera och starta debuggern med debug and break. • Lägg till variablerna a, b, var1 och var2 i watch window om de inte redan finns där.

• Sätt en brytpunkt på första raden i funktionen ”void swap(uint8_t a, uint8_t b)”.

• Klicka upprepade gånger på ”Continue” .

Uppgift 7.

• Iaktta var1 och var2 i Watch window, samt se vad som händer med PORTB i I/O-fönstret. Vad händer med port B och varför?

I fönstret ”I/O” kan man se statusen för processorns portar och register.

Page 10: Laboration 1 - eit.lth.se

10

#include <avr/io.h> void swap(uint8_t *a, uint8_t *b);

uint8_t var1 = 1; uint8_t var2 = 2;

int main(void) {

DDRB |= 0xFF;

while (1) { swap(&var1, &var2);

if (var1 == 2) { PORTB = 0xFF; } else { PORTB = 0; } }

} void swap(uint8_t *a, uint8_t *b) {

// swap the content of a and b uint8_t temp = *a; *a = *b; *b = temp;

}

Här anropas funktionen swap(uint8_t *a, uint8_t *b);

&-tecknet betyder: ”adressen till var1”, respektive ”adressen till var2 ”.

En variabel som pekar på en adress kallas för en pekarvariabel.

Här är * en operator. Betyder: det värde som a pekar på.

Här deklareras två pekarvariabler som kan peka på varsitt 8-bitars tal i minnet.

Page 11: Laboration 1 - eit.lth.se

11

Timer

I sista uppgiften ska en variabel räknas upp med 1 med en frekvens på 1 Hz med hjälp av en timer. Variabelns värde ska skrivas ut på PORTB. När simulatorn används går det inte att läsa av portar under tiden programmet körs. Därför måste en brytpunkt sättas på en lämplig programrad. När programkörningen stoppats vid brytpunkten ska man kunna se resultatet på PORTB i I/O-fönstret.

Processorns hastighet styrs av en klocka. När man använder simulatorn är processorns klockfrekvens 1 MHz / 8 = 125 kHz. I processorn finns fyra timers. Två av dessa är timers med räkneregister på 16-bitar (timer 1 och 3) och de resterande två har 8-bitars räkneregister (timer 0 och 2). 8-bitars-registerna TCNT0 (tillhör timer 0) och TCNT2 (tillhör timer 2) räknar från 0 – 255. När de nått värdet 255, börjar de om på 0 igen. Detta kallas för overflow. 16-bitars-registerna TCNT1 och TCNT3 räknar från 0 – 65535 och börjar därefter om på 0. Ett register kan nollställas mitt under uppräkningen av programmet om man vill. Efter nollställningen börjar registret att räknas upp igen.

En prescaler finns till vart och ett av registerna. Den delar ner klockfrekvensen som styr hur fort registret ska räknas upp. På så vis kan man få registret att räknas upp i långsammare takt.

Exempel: Klockfrekvensen ska delas med 8.

Ställ prescalern till registret TCCR0 till clk/8.

Se Atmega1284 datablad sid. 128 - 152.

Bits 2:0 – CS0[2:0]: Clock Select 0 [n = 0..2] The three Clock Select bits select the clock source to be used by the Timer/Counter.

Sid.145

Sid.146

Page 12: Laboration 1 - eit.lth.se

12

En etta ska sättas på bit 1, (CS01) i TCCR0B, de andra bitarna behöver inte ändras. I sitt program skriver man:

TCCR2B |= 0b00000010;

Men följande skrivsätt är att föredra:

TCCR2B |= (1 << CS21);

Det blir samma resultat: Klockfrekvensen på 125000 Hz/8 = 15625 Hz. Timerns räkneregister TCNT0 räknas upp 15625 gånger per sekund. Eftersom registret TCNT0 är ett 8-bitars register overflowar det vid.

Uppgift 8.

Med en timern inställd enligt ovan, med vilken frekvens overflowar timers räkneregister?

Page 13: Laboration 1 - eit.lth.se

13

Uppgift 9.

Skriv ett program som efter en sekund, räknar upp en variabel med ett och skriver ut den på PORTB. OBS riktningsregistret DDRB måste var konfigurerat så PORTB blir en utport (exempel finns i projektmanualen på kurshemsidan).

Vilka register har ni använt och vilka värden har ni skrivit in i registern?