Mikrokontrolery AVR

advertisement
Mikrokontrolery AVR
Budowa
zastosowanie
programowanie
Co to jest
mikrokontroler?
Mikrokontroler jest kompletnym systemem
komputerowym zbudowanym w pojedynczym
układzie scalonym, zawierającym jednostkę
centralną, pamięć, generator sygnału
zegarowego oraz układy wejścia i wyjścia.
Zarys:

AVRy to sympatyczne uC (mikrokontrolery) firmy
znanej chyba wszystkim z produkcji legendarnej "51" z
pamięcią Flash - http://www.atmel.com . Rodzina ta
należy do procesorów RISC - choć lista rozkazów jest
dość rozległa. Większość rozkazów wykonują w
JEDNYM takcie - w przeciwieństwie do np. 12
taktowych MCS-51. Dodatkowo posiadają mechanizm
pipeline czyli przetwarzania potokowego.
Taktowane przeważnie do max 16MHz (mające jednak
duże zdolności do podkręcania nawet do 30MHz w
przypadku serii ATMmega). Procesorki zewnętrznie 8
bitowe, jednak pamięć programu ma organizację w
postaci słów.
Wszystkie nowe AVR-y nie wymagają zew. zegara do
działania. Stare układy z gałęzi Classic np. AT90S2313
nie posiadały takich możliwości. Dlatego w ich
przypadku kwarc czy sygnał zegarowy jest niezbędny.
A co chyba najważniejsze są l4m3 odporne! Nie
straszne im odwrotne włożenie w podstawkę, zbyt
duże napięcie, zwieranie portów, itp przypadki - spocą
się, ostygną i działają dalej
Podział:
AVR 8bit dzielą się obecnie na parę głownych grup: Classic -
obecnie już wycofane, Tiny, Mega oraz XMEGA o których
później. Istnieją jeszcze mikrokontrolery specjalizowane jak:
Lighting AVR (z dużą ilością generatorów PWM), Pico Power (o
bardzo niskim poziomie poboru energii), USB (posiadające np.
sprzętowy interfejs USB) czy Automotive. Jednakże są to układy
niszowe.
Wracając jednak do głównego podziału. Jak łatwo się domyśleć
rodzina Tiny jest okrojona z znacznej części
peryferiów/zasobów które posiada rodzina Mega. Największe
układy Mega umożliwiają dołączenie zew. pamięci RAMu czyniąc
z nich kompletne potworki
Co przemawia za
AVR-ami?
darmowe środowiska programistyczne +
bogata liczba kompilatorów i nieskończone
zasoby bibliotek!
Budowa mikrokontrolerów AVR

Budowa mikrokontrolera opiera się o architekturę hardwardzką. Odpowiednia
konfiguracja zewnętrzna mikrokontrolerów umożliwia dołączenie zewnętrznej
pamięci danych o rozmiarze do 64 KB, przy czym słowo danych ma rozmiar 8
bitów. Dużą szybkość mikrokontrolera zapewnia przetwarzanie potokowe
powodujące wykonywanie większości rozkazów mieszczących się w jednym
cyklu zegarowym, oraz 32 bajtowy (bardzo duży) obszar rejestrów roboczych,
o natychmiastowym dostępie. Ich dodatkową zaletą jest brak ścisłego
określenia akumulatora (architektura RISC). Tę funkcję może pełnić dowolnie
wybrany rejestr, spośród 32-bajtowego banku rejestrów roboczych. Zapewnia
to bardzo znaczny wzrost szybkości implementowanych algorytmów, w
stosunku do mikrokontrolerów z typową budową z określonym
umiejscowieniem akumulatora. Jest to efekt rozłożenia dość znacznego
"obciążenia" akumulatora przesłaniami, na znacznie większą liczbę rejestrów,
co zapewnia eliminację wielu z nich, dokonywanych w celu zapamiętania
wyników pośrednich przy większych obliczeniach..
Konstruktorzy uwzględnili również wzrastające
zapotrzebowanie na wbudowaną pamięć EEPROM, służącą do
zapamiętania konfiguracji urządzeń budowanych z
wykorzystaniem mikrokontrolerów. Zastosowanie szeregowego
algorytmu programowania oraz pamięć programu typu "Flash",
umożliwia programowanie i przeprogramowanie
mikrokontrolera po umieszczeniu go w układzie. Zastosowane
rozwiązania są również konkurencyjne w stosunku do
mikrokontrolerów z serii PIC. Powodują one, iż przy tej samej
częstotliwości zegara AVR-y są około czterokrotnie od nich
szybsze. Konstruktorzy uwzględnili również układ Watchdog,
jak i tryb pracy z obniżonym poborem mocy, które w obecnej
chwili stają się standardem w mikrokontrolerach
Lista rozkazów

zwarta lista rozkazów wymaga koniecznych kompromisów, pierwszy z nich
dotyczy bezpośrednich wartości (stałych łańcuchowych). Niewiele instrukcji
akceptuje bezpośrednie wartości, a te, które to robią (ADIW, SUBI, ORI, itp.)
operują tylko w wyższej połowie (R16-R31) rejestru. Nawet po odcięciu bitu z
pola specyfikatora argumentu, te instrukcje mają czasami miejsce tylko dla 6bitowych bezpośrednich wartości.
Instrukcje ADIW i SBIW (dodaj/odejmij natychmiast od słowa) są nawet
bardziej restrykcyjne, operując tylko na ostatnich ośmiu rejestrach R24-R31.
Te instrukcje, w pierwszym rzędzie, są przeznaczone, by dodać małe
przesunięcia (0-63 bajtów) do wskaźników X, Y i Z.
Istnieje bogactwo instrukcji rozgałęzienia warunkowego, mianowicie: dwa dla
każdego z ośmiu znaczników w rejestrze stanów. Z małymi 7-bitowymi
przesunięciami, te instrukcje mogą odwrócić wykonanie tylko 64 instrukcji w
którymkolwiek kierunku. Dla większego rozmieszczenia, RJMP może
przesunąć kod programu do 2K, który jest zwykle w zupełności dany małym
miejscem dla kodu w na chip'ie.

