Budowa zastosowanie programowanie

1 Budowa zastosowanie programowanieMikrokontrolery AVR Bu...
Author: Helena Dudek
0 downloads 2 Views

1 Budowa zastosowanie programowanieMikrokontrolery AVR Budowa zastosowanie programowanie

2 Co to jest mikrokontroler?Mikrokontroler jest kompletnym systemem komputerowym zbudowanym w pojedynczym układzie scalonym, zawierającym jednostkę centralną, pamięć, generator sygnału zegarowego oraz układy wejścia i wyjścia.

3 Zarys: AVRy to sympatyczne uC (mikrokontrolery) firmy znanej chyba wszystkim z produkcji legendarnej "51" z pamięcią Flash - . Rodzina ta należy do procesorów RISC - choć lista rozkazów jest dość rozległa. Większość rozkazów wykonują w JEDNYM takcie - w przeciwieństwie do np. 12 taktowych MCS-51. Dodatkowo posiadają mechanizm pipeline czyli przetwarzania potokowego. Taktowane przeważnie do max 16MHz (mające jednak duże zdolności do podkręcania nawet do 30MHz w przypadku serii ATMmega). Procesorki zewnętrznie 8 bitowe, jednak pamięć programu ma organizację w postaci słów.

4 Wszystkie nowe AVR-y nie wymagają zew. zegara do działaniaWszystkie nowe AVR-y nie wymagają zew. zegara do działania. Stare układy z gałęzi Classic np. AT90S2313 nie posiadały takich możliwości. Dlatego w ich przypadku kwarc czy sygnał zegarowy jest niezbędny. A co chyba najważniejsze są l4m3 odporne! Nie straszne im odwrotne włożenie w podstawkę, zbyt duże napięcie, zwieranie portów, itp przypadki - spocą się, ostygną i działają dalej

5 Podział: AVR 8bit dzielą się obecnie na parę głownych grup: Classic - obecnie już wycofane, Tiny, Mega oraz XMEGA o których później. Istnieją jeszcze mikrokontrolery specjalizowane jak: Lighting AVR (z dużą ilością generatorów PWM), Pico Power (o bardzo niskim poziomie poboru energii), USB (posiadające np. sprzętowy interfejs USB) czy Automotive. Jednakże są to układy niszowe. Wracając jednak do głównego podziału. Jak łatwo się domyśleć rodzina Tiny jest okrojona z znacznej części peryferiów/zasobów które posiada rodzina Mega. Największe układy Mega umożliwiają dołączenie zew. pamięci RAMu czyniąc z nich kompletne potworki

6 Co przemawia za AVR-ami?darmowe środowiska programistyczne + bogata liczba kompilatorów i nieskończone zasoby bibliotek!

7 Budowa mikrokontrolerów AVRBudowa mikrokontrolera opiera się o architekturę hardwardzką. Odpowiednia konfiguracja zewnętrzna mikrokontrolerów umożliwia dołączenie zewnętrznej pamięci danych o rozmiarze do 64 KB, przy czym słowo danych ma rozmiar 8 bitów. Dużą szybkość mikrokontrolera zapewnia przetwarzanie potokowe powodujące wykonywanie większości rozkazów mieszczących się w jednym cyklu zegarowym, oraz 32 bajtowy (bardzo duży) obszar rejestrów roboczych, o natychmiastowym dostępie. Ich dodatkową zaletą jest brak ścisłego określenia akumulatora (architektura RISC). Tę funkcję może pełnić dowolnie wybrany rejestr, spośród 32-bajtowego banku rejestrów roboczych. Zapewnia to bardzo znaczny wzrost szybkości implementowanych algorytmów, w stosunku do mikrokontrolerów z typową budową z określonym umiejscowieniem akumulatora. Jest to efekt rozłożenia dość znacznego "obciążenia" akumulatora przesłaniami, na znacznie większą liczbę rejestrów, co zapewnia eliminację wielu z nich, dokonywanych w celu zapamiętania wyników pośrednich przy większych obliczeniach..

8 Konstruktorzy uwzględnili również wzrastające zapotrzebowanie na wbudowaną pamięć EEPROM, służącą do zapamiętania konfiguracji urządzeń budowanych z wykorzystaniem mikrokontrolerów. Zastosowanie szeregowego algorytmu programowania oraz pamięć programu typu "Flash", umożliwia programowanie i przeprogramowanie mikrokontrolera po umieszczeniu go w układzie. Zastosowane rozwiązania są również konkurencyjne w stosunku do mikrokontrolerów z serii PIC. Powodują one, iż przy tej samej częstotliwości zegara AVR-y są około czterokrotnie od nich szybsze. Konstruktorzy uwzględnili również układ Watchdog, jak i tryb pracy z obniżonym poborem mocy, które w obecnej chwili stają się standardem w mikrokontrolerach

9 Lista rozkazów zwarta lista rozkazów wymaga koniecznych kompromisów, pierwszy z nich dotyczy bezpośrednich wartości (stałych łańcuchowych). Niewiele instrukcji akceptuje bezpośrednie wartości, a te, które to robią (ADIW, SUBI, ORI, itp.) operują tylko w wyższej połowie (R16-R31) rejestru. Nawet po odcięciu bitu z pola specyfikatora argumentu, te instrukcje mają czasami miejsce tylko dla 6-bitowych bezpośrednich wartości. Instrukcje ADIW i SBIW (dodaj/odejmij natychmiast od słowa) są nawet bardziej restrykcyjne, operując tylko na ostatnich ośmiu rejestrach R24-R31. Te instrukcje, w pierwszym rzędzie, są przeznaczone, by dodać małe przesunięcia (0-63 bajtów) do wskaźników X, Y i Z. Istnieje bogactwo instrukcji rozgałęzienia warunkowego, mianowicie: dwa dla każdego z ośmiu znaczników w rejestrze stanów. Z małymi 7-bitowymi przesunięciami, te instrukcje mogą odwrócić wykonanie tylko 64 instrukcji w którymkolwiek kierunku. Dla większego rozmieszczenia, RJMP może przesunąć kod programu do 2K, który jest zwykle w zupełności dany małym miejscem dla kodu w na chip'ie.

