Technika cyfrowa, robotyka – mikrokontrolery AVR – zapis do portów

Co to jest mikrokontroler?

Z układów cyfrowych można budować dowolnie skomplikowane układy. Jednakże, gdy ilość bramek zaczyna rosnąć, konstrukcja taka staje się coraz bardziej skomplikowana i trudna do uruchomienia. Rozwiązaniem jest zastosowanie układów cyfrowych, które mogą spełniać dowolne funkcje, ponieważ posiadają możliwość programowania, czyli sterowania za pomocą odpowiedniego programu. Układy takie noszą nazwę mikrokontrolerów jednoukładowych.

Mikrokontroler jest kompletnym komputerem, tyle że bardzo małym. Zewnętrznie wygląda jak zwykły układ cyfrowy:

 

ATTINY13, ATTINY2313 i ATMEGA8

 

Wewnątrz zawiera nowoczesny mikroprocesor 8-bitowy, pamięć oraz różne układy we/wy. Mikrokontrolery służą do inteligentnego sterowania urządzeniami elektronicznymi i elektrycznymi (diody LED, przyciski, silniczki, czujniki, wyświetlacze, linie transmisyjne oraz inne układy wykonawcze). Oczywiście, w porównaniu z twoim komputerem PC jest to pchełka, lecz jego przeznaczenie jest inne od komputerów PC i w swojej roli mikrokontrolery radzą sobie bardzo dobrze. Jeśli tego jeszcze nie wiesz, to układy mikrokontrolerów są powszechnie stosowane w takich urządzeniach jak klawiatury, myszki, joysticki (te nowsze USB), tabliczki graficzne, dyski twarde, stacje CD/CDRW/BluRay, pendrive'y, kamerki itd. Dzięki mikrokontrolerom urządzenia te stają się w pewien sposób inteligentne i potrafią się komunikować z komputerem głównym.

Poza światem komputerów PC mikrokontrolery spotkasz w radioodbiornikach, telewizorach, odtwarzaczach, pralkach, piecykach, klimatyzacji, domofonach, samochodach, itd. itd. Liczba ich zastosowań jest ogromna, dlatego warto poznać sposoby ich wykorzystywania.

 

Mikrokontrolery firmy ATMEL

Na rynku elektronicznym spotyka się mikrokontrolery różnych firm. Dla "domowych" zastosowań najbardziej odpowiednie są produkty firmy ATMEL. Powodów jest kilka. Przede wszystkim są one tanie, łatwe w programowaniu oraz używane powszechnie. Dlatego w Internecie znajdziesz mnóstwo informacji na ich temat. Firma ATMEL produkuje całą gamę mikrokontrolerów. Ich cechą wspólną jest architektura, a co za tym idzie, podobieństwo w programowaniu. Nie będziesz się zatem musiał uczyć ciągle zupełnie nowych rzeczy, gdy zmienisz jeden model na inny (tak do końca nie jest to prawdą, jednakże podstawy są takie same).

Mikrokontrolery ATMEL są produkowane w dwóch podstawowych seriach:

W każdej z tych serii występują układy o różnych możliwościach (np. różna pojemność pamięci, liczba wyprowadzeń, elementy dodatkowe wewnątrz struktury mikrokontrolera, itd.). My zajmiemy się na początek trzema modelami mikrokontrolerów:

 

Model FLASH RAM EEPROM Linie I/O Cena
ATTINY13 1KB 64B 64B 6 3 zł
ATINY2313 2KB 128B 128B 18 5 zł
ATMEGA8 8KB 1KB 512B 23 6 zł

 

Co oznaczają dane w tabelce? Otóż poznajmy podstawową budowę mikrokontrolera AVR firmy ATMEL:

 

Budowa mikrokontrolerów AVR

 

CPU

Mikrokontroler posiada odpowiednio zaprojektowany mikroprocesor 8-bitowy, który jest zbudowany wg tzw. architektury harwardzkiej (AVR – oznacza kontroler jednoukładowy RISC ze zmodyfikowaną architekturą harwardzką). W architekturze tej pamięć programu jest oddzielona od pamięci danych. Mikroprocesor jest układem RISC  (ang. Reduced Instruction Set Computer – komputer o zredukowanym zestawie rozkazów), czyli posiada zubożony zestaw rozkazów w porównaniu do mikroprocesorów CISC (ang. Complex Instruction Set Computer – komputer o złożonym zestawie rozkazów), lecz za to są one wykonywane bardzo szybko. Okazuje się, że komputery RISC są wydajniejsze od komputerów CISC. Zubożenie listy rozkazów upraszcza budowę mikroprocesora, dzięki czemu może on wykonywać szybciej podstawowe operacje. Rozkazy skomplikowane zawsze da się wykonać za pomocą ciągu prostszych rozkazów. Nie jest to zatem jakieś zubożenie funkcjonalności procesora. Raczej potraktuj to jako odchudzenie grubasa, dzięki czemu staje się on szybszym biegaczem, bo nie musi taszczyć ze sobą swojego brzuszyska.

