Do Projektu iAutomatyka dołączyli:

Publikacja zgłoszona do 🎁 Konkursu iAutomatyka
https://iautomatyka.pl/wp-content/uploads/2022/04/278764223_1011528179795727_6964095811875773419_n.jpg

Mikrokontrolery AVR

autor: MatWisT194.

W poniższym artykule chciałbym przedstawić na przykładzie układu Attiny88 (Mh-tiny), jak działają mikrokontrolery z rodziny AVR, z czego są zbudowane, jak wygląda ich programowanie a także pokazać kilka przykładowych programów, napisanych w języku C.

Link do dokumentacji układu, którego używam: tutaj

Jak używać dokumentacji układów AVR?

Aby maksymalnie ułatwić sobie robotę polecam pobrać Adobe reader. Jest to darmowy program do przeglądania plików PDF. Dokumentacje udostępniane w Internecie mają właśnie taki format. Ułatwienie polega na tym, że gdy otworzymy za pomocą tego programu dokument, zobaczymy po lewej stronie spis treści. Dzięki temu nie musimy scrolować przez 300 stron w poszukiwaniu tego co nam jest potrzebne. Po otwarciu dokumentu widzimy stronę, z której dowiemy się, jakie peryferia mamy do dyspozycji, o napięciu zasilania, ilości wyprowadzeń, taktowaniu itp. Ogromną zaletą jest to, że większość dokumentacji układów AVR jest do siebie bardzo podobna. Niestety dużą wadą jest fakt, że nigdy nie znalazłem pełnych dokumentacji w języku Polskim. Dla osób nie znających dobrze angielskiego nadzieję może stanowić tłumacz Google, choć należy pamiętać, że nie oddaje on w pełni sensu zdań.

Załóżmy, że chcemy dowiedzieć się co nieco o portach wejścia-wyjścia (IO). W tym celu wchodzimy w zakładkę I/O-Ports. Zobaczymy cztery podrozdziały.

Z części „Introduction” możemy dowiedzieć się, z jakich elementów składa się każdy pin. Przykładowo widzimy, że mamy do dyspozycji rezystor podciągający (Pull-up), który możemy włączyć programowo. Mowa jest jeszcze o konfigurowaniu pinów jako wejścia lub wyjścia w postaci czytelnej tabeli, która stanowi graficzny skrót kilku stron tekstu. Po przeanalizowaniu przykładowego programu w dalszej części artykułu wszystko co w niej jest stanie się jasne.

Jednak elementem najważniejszym jest rozdział z opisem rejestrów. Mówi nam o tym, za co odpowiada dany rejestr, a także jakie wartości należy mu ustawić, aby wykonał to co mu każemy. Należy zwrócić uwagę, że każdy rejestr ma domyślnie wyzerowane wszystkie bity zaraz po włączeniu zasilania układu.

Bystre oko zauważy, że jedyną rzeczą, które różnią się nazwy to litery (A,B,C,D). Są to adresy portów. Rejestr odpowiedzialny za stan wyjść (1 lub 0) to PORTx. Widzimy że składa się on z 8 bitów, czyli za jego pomocą kontrolujemy 8 wyprowadzeń. Kolejnym jest DDRx. Tutaj ustawiamy, czy pin jest wejściem (wartość 0) lub wyjściem (wartość 1). Jest jeszcze PINx, który przechowuje nam stan, jaki panuje na pinie, jeśli ustawimy go jako wejście. Do niego nic nie wpisujemy a jedynie odczytujemy. Jak widać, programowanie polega głównie na odpowiednim konfigurowaniu rejestrów. Znajomość trzech powyższych pozwala na swobodne posługiwanie się portami WE/WY. Pokazane to będzie na przykładzie w dalszej części artykułu.

Czym jest mikrokontroler a czym mikroprocesor?

Wielu ludzi popełnia błąd nazywając mikrokontroler mikroprocesorem. Są to różne rzeczy, choć brzmią bardzo podobnie… MIKROPORCESOR nie ma wbudowanych pamięci programu i układów wejścia/wyjścia ani układów peryferyjnych. Można go porównać do ludzkiego mózgu, ale poza ciałem człowieka, czyli nie może pozwolić sobie na zbyt wiele… MIKROKONTROLER to układ scalony z wyspecjalizowanym mikroprocesorem, wbudowanymi pamięciami EEPROM, FLASH, RAM, ROM, układami wejścia wyjścia, timerami, licznikami, układami do komunikacji, timerem watchdog, układem kontroli zasilania, przetwornikiem analogowo- cyfrowym i wieloma innymi specjalnymi układami. Można powiedzieć, że mikrokontroler stanowi jeden wielki i zwarty organizm.