10 AVR posiada również zbiór interesujących operacji "przeskoku" (SBRC, SBRS, SBIC i SBIS), które przeskakują ponad następną instrukcją, jeśli jakikolwiek bit w którymkolwiek rejestrze jest ustawiony lub pusty. Jeśli rozkaz przeskoku jest dużym skokiem, to te przeskoki mogą być użyte, by skutecznie utworzyć warunkowe długotrwałe rozgałęzienia. Alternatywnie, mogą one zostać użyte, by opuścić pojedynczą operację arytmetyczną lub logiczną w łańcuchu rozkazów, tworząc warunkowe rozkazy podobne nieco do ARM. Żaden z chip‘ów AVR nie ma naturalnych operacji mnożenia - a już wogóle dzielenia - chociaż jeden został zdefiniowany. Jako zdefiniowany, MUL wymnaża dowolne 8-bitowe rejestry i osadza 16-bitowy wynik w R0 i Rl. Po wprowadzeniu w życie, MUL jest wykonywany tylko w dwóch cyklach zegara, czyli pięć razy szybciej niż 68HC11 (10 cykli); nawet nowszy 68HC12 Motoroli potrzebuje 3 cykli. Atmel ma zamiar umieścić operację mnożenia w przyszłych kościach AVR, gdy zwiększy się prędkość zegara, a chipy przejmą proste zadania przetwarzania sygnałów.

11 Oprogramowanie: Lista popularnego oprogramowania przedstawia się następująco:" * ASEMBLERY: AVR Asembler (składnik AVR Studio), AVRA * C/C++: WINAVR (środowisko), AVRGCC, IAR C++, CodeVisionAVR * BASIC: BASCOM AVR, FastAVR * PASCAL: Embeeded Pascal AVR, AVRCo Darmowe środowisko AVRStudio, zintegrowane z kompilatorem ASMa i możliwością dointegrowania WINAVR daje nam w pełni profesjonalne i co najważniejsze DARMOWE środowisko. Samo AVRStudio umożliwia poza pisaniem softu także debugowanie przy użyciu JTAGa i DebugWire. Jest jeszcze symulator avrów VMLAB też już darmowy.

12 Programowanie/Narzędzia uruchomienioweSposoby programowania: - ISP - tzw. programowanie w systemie. Wystarczą 4 linie + masa. A procesora nawet nie trzeba wyciągać z podstawki/urządzenia. - Równoległe HV - Dużo przewodów ale umożliwia odblokowanie procesorów z wyłączonym ISP lub z wyłączoną nóżką RESET. - Szeregowe HV - Odpowiednik Równoległego HV dla procesorów z ograniczoną ilością nóżek. - JTAG - dostępne w układach rodzin MEGA/XMEGA Sposoby debugowania: - JTAG-ICE (JTAG) - starsze, ale nadal popularne narządzie. Doczekało się nawet tańszych klonów. - MKii (ISP+JTAG+DW) - ponoć są klony. - DW - dla układów z ograniczoną ilością końcówek.

13 Wszystko o programowaniu avrDo zaprogramowania samego mikroprocesora nie jest potrzebny żaden skomplikowany programator. Wystarczy sześciożyłowy kabelek z podstawką na końcu, dołączony do portu drukarkowego komputera PC. Co ważne, zasilanie pobierane jest też z komputera PC. Taki prościutki programator widać na fotografii.

14 Jaki język? Najpierw, na początku programowania należy choć troszkę opanować znany i popularny od wielu lat język programowania – BASIC. Właśnie za jego pomocą najłatwiej będzie poznać podstawowe pojęcia, charakterystyczne dla wszystkich języków programowania. Co bardzo ważne, BASCOM jest dialektem języka BASIC, ukierunkowanym na programowanie tak zwanych procesorów jednoukładowych. Na rysunkach obok znajdują się dwa przykładowe zrzuty ekranowe z ćwiczeń.

15 ISP - programowanie w systemieIstnieje bardzo dużo róznorodnych programatorów dla mikrokontrolerów AVR. Większość z nich do programowania używa interfejsu ISP. Jest to wygodny i najprostszy sposób programowania naszego układu, poniewaz nie wymaga się specjalistycznych narzędzi i programatorów, a najprostszy programator możemy wykonać zaledwie w 5 minut. Ponadto programowanie odbywa się w układzie docelowym dlatego też nie musimy za każdym razem przekładać mikrokontrolera z programatora do układu docelowego. Programujemy przez złacze SPI i od razu testujemy:) nasz program. Atmel w swojej nocie aplikacyjnej sugeruje jak ma wyglądać złącze programatora w układzie docelowym:

16 Gdzie poszczególne linie oznaczają1. MISO - linia danych WE z programowanego układu do programatora 2. VCC - zasilanie programatora 3. SCK - sygnał zegarowy z programatora 4. MOSI - linia danych WY z programatora do programowanego układu 5. RESET - Reset z programatora 6. GND - Masa