AVR posiada również zbiór interesujących operacji "przeskoku" (SBRC,
SBRS, SBIC i SBIS), które przeskakują ponad następną instrukcją, jeśli
jakikolwiek bit w którymkolwiek rejestrze jest ustawiony lub pusty. Jeśli rozkaz
przeskoku jest dużym skokiem, to te przeskoki mogą być użyte, by skutecznie
utworzyć warunkowe długotrwałe rozgałęzienia. Alternatywnie, mogą one
zostać użyte, by opuścić pojedynczą operację arytmetyczną lub logiczną w
łańcuchu rozkazów, tworząc warunkowe rozkazy podobne nieco do ARM.
Żaden z chip‘ów AVR nie ma naturalnych operacji mnożenia - a już wogóle
dzielenia - chociaż jeden został zdefiniowany. Jako zdefiniowany, MUL
wymnaża dowolne 8-bitowe rejestry i osadza 16-bitowy wynik w R0 i Rl. Po
wprowadzeniu w życie, MUL jest wykonywany tylko w dwóch cyklach zegara,
czyli pięć razy szybciej niż 68HC11 (10 cykli); nawet nowszy 68HC12
Motoroli potrzebuje 3 cykli. Atmel ma zamiar umieścić operację mnożenia w
przyszłych kościach AVR, gdy zwiększy się prędkość zegara, a chipy przejmą
proste zadania przetwarzania sygnałów.
Oprogramowanie:

Lista popularnego oprogramowania przedstawia się
następująco:"
* ASEMBLERY: AVR Asembler (składnik AVR Studio), AVRA
* C/C++: WINAVR (środowisko), AVRGCC, IAR C++,
CodeVisionAVR
* BASIC: BASCOM AVR, FastAVR
* PASCAL: Embeeded Pascal AVR, AVRCo
Darmowe środowisko AVRStudio, zintegrowane z kompilatorem
ASMa i możliwością dointegrowania WINAVR daje nam w pełni
profesjonalne i co najważniejsze DARMOWE środowisko. Samo
AVRStudio umożliwia poza pisaniem softu także debugowanie
przy użyciu JTAGa i DebugWire. Jest jeszcze symulator avrów
VMLAB http://amctools.com/ też już darmowy.
Programowanie/Narzędzia
uruchomieniowe
Sposoby programowania:
- ISP - tzw. programowanie w systemie. Wystarczą 4 linie + masa. A
procesora nawet nie trzeba wyciągać z podstawki/urządzenia.
- Równoległe HV - Dużo przewodów ale umożliwia odblokowanie
procesorów z wyłączonym ISP lub z wyłączoną nóżką RESET.
- Szeregowe HV - Odpowiednik Równoległego HV dla procesorów z
ograniczoną ilością nóżek.
- JTAG - dostępne w układach rodzin MEGA/XMEGA
Sposoby debugowania:
- JTAG-ICE (JTAG) - starsze, ale nadal popularne narządzie. Doczekało się
nawet tańszych klonów.
- MKii (ISP+JTAG+DW) - ponoć są klony.
- DW - dla układów z ograniczoną ilością końcówek.
Wszystko o
programowaniu avr
Do zaprogramowania
samego mikroprocesora nie
jest potrzebny żaden
skomplikowany programator.
Wystarczy sześciożyłowy
kabelek z podstawką na
końcu, dołączony do portu
drukarkowego komputera
PC. Co ważne, zasilanie
pobierane jest też z
komputera PC. Taki
prościutki programator widać
na fotografii.
Jaki język?

Najpierw, na początku
programowania należy choć
troszkę opanować znany i
popularny od wielu lat język
programowania – BASIC. Właśnie
za jego pomocą najłatwiej będzie
poznać podstawowe pojęcia,
charakterystyczne dla wszystkich
języków programowania. Co
bardzo ważne, BASCOM jest
dialektem języka BASIC,
ukierunkowanym na
programowanie tak zwanych
procesorów jednoukładowych.
Na rysunkach obok znajdują się
dwa przykładowe zrzuty ekranowe
z ćwiczeń.
ISP - programowanie w systemie
Istnieje bardzo dużo róznorodnych programatorów dla
mikrokontrolerów AVR. Większość z nich do programowania
używa interfejsu ISP. Jest to wygodny i najprostszy sposób
programowania naszego układu, poniewaz nie wymaga się
specjalistycznych narzędzi i programatorów, a najprostszy
programator możemy wykonać zaledwie w 5 minut. Ponadto
programowanie odbywa się w układzie docelowym dlatego też
nie musimy za każdym razem przekładać mikrokontrolera z
programatora do układu docelowego. Programujemy przez
złacze SPI i od razu testujemy:) nasz program.
Atmel w swojej nocie aplikacyjnej sugeruje jak ma wyglądać
złącze programatora w układzie docelowym:
Gdzie poszczególne linie
oznaczają
1. MISO - linia danych WE z programowanego układu
do programatora
2. VCC - zasilanie programatora
3. SCK - sygnał zegarowy z programatora
4. MOSI - linia danych WY z programatora do
programowanego układu
5. RESET - Reset z programatora
6. GND - Masa
Istnieje także zmodyfikowana wersja
złącza ISP 2x5 pin wygląda ona
następująco:
Programator
Wersja 1:
W najprostszym wydaniu do zaprogramowania mikrokontrolera AVR
potrzeba:
- wtyczka DB25 (wtyk męski od LPT)
- ok 80 cm taśmy 5 żył
- wtyczka 2x5 pin
Schemat podłączenia programatora jest następujący:
Programator ten zgodny jest z
programatorem typu dt006 i gdy
go będziemy używać to taki typ
programatora musimy podać.
Wersja 2
Kolejna wersja programatora jest już bardziej "rozbudowana" i
wyposażona jest w bufor zabezpieczający przed ewentulanym
uszkodzeniem portu LPT. Poza tym nic nie ma w nim
skomplikowanego.
Do jego budowy potrzebne nam będą:
- wtyczka DB25 (wtyk męski od LPT)
- ok 80 cm taśmy 6 żył
- wtyczka 2x5 pin (ewentualnie 2x3 pin)
- układ 74HC125
- rezystor 100 kom
- kondensator 0,1 uF
Schemat programatora
jest następujący:
Programator ten zgodny jest z
progrmatorem typu stk200 i taki
typ programatora musimy podać
podczas programowania.
WinAVR - dla zielonych:)