Jeśli mówimy, że procesor jest np. 32 bitowy, oznacza to, że jego instrukcje, słowa, adresy i inne dane mieszczą się w najwyżej 32 bitach pamięci.

Od taktowania procesora zależy ile instrukcji i jak szybko jest je w stanie wykonać układ (im więcej, tym lepiej, ale istnieją granice podawane w notach katalogowych).

Rodzina AVR

Atmel AVR – typ ośmiobitowych mikrokontrolerów produkowanych przez firmę Atmel od roku 1996. Pierwsze wersję stworzyło dwóch studentów z Norweskiej Wyższej Szkoły Technicznej (Alf-Egil Bogen, Vegard Wollan). Od ich nazwisk wzięło się: Alf and Vegard’s RISC processor.

Układy typu AVR zostały podzielone na kilka podtypów:

tinyAVR, czyli małe mikrokontrolery z pamięcią sięgającą 16kB pamięci programu. Posiadają od 6 do 32 wyprowadzeń (pinów), miały mały zestaw peryferiów, ale dzięki temu pobierały bardzo mało mocy. Stosowane były w małych urządzeniach, które nie wymagały dużych mocy obliczeniowych.

ATtiny microcontroller comparison chart - Wikipedia

megaAVR, mikrokontrolery o dużo większych możliwościach obliczeniowych niż ich mniejsi bracia. Posiadają 4-256 kB pamięci programu, obudowy o 28-100 wyprowadzeniach, liczne zintegrowane peryferia (przetworniki AC/CA, timery, liczniki, USB itp). Stosowane są w wymagających aplikacjach np. jako sterowniki maszyn przemysłowych lub urządzeń gospodarstwa domowego. Taktowane są maksymalnie do 20 MHz.

ATmega328 - Wikipedia

Mimo znacznego już wieku tych układów, nadal znajduję je w nowoczesnych urządzeniach (mikrofale, pralki, kuchenki, centrale alarmowe, czytniki RFID, a nawet w urządzeniach automatyki przemysłowej i domowej). Pokazuje to, jak dobrze zostały wykonane i zaprojektowane a także, że są ponadczasowe. Mikrokontrolery AVR są popularne również wśród hobbystów i amatorów, ze względu na łatwość programowania, a także łatwość uruchomienia.

Co kryje warstwa tworzywa…

Układ nadzoru zasilania pilnuje, aby napięcie było zgodne z założeniami projektantów (2.7 do 5.5 V). Znajduje się tu również układ resetujący. Sprzętowy układ SPI i I2C to struktury wbudowane w płytkę krzemową, które umożliwiają komunikację z czujnikami lub drugim mikrokontrolerem. Znacząco ułatwia to pracę programisty, gdyż zamiast ogarniać programowo cały protokół komunikacji tak naprawdę odczytujemy jedynie rejestr z danymi.

Co jest potrzebne, żeby zacząć programować mikrokontrolery AVR?

Mikroprocesor zawarty wewnątrz mikrokontrolera AVR rozumie tylko binarne kody instrukcji. Program umieszczony w pamięci Flash mikrokontrolera wygląda mniej więcej tak:
1001101111110101
1101000110001001
0001010110000101
0000011110011011

Każda instrukcja dla mikroprocesora AVR zajmuje w pamięci co najmniej 16 bitów. Program zawierający bezpośrednio instrukcje dla mikroprocesora nazywamy programem maszynowym a język tych instrukcji nazywa się językiem maszynowym. Poszczególne instrukcje określają operacje, które ma wykonać mikroprocesor. Programowanie na poziomie języka maszynowego to niesamowicie trudne zadanie i wątpię, że w dobie kompilatorów np. języka C ktoś jeszcze tak robi, choć 30 lat temu była to jedyna metoda.

Aby umożliwić programowanie mikrokontrolera przez port USB potrzeba nam specjalnego programatora:

Programator ATMEL USBasp USBISP AVR ISP + Taśma - Sklep, Opinie, Cena w Allegro.plKosztuje w granicach 20 zł. Zasada jego działania, którą potrzebujemy znać do naszych działań to tłumaczenie danych przesyłanych przez interfejs USB do danych przesyłanych na port ISP. Na programatorze również znajduje się mikrokontroler AVR, z programem, który działa jak tłumacz.

ISP (In-System Programming) umożliwia zaprogramowanie układu scalonego bez jego demontażu z urządzenia, w którym pracuje. Na odwrocie programatora znajduję się rozpiska pinów.

