Zakres laboratorium:
  1. Zapoznanie z płytką EDU
  2. Typy zmiennych dla mikrokontrolerów AVR
  3. Operacje bitowe
  4. Rejestry DDRx, PORTx, PINx – sterowanie portami
 Zadania do wykonania:
  • Zadanie 1.1
  • Zadanie 2.1
  • Zadanie 2.2
  • Zadanie 4.1
1. Zapoznanie z płytką EDU (płytka EDU)
opis-EDU
Rozmieszczenie elementów na płytce.

Do czego mogą służyć poszczególne elementy?

Dane techniczne mikrokontrolera ATmega32A:

  • Rodzina: AVR
  • Organizacja pamięci Flash: 32kb
  • Pamięć EEPROM: 1024B
  • Pamięć SRAM: 2048B
  • Częstotliwość maksymalna: 16MHz
  • Napięcie pracy: 2,7 – 5,5V
  • Liczba wejść/wyjść: 32
  • Liczba kanałów PWM: 4
  • Liczba timerów 8-bit: 2
  • Liczba timerów 16-bit: 1
  • Obudowa: DIP40

Przykładowy wynik kompilacji:

wynik kompilacji
Wynik kompilacji.

 

Program – pamięć Flash

Data – pamięć SRAM (20% – minimalna wartość jaka powinna być dostępna)

 Zadanie 1.1

  • Utworzyć nowy projekt z plikami „GLOBAL.h” i „main.cpp” (szablony plików na stronie  Środowisko programistyczne AVR). Podłączyć programator, skompilować i wgrać program do mikrokontrolera.
  • Ile pamięci zajmuje ten program?

 

2. Typy zmiennych dla mikrokontrolerów AVR

Mikrokontrolery ATmega32 i ATmega328P są mikrokontrolerami 8-biotowymi (wszystkie rejestry mają pojemność 8 bitów). Oznacza to, że potrafią wykonywać proste operacje tylko na liczbach 8-biotowych, w celu wykonania operacji na większych liczbach mikrokontroler musi wykonać kilka instrukcji, co wpływa na wydajność programu. Dlatego też w pakiecie WinAVR można znaleźć specjalne typy zmiennych z dokładnym sprecyzowaniem rozmiaru zmiennej (stdint.h).

Typy zmiennych dla liczb dodatnich (bez znaku) i całkowitoliczbowych:

  • uint8_t – 0 – 255
  • uint16_t – 0 – 65535
  • uint32_t – 0 – 4294967295
  • uint64_t – 0 – 18446744073709551615

Zmienne z znakiem i całkowitoliczbowe:

  • int8_t – -128 – 127
  • int16_t – -32768 – 32767
  • int32_t – -2147483648 – 2147483647
  • int64_t – -9223372036854775808 – 9223372036854775807

Zmienne dla liczb zmiennopozycyjnych (liczba z przecinkiem) – typy zajmujące dużo pamięci:

  • float
  • double

Zmienne inne:

  • char – zmienna 8 bitowa do przechowywania znaków
  • bool – true/false – przechowuje wartość na pierwszej pozycji bajtu (0b00000001/0b00000000) ale i tak zajmuje 8 bitów.

Bity, bajty itd. – o co w tym chodzi???

uint8_t liczba= 209;  uint8_t liczba= 0b11010001; uint8_t liczba= 0xD1;

bajt_01_small
Bajt interpretowany jako liczba bez znaku. Źródło*

int8_t liczba= -47;  int8_t liczba= -0b11010001; int8_t liczba= -0xD1;

bajt_02_small
Bajt o tej samej zawartości, teraz interpretowany jako liczba ze znakiem. Źródło*

uint16_t liczba= 37585;  uint16_t liczba= 0b1001001011010001; uint8_t liczba= 0x92D1;

dwa_bajty_01_small
Dwa bajty interpretowane jako liczba bez znaku. Źródło*

 

Zadanie 2.1

  • wyniki zapisywać na kartce w celu pokazania prowadzącemu
  • przygotować i skompilować poniższy program

  • ile pamięci zajmuje program przy rozmiarze tablicy 10?
  • zmienić rozmiary tablicy na 100,1000,2000
  • zanotować informacje o wykorzystanej ilości pamięci
  • zmienić typ uin8_t na int i przeprowadzić takie same badania

Zadanie 2.2

  • skompilować poniższy program:

 

 

  • ile pamięci zajmuje program, którzy wykorzystuje liczby zmiennoprzecinkowe
  • zmienić typ liczby „zmienna” z float na uint8_t
  • ile pamięci teraz zajmuje program, ile pamięci dodatkowo musi wykorzystać kompilator aby móc obsługiwać liczby zmiennoprzecinkowe?

Jakie wnioski można wysunąć? Przemyśleć i zaprezentować prowadzącemu wyniki i przedstawić wnioski.

3. Operacje bitowe
  • Zaprzeczenie NOT: ~
  • Iloczyn AND: &
  • Suma OR: |
  • Suma wyłaczająca XOR: ^
  • Przesunięcie w prawo: >>
  • Przesunięcie w lewo: <<