Programowanie mikrokontrolerów AVR w języku C wcale nie musi być
trudne. Jeżeli ktoś już ma jakieś podstawy języka C to do nauki
programowania mikrokontrolerów AVR, wcale nie musi od nowa się
uczyć dość ostatnio popularnego BASCOMa, może wykorzystać
znakomite środowisko programistyczne jakim jest WinAVR. Pakiet
WinAVR bo tak powinniśmy go nazywać jest środowiskiem opartym na
licencji GPL , stąd jest on darmowy i wciąż rozbudowywany przez wiele
osób interesujących się rodziną mikrokontrolerów AVR. Pomimo że
WinAVR jest środowiskiem darmowym oferuje szereg narzędzi
dorównujących swoją funkcjonalnością programom komercyjnym. W
skład pakietu WinAVR wchodzi szereg narzędzi takich jak znany
kompilator z systemów Unix, który został przeniesiony na procesory
AVR (avr-gcc), edytor (Programmers Notepad), asembler (avr-as),
debugger (avr-gdb), programator (avrdude) oraz wiele innych.

Darmową wersje pakietu WinAVR możemy znaleźć na stronie domowej
http://winavr.sourceforge.net/ lub tutaj ( rozmiar ok 12 Mb)
Instalacja i obsługa programu
Bascom-AVR

Pisać programy dla AVRów w BASCOM-AVR
można z powodzeniem również w "windowsowym"
notatniku ale aby móc napisany program
skompilować, zapisać do pamięci mikrokontrolera, a
wcześniej wykonać ewentualnie symulację działania,
potrzebujemy nieco innego narzędzia jakim jest
pakiet IDE (z ang. Integrated Development Environment zintegrowane środowisko projektowe) o nazwie
BASCOM-AVR
Instalacja
Ściągnięty program ze strony www.mcselec.com
będzie pewnie w postaci czterech lub więcej
spakowanych plików o nazwach bcavrd_1.zip,
bcavrd_2.zip, bcavrd_3.zip, bcavrd_4.zip, które
należy rozpakować do jakiegoś wspólnego
katalogu gdzie pojawią się pliki nazwach setup.
EXE, setup.W01, setup.W02, setup.W03.
Po uruchomieniu pliku setup. EXE
uruchomi się instalacja, której nie
należy "przeszkadzać" i wystarczy po
prostu zatwierdzać kolejne kroki
instalacji.
Oprócz programu polecam ściągnięcie polskiej
wersji "pomocy". Po rozpakowaniu tego pliku
należy mu zmienić nazwę na Bascavr.hlp ) i
umieścić katalogu C:\Program Files\MCS
Electronics\BASCOM-AVR, jednocześnie
zmieniając po uruchomieniu programu
ustawienia w zakładce Options -> Environment > IDE z zaznaczonego Use HTML help na
odznaczony. Ten zabieg spowoduje, że pomoc
(help) uruchamiana z programu będzie w języku
polskim.
Po instalacji warto na pulpicie
umieścić skrót do programu ale
to już zależy od indywidualnych
upodobań i przyzwyczajeń.
Obsługa