17 Istnieje także zmodyfikowana wersja złącza ISP 2x5 pin wygląda ona następująco:

18 Programator Programator ten zgodny jest zWersja 1: W najprostszym wydaniu do zaprogramowania mikrokontrolera AVR potrzeba: - wtyczka DB25 (wtyk męski od LPT) - ok 80 cm taśmy 5 żył - wtyczka 2x5 pin Schemat podłączenia programatora jest następujący: Programator ten zgodny jest z programatorem typu dt006 i gdy go będziemy używać to taki typ programatora musimy podać.

19 Wersja 2 Kolejna wersja programatora jest już bardziej "rozbudowana" i wyposażona jest w bufor zabezpieczający przed ewentulanym uszkodzeniem portu LPT. Poza tym nic nie ma w nim skomplikowanego. Do jego budowy potrzebne nam będą: - wtyczka DB25 (wtyk męski od LPT) - ok 80 cm taśmy 6 żył - wtyczka 2x5 pin (ewentualnie 2x3 pin) - układ 74HC rezystor 100 kom - kondensator 0,1 uF Schemat programatora jest następujący: Programator ten zgodny jest z progrmatorem typu stk200 i taki typ programatora musimy podać podczas programowania.

20 WinAVR - dla zielonych:)Programowanie mikrokontrolerów AVR w języku C wcale nie musi być trudne. Jeżeli ktoś już ma jakieś podstawy języka C to do nauki programowania mikrokontrolerów AVR, wcale nie musi od nowa się uczyć dość ostatnio popularnego BASCOMa, może wykorzystać znakomite środowisko programistyczne jakim jest WinAVR. Pakiet WinAVR bo tak powinniśmy go nazywać jest środowiskiem opartym na licencji GPL , stąd jest on darmowy i wciąż rozbudowywany przez wiele osób interesujących się rodziną mikrokontrolerów AVR. Pomimo że WinAVR jest środowiskiem darmowym oferuje szereg narzędzi dorównujących swoją funkcjonalnością programom komercyjnym. W skład pakietu WinAVR wchodzi szereg narzędzi takich jak znany kompilator z systemów Unix, który został przeniesiony na procesory AVR (avr-gcc), edytor (Programmers Notepad), asembler (avr-as), debugger (avr-gdb), programator (avrdude) oraz wiele innych. Darmową wersje pakietu WinAVR możemy znaleźć na stronie domowej lub tutaj ( rozmiar ok 12 Mb)

21 Instalacja i obsługa programu Bascom-AVRPisać programy dla AVRów w BASCOM-AVR można z powodzeniem również w "windowsowym" notatniku ale aby móc napisany program skompilować, zapisać do pamięci mikrokontrolera, a wcześniej wykonać ewentualnie symulację działania, potrzebujemy nieco innego narzędzia jakim jest pakiet IDE (z ang. Integrated Development Environment - zintegrowane środowisko projektowe) o nazwie BASCOM-AVR

22 Instalacja Ściągnięty program ze strony będzie pewnie w postaci czterech lub więcej spakowanych plików o nazwach bcavrd_1.zip, bcavrd_2.zip, bcavrd_3.zip, bcavrd_4.zip, które należy rozpakować do jakiegoś wspólnego katalogu gdzie pojawią się pliki nazwach setup. EXE, setup.W01, setup.W02, setup.W03.

23 Po uruchomieniu pliku setupPo uruchomieniu pliku setup. EXE uruchomi się instalacja, której nie należy "przeszkadzać" i wystarczy po prostu zatwierdzać kolejne kroki instalacji.

24 Oprócz programu polecam ściągnięcie polskiej wersji "pomocy"Oprócz programu polecam ściągnięcie polskiej wersji "pomocy". Po rozpakowaniu tego pliku należy mu zmienić nazwę na Bascavr.hlp ) i umieścić katalogu C:\Program Files\MCS Electronics\BASCOM-AVR, jednocześnie zmieniając po uruchomieniu programu ustawienia w zakładce Options -> Environment -> IDE z zaznaczonego Use HTML help na odznaczony. Ten zabieg spowoduje, że pomoc (help) uruchamiana z programu będzie w języku polskim.

25     Po instalacji warto na pulpicie umieścić skrót do programu ale to już zależy od indywidualnych upodobań i przyzwyczajeń.

26 Obsługa Po uruchomieniu programu i otwarciu nowego pliku poleceniem File -> New ekran programu będzie wyglądał tak jak na rys. 1. Program BASCOM-AVR jest programem pracującym w środowisku Windows więc prawdopodobnie większość poleceń w pasku menu czy pasku narzędziowym umieszczonych u góry otwartego okna jest Ci znana z innych programów i obsługa nie będzie problemem. Domyślne ustawienia programu są takie że właściwie nic nie trzeba zmieniać poza kilkoma korektami.

27 Na rys. 1 pokazane jest okno po uruchomieniu pakietu Bascom-AVR i otwarciu pliku z programem.