Płytka, której używam lub popularne Arduino posiadają złącze przeznaczone do programowania. Połączenia należy wykonać według nazw. Przykładowo MOSI na programatorze łączymy z MOSI na złączu mikrokontrolera. Poniżej znajduje się zdjęcie z wszystkimi opisanymi pinami:

Nazwy np. PD0 to adresy pinów, ADC oznacza pin z przetwornikiem analogowo-cyfrowym, którego możemy używać jako zwykłe wejście/wyjście, nazwy D2 przeznaczone są tylko w momencie programowania tej płytki w środowisku Arduino. Nam nie jest to potrzebne.

Potrzebujemy również środowiska, które pozwoli nam napisać program i prześle go do mikrokontrolera. Ja używam Microchip studio.

Instalacja przebiega standardowo jak w innych programach i jest bardzo intuicyjna, nie pokażę jej tutaj. Po instalacji pokazuje nam się takie okno:

Nowy projekt tworzymy klikając „New Project”. Po otwarciu okna wybieramy to co zaznaczyłem na zdjęciu i nazywamy nasz projekt. Gdy to zrobimy klikamy ok.

Później pojawia się okno wyboru naszego urządzenia (mikrokontrolera), wybieramy ten, który aktualnie programujemy po czym klikamy ok.

Pojawia się nam pusty program, składający się z „int main(void)”, czyli pętli programu. W miejscu między while(1) a { wpisujemy działania, które mikrokontroler wykona zaraz po włączeniu zasilania np. inicjalizacja portów, włączenie peryferii. Przestrzeń na samej górze przeznaczona jest na definicje funkcji, dołączanie bibliotek lub tworzenie zmiennych globalnych.

Następnie musimy pobrać program odpowiedzialny za przesyłanie danych z komputera do programatora. Jego nazwa to AvrDude. Jego instalacja jest troszkę wymagająca, dlatego przesyłam film z jego instalacją na Windows 10.

Teraz część polegająca na dodaniu naszego programatora do środowiska. Aby to zrobić należy w pasku narzędzi kliknąć Tools i potem ExternalTools.

Title – wpisujemy nazwę naszego układu np. attiny88

Command – podajemy ścieżkę do folderu z AvrDude.exe np. c:\users\Pulpit\AVRDUDE\avrdude.exe

Arguments –    –c usbasp -p m162 -U flash:w:$(TargetDir)$(TargetName).hex:i      w miejscu „-p xxx” wpisujemy nazwę naszego układu np. dla Attiny88 jest to „t88”, dla Atmega162 „m162”.

Initial directory zostawiamy puste, zaznaczamy „Use Output Window„, klikamy OK.

Zestaw do testowania kodu

Aby testować proste programy wystarczy nam zaledwie przycisk, dwa rezystory (od 100 do 1000 Omów) i dwie diody LED. Poniżej znajduje się schemat układu, według którego będę robił dalsze kroki:

Brak opisu.

Hello world!

Pierwszy program będzie polegał na włączaniu jednej diody a wyłączaniu drugiej podczas klikania przycisku. Wykrywanie zmiany stanu przycisku będzie polegało na zwieraniu 5V, który ustawimy na pinie PD1 (1) do masy. W momencie kliknięcia na pinie PD1 będziemy mieli stan niski. Właśnie to będziemy chcieli wykryć.

Programowanie całego układu w głównej mierze opiera się na ustawianiu wartości rejestru. Rejestry i informacje o nich znajdziemy w nocie katalogowej (u mnie 64-67 strona). Wartości domyślne rejestrów to zera.

PORT(A,B,C,D) – w tym rejestrze ustawiamy, jakie mają być stany na pinie (wysoki [5V] lub niski [0V])            DDR(A,B,C,D) – tutaj ustawiamy, czy pin jest wejściem, czy wyjściem. Jeśli przykładowo ustawimy PD2 na Zero, pin będzie wejściem, jeśli na Jeden to wyjściem.                                                                                                PIN(A,B,C,D) – rejestr, który przechowuje stan pinu, jeśli ustawiliśmy go jako wejście

W programie będzie pokazane, jak odbywa się całe to „ustawianie”.

Przykładowo: DDRD &= (~(1<<S1)) używane jest do ustawiania zera [0] na danym bicie (S1)  a                                PORTD |= (1<<Led1) oznacza ustawienie jedynki na bicie Led1, czyli włączenie diody. Pętla while(1) będzie wykonywała się w nieskończoność z góry do dołu.

Wgrywanie programu

Najpierw łączymy programator zgodnie z pinami ISP Pamiętając o upewnieniu się czy mamy wszystko zgodnie ze schematem i nie pomyliliśmy biegunów zasilania. Następnie wkładamy urządzenie do portu USB komputera. Teraz klikamy F7 na naszej klawiaturze. Rozpocznie się proces kompilacji programu, czyli tłumaczenia kodu C na język maszynowy. Jeśli coś napisaliśmy nie tak to program nam o tym powie. Później otwieramy okno z naszym programem i klikamy w Tools na pasku narzędzi. Następnie upewniamy się czy programator jest podłączony i klikamy na nazwę naszego mikrokontrolera. Nastąpi proces wgrywania programu.

Brak opisu.

Jeśli wszystkie poprzednie kroki zrobiliśmy dobrze to powinniśmy zobaczyć taki ekran i cieszyć się pierwszym wgranym programem:

W dalszych poczynaniach przyda nam się wiedza na temat zmiennych jakie są dostępne. Jak widać są to podobne zmienne do tych wykorzystywanych w PLC.

W drugim programie po wciśnięciu przycisku dioda zapali się dokładnie 5 razy. Wykorzystamy sobie funkcję For. Jest to pętla, która wykonuje się tak długo, aż warunek który jej podamy jest prawdziwy. Składa się ona z 3 rzeczy, które możemy dowolnie zmieniać. Pierwsza od lewej (int i = 0) to zmienna, którą operujemy, środkowa to warunek, jak długo lub ile razy pętla działa, prawa to zmniejszanie lub zwiększanie zmiennej pętli, który jest wykonywany po przejściu przez całą jej zawartość.

Żeby zobaczyć, że dioda miga potrzebujemy opóźnienia (delay). Aby dodać tą funkcję potrzebujemy dołączyć bibliotekę (#include <util/delay.h>). Zyskujemy wtedy funkcję, do której w nawiasy wpisujemy czas liczony w milisekundach przez który ma opóźniać jakieś działanie.

Działanie tej pętli będzie można obserwować po wgraniu poniższego programu i kliknięciu przycisku S1:

Podsumowanie

Mikrokontrolery AVR to bardzo użyteczne układy. Są tanie, łatwe w programowaniu i przyjazne dla początkujących. Potrafią obsługiwać bardzo dużo procesów. Przykładowo moja drukarka 3D, czyli urządzenie dosyć złożone i wymagające mocy obliczeniowych sterowana jest właśnie przez taki układ. Myślę, że gdyby te układy istniały w 1969 roku to bez problemu zabrałyby nas na księżyc i starczyłoby miejsca w ich pamięci, żeby obsłużyć automatyczny ekspres do kawy 🙂



Utworzono: / Kategoria:

Reklama

Newsletter

Zapisz się i jako pierwszy otrzymuj nowości!




.
NAJNOWSZE PUBLIKACJE OD UŻYTKOWNIKÓW I FIRM
>KLIKNIJ<

Komunikacja bezprzewodowa RADIOLINE na farmach fotowoltaicznych

Komunikacja bezprzewodowa RADIOLINE na farmach fotowoltaicznych

>KLIKNIJ<

Najlepszy sposób na zmianę prędkości napędu? Przekładnia!

Najlepszy sposób na zmianę prędkości napędu? Przekładnia!

>KLIKNIJ<

Nowoczesne HMI w systemach automatyki

Nowoczesne HMI w systemach automatyki

>KLIKNIJ<

Przykład predykcyjnego wyznaczenia poziomu wyeksploatowania mechanizmu precyzyjnej śruby z nakrętką kulkową.

Przykład predykcyjnego wyznaczenia poziomu wyeksploatowania mechanizmu precyzyjnej śruby z nakrętką kulkową.

>KLIKNIJ<

DataLogger IG – rejestrator danych dla serwisu i diagnostyki przekładni przemysłowych

DataLogger IG – rejestrator danych dla serwisu i diagnostyki przekładni przemysłowych

>KLIKNIJ<

Jak zwiększyć bezpieczeństwo zasilania układów automatyki rozwiązaniami od Phoenix Contact

Jak zwiększyć bezpieczeństwo zasilania układów automatyki rozwiązaniami od Phoenix Contact

>KLIKNIJ<

Ustawienia przemienników częstotliwości

Ustawienia przemienników częstotliwości

>KLIKNIJ<

Czy warto inwestować w rozwiązania dedykowane? Nowy system złączek sygnałowych

Czy warto inwestować w rozwiązania dedykowane? Nowy system złączek sygnałowych

Reklama



MOŻESZ SIĘ TYM ZAINTERESOWAĆ