Pamięć FLASH

Do przechowywania programu dla mikroprocesora służy pamięć FLASH (taka sama jak w pendrive'ach). Pamięć FLASH można wielokrotnie zapisywać (tutaj gwarantowane jest zwykle 10.000 cykli zapisu). Jej cechą charakterystyczną jest to, że zapisane dane nie są tracone po zaniku napięcia zasilającego. Dlatego program raz zapisany w tej pamięci jest od razu dostępny dla mikroprocesora po włączeniu zasilania (w komputerze PC program musi być wczytany z zewnętrznego nośnika, co zajmuje czas przy starcie systemu). Ilość pamięci FLASH wpływa na wielkość programu, który możemy umieścić w kontrolerze, a to z kolei określa złożoność funkcji, które ten kontroler może pełnić. Pchełka ATTINY13 ma tej pamięci 1KB, co wystarcza do prostych zastosowań. Starsi bracia posiadają odpowiednio więcej pamięci FLASH, zatem mogą wykonywać większe programy (czyli mogą pełnić bardziej skomplikowane funkcje). Mikrokontrolery będziemy programować w języku C (istnieje również możliwość programowania ich w języku asemblera, ale jest to dosyć trudne dla początkujących). W 1KB pamięci da się zmieścić całkiem sensowny program dla mikroprocesora AVR.

Pamięć RAM

Dane przechowywane są w pamięci RAM. Pamięć ta po zaniku zasilania traci informację. Ilość pamięci RAM również określa funkcjonalność mikrokontrolera. Im jest jej więcej, tym więcej danych jest on w stanie przetwarzać. W pchełce ATTINY13 jest zaledwie 64 bajty pamięci RAM. Nie martw się, tyle zwykle wystarczy dla tego mikrokontrolera. Jeśli okazałoby się to zbyt mało, to firma ATMEL produkuje również bardziej pojemne pchełki, np. ATTINY25 (FLASH 2KB, RAM 128B, EEPROM 128B), ATTINY45 (FLASH 4KB, RAM 256B, EEPROM 256B), ATTINY85 (FLASH 8KB, RAM 512B, EEPROM 512B).

Pamięć EEPROM

Do przechowywania danych, które mają przetrwać wyłączenie zasilania (np. jakieś parametry konfiguracyjne lub dane startowe), służy pamięć EEPROM. Pamięć ta pozwala mikroprocesorowi wymazywać oraz zapisywać dane. Trwa to dłużej niż w przypadku RAM i dostęp jest bardziej skomplikowany. Dodatkowo liczba zapisów jest ograniczona do około 100 tysięcy (tyle gwarantuje firma ATMEL, lecz jeden z użytkowników męczył swój mikrokontroler zapisami do pamięci EEPROM i osiągnął liczbę ponad 4 milionów zapisów, zanim pamięć odmówiła dalszej współpracy). Z pamięci EEPROM na początku nie będziemy korzystać.

Porty we/wy

Ze światem zewnętrznym mikrokontroler komunikuje się za pomocą portów. Porty są wyprowadzone na nóżki układu scalonego. Do portów tych podłączamy różne urządzenia zewnętrzne. Porty mogą pracować dwukierunkowo, tzn. mogą wyprowadzać informację wpisaną do nich przez mikroprocesor, albo mogą odczytywać dane, które pojawiają się na linii portu z zewnątrz (np. naciśnięcie przycisku może zwierać linię portu wejściowego do masy i wymuszać na niej stan logiczny 0). Opanowanie programowania portów zapewni ci sukces w efektywnym stosowaniu mikrokontrolera. Im więcej linii portów, tym łatwiej podłączać do mikrokontrolera różne urządzenia bez dodatkowych układów scalonych. Pchełka ATTINY13 ma 8 nóżek, z których dwie są przeznaczone dla zasilania układu +5V oraz GND. Pozostałe 6 nóżek to właśnie linie portów. Linie portów mogą pełnić różne funkcje dodatkowe, o czym pomówimy w dalszej części kursu.

ISP

Układ programowania ISP (ang. In System Programming) pozwala programować mikrokontroler bez wyjmowania go z układu aplikacyjnego. Jest to bardzo wygodne rozwiązanie. Starsze mikrokontrolery wymagały wyjęcia z układu aplikacyjnego i programowania w specjalnych programatorach. Dzisiaj, dzięki ISP jest to banalnie proste. Bezpośrednio w układzie podłączasz do odpowiednich nóżek mikrokontrolera sygnały z programatora i programujesz mikrokontroler. Gdy proces się zakończy, mikrokontroler zostaje zresetowany i rozpoczyna wykonywanie programu, który został zapisany w pamięci FLASH.

Układy

Układy dodatkowe – tutaj różne rodziny są wyposażane w przeróżne dodatki: liczniki, komparatory, moduły transmisyjne. Zajmiemy się nimi w miarę potrzeb.

 

Co potrzebujesz do programowania mikrokontrolerów AVR?

Mikrokontroler

Po pierwsze, musisz zaopatrzyć się w odpowiedni mikrokontroler. Mikrokontrolery da się tanio kupić w serwisie Allegro. Jeśli mieszkasz w większym mieście, to na pewno są w nim sklepy z częściami RTV. Zapytaj o mikrokontrolery. Zaopatrz się przynajmniej w mikrokontroler ATMEGA8 (koszt około 6zł). Na nim uruchomisz wszystkie opisane tutaj projekty. Oprócz tego warto posiadać również ATTINY13 (koszt około 2,5...3zł) oraz ATTINY2313 (koszt około 4...5zł). Jak widzisz, ceny mikrokontrolerów nie są zbytnio wygórowane.

Uwaga:

Mikrokontrolery ATMEL mogą występować w różnych rodzajach obudów. Dla naszych celów najlepsze będą obudowy typu DIL (ang. Dual In Line). Obudowa DIL posiada z obu stron wyprowadzenia, które wlutowuje się w płytkę drukowaną lub wkłada do płytki stykowej. Oprócz obudów DIL spotkasz obudowy SMD (ang. Surface Mounted Device). Tego typu układy przeznaczone są do bezpośredniego montażu na płytce drukowanej w miniaturowych urządzeniach. Początkującemu elektronikowi mogą sprawiać kłopoty, ponieważ ich przylutowanie do płytki wymaga dużych umiejętności posługiwania się lutownicą oraz pewnej ręki. Bez specjalnego adaptera kontrolery SMD nie nadają się do płytki stykowej (no, ale przecież płytka stykowa nie jest docelowym środowiskiem dla mikrokontrolerów, możesz na niej uruchomić aplikację w wersji DIL kontrolera, a następnie skonstruować to samo urządzenie w wersji SMD).


ATMEGA8 w obudowie DIL
    

ATMEGA8 w obudowie SMD
    

 

Płytka stykowa

Do montażu prostych urządzeń wystarczy ci taka sama płytka stykowa, jakiej używaliśmy do budowy układów cyfrowych. Zaopatrz się w odpowiednią liczbę przewodów lub zworek. Zworki da się tanio wykonać z drutu w izolacji, np. z kabla telefonicznego lub z przewodu sieciowego UTP. Ostatecznie możesz zakupić odpowiednie zworki, jeśli jesteś bogatym człowiekiem. Samą płytkę stykową możesz kupić za około 13 zł w serwisie Allegro.

 

 

Uwaga:

Płytki stykowe są produkowane w różnych wielkościach. Nie kupuj całkiem małej ani bardzo dużej. Najlepsza jest taka płytka, jak na powyższej fotografii. Linie zasilania znajdują się po bokach płytki i są oznaczone kolorem czerwonym (+5V) oraz niebieskim (masa GND). Należy do nich podłączyć przewody zasilające z zasilacza lub z programatora. Zwróć uwagę, czy na twojej płytce stykowej linie te są połączone na całej długości. Istnieją wersje płytek posiadające przerwę w środku swojej długości (pozwala to na jednej płytce uruchamiać dwa układy o niezależnym zasilaniu). Jeśli zdarzy ci się taka płytka stykowa, to pamiętaj o połączeniu ze sobą linii zasilania. Unikniesz wielu stresów w stylu: dlaczego mi to nie działa...

 

Płytki stykowe posiadają zaczepy po bokach, które pozwalają je łączyć w zespoły. Przydaje się to wtedy, gdy tworzysz jakiś większy projekt, który wykracza poza możliwości połączeniowe jednej płytki. Pamiętaj jednakże, że płytka stykowa służy jedynie do nauki i budowy prototypów w celu przetestowania ich działania. Urządzenia docelowe zwykle montuje się za pomocą lutowania na odpowiednio zaprojektowanej płytce drukowanej. Nie zwalnia to jednak od wymogu staranności wykonania projektu. Dlatego przy montażu nie spiesz się, przewody układaj starannie na płytce, sprawdzaj kilkakrotnie wszystkie połączenia, gdyż błędy mogą cię uderzyć po kieszeni. O tym, że układ montujemy bez podłączonego zasilania, nie muszę chyba wspominać...

Programator AVR USB ISP

Do programowania mikrokontrolera potrzebujesz programatora. Tutaj proponuję nie oszczędzać zbytnio i zakupić gotowy programator AVR USB ISP. W Internecie spotkasz wiele projektów prostych programatorów, jednakże ich wykonanie i stosowanie wymaga wprawy i pewnych umiejętności. Koszt dobrego programatora zaczyna się od około 35 zł w górę. Nie kupuj specjalnie drogich programatorów. Jednakże sprawdź, czy programator pozwala zasilać mikrokontroler (odpadnie ci potrzeba posiadania zasilacza) oraz czy współpracuje z oprogramowaniem ATMEL Studio 6.2.

 

 

Mój programator nazywa się AVRProg USB v3 MK II Eco. Z jednej strony posiada on złącze mini USB, takie jak w telefonach komórkowych. Z drugiej strony znajduje się złącze w standardzie KANADA służące do programowania mikrokontrolerów. Programator ten współpracuje bez problemów z ATMEL Studio 6.2 oraz pozwala programować wszystkie mikrokontrolery ATMEL z serii TINY i MEGA. Jeśli się dokładnie przyjrzysz obrazkom, to zauważysz, że programator sam posiada na swoim pokładzie mikrokontroler firmy ATMEL w wersji SMD. Ważną rzeczą jest buforowanie sygnałów programatora (separowanie, oddzielanie ich od układu aplikacyjnego). Do tego celu służy właśnie dodatkowy układ scalony obok mikrokontrolera. Dzięki niemu programator nie wpływa na budowany układ, jeśli nie programuje mikrokontrolera. Z drugiej strony płytki mamy przełączniki konfiguracyjne oraz rezonator kwarcowy.

Do programatora dołączone jest zwykle oprogramowanie, które należy zainstalować na komputerze PC, aby ten mógł odpowiednio współpracować z programatorem. Na tym etapie musisz dokładnie postępować wg instrukcji instalacji dołączonej do programatora. Oprogramowanie programatora skonfiguruj tak, aby mogło współpracować z ATMEL Studio 6.2 (w instrukcji dołączonej do twojego programatora powinno to być opisane krok po kroku). Również poszukaj informacji, w jaki sposób twój programator jest uruchamiany w ATMEL Studio 6.2.

Aby podłączyć programator do płytki stykowej, musisz posiadać odpowiedni zestaw przewodów zakończonych wtykami męskimi oraz żeńskimi (sztuk 6, najlepiej w różnych kolorach, co ułatwi ich rozpoznawanie). Złącze żeńskie umożliwia połączenie przewodu z gniazdkiem Kanada w programatorze. Złącze męskie wpinamy w płytkę stykową.

 

 

Zwykle do programatora dołączona jest taśma przewodów z wtyczkami po obu stronach, która pozwala podłączyć programator do wtyczki Kanada na płytce układu zawierającego programowany mikrokontroler. Jeśli nie posiadasz przewodów z wtykami męskim i żeńskim, to możesz wykorzystać tę taśmę i zwykłe przewody z wtykami męskimi:

 

 

Oprogramowanie Atmel Studio 6.2

Do tworzenia programów dla swoich mikrokontrolerów będziesz potrzebował odpowiedniego środowiska programowania. Wszystko, co ci jest potrzebne, zapewnia darmowy pakiet Atmel Studio 6.2. Znajdziesz go na stronie firmy Atmel. Pakiet ten obsługuje wszystkie mikrokontrolery ATMEL z serii TINY oraz MEGA i innych. Nasz kurs opieramy na tym środowisku. W Internecie znajdziesz opinie, że lepsze jest środowisko oparte na Eclipse. Być może, to kwestia gustu.

Pobierz ze strony producenta plik instalacyjny i uruchom go na swoim komputerze. Jeśli masz nowy komputer z systemem Windows 7 lub 8, to nie powinieneś napotkać niespodzianek przy instalacji. Na starszych komputerach z systemem Windows XP (już nieobsługiwanym przez Microsoft) musisz zainstalować dodatek Service Pack 3.0, aby instalacja mogła się rozpocząć. Być może będzie konieczne zainstalowanie dodatkowych składników. Komputer powinien posiadać przynajmniej 2GB pamięci RAM i odpowiednią ilość miejsca na dysku twardym.

AtmelStudio wykorzystuje środowisko Microsoft Visual Studio 2010, co sprawia, że obsługa jest bardzo wygodna. Jeśli znasz język angielski (a kto dzisiaj nie zna?), to możesz uruchomić przewodnik po środowisku, aby poznać jego funkcje. Wszystko to znajdziesz na stronie startowej.

 

 

 

Pierwszy projekt z mikrokontrolerem

Pierwszy projekt wykonamy przy pomocy mikrokontrolera ATTINY13. Mikrokontroler ATTINY13 jest jednym z najmniejszych z serii. Posiada tylko 8 wyprowadzeń:

 

 

Przed budową pierwszej aplikacji musisz poznać znaczenia tych wyprowadzeń (zaznaczyliśmy tylko te funkcje wyprowadzeń układu, które nas w tym projekcie będą interesowały, funkcji jest więcej, lecz nie musisz je od razu wszystkie znać i rozumieć). Są one następujące:

  VCC – zasilanie +3,6...5V
GND – masa, czyli minus zasilania
P0...P6 – linie portu B
RESET – resetowanie układu. Gdy panuje tu
stan niski, to linie portu B zmieniają funkcje
na podane w nawiasach.
SCK – zegar taktujący przy programowaniu
MISO, MOSI – linie zapisu i odczytu danych
przesyłanych z programatora

Co to jest port B?

Jest to "brama", poprzez którą nasz mikrokontroler komunikuje się ze światem zewnętrznym. ATTINY13 posiada wyprowadzone 6 linii portu B. Linie te numerujemy kolejno PB0, PB1, ..., PB5. Każda z tych linii może pracować jako wejście (mikrokontroler odczytuje stan logiczny panujący na linii – stan ten określa sieć zewnętrzna) lub jako wyjście (mikrokontroler steruje stanem linii portu, umieszczając na niej 0 lub 1).

Przy zasilaniu 5V stan logiczny zero odpowiada napięciu około 0,7V, a stan logiczny 1 odpowiada napięciu 4,2V. Wyjścia PB0 i PB1 dostarczają prądu do 20 mA, wyjścia PB2, PB3 i PB4 dostarczają prądu do 10 mA. Wartości te należy brać pod uwagę przy wyliczaniu obciążenia. Linię PB5 zostawimy chwilowo w spokoju.

Jak sterować portem B?

Port B w mikrokontrolerze obsługiwany jest przez trzy rejestry I/O. Poniżej przedstawiamy podstawowe funkcje tych rejestrów. Przeczytaj to kilka razy aż stanie się dla ciebie jasne.

DDRB  –  Rejestr kierunku. Bity DDRB sterują trybem pracy linii PB0...PB5.
Jeśli i-ty bit DDRB jest ustawiony na 1, to odpowiadająca mu linia PBi pracuje jako wyjście. Ustawienie przez mikrokontroler 1 na i-tym bicie PORTB powoduje pojawienie się napięcia 4,2V na linii PBi. Ustawienie 0 na i-tym bicie PORTB zmienia napięcie linii PBi na około 0,7V.
Jeśli i-ty bit DDRB jest ustawiony na 0, to odpowiadająca mu linia PBi pracuje jako wejście. Mikrokontroler może odczytać stan tego wejścia z PINB. Jeśli linia PBi jest w stanie niskim, to odczyt i-tego bitu PINB daje wartość 0. Przy wysokim stanie na linii PBi odczyt i-tego bitu PINB da wartość 1.
PORTB  –  Służy do zapisu informacji do portu. Bity PORTB odpowiadają liniom PB0...PB5
PINB  – Służy do odczytu informacji z linii PB0...PB5. Poszczególne bity PINB odpowiadają stanom linii PB0...PB5.

Budujemy pierwszy układ aplikacyjny

Na płytce stykowej zmontuj następujący obwód (nie podłączaj do niego zasilania, zrobimy to za chwilę). Podaliśmy również wyprowadzenia dla ATTINY2313 oraz ATMEGA8. Proponowany układ bez problemu zmontujesz i uruchomisz również na tych kontrolerach, ponieważ są one na tym etapie kompatybilne z ATTINY13. Zmienią się jedynie numery wyprowadzeń, na co musisz zwrócić uwagę. Ja preferuję na początek ATTINY13, bo jest naprawdę mały i nie zajmuje dużo miejsca na płytce stykowej.

Jest to typowy pierwszy projekt, od którego zaczynają wszyscy uczący się programowania mikrokontrolerów (coś w stylu programu "Hello world!"). Zaprogramujemy nasz mikrokontroler tak, aby mrugał diodą LED. Podobny układ utworzyliśmy na poprzednich zajęciach, lecz teraz to samo uzyskamy w sposób programowy.

     

 

Spis elementów:

 

Element Ilość Opis
programator ISP 1 do zasilania i programowania mikrokontrolera
płytka stykowa + kable 1 do montażu układu
ATTINY13 1 mikrokontroler (ATTINY2313, ATMEGA8)
opornik 220Ω/0,125W 1 –(                )–  do ograniczania napięcia i prądu diody LED
kondensator 100nF 1 do eliminacji zakłóceń (nie musisz go koniecznie stosować, lecz jest to zalecane)
czerwona dioda LED 1 do sygnalizacji stanu wysokiego na wyjściu PB0

 

 

Aby mikrokontroler cokolwiek robił, musimy napisać dla niego odpowiedni program. W tym celu uruchom ATMEL Studio 6.2. Na stronie startowej wybierz opcję New Project (alternatywnie możesz wybrać opcje menu: File → New → Project...). Na ekranie pojawi się wtedy okno szablonów projektów:

 

W oknie tym wybierz jak na obrazku:

Zaznacz opcję Create directory for solution – zostanie utworzony katalog dla rozwiązania.

Kliknij w przycisk OK.

Teraz na ekranie pojawi się nowe okienko, w którym wybierasz swój mikrokontroler.

 

 

Ponieważ obsługiwanych kontrolerów jest bardzo dużo, wybierz na liście u góry okienka rodzinę tinyAVR, 8-bit, a następnie zaznacz układ ATtiny13 (jeśli stosujesz inny mikrokontroler, to dokonaj właściwego dla niego wyboru). Po lewej stronie masz różne narzędzia związane z tym mikrokontrolerem. Szczególnie proponuję ściągnąć sobie plik PDF z informacjami producenta. Będzie on dostępny pod hiperłączem Datasheets.

Zatwierdź wybór klawiszem OK.

ATMEL Studio utworzy rozwiązanie dla twojego mikrokontrolera i w oknie edytora powinieneś zobaczyć szablon kodu w języku C:

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/*
 * ATTINY13_001.c
 *
 * Created: 2014-05-20 18:27:26
 *  Author: Jerzy Wałaszek
 */ 


#include <avr/io.h>

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}

 