28 W oknie tym na wyróżnienie zasługują następujące elementy: - pasek menu  - pasek narzędziowy, w którym widać ikony najczęściej używanych    programów i poleceń, opis znaczenia tych ikon umieściłem w dalszej    części tego tekstu, pasek narzędziowy można modyfikować samemu,    wystarczy najechać kursorem na obszar paska, kliknąć prawym    przyciskiem myszki i przeciągnąć z otwartego w ten sposób okienka    ikonkę, którą chcemy umieścić na pasku  - lista etykiet (Label), która umożliwia szybkie przejście do wybranej    etykiety, wystarczy nacisnąć na przycisk z prawej strony listy i ukażą się    wszystkie etykiety  - lista procedur (Sub), która umożliwia szybkie przejście do wybranej,    a zdefiniowanej wcześniej procedury, wybiera się podobnie jak dla listy    etykiet  - okno edytora, w którym będziesz pisał swoje znakomite programy  - pasek stanu, w którym pojawiają się informacje dotyczącego działań    związanych z otwartym plikiem naszego programu, np. wskazywana    jest pozycja kursora, wyświetlana jest informacja czy dokument był    zmodyfikowany itp.

29 Pasek menu: W skład paska menu wchodzą zakładki, których znaczenie zamieszczam poniżej.

30 File -ta zakładka wraz z jej poleceniami jest z pewnością wszystkim znana z innych programów windowsowych:

31 otwiera nowe okno edytora dla nowego pliku, w którym można zapisywać kod programu - skrót klawiszowy Ctrl+N,

32 otwiera poprzednio zapisany plik - skrót klawiszowy Ctrl+O,

33 zamyka otwarty plik - skrót klawiszowy Ctrl+F4,

34 zapisuje otwarty i edytowany właśnie plik z poleceniem nadania nazwy,

35 umożliwia podgląd wydruku otwartego pliku,

36 polecenie drukowania otwartego pliku - skrót klawiszowy Ctrl+P,

37 wyjście z pakietu Bascom-AVR - skrót klawiszowy Alt+F4

38 Edit - również typowa zakładka programów windowsowych zawierająca znane polecenia takie jak kopiowanie, wycinanie, wklejanie itp:

39 powoduje cofnięcie wykonanej ostatnio zmiany w programie - skrót klawiszowy Ctrl+Z,

40 przywraca ponownie poprzednio wykonaną, a następnie cofniętą zmianę w programie - skrót klawiszowy Shift+Ctrl+Z,

41 wycina zaznaczony tekst i przechowuje go w schowku - skrót klawiszowy Ctrl+X,

42 kopiuje zaznaczony tekst do schowka - skrót klawiszowy Ctrl +C,

43 wkleja zawartość schowka w miejsce wskazane kursorem - skrót klawiszowy - Ctrl+V,

44 wyszukiwanie w programie fragmentu tekstu, który wpisuje się w okienko dialogowe "Find Text", w okienku tym można poustawiać różne opcje dotyczące wyszukiwania - skrót klawiszowy Ctrl+F,

45 wyszukiwanie następnego wystąpienia tekstu wpisanego w okienko dialogowe "Find Text" - skrót klawiszowy F3,

46 zastępuje wszystkie znalezione słowa wpisane w okienku dialogowym "Replace Text" nowymi słowami również wpisanymi w tym okienku, w okienku tym można poustawiać różne opcje dotyczące wyszukiwania i zastępowania - skrót klawiszowy Ctrl+R,

47 skok do wybranej linii programu, którą to linię wpisuje się w okienku dialogowym "Go to line Number" - skrót klawiszowy Ctrl+G,

48 Toggle Bookmark- ustawia znaczniki w programie, widoczne są one z lewej strony okienka edytora, znaczników może być maksymalnie 8, ułatwiają one szybkie przemieszczanie się po tekście programu,

49 Goto Bookmark - umożliwia skok do wybranego znacznika - skrót klawiszowy Ctrl+x, gdzie x to numer znacznika,

50 przesuwa zaznaczony fragment o ilość pozycji jaka jest ustawiona w zakładce "Options->Environment->Editor->Tab-size",

51 cofa wstawiony akapit,

52 Program - polecenia z tej zakładki uruchamiają programy służące do kompilacji, sprawdzania składni, symulacji i wysyłania programu do mikrokontrolera:

53 uruchamia kompilację programu - skrót klawiszowy F7,

54 uruchamia wykrywanie błędów składni w pisanym programie - skrót klawiszowy Ctrl+F7,

55 pokazuje raport z kompilacji - skrót klawiszowy Ctrl+W,

56 uruchamia symulację programu - skrót klawiszowy F2,

57 uruchamia program umożliwiający zaprogramowanie mikrokontrolera - skrót klawiszowy - F4,

58 Pierwszy program - zapalanie i gaszenie diody LEDPierwszy program jaki wszyscy najczęściej piszą, to zapalanie diody LED podłączonej do któregoś z portów mikrokontrolera. To dobre ćwiczenie przy poznawaniu konfiguracji portów.

59 Dioda LED podłączona będzie do wyprowadzenia PB0 portu B   Dioda LED podłączona będzie do wyprowadzenia PB0 portu B. Do wyprowadzeń PD0 i PD1 portu D podłączone będą przełączniki, których zadaniem będzie odpowiednio włączanie i wyłączanie świecenia diody LED. Naciśnięcie przełącznika podłączonego do PD0 powinno spowodować zaświecenie diody, natomiast naciśnięcie przełącznika podłączonego do PD1 powinno spowodować zgaszenie diody.

60    Zapewne każdy kto używał różnego rodzaju przełączników wie, że podczas naciśnięcia, a następnie zwolnienia przycisku przełącznika występuje zjawisko drgania styków powodujące na przemian zwarcie i rozwarcie styków. W tym konkretnym przypadku nie będziemy zajmować się programową eliminacją wpływu drgania styków przełączników gdyż nie ma to znaczenia dla poprawnego działania układu.

61    Opisywane działanie programu ma być zrealizowane w układzie przedstawionym na rysunku. Jest to fragment schematu ideowego zestawu ZL1AVR.

