background image

Sprawozdanie z ćwiczenia 8

Data wykonania ćwiczenia: 24.05.2010

Temat ćwiczenia: Mikrokontrolery AVR cz.II

 

Laboratorium Mikroinformatyki

Rok akademicki

Termin

Rodzaj studiów

Kierunek

Prowadzący

Grupa

Sekcja

2009/2010

poniedziałek

dzienne

INF

GD

1

C

12.03.2010

Skład sekcji:

Korneliusz Olejniczak
Przemysław Sadowski

background image

1. Zadanie:

Naszym zadaniem podczas laboratorium było napisanie programu kopiujacego tablice 
z pamieci ROM do pamieci RAM az do napotkania ciagu słowa 0x00,0xff lub do 
osiagniecia liczby przekopiowanych elementów równej 30. Kazdorazowo wczytany 
znak miał byc wystawiony na wyjscie na porcie B. Program miał powstać w języku C.

2.  Rozwiązanie zadania:

Działanie programu:
Program działa tak jak powinien. Jeśli tablica jest krótsza i zakończona sekwencją końcową, 
jest dłuższa, czy taka jak powinna być, program nie zgłasza błędów, bądź nie wysypuje się.

linia

Polecenie programu

Komentarz

1
2
3
4
5 0x20,0x15, 0x10, 0x43, 0x20, 0x02, 
6 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 
7 0x09, 0x10, 0x11, 0x12, 0x13, 0x09, 
8 0x10, 0x11, 0x12, 0x13, 0x09, 0x10, 
9 0x00, 0xff, 

Zakończenie tablicy ROM

10 };
11

zmienne pomocnicze

12
13
14
15
16

// -----------------------------------------------------

17

DDRA=0x00;

Ustaw ienie Portu A jako w yjścia

18

PORTA=0xFF;

19

DDRB=0xFF; 

Ustaw ienie Portu B jako w ejścia

20

PORTB=0x00;

21
22

Włączenie obsługi przerw ań

23
24

licznik=0;

25

Początek pętli sczytującej 30 elementów   tablicy

26

{

27

Sczytanie pierw szego bajtu z ROM

28

29

       PORTB=temp;

Jeśli nie jest, to na Port B w yślij sczytany bajt

30

       tab_ram[licznik]=temp;

31

       licznik++;

Zw iększ licznik o jeden

32

}

33
34

break;

35
36

}

37
38 }

#define TABLE_LENGTH 30

volatile unsigned char tab_ram[TABLE_LENGTH]; 

Zadelkarow anie tablicy RAM w ielkości 30

static unsigned char tab_rom[] PROGMEM = {

Zadelkarow anie tablicy ROM:

o losow ych martościach

unsigned int licznik;
unsigned int temp;

// ************** main **************
void main(void) {

sei();

w hile(licznik<TABLE_LENGTH)

temp=pgm_read_byte(&tab_rom[licznik]);

if( temp!=0x00 || pgm_read_byte(&tab_rom[licznik+1])!=0xff){

Jeśli sczytyw any bajt i następny są sekw encja 
końcow ą  to przerw ij

Zapisz do tablicy RAM na pozycji licznika 
sczytany bajt

else

// end of programm

background image

Wnioski:

Próba została przeprowadzona dla 30 elementów w tablicy(28 losowych bajtów, 2B końcowej 
sekwencji), przy ustawionym procesorze na 1 MHz(dla uproszczenia obliczeń) w AVRStudio. 

Program napisany w języku Assembler trwał 448 taktów, czyli 448 μs.

Samo rozpoczęcie programu w języku C(na poprzedniej stronie), tzn. zadeklarowanie 
zmiennych, dodanie bibliotek, zajmuje 236 taktów. Pozostałe czynności zajmują kolejne 628 
taktów co daje nam ich 865. 

Wynika z tego, że programy pisane w języku Assembler są dużo szybsze niż, w języku C, 
mimo identycznego działania.