Jak zaprogramować mikrokontroler AVR ATTINY84A-PU
W poprzedniej części omówione zostały podstawowe pojęcia związane z projektowaniem układu ze świecącą diodą. Było to absolutne minimum z jakim można cokolwiek wystartować. Jednak mamy już pewną podstawę pozwalającą by ruszyć trochę dalej, choć pewnie lepiej byłoby budować solidne podstawy dotyczące elektroniki. Do pozostałych pojęć dojdziemy jeszcze w trakcie.
W tej części zaczniemy już projektować układy sterowane mikrokontrolerem i pisać na nie programy. Stworzymy najprostsze co chyba można zrobić i co zazwyczaj na początku się robi czyli migająca dioda. To taki „Hello World” w programowaniu mikrokontrolerów.
Stworzymy układ zasilany czterema bateriami AA czyli paluszkami, co da nam napięcie 6V. Zawierający mikrokontroler i diodę podpiętą do jednej z nóżek mikrokontrolera. I oczywiście właściwe rezystory, których wartości wyliczymy sobie w trakcie. Program wgrany na mikrokontroler będzie co określony czas zapalał i gasił diodę na przemian. Niby nic ciekawego a zapoznamy się z narzędziami pozwalającymi tworzyć i wgrywać oprogramowanie do mikrokontrolera z rodziny Atmel AVR.
Co będziemy potrzebować?
- Mikrokontroler – w tym przypadku jeden z mniejszych i prostszych z niewielką ilością pinów i możliwości ATTINY84A-PU. (później weźmiemy sobie coś większego)
- Programator – ja mam ATB-USBASP ale jakiś inny lepszy też się nada. Ogólnie potrzebujemy programatora aby wgrać program na nasz mikrokontroler.
- Oprogramowanie – wykorzystamy Microchip studio (dawniej avr studio)
- Płytka stykowa – na której zmontujemy nasz prototyp
- Trochę kabli – żeby to wszystko połączyć na płytce stykowej
- Dioda – dzięki której będziemy chcieli zaprezentować działanie programu
- Multimetr – przyda się do upewnienia na pierwszy raz czy rzeczy działają jak byśmy chcieli
- Rezystory – do uzyskania odpowiedniego napięcia, policzymy sobie zaraz dokładniej jakich będziemy potrzebować.
Mikrokontroler ATTINY84A-PU
Najważniejsze co nas interesuje jak dostajemy do zaprogramowania mikrokontroler to jego schemat wyprowadzeń. Znajdziemy go w nocie katalogowej. Nota katalogowa to dość obszerny dokument opisujący szczegóły działania i parametry danego mikrokontrolera (czy w sumie jakiegokolwiek elementu elektronicznego). W tym przypadku do dyspozycji mamy 14 wyprowadzeń, z których już na starcie odpadają nam zawsze co najmniej 2 na podpięcie zasilania. (VCC – plus, GND – minus).
Bardzo ważne: piny liczymy od takiego wcięcia jak widać na obrazku poniżej. Ono praktycznie zawsze jest fizycznie na mikrokontrolerze dzięki czemu jesteśmy w stanie określić, który pin ma jakie oznaczenie zgodnie ze schematem.
Jak widać z powyższego schematu zasilanie łączymy do pinu 1 – VCC czyli plus oraz 13 – GND czyli minus.
Napięcie z jakim działa ten mikrokontroler (oraz wiele innych z tej rodziny) to 1,8V do 5,5V. My będziemy często korzystać z 5V, czyli napięcia jakie jest w wejściu USB z komputera. Zaraz przejdziemy do programatora i spróbujemy to zmierzyć. Tutaj należało by napisać jeszcze kilka rozdziałów o wyjściach i mikrokontrolerach ale jeszcze wrócimy do niektórych szczegółów.
Programator USBASP
Programator to urządzenie umożliwiające wgrywanie programów na mikrokontrolery. Jeden pasujący koniec wtykamy do komputera do USB (najlepiej mieć do tego kabel USB dzięki czemu jeśli bawimy się z PC to można się bawić wygodnie na biurku).
Z drugiej strony do pinów możemy podpiąć różne wyjścia, ja podpinam takie specjalne kable z końcówkami żeńsko męskimi lub męsko-męskie w zależności od tego jakie jest wyjście. Dzięki temu mogę wygodnie podpiąć programator do płytki stykowej tak jak na zdjęciach później.
Najważniejsze co trzeba wiedzieć o programatorze to jakie ma wyjścia aby móc prawidłowo podłączyć go do mikrokontrolera. Najważniejsze to żeby nie pomylić plusa z minusem (udało mi się doprowadzić to tego że z mojego mikrokontrolera poszedł dym 😉 ).
Powyżej jest schemat, bardzo prawdopodobne że na twoim programatorze wygląda to identycznie ale lepiej zajrzyj do instrukcji.
Aby sprawdzić czy dobrze interpretujesz wyjścia programatora zawsze możesz wykorzystać multimetr nastawiony na pomiar napięcia. Przy okazji upewnisz się że napięcie jest odpowiednie dla twojego mikrokontrolera jaki by on nie był. Chyba najprościej będzie to zrobić poprzez podłączenie kabli do VCC i GND a następnie do miernika. Cały eksperyment może wyglądać jak na poniższym obrazku. Jak widać napięcie jest bardzo dobre dla naszego kontrolera i wynosi ono prawie dokładnie 5V.
Jak podłączyć Programator do Mikrokontrolera ATTINY84A-PU?
Znamy już schematy wyjść programatora oraz mikrokontrolera. Teraz należałoby to wszystko jakoś połączyć kablami aby można było wgrać nasz program, który za kilka chwil zaczniemy pisać. Jak widać na obrazku wyżej do programatora podczepiłem dwa kable, o których wspominałem chwilę temu. U mnie Mikrokontroler już czeka wpięty w płytkę stykową na połączenie.
Jeśli dokładnie się wczytasz w schematy to będziesz w stanie wywnioskować z opisu pinów kontrolera, które wyjścia programatora gdzie podpiąć. Zobacz na obrazek poniżej.
Jeśli wszystko połączyłeś prawidłowo to otrzymałeś już małego potworka z kabli i chyba można przejść do programowania prostej aplikacji zapalającej i gaszącej diodę co jakąś ilość czasu. W tym celu wykorzystamy oprogramowanie Microchip studio dedykowane specjalnie do takich zadań.
Oprogramowanie Microchip Studio i pierwszy program
Nie opisuję już instalacji bo podejrzewam że każdy przeciętny użytkownik komputera będzie w stanie wpisać w wyszukiwarkę microchip studio, pobrać i zainstalować program. Podpowiem tylko że to taki z biedronką (przynajmniej na ten moment).
Zaczynamy od utworzenia nowego projektu, czyli „New Project…” i wybieramy „GCC C Executable Project”. Warto zwrócić uwagę że na dole tego okna możemy sobie wybrać inną ścieżkę i określić nazwę. Ścieżkę warto sobie zapamiętać na przyszłość.
W kolejnym oknie wybieramy mikrokontroler, który chcemy zaprogramować i dalej OK.
Po chwili powinien się utworzyć projekt z plikiem main.c, w którym znajdzie się wstępny szablon programu.
Na początku mamy komentarze z informacjami między innymi kiedy plik został utworzony oraz kto go utworzył (niezbyt to istotne i usunięcie tego w zasadzie nic nie zmieni.
Dalej mamy instrukcję #include <avr/io.h> i jest to prawie najważniejsza linijka gdzie dołączamy bibliotekę, dzięki której będzie można programować pod mikrokontroler z rodziny AVR czyli naszą atmegę.
Dalej mamy funkcję główna programu int main(void) i blok kodu zawierajacy niekończącą się pętlę programu. Po wrzuceniu programu do mikrokontrolera kod w tej pętli będzie się wykonywał w nieskończoność i nada się to do migania naszą diodą.
Jeśli dobrze przyjrzysz się wcześniej załączonemu schematowi zauważysz że większość pinów jest oznaczona PA albo PB z jakimś numerem. Oznacza to że mamy tutaj dwa porty A oraz B z kilkoma wyjściami.
Do naszego zadania potrzebujemy tylko jeden port żeby później podpiąć do niego naszą diodę. Załóżmy że podłączymy diodę do portu PB1 (na schemacie (PCINT9/XTAL2) PB1) musimy określić to w naszym kodzie.
Zaczynamy od ustawienia pinu PB1 na wyjście poprzez komendę
DDRB |= (1 << PB1);
Powyższy kod umieszczamy w funkcji głównej programu main. Następnie zmieniamy stan naszego pinu na przeciwny, w praktyce jeśli prąd nie płynął przez ten pin to teraz przez niego popłynie o ile podłączymy do niego plus czyli anodę naszej diody (trzeba pamiętać o rezystorze do czego za chwilę dojdziemy).
PORTB ^= (1 << PB1);
Powyższą linię kodu umieszczamy w naszej nieskończonej pętli while. W tym momencie nasze stany zmieniałyby się z taką prędkością że nie sposób byłoby to zauważyć gołym okiem. Dlatego Trzeba jeszcze zatrzymać program na chwilę żeby był czas przypatrzeć się działaniu.
Aby to zrobić należy dołączyć bibliotekę delay.h jednak ta biblioteka potrzebuje określenia taktowania. Dlatego też przed funkcją main dodajemy definicję taktowania procesora. Domyślnie nasz mikrokontroler attiny84A-PU ma taktowanie 1MHz czyli 1000000Hz i taką liczbę podajemy. Pamiętamy o UL na końcu bo to duża liczba.
#define F_CPU 1000000UL
W następnej linijce załączamy bibliotekę obsługującą opóźnienia.
#include <util/delay.h>
Na koniec pozostaje dodać opóźnienie w naszej pętli o 1000 milisekund czyli stan powinien się zmieniać co sekundę. Możesz spróbować ustawić inną wartość.
_delay_ms(1000);
Na koniec jakby mógł wyglądać kompletny kod:
Jak dodać programator USBASP do Microchip studio?
Jeśli robisz to pierwszy raz to pewnie programator nie za bardzo działa z microchip bo brakuje mu sterowników. Trzeba będzie pobrać sterowniki. Najpierw pobierz program zadig ze strony https://zadig.akeo.ie/
Jeśli programator jest podłączony i udało się uruchomić pobrany programik to powinniśmy mieć coś jak na obrazku poniżej
wybieramy sterownik „libusb-win32 (v1.x.x.x)” po czym klikamy przycisk „Install Driver”. Teraz należy uzbroić się w cierpliwość program przeprowadzi instalację wymuszoną naszego sterownika co może zająć kilka chwil które należy cierpliwie odczekać. O prawidłowej instalacji powiadomi nas stosowny komunikat.
Teraz jak już mamy sterowniki w microchip wchodzim w tools > external tools
Potem trzeba pobrać i zainstalować avrdude najlepiej z oficjalnej strony projektu avrdude , warto zwrócić uwagę jak będziesz pobierać i korzystasz z windowsa żeby pobrać plik z mingw32 w nazwie. Tam powinien się znajdywać interesujący nas plik z rozszerzeniem exe czyli avrdude.exe. Po wypakowaniu wpisujemy tę ścieżkę w pole „Command”.
W polu z argumentami trzeba wpisać komendę:
-p attiny84 -c usbasp -P usb -B 8 -U flash:w:$(TargetDir)$(TargetName).hex:i
Zwróć uwagę że jako drugi argument podaliśmy attiny84. Jeśli będziesz chciał zaprogramować inny mikrokontroler zmień ten argument na taki, którego używasz np atmega8.
Wybieramy jeszcze opcję „Use output window”, która sprawi że będziemy widzieli komunikaty w konsoli przy wgrywaniu programu i klikamy ok. Konfiguracja powinna wyglądać tak jak na obrazku poniżej.
Następnie z menu „tools” wybieramy „customize” i dodajemy „USB ASP”
Następnie przechodzimy do zakładki „Commands” zaznaczamy „Toolbar” i z listy rozwijanej wybieramy „USB ASP”, w tym momencie okno pod spodem controls powinno się wyczyścić. Klikamy „Add Command” a następnie z lewej listy wybieramy „Tools” a z prawej „External Command 1”.
Dzięki temu zabiegowi po kliknięciu ok powinien się pojawić nowy guzik w naszym interfejsie umożliwiający szybkie i łatwe wgrywanie programu na mikrokontroler. Należy jednak cały czas pamiętać że przed wgraniem trzeba program zbudować.
Wgrywamy program na mikrokontroler
Do tej pory powinieneś mieć fizycznie podłączony programator do mikrokontrolera, napisany odpowiedni program, który robi robotę oraz skonfigurowany programator z Microchip Studio.
Nie pozostaje nic innego jak wgrać program na nasz mikrokontroler. Przed wgraniem należy kliknąć „Build…” a potem nasz skonfigurowany guzik „USBASP”. Jeśli zrobiłeś wszystko poprawnie powinieneś uzyskać komunikat jak na obrazku poniżej. Jeśli podłączyłeś coś źle albo coś nie tak poszło w konfiguracji także otrzymasz komunikat o niepowodzeniu. U mnie wgranie takiego małego programu trwało mniej niż sekundę.
Teraz jak już mamy podłączony programator z jakimś zasilaniem i wrzucony program możemy sprawdzić za pomocą miernika czy nasz program już działa oraz jakie napięcie mamy na wyprowadzeniu. Oczekujemy że co sekundę powinniśmy dostawać jakieś dodatnie napięcie na pinie oznaczonym na schemacie jako PB1 czyli trzecia nóżka naszego mikrokontrolera.
Próbujemy podpiąć miernik na pomiarze napięcia pod wyżej wymieniony pin i GND czyli minus. Jeśli wszystko poszło dobrze powinniśmy otrzymać na multimetrze co ok sekundę kilka volt, nie więcej jak 5V na zmianę z zerem. Powinno to wyglądać mniej więcej tak jak na poniższym obrazku.
Podpinamy diodę
Z poprzedniej lekcji wiesz już że dioda czerwona potrzebuje napięcia ok 2 – 2,3V oraz natężenia ok 0,02A aby działać optymalnie, przy 5V prawdopodobnie dość szybko się spali.
Pamiętasz także że aby otrzymać odpowiednie napięcie potrzebujesz dodać rezystancję, ażeby ją policzyć trzeba wykorzystać wzór:
Spadek napięcia / natężenie = rezystancja w ohmach.
Spadek napięcia to nasze 5V, które otrzymujemy na wyjściu minus 2,3V czyli 2,7V. Dalej nasze 2,7V dzielimy przez natężenie wynoszące 0,02A i otrzymujemy 135 Ohmów.
Skoro już wiemy jaki rezystor jest potrzebny to podłączamy pod pin PB1 rezystor jak najbardziej przybliżony do tej wartości, następnie anodę diody czyli dłuższą nóżkę do rezystora i katodę do minusa czyli GND.
Po podłączeniu dioda powinna migać, jednak teraz nasz prototyp będzie działał tylko wówczas gdy będzie do niego podpięty programator. Trochę słabo bo nie zrobimy dyskoteki dalej od komputera. Potrzebujemy jeszcze podłączyć jakąś baterię. Najlepiej by się tutaj nadało coś na 5V ale może to być np koszyczek z czterema paluszkami 1,5V. Połączone szeregowo dadzą akurat 6V, przy dodaniu jakiegoś małego rezystora z 50 omów powinniśmy otrzymać oczekiwane napięcie. Może to być też 3 lub 2 paluszki ponieważ zakres pracy mikrokontrolera 1,8 – 5,5V ale wtedy trzeba by jeszcze raz przeanalizować podłączenie diody bo będzie świecić słabiej i pewnie można by usunąć rezystor.
Trochę mi się rozładowała bateria 9V tak że zostało akurat ok 5V, w sam raz do tego układu.
O oto i ostateczny prototyp mojego projektu. Po odłączeniu programatora ten potworek zredukował się do całkiem przyjemnego minimum.