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 )