62 Aby schemat widoczny na rys   Aby schemat widoczny na rys. 1 był zgodny z połączeniami w ZL1AVR, to w zestawie należy zewrzeć następujące złącza:    - JP1 - podłączenie +5V do zasilania LED,    - JP6 i JP7 - podłączają SW1 do PD0 i SW4 do PD1    - JP4 zewrzeć 2 z 3 - podłaczy to masę do SW1 i SW4    - J4 - 2 z 3, J3 - 1 z 2 - zostanie dołączony kwarc X1    - ZW_PORTB - 15 z 16 - podłączenie LED1 do PB0    - do JP13 podłączyć zasilanie.

63     Dioda LED1 zaświeci się gdy PB0 (pin12 AT90S2313) będzie skonfigurowany jako wyjście i jego stan przyjmie wartość "0", to umożliwi przepływ prądu przez diodę LED1, prąd ten ograniczony jest rezystorem R9 do wartości ok. 3,5mA (zależy to również od wartości spadku napięcia na diodzie LED). Aby świecenie diody uzależnić od stanu przełączników SW1 i SW4 to PD0 (pin 2) i PD1 (pin 3) muszą być skonfigurowane jako wejścia z wejściem typu pull-up wymuszającym początkowy stan 1. W takim przypadku naciśnięcie jednego z przełączników spowoduje, że na odpowiednim wejściu pojawi się stan "0". Pozostałe niewykorzystywane wyprowadzenia zarówno portu B jak i D mogą być skonfigurowane dowolnie, można je więc ustawić np. jako wyjścia.

64 W procesorach AVR na początku zawsze należy skonfigurować porty określając dla każdego wyprowadzenia dwa parametry: - funkcję jaką ma pełnić - wejścia czy wyjścia - stan spoczynkowy jaki ma przyjąć - "0" czy "1" Jeżeli porty nie zostaną skonfigurowane, to przy starcie mikrokontrolera (po wyzerowaniu) rejestry PORTx i DDRx (x w zależności od portu będzie zastąpiony literką A, B, C lub D) zostaną wyzerowane co oznacza, że wszystkie wyprowadzenia portów będą wejściami w stanie wysokiej impedancji (wejścia pływające)

65 Teraz przechodzimy do sedna sprawy, czyli zamienić na program zrozumiały dla naszego AVR-a.

66 W helpie do BASCOM-AVR (wersja w języku polskim) są dokładnie opisane wszystkie instrukcje i inne elementy języka BASCOM dla AVR . Ściągnij sobie tego helpa i często tam zaglądaj!

67 Zgodnie z tym co jest napisane powyżej (w ramce) należy najpierw skonfigurować porty AT90S2313. Do konfiguracji urządzeń sprzętowych w BASCOM-AVR służy instrukcja CONFIG, którą się używa razem z nazwą konfigurowanego sprzętu, czyli w przypadku konfiguracji portu nazwą będzie PORTx, a w przypadku pojedynczej końcówki nazwą będzie PINx.y, gdzie x to port B lub D (dla innych mikrokontrolerów może być jeszcze A lub C), y to numer końcówki z danego portu ( lub 7).

68 Za stan portów w mikrokontrolerach AVR odpowiedzialne są trzy rejestry DDRx, PORTx i PINx (x to: A, B, C lub D). Instrukcja CONFIG ustawia cały port lub wybraną końcówkę portu w tryb pracy wejścia lub wyjścia. Inaczej mówiąc ustawia odpowiednio rejestr kierunku czyli DDRx. Jeżeli do każdego bitu rejestru wpiszemy "1" to wszystkie wyprowadzenia portu będą wyjściami, natomiast jeżeli do każdego bitu rejestru DDRx wpiszemy "0" to wszystkie wyprowadzenia będą wejściami.

69 W przykładach poniżej stosuję kolorystykę składni poleceń taką jaką mam ustawioną w BASCOM-AVR. Kolorem zielonym i kursywą wyróżniam komentarze które zawsze muszą być poprzedzone znakiem apostrofu '  lub instrukcją REM. Warto przyzwyczaić się do opatrywania swoich programów komentarzami gdyż to po pewnym czasie ułatwia analizę wcześniej napisanych programów:            ' - to jest komentarz      Rem - i to też jest komentarz

70 Konfiguracja całego portu B jako wyjście lub wejście:       Config Portb = Output     ' cały port B jako wyjście        Config Portb = Input     ' cały port B jako wejście

71 można również skonfigurować każde wyprowadzenie (każdy bit) osobno:       Config Pinb.0 = Output    ' wyprowadzenie PB0 portu B jako wyjście       Config Pinb.1 = Output    ' wyprowadzenie PB1 portu B jako wyjście       Config Pinb.2 = Output    ' wyprowadzenie PB2 portu B jako wyjście       Config Pinb.3 = Output    ' wyprowadzenie PB3 portu B jako wyjście       Config Pinb.4 = Output    ' wyprowadzenie PB4 portu B jako wyjście       Config Pinb.5 = Output    ' wyprowadzenie PB5 portu B jako wyjście       Config Pinb.6 = Output    ' wyprowadzenie PB6 portu B jako wyjście       Config Pinb.7 = Output    ' wyprowadzenie PB7 portu B jako wyjście       Config Pinb.0 = Input    ' wyprowadzenie PB0 portu B jako wejście       Config Pinb.1 = Input    ' wyprowadzenie PB1 portu B jako wejście       Config Pinb.2 = Input    ' wyprowadzenie PB2 portu B jako wejście       Config Pinb.3 = Input    ' wyprowadzenie PB3 portu B jako wejście       Config Pinb.4 =  Input    ' wyprowadzenie PB4 portu B jako wejście       Config Pinb.5 = Input    ' wyprowadzenie PB5 portu B jako wejście       Config Pinb.6 = Input    ' wyprowadzenie PB6 portu B jako wejście       Config Pinb.7 = Input  ' wyprowadzenie PB7 portu B jako wejście