Teraz napiszemy właściwy program. Jest on specjalnie tak prosty, abyś go bez problemów zrozumiał:

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
 * ATTINY13_0001.c
 *
 * Created: 2014-05-20 18:27:26
 *  Author: Jerzy Wałaszek
 */ 


#include <avr/io.h>      // Definicje portów
#define F_CPU 1000000UL  // Określamy zegar procesora
#include <util/delay.h>  // Definicje opóźnień

int main(void)           // Główna funkcja programu
{
    DDRB = 1;            // Bit PB0 będzie pracował jako wyjście
    while(1)             // Pętla nieskończona
    {
        PORTB = 0;       // Umieszczamy na wyjściu PB0 0 (dioda jest zgaszona)
	_delay_ms(500);  // Czekamy pół sekundy
	PORTB = 1;       // Umieszczamy na wyjściu PB0 1 (dioda jest zaświecona)
	_delay_ms(500);  // Czekamy pół sekundy i wracamy na początek pętli
    }
}

 

Uwagi:

W wierszu 10 definiujemy stałą F_CPU, która określa częstotliwość taktowania mikrokontrolera. Mikrokontrolery ATMEL posiadają wbudowane generatory, które są tak ustawione, że układ pracuje z częstotliwością 1MHz, czyli miliona cykli na sekundę. Częstotliwość tę można zmienić, co zrobimy w późniejszym etapie nauki.

