Zobacz także:
- Mikrokontrolery AVR część 1 – wprowadzenie
- Mikrokontrolery AVR część 2 – podstawy
- Mikrokontrolery AVR część 3 – wokół kontrolera
- Mikrokontrolery AVR część 4 – Porty we/wy
- Mikrokontrolery AVR część 5 – przerwania
- Mikrokontrolery AVR część 6 – timer0
- Mikrokontrolery AVR część 7 – tmier1
- Mikrokontrolery AVR część 8 – timer2
- Mikrokontrolery AVR część 9 – Komparator analogowy
- Mikrokontrolery AVR część 10 – transmisja szeregowa UART
Kiedy już wiemy do czego służy każda z nóżek kontrolera, można w zasadzie przejść do tworzenia układu elektronicznego i programowania. Ale właśnie co podpiąć do kontrolera, żeby zaczął działać i żeby można było wgrać program do pamięci programu, czyli pamięci typu Flash? W tym artykule zajmę się właśnie tymi podstawowymi elementami potrzebnymi do pracy kontrolera i powiem trochę o czymś takim jak bity konfiguracyjne, czyli fuse bity. Zacznijmy od tego, że trzeba zasilić kontroler. Układy z rodziny AVR są zasilane przeważnie napięciem 5V, zależnie od wersji może to napięcie być niższe. Plus napięcia zasilania podłączamy do VCC, a minus do GND. Jak to zrobić w praktyce pokazuje poniższy rysunek.
Dodatkowo jest tam kondensator, który ma filtrować zakłócenia. Powinien mieś on wartość około pomiędzy 10nF, a 100nF.
Ale to jeszcze nie wszystko przy podłączaniu zasilania do naszego AVRka. Musimy zasilić jeszcze przetwornik analogowo-cyfrowy. Na razie niektóre rzeczy mogą wydawać się niejasne, dlatego muszę powiedzieć co nieco o przetworniku. Z przetwornikiem są związane trzy wejścia: AVCC, GND oraz AREF. Jak już pisałem AVCC to plus zasilania, GND to masa przetwornika, a AREF to wejście napięcia odniesienia. W celu odfiltrowania ewentualnych zakłóceń należy AVCC podpiąć do plusa zasilania poprzez dławik (cewkę) o indukcyjności własnej równej 10 uH oraz pomiędzy AVCC, GND należy podłączyć kondensator, taki jak przy normalnym zasilaniu. GND podpinamy do masy.
Co robimy z AREF?
AREF jest to wejście napięcia odniesienia, czyli napięcie względem którego przetwornik przetwarza wartość analogową na cyfrową. Można tutaj po prostu podpiąć plus zasilania, jednak najczęściej robi się tak, że korzysta się z napięcia AVCC jako napięcie odniesienia. Wtedy nie trzeba niczego podpinać do AREF, ale pin taki nie może wisieć w powietrzu, więc należy go podciągnąć do masy poprzez kondensator o pojemności na przykład 10nF. Na poniższym rysunku przedstawiam fragment schemat uzupełniony o zasilanie przetwornika A/C.
Po lewej stronie schematu zostały jeszcze wolne wejścia reset oraz wejścia dla generatora lub rezonatora zewnętrznego.
Na razie zajmę się resetem. Aby zresetować AVRka należy na wejście RESET podać zero, czyli masę. Aby nie dochodziło do samoczynnego resetowania się układu należy RESET podciągnąć do plusa zasilania. Podciągnięcia dokonujemy poprzez rezystor o oporze 10k?.
Czasem zachodzi potrzeba, aby można było resetować układ poprzez naciśnięcie guzika. Dodajemy wtedy guzik pomiędzy podciągnięty do plusa RESET a masę. Kiedy wciśniemy przycisk na rezystorze odłoży się 5V, a na resecie pojawi się potencjał masy i kontroler się zresetuje.
Pozostała nam jeszcze kwestia taktowania procesora. Mikrokontrolery AVR można taktować na kilka sposobów, poprzez: wewnętrzny układ RC, zewnętrzny układ RC, rezonator kwarcowy lub ceramiczny oraz poprzez zewnętrzny sygnał zegarowy. Standardowo jest używany wewnętrzny generator RC ustawiony na częstotliwość 1MHz. W takim przypadku możemy korzystać z pinów PB6-7 jako zwykłe porty. Wewnętrzny układ RC może taktować kontroler z częstotliwościami: 1, 2, 4, 8MHz. Jak to zmieniać, powiem później. Jednak ten wewnętrzny generator nie jest zbyt dokładny. Kiedy zależy nam na dokładności to używamy zewnętrznego rezonatora. Podłączamy go do pinów XTAL1 oraz XTAL2 i podciągamy do masy poprzez kondensatory o pojemności od 11pF do 22pF.
Ale w jaki sposób powiedzieć kontrolerowi jakiego taktowania ma używać i jaką ma ono mieć wartość. Do tego służą nam bity konfiguracyjne, fuse bity. Są to dwa bajty niezależnej pamięci, do której mamy dostęp poprzez programator. Od razu napiszę, że ze zmianą fuse bitów należy bardzo uważać, ponieważ można zablokować sobie kontroler. Za taktowanie procesora odpowiadają bity CKSEL0 ? 3. Poniżej przedstawiam wykaz konfiguracji tych bitów zależnie od tego co chcemy ustawić.
- 0000 = częstotliwość z zewnętrznego generatora,
- 0001 = wewnętrzny oscylator 1MHz,
- 0010 = wewnętrzny oscylator 2MHz,
- 0011 = wewnętrzny oscylator 4MHz,
- 0100 = wewnętrzny oscylator 8MHz,
- 0101 = zewnętrzny oscylator RC 1MHz,
- 0110 = zewnętrzny oscylator RC 2MHz,
- 0111 = zewnętrzny oscylator RC 4MHz,
- 1000 = zewnętrzny oscylator RC 8MHz,
- 1001 = zewnętrzny kwarc z kondensatorami 2MHz,
- 1010 = zewnętrzny kwarc z kondensatorami 2-4MHz,
- 1011 = zewnętrzny kwarc z kondensatorami 4-6MHz,
- 1100 = zewnętrzny kwarc z kondensatorami 6-8MHz,
- 1101 = zewnętrzny kwarc z kondensatorami 8-10MHz,
- 1110 = zewnętrzny kwarc z kondensatorami 10-16MHz.
Na razie nie będę więcej mówił o fuse bitach, proponuje używać na początek wewnętrznego generatora, o częstotliwości ustawionej standardowo na 1MHz. Tyle na pewno wystarczy na początek. Z doświadczenia wiem, że nic bardziej nie zniechęca do programowania jak zablokowany fuse bitami kontroler.
Kiedy już wiemy co należy zrobić, aby układ działał poprawnie, trzeba jeszcze wgrać do niego program. Jest kilka sposobów wgrywania programu do pamięci Flash. Najpopularniejszym sposobem jest programowanie poprzez ISP (In System Programing) czyli programowanie w systemie. Wykorzystuje się do tego celu transmisje SPI. Można także programować pamięć poprzez interfejs JTAG oraz programatorem równoległym, ale to są już droższe rozwiązania, programatory są drogie.
Istnieje wiele programatorów ISP. Najpopularniejsze to STK200, STK500 oraz USBasp. Jednak nie będę tutaj ich opisywał, zajmę się tylko tym jak je podłączyć do kontrolera. Aktualnie standardem, podłączania programatorów ISP jest standard KANDA. Jest to dwurzędowa złączka pinowa o odpowiednim rozmieszczeniu sygnałów. Poniższy rysunek, który pokazuje jakiemu sygnałowi odpowiadają poszczególne piny.
Standard ten zawiera takie sygnały jak MOSI, MISO, SCK, RESET oraz zasilające VCC oraz GND. VCC pełni różną funkcję zależnie od tego jakiego programatora używamy. Przy programatorach USB (np. USBasp, STK500), można nim zasilać kontroler, a przy innych programatorach (np. tych na LPT ) poprzez VCC doprowadzamy napięcie do programatora. Jest jeszcze sygnał NC, czyli nieużywany. Niektóre programatory mogą nim sterować diodę sygnalizującą programowanie.
Jak podłączyć złącze typu KANDA do kontrolera pokazuje poniższy schemat. Przy okazji jest to całościowy schemat z tego artykułu. Proponuje go zapamiętać, bo jest on stosowany w każdym układzie opartym o kontrolery z rodziny AVR.
Na tym zakończę ten artykuł. W następnej części opiszę budowę portów i rejestry odpowiedzialne za ich pracę.
Cz koniecznie trzeba łączyć wszystkie GND z złącza programatora STK200 czy może wystarczy tylko podłączenie jednego z nich?
Generalnie, dobrze jak by połączyć wszystkie, ponieważ pełnią role ekranu w tasiemce idącej od programatora. Ale z drugiej strony, jak nie połączymy, to też powinno działać, bo w programatorze też wszystko jest połączone, więc powinno też tak działać.
Świetny poradnim, mam nadzieje, ze kolejne lekcje będą równie przydatne jak te do tej pory. Jednak nie kryje, że małe zdjecia układów zaprezentowanych powyżej utrudniają ich odczytanie, a nawet uniemozliwiaja je. Czy mogłbyś może zamiescic schematy o wiekszej rozdzielczosci? Byłbym bardzo wdzięczny.
Czeszę się, że artykuł się podoba.
Co to tych schematów, stopniowo je poprawiam, ponieważ utraciłem jakiś czas temu grafikę ze strony i udało mi się odzyskać tylko miniatury. Jak znajdę chwilkę czasu, to popracuje nad tymi schematami.
Hej, moglbys cos ze zdjeciami zrobic bo male strasznie ?
Bardzo przydatne opis: trudno bylo znalezc taki artykul. Autorzy zwykle ograniczone do tych, ktore mozna znalezc w Internecie, i sa bardzo dobrze probowal. Dziekujemy.
Bardzo fajny wpis. Jednak miał bym pytanie, jak zmienić zewnętrzny oscylator na wewnętrzny w atmega328p
Standardowo w mikrokontrolerach atmega ustawiony jest początkowo wewnętrzny oscylator. Aby go zmienić należy odpowiednio ustawić fuse bity, najlepiej skorzystać z gotowego kalkulatora, na przykład takiego jak ten http://www.engbedded.com/fusecalc/ przeważnie używam tego i nigdy nie miałem problemów. Warto pamiętać, że złe ustawienie fuse bitów może skończyć się zablokowanie mikrokontrolera.
dwie literówki znalazłem podczas czytania 🙂
MOIS -> MOSI
nie zależnej -> niezależnej
Dzięki już poprawiłem 🙂