72 powyższego zapisu nie polecam z oczywistych powodów, lepiej przedstawić to samo korzystając z tego, że bajt można przedstawić jako 8 bitów i od razu będzie widać, który bit jest wyjściem, a który wejściem:  Config Portb = &B     ' cały port B jako wyjście       Config Portb = &B     ' cały port B jako wejście

73 w tym przypadku wszystkie wyprowadzenia są wyjściami lub wejściami, gdyby zapisać:Config Portb = &B     ' wyprowadzenia PB0 i PB1 to wejścia,                                                       ' PB2 do PB7 to wyjścia oznaczałoby to, że bit 0 i bit 1 są ustawione na 0 co oznacza, że wyprowadzenie PB0 i PB1 portu B są wejściami, a pozostałe wyjściami.

74 Prefiks &B oznacza w BASCOM-AVR, że liczba występująca po tym znaku jest zapisana w postaci dwójkowej, prefiks &H oznacza liczbę zapisaną w kodzie szesnastkowym, bez prefiksu liczba w kodzie dziesiętnym.

75    Przypisanie funkcji dla portu to pierwsza rzecz, druga natomiast to określenie stanu spoczynkowego wyprowadzeń portów mikrokontrolera po starcie pogramu. W tym celu do każdego bitu rejestru PORTx należy wpisać "0" lub "1". Można tego dokonać dla każdego bitu osobno, lub dla całego rejestru od razu, podobnie jak to miało miejsce przy przypisaniu funkcji wejścia lub wyjścia.

76 Ustawienie stanu spoczynkowego portu B:Portb = &B      ' podciągnięcie wszystkich wyprowadzeń                                              ' portu B do "1" dla portu B skonfigurowanego jako wyjście będzie to oznaczało, że stanem spoczynkowym wszystkich wyprowadzeń jest jedynka (stan wysoki), dla portu B skonfigurowanego jako wejście, to oznacza podciągnięcie wszystkich wejść do jedynki.

77 Gdy zapiszemy:        Portb = &B      ' dla portu B jako wyjście oznacza to                                              ' ustawienie na wszystkich wyprowadzeniach                                              ' stanu "0",                                              ' dla portu B jako wejście oznacza to                                              ' pozostawienie wszystkich wejść                                              ' pływających będzie to oznaczało dla portu B skonfigurowanego jako wyjście ustawienie na wszystkich wyprowadzeniach stano logicznego "0", natomiast dla portu B skonfigurowanego jako wejście oznacza to, że wszystkie wejścia pozostają w stanie wysokiej impedancji (wejścia pływające). Warto pamiętać, że dla wyprowadzenia portu pełniącego rolę wejścia, do którego podpięty jest przełącznik zwierający go do zera (po naciśnięciu), ważnym jest aby to wejście było podciągnięte do jedynki

78 Podobnie jak konfigurowanie pojedynczego wyprowadzenia portu można zrobić ustawienie stanu spoczynkowego dla pojedynczego wyprowadzenia, co ilustruje poniższy zapis:        Portb.5 = 1    ' wyprowadzenie PB5 portu B podciągnięte do "1"        Portb.5 = 0    ' wejście PB5 portu B pływające lub                              ' wyjście PB5 portu B ustawione w stan"0"

79     Po tych wszystkich wyjaśnieniach wracamy do naszego układu i przygotujemy porty mikrokontrolera do pracy zgodnie z założeniami.

80       Config Portb = &B   ' cały port B jako wyjście                  Portb = &B   ' wszystkie wyjścia w stanie "1"       Config Portd = &B    ' PD0 i PD1 - wejścia, pozostałe - wyjścia                  Portd = &B    ' PD0 do PD6 podciągnięte do "1"

81 Nasz mikrokontroler przygotowany jest do pracy, SW1 i SW4 podpięte są do wejść PD0 i PD1, które podciągnięte są do jedynki, pozostałe wyprowadzenia portu D są wyjściami (co dla działania układu jest obojętne), cały port B jest wyjściem i stan spoczynkowy jest "1", co w przypadku diody LED1 podpiętej do PB0 powoduje, że dioda nie świeci.

82 Aby program działał zgodnie z założeniami, to należy sterować stanem wyjścia PB0 poprzez zmianę najmłodszego bitu rejestru PORTB czyli Portb.0 w zależności od stanu wejść PD0 i PD1. Zmieniać stan bitu rejestru PORTB (i innych rejestrów PORTA, PORTD, PORTC również) można w BASCOM-AVR na dwa sposoby, aby dioda zaświeciła należy napisać: Portb.0 = 0  ' PB0 w stanie "0" - dioda świeci lub        Reset Portb.0  ' PB0 w stanie "0" - dioda świeci

83 w drugim sposobie użyłam instrukcji RESET, która ustawia określony bit w stan "0". Aby dioda przestała świecić należy napisać:                  Portb.0 = 1  ' PB0 w stanie "1" - dioda nie świeci lub           Set Portb.0  ' PB0 w stanie "1" - dioda nie świeci tutaj w drugim sposobie użyłam instrukcji SET, która Ustawia określony bit w stan "1".