W wierszu 15 ustawiamy rejestr kierunku DDRB tak, aby linia PB0 pracowała jako wyjście.

 

Gdy program zostanie wprowadzony do edytora, należy go skompilować. W tym celu naciśnij po prostu klawisz F7 (lub użyj opcji menu Build lub narzędzia Build Solution na pasku narzędziowym u góry ekranu). Jeśli twój program nie zawierał błędów, to w oknie Output zobaczysz raport z kompilacji, który powinien się kończyć napisem:

 

Build succeeded.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

 

Dodatkowe informacje w tym raporcie określają rozmiar twojego programu:

 

text	   data	    bss	    dec	    hex	filename
  84	      0	      0	     84	     54	ATTINY13_001.elf

 

oraz zużycie pamięci mikrokontrolera:

 

Program Memory Usage 	:	84 bytes   8,2 % Full
Data Memory Usage	:	0 bytes   0,0 % Full

 

Program nie trafił jeszcze do mikrokontrolera. Otrzymaliśmy na dysku PC plik ATTINY13_001.elf, w którym jest umieszczony kod binarny programu. Teraz zajmiemy się przesłaniem tego kodu do pamięci FLASH naszego mikrokontrolera.

Najpierw jednak opowiemy krótko o interfejsie ISP, który umożliwia programowanie mikrokontrolera. Interfejs ten składa się z 4 linii: RESET, SCK (Serial Clock), MISO (Master Input, Slave Output) i MOSI (Master Output, Slave Input). Linie te łączymy z odpowiednimi wyprowadzeniami mikrokontrolera:

 

     

 

