Programowanie – lekcja 1

Pierwszą lekcję programowania mikrokontrolerów zaczniemy od złożenia poniższego układu na płytce stykowej:

schemat_glowny_blog_v2

Ryc. 1 Schemat układu złożonego ze źródła zasilania B1, stabilizatora napięcia 7805, kondensatorów (C1, C2, C3, C4), mikrokontrolera ATmega 8, czerwonej diody D1 oraz rezystorów (R1, R2).

 

Źródłem prądu może być zarówno bateria jak i specjalny zasilacz, natomiast dalej koniecznie musi znajdować się stabilizator napięcia w otoczeniu kondensatorów lub moduł stabilizatora napięcia. Dopiero wtedy możemy podłączyć nasz mikrokontroler, którym będzie ATmega8. Ważne jest aby układ nie był zasilany napięciem wyższym niż 5V. To samo dotyczy każdej końcówki mikrokontrolera. Najwyższe napięcie na pojedynczej końcówce to 5V !

W tym miejscu przyjrzyjmy się bliżej ATmedze8 – jej notę katalogową możecie znaleźć tutaj.  Na stronie drugiej (cała nota ma 320 stron!) znajdziecie opis poszczególnych wyprowadzeń:

Ryc

Ryc. 2 Schemat funkcji pinów ATmegi8.

Do nóżki 7 opisanej jako VCC podłączamy plus zasilania, a do nóżki 8 GND masę.

Jeśli pozostawimy nóżkę 1 (RESET) z niczym niepołączoną może się zdarzyć, że jakieś nawet drobne zakłócenia spowodują reset naszego układu. Zapobiega temu rezystor R1 o rezystancji 10kΩ. Poza tym programator przed zaprogramowaniem mikrokontrolera musi go zresetować. Dlatego nóżkę 1 podłączyłam do złącza z którym potem będziemy łączyć programator.

Nóżki 17, 18 i 19 służą do podłączenia mikrokontrolera przez złącze ISP do programatora. Złącze ISP (z ang. In System Programming) umożliwia podłączenie programatora znajdującego się w jakimś obwodzie. Wracając do naszych nóżek:

  • nóżka 17, czyli pin MOSI – master output slave input – wejście,
  • nóżka 18, czyli pin MISO – master input slave output – wyjście,
  • nóżka 19, czyli pin SCK – serial clock – dane pomiędzy programatorem a mikrokontrolerem przesyłane są w równych odstępach czasu, zgodnie ze wskazaniem tego zegara.

Nóżka 2 (RXD) PD0 – jedno z wielu wielofunkcyjnych wyprowadzeń,  którego funkcja zależy od tego co tu podłączymy i jak ją zaprogramujemy. Ja podłączyłam tu rezystor R2 220Ω i czerwoną diodę LED D1.

Jak z układem połączyć programator? Otóż:

  • złącze 1 programatora MOSI (u mnie przewód brązowy) – nóżka 17 MOSI mikrokontrolera;
  • złącze 2 programatora VCC (u mnie przewód czerwony) – nóżka 7 VCC mikrokontrolera;
  • złącze 4 programatora GND (u mnie przewód niebieski) – nóżka 8 GND mikrokontrolera;
  • złącze 5 programatora RST (u mnie przewód biały) – nóżka 1 RESET mikrokontrolera;
  • złącze 7 programatora SCK (u mnie przewód czarny) – nóżka 19 SCK mikrokontrolera;
  • złącze 9 programatora MISO (u mnie przewód zielony) – nóżka 18 MISO mikrokontrolera.
IMG_8669

Ryc. 3 Programator.

Mój układ na płytce stykowej:

Ryc

Ryc. 4 Układ złożony na płytce stykowej na podstawie schematu z ryc. 1.

Ćwiczenie 1

Celem pierwszego ćwiczenia będzie napisanie krótkiego programu, który będzie sterował miganiem diody LED.

Otwieramy program AVR Studio 4 (o tym skąd go ściągnąć pisałam tutaj):