84 Czas na najważniejsze, a więc co trzeba zrobić aby program ciągle sprawdzał stan wejść, do których są podpięte przełączniki SW1, SW4 i w zależności od ich stanów zmieniał stan wyjścia PB0 powodując świecenie bądź gaszenie diody LED1.

85 Aby program wykonywał w kółko jakąś operację należy zastosować w programie nieskończoną pętlę. W BASCOM-AVR może do tego celu posłużyć instrukcja DO ... LOOP, która powtarza blok programu dopóki warunek końcowy nie będzie spełniony. Gdy warunek nie zostanie podany (a tak będzie w naszym przypadku) pętla będzie się wykonywać w nieskończoność.

86 Zapisać to więc można tak jak poniżej:           Do     ' początek nieskończonej pętli                ciąg wykonywanych instrukcji           Loop     ' powrót do początku pętli

87 Teraz pozostało jeszcze spowodowanie sprawdzania stanów wejść PD0, PD1 i uzależnienia od nich stanu PB0, czyli musimy wykonać instrukcję w stylu: "wykonaj coś pod warunkiem, że jest spełnione coś innego".

88 W BASCOM-AVR jest instrukcja IF. THEN. ELSEW BASCOM-AVR jest instrukcja IF ... THEN ... ELSE ... END IF, która znakomicie się do naszych celów nadaje. Tworzy ona tzw. blok decyzyjny.

89 Instrukcja IF. THEN oblicza logiczną wartość podanego wyrażeniaInstrukcja IF ... THEN oblicza logiczną wartość podanego wyrażenia. Jeśli będzie ono prawdziwe (wynikiem będzie logiczna prawda) wykonany zostanie blok instrukcji umieszczony po instrukcji THEN. Jeśli będzie ono fałszywe, to instrukcje po słowie THEN nie zostaną wykonane. Wykonane za to będą instrukcje po słowie ELSE, jeśli ono występuje

90 W naszym przypadku musimy więc sformułować następujący blok decyzyjny: "... jeśli PD0 jest w stanie zero, to ustaw PB0 w stan "0" jeśli tak nie jest to przejdź do następnej instrukcji, w której będzie następna decyzja - jeśli PD1 jest w stanie zero, to ustaw PB0 w stan "1", jeśli tak nie jest to wróć do początku ...". I tu mała niespodzianka - jak odczytać stan dowolnego wyprowadzenia portu?

91 Umiemy wpisywać do dowolnego bitu portu jedynkę lub zero poleceniem PORTx.y = 1 czy PORTx.y = 0, a jak jest z odczytem? I tu okazuje się przydatny trzeci rejestr PINx (to jest rejestr tylko do odczytu; x to: A, B, C lub D). Do odczytu stanu wyprowadzenia dowolnego portu służy polecenie PINx.y.

92 Jeśli już wszystko jasne, to czas zapisać nasz blok decyzyjny:Do                                                   ' początek nieskończonej pętli     If Pind.0 = 0 Then Portb.0 = 0    ' jeśli na wejściu PD0 jest 0 to wyjście                                                        ' PB0 przyjmuje stan "0"     If Pind.1 = 0 Then Portb.0 = 1    ' jeśli na wejściu PD1 jest 0 to wyjście                                                        ' PB0 przyjmuje stan "1" Loop                                               ' powrót do początku pętli

93 Teraz wystarczy połączyć wszystkie niezbędne elementy programu czyli "blok konfigurujący porty" oraz ostatnio napisany "blok decyzyjny", całość zakończyć instrukcją END i otrzymamy pierwszy program

94 Config Portb = &B   ' cały port B jako wyjście            Portb = &B   ' wszystkie wyjścia w stanie "1" Config Portd = &B    ' PD0 i PD1 - wejścia, pozostałe - wyjścia            Portd = &B    ' PD0 do PD6 podciągnięte do "1" Do                                                   ' początek nieskończonej pętli     If Pind.0 = 0 Then Portb.0 = 0    ' jeśli na wejściu PD0 jest 0 to wyjście                                                        ' PB0 przyjmuje stan "0"     If Pind.1 = 0 Then Portb.0 = 1    ' jeśli na wejściu PD1 jest 0 to wyjście                                                        ' PB0 przyjmuje stan "1" Loop                                               ' powrót do początku pętli End                                                 ' koniec programu

95 Mikrokontrolery AVR -techniczne aspekty programowania

96 Mikrokontrolery avr integrują w swojej strukturze nieulotną pamięć przeznaczoną na program( pamięć FLASH) oraz nieulotną pamięć EEPROM do dowolnego zastosowania przez autora programu. Po napisaniu programu powstaje problem związany z umieszczeniem jego kodu wewnątrz pamięci mikrokontrolera. Producent (firma ATMEL) przwidział w ogólnym przypadku dwa rozwiązania dotyczące sposobu programowania pamięci FLASH oraz EEPROM. Programowanie mikrokontrolerów może odbywać się: W programatorze; W układzie;