Gdy linia RESET przyjmie stan niski, mikrokontroler zatrzymuje wykonywanie programu i zmienia znaczenie linii PB0, PB1 i PB2 (dla ATTINY13, w innych mikrokontrolerach będą to inne linie). Linie te przestają być liniami portu B, a stają się liniami interfejsu ISP. Teraz programator może przesłać do mikrokontrolera dane dla pamięci FLASH, EEPROM lub dla tzw. fuse-bitów, czyli bitów bezpiecznikowych. Może również odczytać zawartość tych komponentów.

Gdy to już wiesz, to połącz swój programator z mikrokontrolerem na płytce stykowej za pomocą odpowiednich przewodów. Poniżej podajemy rozmieszczenie tych sygnałów we wtyczce KANADA w programatorze (linie VCC i GND wykorzystamy do zasilania naszego układu na płytce stykowej):

Uwaga:

Połączenie programatora z płytką wykonaj starannie – najlepiej użyj do tego celu przewodów o różnych kolorach. Sprawdź kilkakrotnie, czy nie popełniłeś pomyłki. Jeśli pomylisz te linie, mikrokontrolera nie da się zaprogramować.

 

 

Podłącz programator do portu USB w swoim komputerze PC, na którym masz uruchomione ATMEL Studio 6.2. Z menu wybierz opcję Tools → Device Programming (lub naciśnij Ctrl+Shift+P albo wybierz ikonkę programatora z paska narzędziowego u góry ekranu ). Na ekranie pojawi się okienko programowania mikrokontrolera:

 

 