Po uruchomieniu programu i otwarciu nowego pliku
poleceniem
File -> New ekran programu będzie wyglądał tak jak na
rys. 1. Program BASCOM-AVR jest programem
pracującym w środowisku Windows więc
prawdopodobnie większość poleceń w pasku menu czy
pasku narzędziowym umieszczonych u góry otwartego
okna jest Ci znana z innych programów i obsługa nie
będzie problemem. Domyślne ustawienia programu są
takie że właściwie nic nie trzeba zmieniać poza kilkoma
korektami.
Na rys. 1 pokazane jest okno po
uruchomieniu pakietu Bascom-AVR
i otwarciu pliku z programem.
W oknie tym na wyróżnienie
zasługują następujące elementy:
- pasek menu
- pasek narzędziowy, w którym widać ikony najczęściej używanych
programów i poleceń, opis znaczenia tych ikon umieściłem w dalszej
części tego tekstu, pasek narzędziowy można modyfikować samemu,
wystarczy najechać kursorem na obszar paska, kliknąć prawym
przyciskiem myszki i przeciągnąć z otwartego w ten sposób okienka
ikonkę, którą chcemy umieścić na pasku
- lista etykiet (Label), która umożliwia szybkie przejście do wybranej
etykiety, wystarczy nacisnąć na przycisk z prawej strony listy i ukażą się
wszystkie etykiety
- lista procedur (Sub), która umożliwia szybkie przejście do wybranej,
a zdefiniowanej wcześniej procedury, wybiera się podobnie jak dla listy
etykiet
- okno edytora, w którym będziesz pisał swoje znakomite programy
- pasek stanu, w którym pojawiają się informacje dotyczącego działań
związanych z otwartym plikiem naszego programu, np. wskazywana
jest pozycja kursora, wyświetlana jest informacja czy dokument był
zmodyfikowany itp.
Pasek menu:
W skład paska menu wchodzą zakładki, których
znaczenie zamieszczam poniżej.
File -ta zakładka wraz z jej poleceniami jest z
pewnością wszystkim znana z innych
programów windowsowych:
otwiera nowe okno edytora dla
nowego pliku, w którym można
zapisywać kod programu - skrót
klawiszowy Ctrl+N,
otwiera poprzednio
zapisany plik - skrót
klawiszowy Ctrl+O,
zamyka otwarty plik - skrót
klawiszowy Ctrl+F4,
zapisuje otwarty i
edytowany właśnie plik z
poleceniem nadania
nazwy,
umożliwia podgląd
wydruku otwartego
pliku,
polecenie drukowania
otwartego pliku - skrót
klawiszowy Ctrl+P,
wyjście z pakietu
Bascom-AVR - skrót
klawiszowy Alt+F4
Edit - również typowa zakładka
programów windowsowych zawierająca
znane polecenia takie jak kopiowanie,
wycinanie, wklejanie itp:
powoduje cofnięcie
wykonanej ostatnio
zmiany w programie skrót klawiszowy
Ctrl+Z,
przywraca ponownie
poprzednio wykonaną, a
następnie cofniętą
zmianę w programie skrót klawiszowy
Shift+Ctrl+Z,
wycina zaznaczony tekst i
przechowuje go w
schowku - skrót
klawiszowy Ctrl+X,
kopiuje zaznaczony tekst
do schowka - skrót
klawiszowy Ctrl +C,
wkleja zawartość schowka
w miejsce wskazane
kursorem - skrót
klawiszowy - Ctrl+V,
wyszukiwanie w
programie fragmentu
tekstu, który wpisuje się
w okienko dialogowe
"Find Text", w okienku
tym można poustawiać
różne opcje dotyczące
wyszukiwania - skrót
klawiszowy Ctrl+F,
wyszukiwanie następnego
wystąpienia tekstu
wpisanego w okienko
dialogowe "Find Text" skrót klawiszowy F3,
zastępuje wszystkie znalezione
słowa wpisane w okienku
dialogowym "Replace Text"
nowymi słowami również
wpisanymi w tym okienku,
w okienku tym można
poustawiać różne opcje
dotyczące wyszukiwania
i zastępowania - skrót
klawiszowy Ctrl+R,
skok do wybranej linii
programu, którą to linię
wpisuje się w okienku
dialogowym "Go to line
Number" - skrót
klawiszowy Ctrl+G,
Toggle
Bookmark- ustawia znaczniki w programie,
widoczne są one z lewej strony okienka edytora,
znaczników może być maksymalnie 8, ułatwiają
one szybkie przemieszczanie się po tekście
programu,
Goto
Bookmark - umożliwia skok do wybranego
znacznika - skrót klawiszowy Ctrl+x, gdzie x to
numer znacznika,
przesuwa zaznaczony
fragment o ilość pozycji
jaka jest ustawiona
w zakładce "Options>Environment->Editor>Tab-size",
cofa wstawiony akapit,
Program - polecenia z tej zakładki
uruchamiają programy służące do kompilacji,
sprawdzania składni, symulacji i wysyłania
programu do mikrokontrolera:
uruchamia kompilację
programu - skrót
klawiszowy F7,
uruchamia wykrywanie
błędów składni w
pisanym programie skrót klawiszowy
Ctrl+F7,
pokazuje raport z
kompilacji - skrót
klawiszowy Ctrl+W,
uruchamia symulację
programu - skrót
klawiszowy F2,
uruchamia program
umożliwiający
zaprogramowanie
mikrokontrolera - skrót
klawiszowy - F4,
Pierwszy program - zapalanie i
gaszenie diody LED
Pierwszy program jaki wszyscy najczęściej piszą,
to zapalanie diody LED podłączonej do
któregoś z portów mikrokontrolera.
To dobre ćwiczenie przy poznawaniu
konfiguracji portów.
Dioda LED podłączona będzie do
wyprowadzenia PB0 portu B. Do wyprowadzeń
PD0 i PD1 portu D podłączone będą
przełączniki, których zadaniem będzie
odpowiednio włączanie i wyłączanie świecenia
diody LED. Naciśnięcie przełącznika
podłączonego do PD0 powinno spowodować
zaświecenie diody, natomiast naciśnięcie
przełącznika podłączonego do PD1 powinno
spowodować zgaszenie diody.
Zapewne każdy kto używał różnego rodzaju
przełączników wie, że podczas naciśnięcia, a
następnie zwolnienia przycisku przełącznika
występuje zjawisko drgania styków powodujące
na przemian zwarcie i rozwarcie styków. W tym
konkretnym przypadku nie będziemy zajmować
się programową eliminacją wpływu drgania
styków przełączników gdyż nie ma to znaczenia
dla poprawnego działania układu.
Opisywane działanie
programu ma być
zrealizowane w układzie
przedstawionym na
rysunku. Jest to fragment
schematu ideowego
zestawu ZL1AVR.
Aby schemat widoczny na rys. 1 był zgodny z
połączeniami w ZL1AVR, to w zestawie należy zewrzeć
następujące złącza:
- JP1 - podłączenie +5V do zasilania LED,
- JP6 i JP7 - podłączają SW1 do PD0 i SW4 do PD1
- JP4 zewrzeć 2 z 3 - podłaczy to masę do SW1 i SW4
- J4 - 2 z 3, J3 - 1 z 2 - zostanie dołączony kwarc X1
- ZW_PORTB - 15 z 16 - podłączenie LED1 do PB0
- do JP13 podłączyć zasilanie.
Dioda LED1 zaświeci się gdy PB0 (pin12 AT90S2313) będzie
skonfigurowany jako wyjście i jego stan przyjmie wartość "0", to
umożliwi przepływ prądu przez diodę LED1, prąd ten
ograniczony jest rezystorem R9 do wartości ok. 3,5mA (zależy to
również od wartości spadku napięcia na diodzie LED). Aby
świecenie diody uzależnić od stanu przełączników SW1 i SW4 to
PD0 (pin 2) i PD1 (pin 3) muszą być skonfigurowane jako
wejścia z wejściem typu pull-up wymuszającym początkowy stan
1. W takim przypadku naciśnięcie jednego z przełączników
spowoduje, że na odpowiednim wejściu pojawi się stan "0".
Pozostałe niewykorzystywane wyprowadzenia zarówno portu B
jak i D mogą być skonfigurowane dowolnie, można je więc
ustawić np. jako wyjścia.
W procesorach AVR na początku zawsze należy
skonfigurować porty określając dla każdego
wyprowadzenia dwa parametry:
- funkcję jaką ma pełnić - wejścia czy wyjścia - stan
spoczynkowy jaki ma przyjąć - "0" czy "1"
Jeżeli porty nie zostaną skonfigurowane, to przy starcie
mikrokontrolera (po wyzerowaniu) rejestry PORTx i
DDRx (x w zależności od portu będzie zastąpiony
literką A, B, C lub D) zostaną wyzerowane co oznacza,
że wszystkie wyprowadzenia portów będą wejściami w
stanie wysokiej impedancji (wejścia pływające)
Teraz przechodzimy do sedna sprawy,
czyli zamienić na program zrozumiały
dla naszego AVR-a.
W helpie do BASCOM-AVR (wersja w języku
polskim) są dokładnie opisane wszystkie
instrukcje i inne elementy języka BASCOM dla
AVR .
Ściągnij sobie tego helpa i często tam zaglądaj!
Zgodnie z tym co jest napisane powyżej (w ramce)
należy najpierw skonfigurować porty AT90S2313. Do
konfiguracji urządzeń sprzętowych w BASCOM-AVR
służy instrukcja CONFIG, którą się używa razem z
nazwą konfigurowanego sprzętu, czyli w przypadku
konfiguracji portu nazwą będzie PORTx, a w
przypadku pojedynczej końcówki nazwą będzie
PINx.y, gdzie x to port B lub D (dla innych
mikrokontrolerów może być jeszcze A lub C), y to
numer końcówki z danego portu (0 ... 6 lub 7).
Za stan portów w mikrokontrolerach AVR
odpowiedzialne są trzy rejestry DDRx, PORTx i
PINx (x to: A, B, C lub D). Instrukcja CONFIG
ustawia cały port lub wybraną końcówkę portu w tryb
pracy wejścia lub wyjścia. Inaczej mówiąc ustawia
odpowiednio rejestr kierunku czyli DDRx. Jeżeli do
każdego bitu rejestru wpiszemy "1" to wszystkie
wyprowadzenia portu będą wyjściami, natomiast jeżeli
do każdego bitu rejestru DDRx wpiszemy "0" to
wszystkie wyprowadzenia będą wejściami.
W przykładach poniżej stosuję kolorystykę składni
poleceń taką jaką mam ustawioną w BASCOM-AVR.
Kolorem zielonym i kursywą wyróżniam komentarze
które zawsze muszą być poprzedzone znakiem
apostrofu ' lub instrukcją REM. Warto przyzwyczaić
się do opatrywania swoich programów komentarzami
gdyż to po pewnym czasie ułatwia analizę wcześniej
napisanych programów:
' - to jest komentarz
Rem - i to też jest komentarz
Konfiguracja całego portu B jako wyjście lub
wejście:
Config Portb = Output
Config Portb = Input
' cały port B jako wyjście
' cały port B jako wejście
można również skonfigurować każde
wyprowadzenie (każdy bit) osobno:
Config Pinb.0 = Output ' wyprowadzenie PB0 portu B jako wyjście
Config Pinb.1 = Output ' wyprowadzenie PB1 portu B jako wyjście
Config Pinb.2 = Output ' wyprowadzenie PB2 portu B jako wyjście
Config Pinb.3 = Output ' wyprowadzenie PB3 portu B jako wyjście
Config Pinb.4 = Output ' wyprowadzenie PB4 portu B jako wyjście
Config Pinb.5 = Output ' wyprowadzenie PB5 portu B jako wyjście
Config Pinb.6 = Output ' wyprowadzenie PB6 portu B jako wyjście
Config Pinb.7 = Output ' wyprowadzenie PB7 portu B jako wyjście
Config Pinb.0 = Input ' wyprowadzenie PB0 portu B jako wejście
Config Pinb.1 = Input ' wyprowadzenie PB1 portu B jako wejście
Config Pinb.2 = Input ' wyprowadzenie PB2 portu B jako wejście
Config Pinb.3 = Input ' wyprowadzenie PB3 portu B jako wejście
Config Pinb.4 = Input ' wyprowadzenie PB4 portu B jako wejście
Config Pinb.5 = Input ' wyprowadzenie PB5 portu B jako wejście
Config Pinb.6 = Input ' wyprowadzenie PB6 portu B jako wejście
Config Pinb.7 = Input ' wyprowadzenie PB7 portu B jako wejście
powyższego zapisu nie polecam z oczywistych
powodów, lepiej przedstawić to samo korzystając
z tego, że bajt można przedstawić jako 8 bitów i
od razu będzie widać, który bit jest wyjściem, a
który wejściem:
Config Portb = &B11111111 ' cały port B
jako wyjście
Config Portb = &B00000000 ' cały port B
jako wejście
w tym przypadku wszystkie
wyprowadzenia są wyjściami lub
wejściami, gdyby zapisać:
Config Portb = &B11111100 ' wyprowadzenia
PB0 i PB1 to wejścia,
' PB2 do PB7
to wyjścia
oznaczałoby to, że bit 0 i bit 1 są ustawione na 0
co oznacza, że wyprowadzenie PB0 i PB1 portu
B są wejściami, a pozostałe wyjściami.
Prefiks &B oznacza w BASCOM-AVR, że liczba
występująca po tym znaku jest zapisana w
postaci dwójkowej, prefiks &H oznacza liczbę
zapisaną w kodzie szesnastkowym, bez prefiksu
liczba w kodzie dziesiętnym.
Przypisanie funkcji dla portu to pierwsza rzecz, druga
natomiast to określenie stanu spoczynkowego
wyprowadzeń portów mikrokontrolera po starcie
pogramu. W tym celu do każdego bitu rejestru PORTx
należy wpisać "0" lub "1". Można tego dokonać dla
każdego bitu osobno, lub dla całego rejestru od razu,
podobnie jak to miało miejsce przy przypisaniu funkcji
wejścia lub wyjścia.
Ustawienie stanu spoczynkowego
portu B:
Portb = &B11111111
wyprowadzeń
' podciągnięcie wszystkich
' portu B do "1"
dla portu B skonfigurowanego jako wyjście będzie to
oznaczało, że stanem spoczynkowym wszystkich
wyprowadzeń jest jedynka (stan wysoki), dla portu B
skonfigurowanego jako wejście, to oznacza
podciągnięcie wszystkich wejść do jedynki.
Gdy zapiszemy:
Portb = &B00000000
' dla portu B jako wyjście oznacza to
' ustawienie na wszystkich wyprowadzeniach
' stanu "0",
' dla portu B jako wejście oznacza to
' pozostawienie wszystkich wejść
' pływających
będzie to oznaczało dla portu B skonfigurowanego jako wyjście ustawienie na
wszystkich wyprowadzeniach stano logicznego "0", natomiast dla portu B
skonfigurowanego jako wejście oznacza to, że wszystkie wejścia pozostają w
stanie wysokiej impedancji (wejścia pływające). Warto pamiętać, że dla
wyprowadzenia portu pełniącego rolę wejścia, do którego podpięty jest
przełącznik zwierający go do zera (po naciśnięciu), ważnym jest aby to wejście
było podciągnięte do jedynki
Podobnie jak konfigurowanie pojedynczego
wyprowadzenia portu można zrobić ustawienie stanu
spoczynkowego dla pojedynczego wyprowadzenia,
co ilustruje poniższy zapis:
Portb.5 = 1 ' wyprowadzenie PB5 portu B
podciągnięte do "1"
Portb.5 = 0 ' wejście PB5 portu B pływające
lub
' wyjście PB5 portu B ustawione w
stan"0"
Po tych wszystkich
wyjaśnieniach wracamy
do naszego układu
i przygotujemy porty
mikrokontrolera do pracy
zgodnie z założeniami.
Config Portb = &B11111111 ' cały port B jako
wyjście
Portb = &B11111111 ' wszystkie
wyjścia w stanie "1"
Config Portd = &B1111100 ' PD0 i PD1 wejścia, pozostałe - wyjścia
Portd = &B1111111 ' PD0 do PD6
podciągnięte do "1"
Nasz mikrokontroler przygotowany jest do pracy,
SW1 i SW4 podpięte są do wejść PD0 i PD1,
które podciągnięte są do jedynki, pozostałe
wyprowadzenia portu D są wyjściami (co dla
działania układu jest obojętne), cały port B jest
wyjściem i stan spoczynkowy jest "1", co
w przypadku diody LED1 podpiętej do PB0
powoduje, że dioda nie świeci.
Aby program działał zgodnie z założeniami, to należy
sterować stanem wyjścia PB0 poprzez zmianę
najmłodszego bitu rejestru PORTB czyli Portb.0 w
zależności od stanu wejść PD0 i PD1. Zmieniać stan
bitu rejestru PORTB (i innych rejestrów PORTA,
PORTD, PORTC również) można w BASCOM-AVR
na dwa sposoby, aby dioda zaświeciła należy napisać:
Portb.0 = 0 ' PB0 w stanie "0" - dioda świeci
lub
Reset Portb.0 ' PB0 w stanie "0" - dioda świeci
w drugim sposobie użyłam instrukcji RESET,
która ustawia określony bit w stan "0".
Aby dioda przestała świecić należy napisać:
Portb.0 = 1 ' PB0 w stanie "1" - dioda nie
świeci
lub
Set Portb.0 ' PB0 w stanie "1" - dioda nie
świeci
tutaj w drugim sposobie użyłam instrukcji SET,
która Ustawia określony bit w stan "1".
Czas na najważniejsze, a więc co trzeba zrobić
aby program ciągle sprawdzał stan wejść, do
których są podpięte przełączniki SW1, SW4
i w zależności od ich stanów zmieniał stan
wyjścia PB0 powodując świecenie bądź gaszenie
diody LED1.
Aby program wykonywał w kółko jakąś operację
należy zastosować w programie nieskończoną
pętlę. W BASCOM-AVR może do tego celu
posłużyć instrukcja DO ... LOOP, która
powtarza blok programu dopóki warunek
końcowy nie będzie spełniony. Gdy warunek nie
zostanie podany (a tak będzie w naszym
przypadku) pętla będzie się wykonywać w
nieskończoność.
Zapisać to więc można tak jak
poniżej:
Do ' początek nieskończonej pętli
ciąg wykonywanych instrukcji
Loop ' powrót do początku pętli
Teraz pozostało jeszcze spowodowanie
sprawdzania stanów wejść PD0, PD1
i uzależnienia od nich stanu PB0, czyli musimy
wykonać instrukcję w stylu: "wykonaj coś pod
warunkiem, że jest spełnione coś innego".
W BASCOM-AVR jest instrukcja
IF ... THEN ... ELSE ... END IF,
która znakomicie się do naszych
celów nadaje. Tworzy ona tzw.
blok decyzyjny.
Instrukcja IF ... THEN oblicza logiczną wartość
podanego wyrażenia. Jeśli będzie ono prawdziwe
(wynikiem będzie logiczna prawda) wykonany
zostanie blok instrukcji umieszczony po
instrukcji THEN. Jeśli będzie ono fałszywe, to
instrukcje po słowie THEN nie zostaną
wykonane. Wykonane za to będą instrukcje po
słowie ELSE, jeśli ono występuje
W naszym przypadku musimy więc sformułować
następujący blok decyzyjny: "... jeśli PD0 jest w
stanie zero, to ustaw PB0 w stan "0" jeśli tak nie jest to
przejdź do następnej instrukcji, w której będzie następna
decyzja - jeśli PD1 jest w stanie zero, to ustaw PB0 w
stan "1", jeśli tak nie jest to wróć do początku ...". I tu
mała niespodzianka - jak odczytać stan
dowolnego wyprowadzenia portu?
Umiemy wpisywać do dowolnego bitu portu
jedynkę lub zero poleceniem PORTx.y = 1 czy
PORTx.y = 0, a jak jest z odczytem? I tu
okazuje się przydatny trzeci rejestr PINx (to jest
rejestr tylko do odczytu; x to: A, B, C lub D). Do
odczytu stanu wyprowadzenia dowolnego portu
służy polecenie PINx.y.
Jeśli już wszystko jasne, to czas
zapisać nasz blok decyzyjny:
Do
' początek nieskończonej pętli
If Pind.0 = 0 Then Portb.0 = 0 ' jeśli na wejściu PD0 jest 0 to
wyjście
' PB0 przyjmuje stan "0"
If Pind.1 = 0 Then Portb.0 = 1 ' jeśli na wejściu PD1 jest 0 to
wyjście
' PB0 przyjmuje stan "1"
Loop
' powrót do początku pętli
Teraz wystarczy połączyć wszystkie niezbędne
elementy programu czyli "blok konfigurujący porty"
oraz ostatnio napisany "blok decyzyjny", całość
zakończyć instrukcją END i otrzymamy
pierwszy program
Config Portb = &B11111111 ' cały port B jako wyjście
Portb = &B11111111 ' wszystkie wyjścia w stanie "1"
Config Portd = &B1111100 ' PD0 i PD1 - wejścia, pozostałe wyjścia
Portd = &B1111111 ' PD0 do PD6 podciągnięte do "1"
Do
' początek nieskończonej pętli
If Pind.0 = 0 Then Portb.0 = 0 ' jeśli na wejściu PD0 jest 0 to
wyjście
' PB0 przyjmuje stan "0"
If Pind.1 = 0 Then Portb.0 = 1 ' jeśli na wejściu PD1 jest 0 to
wyjście
' PB0 przyjmuje stan "1"
Loop
' powrót do początku pętli
End
' koniec programu
Mikrokontrolery AVR
-techniczne aspekty
programowania