a następnie tworzymy nowy projekt (przycisk „New Project”). Typ projektu „AVR GCC”, nazwa „Lekcja”, potwierdzamy utworzenie nowego folderu i pliku o nazwie „main”, jak również wybieramy odpowiednią lokalizację zapisu (u mnie F:\kurs programowania\lekcja1).

1aKolejnym etapem (po kliknięciu „next”) jest wybór platformy „AVR Simulator” i mikrokontrolera „ATmega8″.

1bPo kliknięciu przycisku „finish” zostaniemy przeniesieni do okna w którym możemy zacząć pisać nasz pierwszy program.

1bbDobrą praktyką jest stworzenie na początku pisanego programu krótkiej metryczki z najważniejszymi informacjami. Możemy to zrobić na dwa sposoby:

  • na początku dłuższego komentarza, mogącego zająć kilka linijek umieszczamy slash i gwiazdkę „/*”, a na końcu gwiazdkę i slash „*/”

1c

  • na początku każdego wersu z komentarzem umieszczamy dwa znaki slash: „//”

1dKtóry sposób wybierzecie zależy tylko od Was. Wasz komentarz zostanie zaznaczony na zielono.

Teraz musimy zdefiniować częstotliwość wewnętrznego zegara mikrokontrolera, wartość podana jest w hercach: „#define F_CPU 1000000UL”.

1eW następnych wersach dołączymy dwie biblioteki danych napisanych dla mikrokontrolera:

  • „#include <avr/io.h>” biblioteka z obsługą portów wejścia i wyjścia (zawsze wstawiamy ją do pisanego programu),
  • „#include <util/delay.h>” biblioteka, którą wstawia się jeśli w programie będziemy korzystać z opóźnień (np. jednosekundowe opóźnienie podczas włączania i wyłączania naszej diody)

1fTe 3 operacje procesor mikrokontrolera wykona na początku, przed rozpoczęciem wykonywania programu.

Właściwa część pisanego programu musi być umieszczona pomiędzy znakami:

„int main()

{

}”

Nawias obok nazwy funkcji głównej „main” pozostawiamy pusty, ponieważ nie ma dodatkowych warunków od których zależałoby wykonanie naszego programu.

1gZanim przejdziemy do omówienia dalszej części kodu programu, zatrzymamy się na chwilę, aby przyjrzeć się naszemu mikrokontrolerowi – ATmedze8, a właściwie jej nóżką.

piny atmegi8 z rejestrami

Ryc

Większość wyprowadzeń mikrokontrolera należy do określonych portów. ATmega8 posiada:

  • port wejścia/wyjścia typu B – należą tu nóżki PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7 (port 8-bitowy)
  • port wejścia/wyjścia typu C – należą tu nóżki PC0, PC1, PC2, PC3, PC4, PC5, PC6 (port 7-bitowy)
  • port wejścia/wyjścia typu D – należą tu nóżki PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7 (port 8-bitowy)

Każdy z tych portów może być modyfikowany w obrębie 3 rejestrów:

  • DDRx – określa czy dany port ma być wejściem czy wyjściem (domyślnie wszystkie porty mikrokontrolera są wejściami),
  • PORTx – określa czy na danym porcie ma pojawić się logiczne „1” czy „0”,
  • PINx – służy do odczytywania danych z portu (np. wielkość napięcia).

Wracamy do pisania naszego programu.

Dioda LED podłączona jest do nóżki drugiej mikrokontrolera PD0. Wyprowadzenie to należy do portu D. Jak już pisałam domyślnie wszystkie porty są wejściami. Jeśli chcemy, aby na konkretnej nóżce pojawiło się napięcie, a dioda się zaświeciła, musimy zmienić rejestr DDRx dla portu D tak, aby stał się on wyjściem. W tym celu w kodzie naszego programu wpisujemy:

DDRD |= 1<<0;