W okienku tym wybierz:

Następnie kliknij przycisk Apply, który zastosuje te ustawienia. Aby sprawdzić poprawność połączenia programatora z mikrokontrolerem, w sekcji Device signature kliknij przycisk Read. Jeśli wszystko jest w porządku, to programator odczyta sygnaturę mikrokontrolera i w oknie pojawią się różne informacje:

 

 

Nie zmieniaj tu nic. Kliknij opcję Memories, która znajduje się w lewej sekcji okienka programowania. Zawartość okienka zmieni się następująco:

 

 

Ustaw wszystko tak, jak na powyższym rysunku, a następnie kliknij w przycisk Program. Nasz plik ATTINY13_001.elf utworzony w trakcie kompilacji zostanie umieszczony w pamięci FLASH mikrokontrolera i dioda powinna zacząć mrugać. Zapamiętaj wykonane tutaj operacje, ponieważ będą się powtarzać przy każdym programowaniu mikrokontrolerów.

Jeśli dioda zaczęła mrugać, to należą ci się gratulacje – skonstruowałeś pierwszą aplikację dla mikrokontrolera, utworzyłeś dla niego program sterujący i zaprogramowałeś go programatorem USB ISP. To daje ci dobry start dla następnych projektów.

 

Modyfikacje programu