•
•
Mikrokontrolery avr integrują w swojej strukturze nieulotną
pamięć przeznaczoną na program( pamięć FLASH) oraz
nieulotną pamięć EEPROM do dowolnego zastosowania przez
autora programu. Po napisaniu programu powstaje problem
związany z umieszczeniem jego kodu wewnątrz pamięci
mikrokontrolera. Producent (firma ATMEL) przwidział w
ogólnym przypadku dwa rozwiązania dotyczące sposobu
programowania pamięci FLASH oraz EEPROM.
Programowanie mikrokontrolerów może odbywać się:
W programatorze;
W układzie;
Programowanie mikrokontrolerów
w programatorze:
Proces ten wymaga wyłożenia programowanego
mikrokontrolera do programatora, zaprogramowaniu
układu i ponownego przeniesienia mikrokontrolera do
układu, w którym ma on pracować. Takie rozwiązanie
ma niedogodność w ciągłym przenoszeniu
mikrokontrolera między programatorem a docelowym
systemem. Drugą poważną niedogodnością tego
rozwiązania jest to, że z praktycznego punktu widzenia
nie istnieje możliwość użycia wybranych modeli
mikrokontrolerów( ponieważ przykładowo
ATMEGA103, ATMEGA128 i inne są produkowane
wyłącznie w obudowach do montażu
powierzchniowego.
Programowanie mikrokontrolerów
w układzie:
Proces programowania wymaga umieszczenia w
docelowym systemie odpowiedniego złącza,
przez które będzie odbywać się programowanie
( kasowanie, odczytywanie pamięci, weryfikacja
itp.). Metoda ta nazywa się programowaniem w
trybie szeregowym. W tym trybie są dostępne
operacje kasowania, programowania i odczytu
pamięci FLASH i EEPROM oraz istnieje
możliwość weryfikacji bitów zabezpieczeń i
bitów konfiguracji.
Firma ATMEL zaproponowała standard złącza
programującego w dwóch wariantach, jako złącze 6stykowe i 10-stykowe. Oba rozwiązania funkcjonalnie są
identyczne. Złącza programujące, są następujące:
gdzie MOSI, MISO, SCK i RESET, są sygnałami
służącymi do programowania, GND jest
Sygnałem masy,
oraz VTG
jest napięciem
zasilającym
Z praktycznego punktu widzenia sprowadza się to do
umieszczenia na płytce drukowanej docelowego złącza
pinowego (najczęściej są to dwurzędowe listy pinowe o
rozstawie 100 mils(2.54mm). Do połączenia z
programatorem używa się kabla płaskiego o zaciśniętą na
końcu złączką nakładaną na piny będące w płytce
drukowanej systemu.
Występujące w złączu do szeregowego programowania
sygnały to:
* RESTET- sygnał zerowania mikrokontrolera;
*MOSI( od ang. Master Output Slave Input)- dane
transmitowane programatora do mikrokontrolera;
*MISO( od ang. Master Input Slave Output)- dane
transmitowane z mikrokontrolera do programatora;
*SCK- sygnał zegarowy do mikrokontrolera;
*GND- masa zasilania;
W ogólnym przypadku złącze
programujące wygląda następująco:
Występujące tu połączenie
złączki z napięciem Vcc
pozwala na zasilenie się
układu z programatora
lub programatora z
układu. W wielu
rozwiązaniach to
połączenie może być
pominięte.
Przykładowe rozwiązanie przyłącza
programatora może być następujące:

Mikrokontroler ma
wprowadzenia sygnałów,
które są niezbędne do
przyłączenia
programatora do
programowania w
układzie w trybie
szeregowym.
Na identycznej zasadzie realizowane jest
przyłączenie jest mikrokontrolera do programowania
w układzie w przypadku innych modeli
mikrokontrolera(AT90S2313)

Mikrokontrolera ATMEGA też nie odbiegają w swoich
rozwiązaniach od powyższego modelu. Przykład z
użyciem mikrokontrolera ATMEGA 161:
Przykładem mikrokontrolera
wymagającego innego przyłączenia jest
ATMEGA 128
We wszystkich przykładach jest pominięty pewnie
problem, który może okazać się w konkretnym
rozwiązaniu dość istotny. Użycie do szeregowego
programowania sygnałów SCK, MOSI i MISO nie
oznacza, że te sygnały nie mogą być używane w
docelowym systemie do innych celów. Jeżeli z punktu
widzenia mikrokontrolera te piny są wyjściami(
mikrokontroler za pomocą tych pinów steruje jakimś
blokiem cyfrowym) nie ma żadnego problemu. W
przeciwnym wypadku( jeżeli któryś z tych pinów jest
wejściem dla mikrokontrolera) mogą wystąpić problemy
z programowaniem.
Przyczyny konfliktów logicznych;
W trakcie programowania na każdym z trzech sygnałów
używanych do programowania mikrokontrolera
występuje konflikt logiczny, w obwodzie są dwa źródła
sygnału:
* wyjście negatora(74HCT04) i sygnał SCK (programator
jest źródłem sygnału);
• Wyjście nagatora(74HCT04) i sygnał MOSI
(programator jest źródłem sygnału);
• Wyjście negatora(74HCT04) i sygnał MISO
(mikrokontroler jest źródłem sygnału).
Może to doprowadzić do niemożności
zaprogramowania mikrokontrolera,
gdyż wyjście negatorów może zakłócać
przebieg sygnałów programujących.
W niektórych rozwiązaniach
programowych można uniknąć
problemu, jeżeli te linie będą
wyjściowymi (z punktu widzenia
mikrokontrolera), czyli przyłączone do
wejść w blokach cyfrowych, którymi
steruje mikrokontroler. Niestety nie
zawsze takie rozwiązanie jest możliwe.
W takiej sytuacji można
zaproponować dwa rozwiązania!
Pierwszy przypadek przedstawia
poniższy rysunek
Jest fizycznym
rozłączeniem poprzez
użycie listy pionowej i
zworek (jumperków). Na
czas programowania
zworki byłyby usuwane,
co tworzyłoby przerwę w
danym połączeniu.
Drugie rozwiązanie
Jest to elektroniczny
przełącznik
konfliktowych połączeń
Układ CD4053 przełącza w odpowiedni sposób sygnały używane
do programowania w trybie szeregowym. Sterowanie
przełączeniem wejść/wyjść multipleksera jest oparte o sygnał
RESET generowany przez programator w trakcie
programowania. W przypadku kiedy mikrokontroler nie jest
przyłączony do programatora, to rezystor występujący w
obwodzie zerowania mikrokontrolera ustala sygnał na poziomie
logicznej jedynki. W efekcie w trakcie programowania , układ
CD4053 łączy mikrokontroler ze złączem programatora. W
trakcie normalnej pracy, wymieniony multiplekser łączy
mikrokontroler z blokiem cyfrowym.
Wykonanie: Magdalena Kozubek
Download