Jak widzicie w nazwie rejestru DDRx zastąpiliśmy „x” literą oznaczającą port „D”. Ta dziwna komenda: ” |= 1<<0″ oznacza po prostu ustawienie nóżek portu D jako wyjście (wyjaśnienie tego zapisu znajdziecie tutaj). Naszą instrukcję kończymy średnikiem, który pełni funkcje terminatora (tak jak kropka na końcu zdania).

1hNasza dioda ma się stale zapalać i gasnąć. W tym celu musimy użyć pętli. Wprowadza się ją za pomocą instrukcji „while”. Pętla będzie się powtarzać dopóki warunek jej wykonania, zapisany w nawiasie będzie liczbą większą od zera. Z tego powodu, jeśli chcemy, aby pętla powtarzała się stale wystarczy w nawias wpisać cyfrę 1. Treść danej pętli zapisujemy w nawiasach { }:

while(1)

         {

         }

1iW pętle wpisujemy następującą instrukcję:

PORTD |=_BV(PD0);// – wyłącza diodę LED

_delay_ms(1000);

PORTD &=~_BV(PD0); //- załącza diodę LED

_delay_ms(1000);

W ten sposób określiliśmy rejestr PORTx dotyczący portu D (PORTD), aby na nóżce PD0 pojawiło się:

  • logiczne 1 – operatory: „|=_BV”
  • logiczne 0 – operatory: „&=~_BV”

Funkcja opóźnienia „_delay_ms(1000)” określa w milisekundach jakie ma być opóźnienia 1000ms = 1s.

1jGratulacje, właśnie napisałeś swój pierwszy program. Nie przejmuj się jeśli coś wydaje Ci się skomplikowane, będziemy omawiać jeszcze wiele przykładów, które może w nieco większym stopniu wyjaśnią pewne sprawy.

Pozostało nam jeszcze skompilowanie programu. Wystarczy w menu u góry kliknąć „Built” lub po prostu wcisnąć F7. Jeżeli masz wszystko prawidłowo napisane a program źle się kompiluje to wykonaj operację dostępną pod tym linkiem.

1k1lW lewym dolnym rogu powinniście otrzymać informację „Build succeeded with 0 Warnings…”, co oznacza prawidłową kompilację programu. Jeśli wyświetla się inny komunikat dokładnie sprawdźcie czy prawidłowo wpisaliście kod programu, zwłaszcza czy są wszystkie średniki.

 Projekt z tej lekcji można pobrać tu.

Ostatnim krokiem jest wgranie napisanego programu do pamięci mikrokontrolera. W tym celu należy podłączyć programator do złącza USB swojego PC (koszyk baterii należy najpierw odłączyć – układ będzie zasilany bezpośrednio z komputera), otworzyć program SinaProg (o tym skąd go pobrać pisałam wcześniej tutaj), a następnie:

  • otwórzyć plik *.hex swojego programu;
  • w ramce „Device” wyszukać na liście mikrokontroler ATmega8;
  • w ramce Flash nacisnąć przycisk „Program”.

screen_sinaprog

(UWAGA! Jeśli jesteś osobą początkującą nie zmieniaj pozostałych parametrów w programie SinaProg, ponieważ może to spowodować całkowite zablokowanie mikrokontrolera.)

Napisany przez Ciebie program zostanie wgrany do mikrokontrolera, a dioda na płytce stykowej powinna zacząć migać. Teraz można odłączyć programator zarówno od PC jak i płytki stykowej, a następnie przed stabilizatorem napięcia podłączyć źródło zasilania – koszyk baterii.

 

4 myśli nt. „Programowanie – lekcja 1

    1. Daria Autor wpisu

      Jeżeli przez diodę ma płynąć prąd to rezystor musi być podłączony do plusa zasilania druga końcówka rezystora musi być podłączona do anody diody LED. Katoda diody LED musi być dołączona do mikrokontrolera. Stan logiczny „0” na nóżce mikrokontrolera „dołącza minus” do diody LED, dlatego przez diodę zaczyna płynąć prąd.

Dodaj komentarz