Uprościmy nieco nasz program, wykorzystując fakt, iż odczyt rejestru PORTB zwraca zapisaną do niego wartość.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * ATTINY13_0002.c
 *
 * Created: 2014-05-20 18:27:26
 *  Author: Jerzy Wałaszek
 */ 


#include <avr/io.h>      // Definicje portów
#define F_CPU 1000000UL  // Określamy zegar procesora
#include <util/delay.h>  // Definicje opóźnień

int main(void)           // Główna funkcja programu
{
    DDRB = 1;            // Bit PB0 będzie pracował jako wyjście
    while(1)             // Pętla nieskończona
    {
        PORTB ^= 1;      // Zmieniamy bit PB0 na przeciwny
	_delay_ms(500);  // Czekamy pół sekundy
    }
}

 

Operator ^= wykonuje działanie sumy modulo 2 na bitach rejestru PORTB. Każde wykonanie instrukcji PORTB ^= 1 zmienia stan bitu PB0 na przeciwny. Dlatego dioda dalej mruga tak jak poprzednio, ale teraz program zajmuje w pamięci tylko 70 bajtów, a nie 84!

Program da się jeszcze bardziej skrócić, jeśli wykorzystamy własność portu PINB. Port ten służy do odczytu stanu linii portu B. Jednakże zapis do PINB pełni specjalną funkcję. Jeśli bit PBi jest ustawiony jako wyjście, to zapis i-tego bitu PINB wartością 1 powoduje zmianę stanu linii PBi na przeciwną.

 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * ATTINY13_0003.c
 *
 * Created: 2014-05-20 18:27:26
 *  Author: Jerzy Wałaszek
 */ 