Zapoznać się z działaniem operacji: link1, link2

W pliku „GLOBAL.h” znajdują się funkcje do operacji bitowych:

  • sbi(rejestr,bit) – ustawia w rejestrze bit(pozycje) jako 1 – SET
  • cbi(rejestr,bit) – ustawia w rejestrze bit(pozycje) jako 0 – CLEAR
  • tbi(rejestr,bit) – ustawia w rejestrze bit(pozycje) na przeciwną wartość – TOGGLE

 

4. Rejestry DDRx, PORTx,PINx – sterowanie portami
ATmega32A - wyprowadzenia
ATmega32A – wyprowadzenia

Wyprowadzenia mikrokontrolera – sterowanie:

  • Port A – PA0-PA7 – DDRA, PORTA, PINA
  • Port B – PB0-PB7 – DDRB, PORTB, PINB
  • Port C – PC0-PC7 – DDRC, PORTC, PINC
  • Port D – PD0-PD7 – DDRD, PORTD, PIND

 

Rejestry – a o co chodzi?

Rejestr DDRx – rejestr kierunku:

  • 0 – ustawia wyprowadzenie jako wejście
  • 1 – ustawia  wyprowadzenie jako wyjście

Rejestr PORTx – rejestr wyjściowy – gdy DDRx ==1:

  • 0 – ustawia wyprowadzenie w stan niski
  • 1 – ustawia wyprowadzenie w stan wysoki

Rejestr PORTx – rejestr wyjściowy – gdy DDRx ==0:

  • 0 – nic nie robi (stan wysokiej impedancji)
  • 1 – pull-UP – podciągnięcie wyprowadzenia do VCC przez rezystor 10k (zapobiega pojawianiu się nieokreślonych stanów na wyprowadzeniu)

Rejestr PINx – rejestr wejściowy – tylko do odczytu:

  • 0 – oznacza stan niski na wyprowadzeniu
  • 1 – oznacza stan wysoki na wyprowadzeniu

Podsumowując:

DDRx PORTx PINx*
Wyjście stan niski 1 0
Wyjście stan wysoki 1 1
Wejście wysoka impedancja 0 0
Wejście PULL-UP 0 1
Odczyt wejścia – stan wysoki 0 x 1
Odczyt wejścia – stan niski 0 x 0

*-tylko do odczytu

W celu ustawienia wyprowadzenie PD6 jako wyjście w stanie wysokim należy:

 

W celu ustawienia wyprowadzenie PD6 jako wyjście w stanie niskim należy:

 

Program realizujący miganie diodą:

Można też krócej:

 

Pierwsze kroki:

  • podłączyć port D do linijki diodowej według schematu (jeśli zworki są w innym położeniu to należy je przepiąć):
led-linijka
Zworki powinny być u góry (założone na VCC i A)
  • ustawić cały port D jak wyjścia – będzie służył do sterowania diodami. W celu uruchomienia diody należy ustawić stan niski na wyprowadzeniu mikrokontrolera.

Kilka sposobów:

  1. DDRD=0xFF;
  2. DDRD |= (1<<PD0) | … | (1<<PD7)
  3. sbi(DDRD, PD0) … sbi(DDRD, PD7)

 

Zadanie 4.1 – sterowanie wyprowadzeniami mikrokontrolera:

  • włączyć wszystkie diody LED – jak można to zrobić, przetestować 3 sposoby
  • napisać funkcję, który będzie mrugał wszystkimi diodami z częstotliwością 1s
  • przygotować funkcje, która będzie realizowała zadanie „biegający punkt”. Jedna dioda na linijce diodowej jest włączona i porusza się w lewo lub w prawo – w zależności gdzie świecący punkt był wcześniej.

 

Zadanie domowe (wykonuje każda osoba samodzielnie):
  • zapoznać się z tworzeniem schematów elektronicznych (Link1, Link2)
  • narysować schemat elektroniczny na podstawie układu z zadania 4.1 (biegający punkt)
  • schemat musi zawierać: mikrokontroler, podłączenie programatora, układ stabilizacji napięcia, diody LED z rezystorami
  • schematy mogą być wykonane w programie komputerowym lub narysowane odręcznie,
  • kompletne/prawidłowe schematy należy przynieść na kolejne zajęcia na kartce A4

 

Zadania na przyszłe laboratorium:
  1. Utrwalić wiadomości dotyczące obsługi portów (rejestr DDRx, PORTx, PINx – do czego służy, jak czytać?)
  2. Co to jest klawiatura matrycowa, jak obsługiwać? (klawiatura 4×4)
  3. Wyświetlacz LCD oparty o sterownik HD44780 – jak obsługiwać?
  4. Algorytm kalkulatora liczb całkowitych opartego o klawiaturę 4×4 (problem wczytywania liczb), wyświetlacz LCD (dodawanie, odejmowanie, mnożenie, wynik, anuluj)

* – http://apollo.astro.amu.edu.pl/PAD/index.php?n=Dybol.DydaktykaBinaria1