Mikrokontrolery

Transkrypt

Mikrokontrolery
Mikrokontrolery
Autor: Paweł Kowalski
Mikrokontroler – jest to układ elektroniczny, który w swojej budowie posiada zawsze jednostkę
arytmetyczno-logiczną, pamięć ulotną oraz stałą. Można go porównać, do komputera, ponieważ posiada on
wszystko, co komputer potrzebuje do poprawnego działania. Nie można oczywiście zapominać o bardzo
ograniczonej mocy mikrokontrolera w porównaniu do normalnego Komputera.
Jaką moc ma Atmega8?
Większość instrukcji Atmegi wykonywanych jest w czasie jednego taktu zegara, poniżej przykłady instrukcji,
wraz z czasem ich wykonania:
- dodawanie, odejmowanie, inkrementacja, dekrementacja, porównanie z zerem – 1 takt
- mnożenie (możliwość mnożenia wyłącznie liczb stałoprzecinkowych) - 2 takty
- odczyt/zapis do SRAM – 2 takty
Maksymalna wydajność Atmegi8 to 16 MIPS (milionów operacji na sekundę), którą osiąga przy
częstotliwości 16MHz (taktowanie można ustawiać w zakresie od 1Mhz do 16Mhz).
Do czego można wykorzystać mikrokontroler?
Przy wykorzystaniu tych małych komputerków w zasadzie ogranicza nas jedynie wyobraźnia ( czasami moc
obliczeniowa i pamięć danego modelu scalaka ).
Te małe urządzonka można spotkać w zdecydowanej większości maszyn, które muszą choć trochę wykazać
się inteligencją, od pralek ( starsze mają mechaniczny mózg zbudowany na zasadzie kół zębatych, które
później zastąpiono właśnie mikrokontrolerami ) po komputery
pokładowe w samochodach.
Budowa mikrokontrolera
Budowę omówię na przykładzie mikrokontrolera ATMEL
Atmega8.
Zewnętrznie mikrokontroler wygląda, jak czarny klocek z
igiełkami. Jedyną drogą komunikacji tego małego komputera są
porty wyprowadzone w postaci pinów ( wystające igiełki ).
Obok jest obrazek ( a nawet dwa ) przedstawiający
wspomniany wcześniej układ.
Atmega8 występuje w dwóch rodzajach obudowy:
- DIP-28 ( ta długa )
- TQPF-32 ( kwadratowa )
Co z tymi pinami?
Jak widać, przy każdym pinie jest mały napis ( np. VCC, PC1 …),
najważniejsze to:
- GND - masa
- VCC – jest to pin, na który należy podać napięcie dodatnie, aby mikrokontroler zadziałał, w przypadku
Atmegi jest to ok. 5v, jednakże działa również z niższymi napięciami ( Niektórym wersjom nie przeszkadza
nawet napięcie poniżej 3V ).
Zauważyłem, że im wyższa jest częstotliwość zegara, tym mikrokontroler jest mniej tolerancyjny na spadki
napięcia. Przy częstotliwości 8Mhz potrafi się wyłączyć nawet przy napięciu 4V, co nie przeszkadza mu przy
taktowaniu 1Mhz.
-AVCC – zasilanie przetwornika analogowo-cyfrowego. W Atmedze jest on wewnętrznie zwarty z VCC, to
chyba błąd i powód wprowadzenia Atmega88, którą można zastępować Atmege8 ( jednakże jest ona
droższa ).
- RESET – służy do resetowania układu ( po podaniu masy na ten pin, układ zacznie pracę od początku)
- PC0, PC1, PC2, PC3, PC4, PC5, PC6 – port, który możemy wykorzystać do komunikacji. Piny do PC0 do PC6
tworzą jeden „8-bitowy” port C ( jest wyprowadzonych tylko 7 bitów, ze względu na ograniczoną ilość
nóżek) . Na tej samej zasadzie są wyprowadzono porty B i D. W większych układach może się również
pojawić port A.
- ADC0-ADC7 – są to piny przetwornika ADC (analog to digital converter) – możemy na nich mierzyć
napięcie. Przetwornik ADC posiada tylko jedno wejście, które porównuje z napięciem podanym na AREF.
Problem kilku wejść rozwiązano wbudowując w strukturę układu multiplexer, przez który można podłączyć
dowolny pin od ADC0 do ADC7 do wejścia ADC.
Jak działa ADC?
ADC porównuje napięcie na pinie wejściowym1 (wyjście z multiplexera) z pinem AREFF. Wynik zapisuje w
postaci 10-bitowej liczby rozbitej na dwa rejestry ADCL (pierwsze 8 mniej znaczących bitów wyniku) oraz
ADCH (dwa najstarsze bity wyniku porównania są zapisane w dwóch najmłodszych bitach tego rejestru). Po
odpowiednim połączeniu tych dwóch rejestrów otrzymamy liczbę z zakresu od 0 do 1023.
Jeśli AREFF = 5v, a na wejście podamy napięcie 1V, to otrzymamy wynik ok. 204.
Należy pamiętać, że jeden pomiar trwa ok. 20 taktów ( może trwać więcej, jeśli chcemy uzyskać
dokładniejszy wynik ). A więc zbadanie kolejno 5 pinów zabiera już 100 cennych taktów.
Porty B, C, D
Porty B, C, D w przeciwieństwie do przetwornika ADC działają w systemie binarnym.
Jeden pin danego portu może czytać lub wypisywać tylko sygnał 0 ( bliski masy ) lub 1 ( bliski napięcia
zasilania ).
Jak to wygląda od strony programowej ( dotyczy Atmegi8 )
Aby przełączyć 2 i 0 bit portu C w tryb wejścia, należy przestawić bity 2 i 0 rejestru DDRC (8-bitowy) na stan
niski:
DDRC = DDRC & 0b11111010; // jak widać, przełączam tylko bity 0 oraz 2, pozostałe pozostawiając bez
zmian. Teraz musimy wewnętrznie podciągnąć te bity pod napięcie dodatnie lub masę. Robi się to za
pomocą rejestru PORTC ( 1 oznacza +, a 0 to masa ).
DDRC = DDRC | 5; // ustawiliśmy bity odpowiedzialne za piny 0 i 2 na stan wysoki, co załatwi podciągnięcie
ich przez bardzo duży rezystor ( rzędu dziesiątek kilo Ohmów ) do zasilania. Pozostałe bity pozostawiamy
bez zmian, ( 5 = 101 binarnie ).
Jeśli teraz podłączymy do pinu 0 jakieś urządzenie, które wygeneruje stan wysoki ( napięcie bliskie zasilaniu
), to w rejestrze PINC na najmłodszym bicie pojawi się 1 ( po odłączeniu będzie 0 )
if ( (PINC & 1) == 1 ) // to jeden ze sposobów sprawdzenia stanu ostatniego bitu portu C.
Przedstawiłem jeden z prostszych i moim zdaniem najbardziej logicznych sposobów.
Problemy
Jednym w większych problemów przy zabawie z mikrokontrolerami jest znikoma przenośność kodu. Czyli
program napisany pod jeden mikrokontroler nie zadziała na innym (jak od każdej reguły jest wyjątek, czyli
Atmega8 i Atmega88, kod z Atmegi8 zadziała na Atmedze88, ale nie odwrotnie ). W programowaniu
komputerów klasy PC nie mamy takich problemów. Większość prostych kodów można skompilować na
praktycznie każdym komputerze, a nawet na różnych systemach operacyjnych ( chodzi tu głównie o
programy konsolowe, np. napisane w C, korzystające z biblioteki stdlib.h )
Atmega8 jest jednym z prostszych mikrokontrolerów ( konstrukcja z lat 90. ), dzisiejsze układy tego typu
wymagają więcej „zabawy”, aby cokolwiek zrobić ( ponieważ mają bardziej skomplikowaną strukturę
wewnętrzną ). Duże skomplikowanie aktualnych układów wymusza pracę ze specjalnie zbudowanymi
strukturami, co wydłuża kod. W Atmedze ustawienie portu na wyście załatwiła nam jedna linijka. W
procesorze takim jak np. STM32F100C4 musimy jeszcze dodatkowo określić taktowanie portu i odblokować
go, co generuje co najmniej 5 linijek ( lecz nie będę ich tutaj przytaczał ).
Dlaczego nie próbowałem tutaj uczyć programowania mikrokontrolerów:
- uczymy się programować konkretny układ ( raczej nie ma chętnych na przestarzałe układy z lat 90.)
- nie da się opanować nawet podstaw przez kilka dni ( należy poznać budowę konkretnego scalaka )
- zabawa z układami nie polega wyłącznie na programowaniu ( dochodzi tu elektronika )
- samo wgranie kodu nie gwarantuje poprawnego działania układu, należy również odpowiednio ustawić
bity konfiguracyjne ( które w każdym mikrokontrolerze są zbudowane inaczej, nawet tak podobne Atmega8
i Atmega88 mają je inaczej zbudowane ).
Nieprawidłowe ustawienie bitów konfiguracyjnych może na zawsze zablokować nasz układ ( brak
możliwości przeprogramowania )
- do uruchomienia nawet najprostszego układu potrzebny jest specjalny programator, który może
zaprogramować ograniczoną ilość modeli mikrokontrolerów, a więc do każdego urządzenia trzeba dobrać
odpowiedni programator
W żadnym wypadku nie próbowałem tutaj nikogo zniechęcić do mikrokontrolerów. Chciałem tylko pokazać,
dlaczego tak mało osób się tym zajmuje.
Zdecydowanym plusem wynikającym z umiejętności użycia tych „małych komputerów” jest
możliwość stworzenia inteligentnego i niepowtarzalnego urządzenia.
BIBLIOGRAFIA
Rozwinięcie skrótu ADC, czyli słowa „analog to digital converter” – zaczerpnięte z encyklopedii Wikipedia.
Załączone obrazki pochodzą z dokumentacji producenta układu ( Atmel )

Podobne dokumenty