97 Programowanie mikrokontrolerów w programatorze:Proces ten wymaga wyłożenia programowanego mikrokontrolera do programatora, zaprogramowaniu układu i ponownego przeniesienia mikrokontrolera do układu, w którym ma on pracować. Takie rozwiązanie ma niedogodność w ciągłym przenoszeniu mikrokontrolera między programatorem a docelowym systemem. Drugą poważną niedogodnością tego rozwiązania jest to, że z praktycznego punktu widzenia nie istnieje możliwość użycia wybranych modeli mikrokontrolerów( ponieważ przykładowo ATMEGA103, ATMEGA128 i inne są produkowane wyłącznie w obudowach do montażu powierzchniowego.

98 Programowanie mikrokontrolerów w układzie:Proces programowania wymaga umieszczenia w docelowym systemie odpowiedniego złącza, przez które będzie odbywać się programowanie ( kasowanie, odczytywanie pamięci, weryfikacja itp.). Metoda ta nazywa się programowaniem w trybie szeregowym. W tym trybie są dostępne operacje kasowania, programowania i odczytu pamięci FLASH i EEPROM oraz istnieje możliwość weryfikacji bitów zabezpieczeń i bitów konfiguracji.

99 Firma ATMEL zaproponowała standard złącza programującego w dwóch wariantach, jako złącze 6-stykowe i 10-stykowe. Oba rozwiązania funkcjonalnie są identyczne. Złącza programujące, są następujące: gdzie MOSI, MISO, SCK i RESET, są sygnałami służącymi do programowania, GND jest Sygnałem masy, oraz VTG jest napięciem zasilającym

100 Z praktycznego punktu widzenia sprowadza się to do umieszczenia na płytce drukowanej docelowego złącza pinowego (najczęściej są to dwurzędowe listy pinowe o rozstawie 100 mils(2.54mm). Do połączenia z programatorem używa się kabla płaskiego o zaciśniętą na końcu złączką nakładaną na piny będące w płytce drukowanej systemu.

101 Występujące w złączu do szeregowego programowania sygnały to:Występujące w złączu do szeregowego programowania sygnały to: * RESTET- sygnał zerowania mikrokontrolera; *MOSI( od ang. Master Output Slave Input)- dane transmitowane programatora do mikrokontrolera; *MISO( od ang. Master Input Slave Output)- dane transmitowane z mikrokontrolera do programatora; *SCK- sygnał zegarowy do mikrokontrolera; *GND- masa zasilania;

102 W ogólnym przypadku złącze programujące wygląda następująco:Występujące tu połączenie złączki z napięciem Vcc pozwala na zasilenie się układu z programatora lub programatora z układu. W wielu rozwiązaniach to połączenie może być pominięte.

103 Przykładowe rozwiązanie przyłącza programatora może być następujące:Mikrokontroler ma wprowadzenia sygnałów, które są niezbędne do przyłączenia programatora do programowania w układzie w trybie szeregowym.

104 Na identycznej zasadzie realizowane jest przyłączenie jest mikrokontrolera do programowania w układzie w przypadku innych modeli mikrokontrolera(AT90S2313)

105 Mikrokontrolera ATMEGA też nie odbiegają w swoich rozwiązaniach od powyższego modelu. Przykład z użyciem mikrokontrolera ATMEGA 161:

106 Przykładem mikrokontrolera wymagającego innego przyłączenia jest ATMEGA 128

107 We wszystkich przykładach jest pominięty pewnie problem, który może okazać się w konkretnym rozwiązaniu dość istotny. Użycie do szeregowego programowania sygnałów SCK, MOSI i MISO nie oznacza, że te sygnały nie mogą być używane w docelowym systemie do innych celów. Jeżeli z punktu widzenia mikrokontrolera te piny są wyjściami( mikrokontroler za pomocą tych pinów steruje jakimś blokiem cyfrowym) nie ma żadnego problemu. W przeciwnym wypadku( jeżeli któryś z tych pinów jest wejściem dla mikrokontrolera) mogą wystąpić problemy z programowaniem.

108 Przyczyny konfliktów logicznych;

109 W trakcie programowania na każdym z trzech sygnałów używanych do programowania mikrokontrolera występuje konflikt logiczny, w obwodzie są dwa źródła sygnału: * wyjście negatora(74HCT04) i sygnał SCK (programator jest źródłem sygnału); Wyjście nagatora(74HCT04) i sygnał MOSI (programator jest źródłem sygnału); Wyjście negatora(74HCT04) i sygnał MISO (mikrokontroler jest źródłem sygnału).

110 Może to doprowadzić do niemożności zaprogramowania mikrokontrolera, gdyż wyjście negatorów może zakłócać przebieg sygnałów programujących.

111 W niektórych rozwiązaniach programowych można uniknąć problemu, jeżeli te linie będą wyjściowymi (z punktu widzenia mikrokontrolera), czyli przyłączone do wejść w blokach cyfrowych, którymi steruje mikrokontroler. Niestety nie zawsze takie rozwiązanie jest możliwe. W takiej sytuacji można zaproponować dwa rozwiązania!

112 Pierwszy przypadek przedstawia poniższy rysunekJest fizycznym rozłączeniem poprzez użycie listy pionowej i zworek (jumperków). Na czas programowania zworki byłyby usuwane, co tworzyłoby przerwę w danym połączeniu.

113 Drugie rozwiązanie Jest to elektroniczny przełącznik konfliktowych połączeń

114 Układ CD4053 przełącza w odpowiedni sposób sygnały używane do programowania w trybie szeregowym. Sterowanie przełączeniem wejść/wyjść multipleksera jest oparte o sygnał RESET generowany przez programator w trakcie programowania. W przypadku kiedy mikrokontroler nie jest przyłączony do programatora, to rezystor występujący w obwodzie zerowania mikrokontrolera ustala sygnał na poziomie logicznej jedynki. W efekcie w trakcie programowania , układ CD4053 łączy mikrokontroler ze złączem programatora. W trakcie normalnej pracy, wymieniony multiplekser łączy mikrokontroler z blokiem cyfrowym. Wykonanie: Magdalena Kozubek