SPRAWOZDANIE
z laboratorium techniki mikroprocesorowej
Temat: „Zapoznanie z AVR i pierwsze programy”.
Paweł Michałek ID 6.3 21.04.2008r.
Wprowadzenie do AVR:
Atmel AVR to rodzina ośmiobitowych mikrokontrolerów produkowanych przez firmę Atmel.
Jednostka arytmetyczno-logiczna opracowana przez dwóch studentów z Norwegian Institute of Technology oparta jest na schemacie RISC procesora i zasadami architektury harwardzkiej, zawiera 32 ośmiobitowe rejestry. Instrukcje arytmetyczno-logiczne mogą być wykonywane na rejestrach. Dane z pamięci mogą być tylko przesyłane do i z rejestrów. Charakteryzuje się ona prostą strukturą rozkazów, dużą wydajnością obliczeniową (większość rozkazów wykonywana jest w jednym takcie procesora).
Listę rozkazów dopasowano do wymagań współczesnych kompilatorów wprowadzając rozkazy pobierania danych przez adresowanie pamięci rejestrem 16-bitowym (zestaw dwóch rejestrów) z jednoczesnym zwiększeniem lub zmniejszeniem rejestru adresowego (pobierz i zwiększ/zmniejsz).
Produkowanych jest wiele rodzajów mikrokontrolerów różniących się wyposażeniem w urządzenia peryferyjne, ilość pamięci RAM, EEPROM i flash. W oznaczeniach dzieli się rodzinę na kontrolery Tiny AVR - małe, Mega AVR -duże, oraz specjalne.
Przykładowo: ATtiny13 zawiera 1kB pamięci programu (flash), 64 bajty EEPROMu, 64 B RAM + 32 rejestry, 6 wejść/wyjść, 2 kanały PWM, SPI, 4 kanały A/D, oscylator w układzie scalonym, montowany jest w obudowie 8 nóżkowej. ATmega2560 zawiera 256 kB pamięci programu, 4 kB EEPROMu, 8 kB RAM, 86 wejść/wyjść, 4 liczniki/czasomierze 16 bitowe, 6 PWM, SPI, 2 - UART, 16 - kanałów A/D ...
Kontrolery wyposażone są między innymi w:
- Watchdog - system restartu w przypadku zapętlenia się programu
- wewnętrzny oscylator
- UART lub USART - uniwersalny port wejścia wyjścia szeregowego, umożliwiający realizację - sprzętową wielu protokołów transmisji szeregowej,
- RTC - zegar czasu rzeczywistego (Real Time Clock),
- Przetworniki A/D i D/A - przetworniki analogowo cyfrowe i cyfrowo analogowe,
- Sprzętowe PWM,
- Sprzętową obsługę protokołów SPI, TWI (odpowiednik I²C).
- Porty I/O
- ISP (In-System Programming - programowanie w układzie) mikrokontroler programuje się w układzie bez wylutowywania, wyciągania mikrokontrolera z układu. Znacznie ułatwia to tworzenie urządzeń opartych na mikrokontrolerach i umożliwia wymianę oprogramowania w każdej chwili.
Konfiguracja układu do ćwiczenia:
diody LED połączone z portem PA mikrokontrolera (JP22-JP17)
wyprowadzenia wierszowe klawiatury matrycowej (W1...W4) połączone z młodszą częścią protu PB mikrokontrolera (PB0...PB3)
klawiatura matrycowa zmniejszona do czteroklawiszowej (zwarte JP3)
Program 1:
Program ten zapala diodę podłączoną do linii 7 portu A. wykorzystuje do tego instrukcję bitową sbi (ustaw bit w rejestrze I/O):
.INCLUDE "m32def.inc”
sbi DDRA,7
sbi PORTA,7
LOOP:
rjmp LOOP
Program rozpoczyna się dyrektywą, dołączającą plik nagłówkowy mikrokontrolera ATmega16. Dzięki temu można odwoływać się do rejestrów układu poprzez nazwy symboliczne, a nie przez adresy. Każdy rozkaz zajmuje 1μs (wewnętrzny oscylator 1MHz).
Program 2:
Program ten zapala co drugą diodę z linii diod LED wykorzystując do tego port A. Wykorzystuje do tego transferu danych:
ldi - ładowanie stałej do rejestru
out - wysyłanie zawartości rejestru na port
.INCLUDE "m32def.inc"
ldi R16,0xFF
out DDRA,R16
ldi R16,0b10101010
out PORTA,R16
LOOP:
rjmp LOOP
Rozkazy ldi R16,0xFF out DDRA,R16 odpowiadają za przełączenie portu PA w tryb pracy jako wyjście. (Przy starcie wszystkie porty pracują w trybie wejściowym, oprócz XTAL2)
Zadanie 3:
Program zapalający i gaszący diodę w zależności od stanu klawisza:
.INCLUDE "m32def.inc"
ldi R16,0xFF
out DDRA,R16 ;tryb wyjsciowy portu A
ldi R16,0x0F
out PORTB,R16 ;podciaganie mlodszej czesci portu B
LOOP:
sbi PORTA,PORTA1 ;ustaw linie
KLAWISZ1:
sbic PINB,PINB0
rjmp KLAWISZ1
KLAWISZ2:
sbic PINB,PINB1
rjmp KLAWISZ2
rjmp LOOP
Instrukcja sbic powoduje pomijanie kolejnej instrukcji gdy linia PINB0 znajduje się w stanie niskim tj. 0.
Program 4:
Program zmienia stan podpiętych diód LED przy naciśnięciu klawisza S5:
.INCLUDE "m16def.inc"
ldi R16, 0xFF
out DDRA, R16 ; port PA pracuje w trybie wyjściowym
out PORTB, R16 ; włącz podciąganie na liniach PB0...PB3
ldi R16, 0b10101010 ;stan początkowy przed przyciśnięciem
out PORTA, R16 ; PORTA=10101010
Petla:
Czekaj_1:
sbic PINB, PINB1
rjmp czekaj_1
ldi R16, 0b11000000
out PORTA, R16
Czekaj_2:
sbic PINB, PINB1
rjmp czekaj_2
ldi R16, 0b00110000
out PORTA, R16
Czekaj_3:
sbic PINB, PINB1
rjmp czekaj_3
ldi R16, 0b00001100
out PORTA, R16
Czekaj_4:
sbic PINB, PINB1
rjmp czekaj_4
ldi R16, 0b00000011
out PORTA, R16
rjmp Petla