#include <avr/io.h>      // Definicje portów
#define F_CPU 1000000UL  // Określamy zegar procesora
#include <util/delay.h>  // Definicje opóźnień

int main(void)           // Główna funkcja programu
{
    DDRB = 1;            // Bit PB0 będzie pracował jako wyjście
    while(1)             // Pętla nieskończona
    {
        PINB = 1;        // Zmieniamy bit PB0 na przeciwny
	_delay_ms(500);  // Czekamy pół sekundy
    }
}

 

Skompilowany program ma teraz tylko 64 bajty długości!

Na zakończenie dwa migacze. Pierwszy jest prostym migaczem ostrzegawczym, który generuje szybkie trzy błyski diody LED, po czym następuje sekundowa przerwa i dioda mruga ponownie trzy razy. I tak w kółko.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
 * ATTINY13_0004.c
 *
 * Created: 2014-05-20 18:27:26
 *  Author: Jerzy Wałaszek
 */ 


#include <avr/io.h>            // Definicje portów
#define F_CPU 1000000UL        // Określamy zegar procesora
#include <util/delay.h>        // Definicje opóźnień

int main(void)                 // Główna funkcja programu
{
    unsigned char i;
    DDRB = 1;                  // Bit PB0 będzie pracował jako wyjście
    PORTB = 0;                 // Gasimy diodę LED
    while(1)                   // Pętla nieskończona
    {
        for(i = 0; i < 6; i++) // Wykonujemy 3 błyski
	{
            PINB = 1;          // Zmieniamy bit PB0 na przeciwny
	    _delay_ms(200);    // Czekamy 1/5 sekundy
	}
	_delay_ms(1000);       // Czekamy 1 sekundę
    }
}

 

I ostatni program, który jest nieco skomplikowany, lecz daje ciekawy efekt świetlny. Postaraj się odkryć zasadę jego działania.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * ATTINY13_0004b.c
 *
 * Created: 2014-05-20 20:18:00
 *  Author: Jerzy Wałaszek
 */ 


#include <avr/io.h>

int main(void)
{
  unsigned char i,m,d,c;
  DDRB = 1;
  i = d = c = m = 0;
  while (1)
  {
    if(i <= m) PORTB = 0b100001;
    else       PORTB = 0b100000;
    i++;
    if(!i)
    {
    	c++;
    	if(c == 20)
    	{
    	    c = 0;
    	    if(d) m >>= 1; else m = (m << 1) | 1;
    	    if(m == 255) d = 1;
    	    if(!m) d = 0;
    	}
    }
  }
}

 

Jak widzisz, ten sam układ elektroniczny może się w różny sposób zachowywać dzięki zastosowaniu programowalnego elementu, jakim jest mikrokontroler. Popularność mikrokontrolerów wiąże się ściśle z ich uniwersalnością.

 

Podsumowanie

Portem B sterujemy za pomocą 3 rejestrów w mikrokontrolerze:

DDRB

Rejestr kierunku. Poszczególne bity tego rejestru określają sposób pracy linii PB. Jeśli dany bit jest ustawiony na 1, to odpowiadająca mu linia PB pracuje jako wyjście. Jeśli bit DDRB jest wyzerowany, to odpowiadająca mu linia PB pracuje jako wejście (tym zajmiemy się na następnych zajęciach).

PORTB

Rejestr wyjścia. Jeśli linia PBi pracuje jako wyjście, to zapis jedynki do bitu i-tego PORTB ustawia tę linię w stan wysoki 1. Zapis do bitu i-tego PORTB zera ustawia tę linię w stan niski 0. PORTB pamięta stan zapisanego bitu, co można wykorzystać do jego zmiany.

PINB

Rejestr wejścia. Odczyt daje nam informację o stanie linii PB. Zapis do rejestru PINB pełni specjalną funkcję – jeśli linia PBi pracuje jako wyjście, to zapis 1 do bitu i-tego PINB zmienia stan logiczny linii PBi na przeciwny.

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.