1. Porty wejścia wyjścia (I/O)



Podobne dokumenty
Wbudowane układy peryferyjne cz. 2 Wykład 8

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

Uproszczony schemat blokowy zespołu 8-bitowego timera przedstawiono na rys.1

Mikroprocesory i Mikrosterowniki Liczniki Timer Counter T/C0, T/C1, T/C2

Wbudowane układy peryferyjne cz. 1 Wykład 7

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

Układy czasowe / liczniki (timers/counters)

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

Programowanie mikrokontrolerów. 5 grudnia 2007

Wstęp Architektura... 13

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania. Sterowniki Urządzeń Mechatronicznych laboratorium. Ćw. 3: Timer v1.0

2. Architektura mikrokontrolerów PIC16F8x... 13

Podstawy Techniki Mikroprocesorowej Laboratorium

WYKORZYSTANIE WEWNĘTRZNYCH GENERATORÓW RC DO TAKTOWANIA MIKROKONTROLERÓW AVR

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

2. PORTY WEJŚCIA/WYJŚCIA (I/O)

Mikrokontrolery AVR techniczne aspekty programowania

SYSTEM PRZERWAŃ ATmega 32

Przerwanie. Źródła przerwań

Układy czasowo-licznikowe w systemach mikroprocesorowych

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Wbudowane układy komunikacyjne cz. 1 Wykład 10

KOMUNIKACJA Z OTOCZENIEM MIKROKONTROLERA

AGH Akademia Górniczo- Hutnicza w Krakowie Katedra Elektroniki WIET

Hardware mikrokontrolera X51

LICZNIKI Liczniki scalone serii 749x

AVR DRAGON. INSTRUKCJA OBSŁUGI (wersja 1.0)

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

3.2. Zegar/kalendarz z pamięcią statyczną RAM 256 x 8

Mikrokontrolery AVR Wprowadzenie

Mikroprocesory i Mikrosterowniki

Układy czasowo-licznikowe w systemach mikroprocesorowych

Wbudowane układy peryferyjne cz. 3 Wykład 9

PRZETWORNIK ADC w mikrokontrolerach Atmega16-32

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

Kurs Elektroniki. Część 5 - Mikrokontrolery. 1/26

Przerzutnik ma pewną liczbę wejść i z reguły dwa wyjścia.

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Metody obsługi zdarzeń

Technika Mikroprocesorowa

Komunikacja w mikrokontrolerach Laboratorium

Podstawy systemów mikroprocesorowych

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: SYSTEMY CYFROWE 1

Mikroprocesory i Mikrosterowniki

Programowanie mikrokontrolerów. 8 listopada 2007

Programowany układ czasowy

Magistrala SPI. Linie MOSI i MISO sąwspólne dla wszystkich urządzeńna magistrali, linia SS jest prowadzona do każdego Slave oddzielnie.

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja. do ćwiczeń laboratoryjnych z przedmiotu: SYSTEMY CYFROWE 1.

Zestaw uruchomieniowy z mikrokontrolerem LPC1114 i wbudowanym programatorem ISP

Wstęp: Interfejs portu równoległego 6821 i portu szeregowego 6850 firmy Motorola

ISP ADAPTER. Instrukcja obsługi rev.1.1. Copyright 2009 SIBIT

Pracownia elektryczna i elektroniczna. Elektronika cyfrowa. Ćwiczenie nr 5.

Politechnika Białostocka

Inne układy peryferyjne AVR

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Język FBD w systemie Concept

był w momencie wystąpienia zewnętrznego zdarzenia. Jest bardzo przydatna przy pomiarach częstotliwości. Pracę timera Timer1 kontrolują następujące

Mikroprocesory i mikrosterowniki

Programowanie mikrokontrolerów. 3 stycznia 2008

Komunikacja w mikrokontrolerach. Wydział Elektroniki Mikrosystemów i Fotoniki Piotr Markowski

Instytut Teleinformatyki

Dokumentacja mikrokontrolera Atmega16 firmy Atmel

PROGRAMOWALNE SYSTEMY MECHATRONIKI

Przerwania, polling, timery - wykład 9

2.1 Porównanie procesorów

Ćw. 7: Układy sekwencyjne

SML3 październik

Układy zegarowe w systemie mikroprocesorowym

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Organizacja typowego mikroprocesora

1. Cel ćwiczenia. 2. Podłączenia urządzeń zewnętrznych w sterowniku VersaMax Micro

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Wyjście do drukarki Centronix

Programowany układ czasowy APSC

Systemy wbudowane. Wprowadzenie. Struktura. Mikrokontrolery AVR. Wprowadzenie do programowania w C

CYKL ROZKAZOWY = 1 lub 2(4) cykle maszynowe

Licznik rewersyjny MD100 rev. 2.48

Porty wejścia/wyjścia w układach mikroprocesorowych i w mikrokontrolerach

Zastosowanie procesorów AVR firmy ATMEL w cyfrowych pomiarach częstotliwości

dokument DOK wersja 1.0

Instrukcja do ćwiczenia : Matryca komutacyjna

LITEcomp. Zestaw uruchomieniowy z mikrokontrolerem ST7FLITE19

Wstęp. Opis ATMEGA128 MINI MODUŁ VE-APS-1406

1.2 Schemat blokowy oraz opis sygnałów wejściowych i wyjściowych

IC200UDR002 ASTOR GE INTELLIGENT PLATFORMS - VERSAMAX NANO/MICRO

Magistrala I 2 C. Podstawy systemów mikroprocesorowych. Wykład nr 5 Interfejsy szeregowe c.d.

Zastosowania mikrokontrolerów w przemyśle

Aplikacja czujnika temperatury dla modułu uniwersalnego UNIV 1.0 i procesora UNIV 1.0 (CPU)

LICZNIKI PODZIAŁ I PARAMETRY

MIKROKONTROLERY I MIKROPROCESORY

ZL9AVR. Płyta bazowa dla modułów ZL7AVR (ATmega128) i ZL1ETH (RTL8019)

ZL9ARM płytka bazowa dla modułów diparm z mikrokontrolerami LPC213x/214x

WPROWADZENIE Mikrosterownik mikrokontrolery

Ćw. 9 Przerzutniki. 1. Cel ćwiczenia. 2. Wymagane informacje. 3. Wprowadzenie teoretyczne PODSTAWY ELEKTRONIKI MSIB

Przetworniki analogowo-cyfrowe (A/C)

Mikrokontroler AVR ATmega32 - wykład 9

Opis układów wykorzystanych w aplikacji

Transkrypt:

1. Porty wejścia wyjścia (I/O) Z uwagi na budowę wewnętrzną CPU, a w szczególności długość rejestrów i szerokość szyny danych porty mają najczęściej budowę 8-bitową. Niektóre z nich mogą pracować jako analogowe lub cyfrowe. Kierunek kaŝdego wyprowadzenia dowolnego portu moŝna ustalać niezaleŝnie od pozostałych i zmieniać w dowolnym momencie bez wpływu na pozostałe linie portu. Stosowną konfigurację moŝna zrealizować przy uŝyciu rozkazów SBI lub CBI. Te same rozkazy moŝna wykorzystać do zmiany poziomu na porcie wyjściowym lub włączenia/wyłączenia podciągania pull-up linii portu wejściowego. 1.1. Budowa portu B Port B w typowym mikrokontrolerze jest 8-bitowym, dwukierunkowym portem we/wy. Jest on dostępny przez 3 lokacje w przestrzeni we/wy mikrokontrolera: Pierwsza lokacja to rejestr danych (Data Register) PORTB adres $18 w przestrzeni we/wy lub $38 w obszarze pamięci wewnętrznej. Druga lokacja to rejestr konfiguracji kierunku (Data Direction Register) DDRB mający odpowiednie adresy: $17 ($37). Trzecia lokacja to rejestr wejściowy (Input Pins) PINB o adresach $16 ($36). Rejestr PINB moŝe być tylko odczytywany, PORTB i DDRB mogą być zarówno czytane jak i zapisywane. WaŜną cechą portu B jest to, Ŝe kaŝda jego linia ma indywidualnie wybierany rezystor podciągający do plusa" zasilania (pull-up). Do wszystkich wyprowadzeń PORTB moŝna dołączać diody LED jedynie poprzez rezystor ograniczający. Dopuszczalna obciąŝalność kaŝdego wyprowadzenia PORTB wynosi 20 ma w stanie niskim (dla Vcc = 5 V). Bezpośrednio sterowane diody LED powinny być włączone poprzez rezystor ograniczający pomiędzy plusem zasilania a portem wyjściowym (przykładowe sterowanie diodą LED przedstawiono na rysunku obok). Zaświecenie diody następuje po ustawieniu na wyjściu portu niskiego poziomu logicznego. 1

Jeśli wyprowadzenia PB0 do PB7 są wykorzystywane jako wejścia i są zewnętrznie podciągane do dołu, to stanowią źródło prądu wypływającego z portu, jeśli tylko są uaktywnione wewnętrzne rezystory podciągające. Większość linii portów ogólnego przeznaczenia pełni dodatkowe funkcje wykorzystywane do obsługi urządzeń peryferyjnych. Znaczenie funkcji alternatywnych portu B przedstawiono w tablicy 1.1. Tab. 1. Alternatywne funkcje portu B Wyprowadzenie portu PBO PB1 PB3 PB5 PB6 PB7 Funkcja alternatywna AINO (wejście nieodwracające komparatora analogowego) AIN1 (wejście odwracające komparatora analogowego) 0C1 (wyjście porównania dla Timera/Licznika1) MOSI (wejście danych dla programowania szeregowego) MISO (wyjście danych dla programowania szeregowego) SCK (wejście zegarowe dla programowania szeregowego) PORTB (Port B Data Register) - rejestr danych portu B - $18 Rejestr PORTB moŝe być zapisywany i odczytywany. Zawiera dane we/wy. DDRB (Port B Data Direction Register) - rejestr kierunku portu B - $17 Rejestr DDRB określa typ kaŝdej linii portu B. Linie mogą być skonfigurowane jako wejściowe lub wyjściowe. Dodatkowo ustawia się opcje związane z podciąganiem. 2

PINB (Port B Input Pin Address) - rejestr wejściowy portu B - $16 Rejestr PINB moŝe być tylko odczytywany. Jego zawartość odzwierciedla bezpośrednio stan wyprowadzeń mikrokontrolera przypisanych do portu B. Fizycznie nie jest to więc rejestr. Inaczej jest podczas bezpośredniego odczytu PORTB. Wówczas czytany jest stan zatrzasków portu B (Port B Data Latch). 1.1.1. Port B jako cyfrowy port we/wy ogólnego przeznaczenia Jeśli poszczególne linie portu B są wykorzystywane jako wyprowadzenia cyfrowe ogólnego przeznaczenia, to są wzajemnie równowaŝne. Jeśli DDBn będzie ustawiony ( 1"), to wyprowadzenie PBn będzie skonfigurowane jako wyjściowe. Jeśli DDBn będzie wyzerowany ( 0"), wyprowadzenie PBn będzie skonfigurowane jako wejściowe. Wyprowadzenie PBn skonfigurowane jako wejściowe będzie się zachowywało róŝnie, w zaleŝności od stanu PORTBn. Jeśli bit PORTBn będzie ustawiony ( 1"), to linia wejściowa PBn będzie miała uaktywniony MOS-owy rezystor podciągający (pull-up). Taka konfiguracja świetnie nadaje się do obsługi np. zewnętrznej klawiatury, róŝnego rodzaju przełączników. Tab. 2. Wpływ ustawienia bitów DDBn i PORTBn na wyprowadzenia portu B DDBn PORTBn I/0 Podciąganie pull-up Uwagi 0 0 Wejście Brak Wysoka impedancja (high-z) 0 1 Wejście Jest PBn jest źródłem prądu, jeśli jest zewnętrznie podciągany do masy zasilania (pull-low) 1 0 Wyjście Brak Wyjście typu push-pull stan niski 1 1 Wyjście Brak Wyjście typu push-pull stan wysoki Po zerowaniu mikrokontrolera port B jest ustawiany w stan wysokiej impedancji, nawet wówczas, gdy nie jest aktywny zegar systemowy. 3

Przykład 1. Konfigurowanie portów mikrokontrolera w asemblerze.include "2313def.inc".def temp=r17 Idi temp, $af out ddrb, temp ;PB0 do PB3 oraz PB5 i PB7 - wyjścia ;pozostałe - wejścia Idi temp, 0xcf out portb, temp ;PB0 do PB3 i PB7 wyjście w stanie wysokim ;PB5 wyjście w stanie niskim ;PB4 wejście w stanie High-Z ;PB6 wejście podciągnięte do plusa 1.1.2. Funkcje alternatywne portu B Wyprowadzenie portu B mogą spełniać takŝe następujące funkcje alternatywne: B7 - SCK: wejście zegarowe dla programowania szeregowego Do tego wejścia jest doprowadzany zewnętrzny przebieg zegarowy taktujący transferem danych podczas szeregowego programowania pamięci mikrokontrolera. B6 - MISO: wyjście danych dla programowania szeregowego Z tego wyjścia są przekazywane informacje z mikrokontrolera do programatora podczas szeregowego programowania pamięci. B5 - MOSI: wejście danych dla programowania szeregowego Do tego wejścia są przekazywane informacje z programatora do mikrokontrolera podczas szeregowego programowania pamięci. B3 - OC1: wyjście przechwytywania Wyjście OC1 jest wykorzystywane, gdy jest aktywna funkcja porównywania Timera/Licznika1. Pojawia się na nim stan wysoki, jeśli stan Timera/Licznika1 zrówna się z rejestrem OCR1A. Wyprowadzenie PB3 powinno być w takim przypadku skonfigurowane jako wyjście. 4

B1 - AIN1: wejście odwracające komparatora analogowego Jeśli wyprowadzenie to jest skonfigurowane jako wejście z wyłączonym podciąganiem (DDB1 jest wyzerowane ( 0") i PB1 jest wyzerowane ( 0")), wyprowadzenie AIN1 jest bezpośrednio dołączone do odwracającego wejścia komparatora analogowego zawartego w strukturze mikrokontrolera. B0 AIN0: wejście nieodwracające komparatora analogowego Analogicznie jak powyŝej. 1.1.3. Budowa linii portu B Na rysunkach przedstawiono schemat linii 1 i 2 portu B. Ich budowa wewnętrzna róŝni się ze względu na funkcje alternatywne. Rys. 1. Schemat linii 0 i 1 portu B 5

2. Pamięci nieulotne w mikrokontrolerach AVR W mikrokontrolerach AVR zastosowane są jednocześnie dwa rodzaje pamięci nieulotnych. Pamięć Flash pełniąca rolę pamięci programu i pamięć EEPROM słuŝąca jako pamięć danych, które powinny być zachowane po wyłączeniu zasilania, czyli do przechowywania parametrów konfiguracyjnych samego mikrokontrolera, opcji programu. Programowanie obu pamięci moŝe się odbywać bezpośrednio w systemie (bez potrzeby przenoszenia mikrokontrolera do programatora). 2.1. Bity sterujące W układach AVR wprowadzono programowalne bity, które powszechnie nazywa się sterującymi. Jednym z ich rodzajów są bity konfiguracyjne (angielska nazwa,fuse bits" jest dość myląca), które umoŝliwiają niejako zmianę wariantu mikrokontrolera. Drugim rodzajem są bity zabezpieczające, które umoŝliwiają wprowadzenie układu w tryb ochrony wewnętrznej pamięci programu tak, aby uniemoŝliwić osobie niepowołanej (konkurencji) odczyt jej zawartości. Mimo, Ŝe bity sterujące nie znajdują się w przestrzeni pamięci programu, programuje się je stosując to samo urządzenie, którym ładuje się do mikrokontrolera program aplikacji. Wszystkie ustawienia mogą być zapisywane wielokrotnie i nie są zerowane w trakcie kasowania pamięci układu (operacji chip erase"), w przeciwieństwie do bitów zabezpieczających. Niestety, nie wszystkie bity konfiguracyjne dostępne są w trybie programowania szeregowego. Programowanie bitów sterujących polega na przypisywaniu im wartości logicznej 0. Bit sterujący, który nie jest zaprogramowany, ma zatem wartość 1. Sposób domyślnej (fabrycznej) konfiguracji jest określany w nocie katalogowej danego układu. 2.1.1. Bity konfiguracyjne (ang. fuse bits) Układy grupy ATmega mogą mieć dwa lub trzy bajty, w skład których wchodzą bity konfiguracyjne. Z uwagi na ich mnogość, przed zastosowaniem danego mikrokontrolera naleŝy prześledzić pod tym kątem jego dokumentację. W tabeli poniŝej przedstawiono zbiór bitów konfiguracyjnych, które w układach ATmega występują najczęściej. Poza wymienionymi, mikrokontrolery te mogą mieć przykładowo tzw. bity zgodności, które włączają tryb emulacji wypartego mikrokontrolera starszej generacji. 6

Tabela 3 Najczęściej spotykane bity konfiguracyjne Nazwa bitu Opis Typowa wartość domyślna BODEN Włącza układ zerujący mikrokontroler w przypadku nieodpowiedniego napięcia zasilania 1 (BOD wyłączony) BODLEVEL(2...0) Ustawia poziom zadziałania modutu BOD. Dobierany zaleŝnie od napięcia zasilania i rodzaju mikrokontrolera. 1 BOOTRST BOOTSZ1...0 Powoduje przeniesienie wektora inicjalizacyjnego na początek sekcji boot loadera Determinują wielkość sekcji boot loadera, która jest umieszczona na końcu pamięci flash 1 (standardowy wektor inicjalizacyjny) 00 CKDIV8 CKOPT CKSEL3...0 JTAGEN OCDEN W niektórych mikrokontrolerach włącza dzielenie zegara systemowego przez 8. Wymusza pracę oscylatora w pełnym zakresie napięć zasilania (ang. rail--to-rail). Zaprogramowania CKOPT zwiększa stabilność pracy generatora w trudnych warunkach elektromagnetycznych, powodując przy tym większe zuŝycie energii. Określają źródło zegara systemowego - umoŝliwiają wybór pomiędzy wewnętrznym oscylatorem RC, źródłem zewnętrznym, zewnętrznym układem RC, rezonatorem kwarcowym i ceramicznym Uaktywnia interfejs uruchomieniowy JTAG i przyporządkowuje mu port TAP, którego linie (TCK, TDO, TDI i TMS) nie mogą być wówczas wykorzystywane jako uniwersalne porty wejścia-wyjścia Włącza tryb uruchomieniowy (ang. On-Chip Debug), dostępny dzięki interfejsowi JTAG 0 (zegar dzielony przez 8) 1 (oscylacje ograniczone) 0001 lub 0010 (wewnętrzny oscylator RC) 0 (JTAG włączony) 1 (OCD zablokowane) RSTDISBL Determinuje tryb pracy wyprowadzenia RESET, które w niektórych mikrokontrolerach słuŝyć moŝe równieŝ jako port wejścia-wyjścia. Zaprogramowanie tego bitu uniemoŝliwia późniejsze programowanie szeregowe poprzez interfejs SPI. 1 (RESET działa jako wyprowadzenie zerujące) SPIEN SUT1...0 Wtacza moŝliwość odczytu i programowania pamięci układowej za pomocą interfejsu szeregowego SPI. Ustawia opóźnienie z jakim mikrokontroler zaczyna działać po dołączeniu zasilania tak, aby generator taktujący i napięcie zasilania miały czas na ustabilizowanie się (ang. start-up time). Ustawienie powinno być uzaleŝnione od zastosowanego źródła zegarowego 0 (SPI włączone) 10 7

2.1.2. Bity zabezpieczające (ang. lock bits) Zintegrowanie układu mikrokontrolera z pamięcią programu daje ciekawą moŝliwość, której dawniej - przy stosowaniu pamięci zewnętrznych - nie było. Producent urządzeń moŝe zabezpieczyć swoje produkty tak, aby odczyt ich oprogramowania nie był moŝliwy. Jest to o tyle waŝne, Ŝe w dzisiejszych czasach - przy mocno rozwiniętej konkurencji - moŝliwość skopiowania oprogramowania (na które poświęca się zazwyczaj najwięcej czasu) jest praktycznie niedopuszczalna. Mikrokontrolery AVR posiadają dwa lub sześć tzw. bitów zabezpieczających, które umoŝliwiają ograniczenie dostępu do pamięci programu. Po zaprogramowaniu układu, moŝemy za ich pomocą włączyć wybrany tryb ochrony. Tryb ten daje się później zmieniać, ale tylko w kierunku poziomów bardziej restrykcyjnych. Kasowanie omawianych bitów moŝliwe jest wyłącznie poprzez wykonanie operacji kasowania całej pamięci mikrokontrolera (ang. chip erase). Bity zabezpieczające moŝna podzielić na dwie podgrupy: bity zabezpieczające pamięć flash i EEPROM przed dostępem zewnętrznym (ang. Lock bits); zaliczają się do nich dwa znaczniki opisane symbolami LB1 i LB2; znaczenie róŝnych ich kombinacji przedstawiono w tabeli 1.4, bity ograniczające zakres działania instrukcji lpm i spm (ang. Boot Lock bits); do tej grupy zaliczają się znaczniki BLB01, BLB02, BLB11, BLB12; Bity zabezpieczające naleŝy zaprogramować po załadowaniu pamięci programu, pamięci EEPROM i ustawieniu bitów konfiguracyjnych. Tab. 4. Poziomy zabezpieczeń pamięci flash i EEPROM przy dostępie zewnętrznym LB2 LB1 Znaczenie 1 1 brak zabezpieczeń 1 0 zapis pamięci jest niedozwolony 0 0 zapis, odczyt i weryfikacja zawartości pamięci są niedozwolone 8

2.1.3. Sygnatury Wszystkie mikrokontrolery z rodziny AVR mają 3-bajtową sygnaturę identyfikacyjną typ układu. Sygnatura moŝe być odczytana zarówno podczas programowania równoległego jak i szeregowego. Dzięki temu, podczas programowania moŝna w wielu sytuacjach uniknąć błędu mogącego uszkodzić układ. Rozmieszczenie sygnatur w mikrokontrolerze AT90S2313 wygląda następująco: 1. $000: - $1E (identyfikator produktu Atmela), 2. $001: - $91 (identyfikator 2kB pamięci Flash), 3. $002: - $01 (identyfikator układu AT90S2313, jeśli sygnatura $001 ma wartość $91). Jeśli bity zabezpieczające są ustawione w trybie 3 (oba zaprogramowane), to odczyt sygnatur jest zablokowany w trybie szeregowym. Dla układu ATmega 8 sygnatury wynoszą: 0x1E 0x93 0x07 2.2. Programowanie szeregowe Pamięć programu (Flash) i nieulotna pamięć danych (EEPROM) mikrokontrolera mają rozdzielne przestrzenie adresowe: $0000...$03FF (Flash) i $000...$07F (EEPROM). Obydwa obszary mogą być programowane przy wykorzystaniu interfejsu SPI, który zawiera linie: SCK, MOSI (wejście), MISO (wyjście). Rys.2. Funkcje wyprowadzeń ISP Aby rozpocząć kasowanie/programowanie pamięci, linia RESET musi znajdować się w stanie niskim. Po spełnieniu tego warunku niezbędne jest wykonanie polecenia Programming Enable (zezwolenie na programowanie), zapobiegające ewentualnemu przypadkowemu wejściu w tryb programowania. Przed rozpoczęciem zapisu danych do pamięci EEPROM jest wykonywany automatyczny cykl kasowania, wykorzystujący układ wewnętrznego taktowania. Nie jest więc konieczne wywołanie polecenia Chip Erase. Operacja kasowania powoduje wypełnienie wszystkich komórek pamięci wartością $FF. 9

Zewnętrzny przebieg zegarowy moŝe być doprowadzony do wejścia XTAL1. MoŜna równieŝ wykorzystywać wbudowany w mikrokontroler oscylator, współpracujący z rezonatorem kwarcowym dołączonym do końcówek XT AL1 i XTAL2. Algorytm programowania szeregowego Podczas szeregowego przesyłania danych do mikrokontrolera, dane są odczytywane na narastającym zboczu zegara SCK. Odbiór danych z mikrokontrolera jest natomiast taktowany zboczem opadającym. Szczegóły przedstawiono na rysunku 3. Do programowania i weryfikacji pamięci wykorzystywane są 4-bajtowe polecenia. Zalecana jest następująca procedura: 1. Po włączeniu zasilania naleŝy doprowadzić napięcie zasilające do wyprowadzeń Vcc i GND, utrzymując przez ten czas linie RESET i SCK w stanie niskim. Jeśli rezonator kwarcowy nie jest dołączony do końcówek XTAL1i XTAL2, naleŝy zastosować zewnętrzny przebieg zegarowy doprowadzony do wejścia XTAL1. 2. Programowanie szeregowe nie będzie działać, jeśli nie nastąpi synchronizacja transmisji pomiędzy programatorem i mikrokontrolerem. W stanie synchronizmu, drugi bajt polecenia Programming Enable ($53) spowoduje zwrócenie trzeciego bajtu do programatora (echo). Jeśli odebrane echo będzie niepoprawne, naleŝy podać dodatni impuls SCK i ponownie wysłać polecenie Programming Enable. Brak poprawnej odpowiedzi po kodzie $53 utrzymujący się w 32 próbach nawiązania synchronizacji oznacza, Ŝe występują problemy z programowanym mikrokontrolerem, bądź z połączeniem pomiędzy nim a programatorem. Rys. 3. Przebiegi charakteryzujące programowanie szeregowe mikrokontrolera 10

Tab. 5. Formaty poleceń programowania szeregowego pamięci Flash i EEPROM Polecenie Zezwolenie na programowanie Format polecenia Bajt 1 Bajt 2 Bajt 3 Bajt 4 1010 1100 0101 0011 xxxx xxxx xxxx xxxx Operacja Zezwolenie na programowanie szeregowe Kasowanie pamięci 1010 1100 100x xxxx xxxx xxxx xxxx xxxx Kasowanie pamięci Czytanie pamięci programu Zapis pamięci programu Czytanie pamięci EEPROM Zapis pamięci EEPROM Zapis bitów zabezpieczających 0010 H000 xxxx xxaa bbbb bbbb oooo oooo Czytanie H bajtu pamięci spod adresu a:b 0100 H000 xxxx xxaa bbbb bbbb i i i i i i i i Zapis H bajtu pamięci pod adres a:b 1010 0000 xxxx xxxx xbbb bbbb oooo oooo Czytanie danej z EEPROM spod adresu b 1100 0000 xxxx xxxx xbbb bbbb i i i i i i i i Zapis danej do EEPROM pod adres b 1010 1100 111x x21x xxxx xxxx xxxx xxxx Zapis bitów zabezpieczających (wyzerowanie danego bitu) Czytanie sygnatury 0011 0000 xxxx xxxx xxxx xxbb oooo oooo Czytanie sygnatur spod adresu bb Uwagi: a= starsze bity adresu, b= młodsze bity adresu, H=0 młodszy bajt, H=1 starszy bajt, o=dane wyjściowe, i=dane wejściowe, x= wartość bitu bez znaczenia, 1=bit zabezpieczający1 3. Jeśli wykonano polecenie Chip Erase, naleŝy odczekać 8-18 ms, po czym wygenerować dodatni impuls na wejściu RESET. 4. Do zaprogramowania kaŝdego bajtu pamięci niezbędne jest przesłanie jego adresu oraz zawartości. Operację programowania moŝna przyspieszyć omijając adresy, które zawierają dane o wartości $FF. 5. Poprawność zapisu moŝna zweryfikować wykorzystując polecenie Read. Powoduje ono przesłanie zapisanej w pamięci danej z mikrokontrolera do programatora poprzez linię MISO (PB6). 6. Zakończenie programowania następuje po ustawieniu linii RESET w stan wysoki, rozpoczynając tym samym normalną pracę mikrokontrolera. 3. Timery/liczniki Większość mikrokontrolerów AVR wyposaŝona jest w co najmniej dwa układy licznikowe. WyróŜnić moŝna dwa podstawowe ich rodzaje: 8 i 16-bitowe. Liczniki 8-bitowe oznaczane są cyframi 0 i 2, natomiast 16-bitowe 1 i 3. 11

W celu rozszerzenia zakresu ich zliczania wprowadzono dodatkowy licznik 10-bitowy, pełniący funkcję wstępnego dzielnika impulsów taktujących. Jest to tzw. preskaler. Jego konfigurację pokazano na rysunku 4. Jeśli jest wykorzystywany sygnał CK aktywnego generatora (taktującego równieŝ mikrokontroler), to mamy do czynienia z timerem, natomiast gdy jest wykorzystywany sygnał zewnętrzny T0 (dla układu TC0) lub T1 (dla układu TC1), mówimy o funkcji licznika. Stopień podziału preskalera moŝe być ustawiony na jedną z czterech standardowych wartości, niezaleŝnie dla kaŝdego timera/licznika: CK/8, CK/64, CK/256, CK/1024. Liczniki/timery mogą być taktowane równieŝ sygnałem zegarowym bez podziału (CK/1). Rys. 4. Konfiguracja 10-bitowego preskalera słuŝącego do wytwarzania sygnałów zegarowych dla Liczników/Timerów 3.1. 8-bitowy Timer/Licznik0 Schemat blokowy układu TC0 przedstawiono na rysunku 5. Jest to 8-bitowy timer/licznik, który moŝe być taktowany bezpośrednio sygnałem CK (z oscylatora wewnętrznego), sygnałem CK podzielonym wstępnie przez preskaler oraz sygnałem z wejścia zewnętrznego T0. Układ TC0 moŝe być zatrzymany w dowolnym momencie poprzez wyzerowanie bitów sterujących CS02, CS01, CS00 znajdujących się w rejestrze sterującym tego timera/licznika TCCR0. 12

Jeśli układ TC0 jest skonfigurowany jako licznik, to zewnętrzny przebieg zegarowy nie taktuje go bezpośrednio, lecz jest synchronizowany sygnałem wewnętrznego oscylatora. W tym trybie sygnał zegarowy T0 jest próbkowany podczas narastającego zbocza wewnętrznego sygnału zegarowego. Maksymalna mierzona częstotliwość sygnału na wejściu T0 musi być mniejsza niŝ f XTAL /2. Układ TC0 dla małych stopni podziału preskalera cechuje się duŝą rozdzielczością i dokładnością. DuŜe stopnie podziału przydają się natomiast do generowania długich impulsów lub obsługi wolnozmiennych zdarzeń. Rys. 5. Schemat blokowy Timera/Licznika0 (TC0) W przypadkach, w których jest wymagany precyzyjny pomiar długich czasów, niezbędne staje się wprowadzenie dodatkowych mechanizmów programowych. Najczęściej będzie to dodatkowa zmienna programu zliczająca przerwania od timera/licznika. Zliczanie kończy się dopiero po osiągnięciu wymaganej liczby wejść do procedury obsługującej przerwanie. Timer/Licznik0 jest konfigurowany poprzez rejestr sterujący TCCR0. Flaga przepełnienia dla tego układu (TOV0) znajduje się w rejestrze TIFR (Timer/Counter Interrupt Flag Register). 13

TCCR0 (Timer/Counter0 Control Register) - rejestr sterujący Timera/Licznika0 - $33 B7...3 - zarezerwowane. Te bity są zarezerwowane i zawsze odczytywane jako zero. B2...B0 - CS02, CS01, CS00 (Clock Select0, bity: 2, 1, 0): bity wyboru stopnia podziału preskalera oraz źródła sygnału taktującego i jego zbocza aktywnego dla licznika TC0. Występujący w tablicy 6 sygnał CK pochodzi z wewnętrznego generatora i jest to ten sam sygnał, który taktuje CPU. Skonfigurowanie układu TC0 jako licznik powoduje - jak juŝ wiadomo - zliczanie impulsów z wejścia T0. Dzieje się tak nawet wtedy, gdy wyprowadzenie mikrokontrolera PD4/T0 jest ustawione jako wyjście. Rozwiązanie takie umoŝliwia programową kontrolę zliczania. Na skutek przepełnienia Timera/Licznika0 moŝe być wygenerowane przerwanie, którego procedura obsługi jest umieszczona w pamięci programu pod adresem $006. Tab. 6. Konfiguracja układu Timera/Licznika0 CS02 CS01 CS00 Opis 0 0 0 Stop układ TC0 jest zatrzymany 0 0 1 Sygnał taktujący CK 0 1 0 Sygnał taktujący CK/8 0 1 1 Sygnał taktujący CK/64 1 0 0 Sygnał taktujący CK/256 1 0 1 Sygnał taktujący CK/1024 1 1 0 Sygnał taktujący: zewnętrzny sygnał T0, zbocze opadające 1 1 1 Sygnał taktujący: zewnętrzny sygnał T0, zbocze narastające TCNT0 (Timer/Counter0) - rejestr Timera/Licznika0 - $32 Timer/Licznik0 zaprojektowano jako układ zliczający w górę. Rejestr TCNT0 przechowujący aktualny stan zliczania jest dostępny zarówno do zapisu jak i odczytu. 14

Jeśli zapis do tego rejestru nastąpi jednocześnie z impulsem zegarowym, najpierw zostanie zwiększony stan licznika, następnie zostanie dokonany wpis nowej wartości do rejestru. Osiągniecie stanu 0 jest traktowane jako przepełnienie. W tym momencie jest ustawiana flaga przepełnienia TOV0 sygnalizująca Ŝądanie obsługi przerwania. To czy zostanie ono zauwaŝone przez CPU zaleŝy od ustawienia bitu TOIE0 w rejestrze TIMSK (Timer/Counter Interrupt Mask Register) i bitu globalnego zezwolenia na przerwania I w rejestrze SREG. 3.2. 16-bitowy Timer/Licznik1 Timer/licznik 16-bitowy jest znacznie bardziej rozbudowany niŝ omawiany poprzednio, moŝe w związku z tym spełniać dodatkowe funkcje. Schemat blokowy Timera/Licznika1 przedstawiono na rysunku 7. Timer/licznik moŝe być taktowany bezpośrednio sygnałem CK (z oscylatora wewnętrznego), sygnałem CK podzielonym wstępnie przez preskaler lub sygnałem z wejścia zewnętrznego T1. Układ TC1 moŝe być zatrzymany w dowolnym momencie poprzez wyzerowanie bitów sterujących CS12, CS11, CS10 znajdujących się w rejestrze sterującym tego timera/licznika - TCCR1B (Timer/Counter1 Control Register B). TCCR1B (Timer/Counter1 Control Register B) rej. sterujący B Timera/Licznika1 - $2E B7 ICNC1 (Input Capture 1 Noise Canceler): bit włączający/wyłączający układ eliminacji szumu w trybie porównania. B6 ICES1 (Input Capture Edge Select): bit określający zbocze sygnału wyzwalającego przechwytywanie. Jeśli bit ICES1 jest wyzerowany to przepisywanie zawartości rejestrów timera/licznika do rejestru ICR1 jest realizowane na opadającym zboczu wejściowego sygnału ICP. B2 B0 CS12, CS11, CS10 (Clock Select1, bity: 2,1,0): bity wyboru stopnia podziału preskalera oraz źródła sygnału taktującego i jego zbocza aktywnego. Konfiguracja bitów analogicznie jak dla Timera/Licznika0. 15

Rys. 7. Schemat blokowy Timera/Licznika1 (TC1) TCNT1H i TCNT1L (Timer/Counter1) rejestr Timera/Licznika1 - $2D/$2C 16-bitowy rejestr TCNT1 przechowuje aktualny stan Timera/Licznika1 TCNT1H starszy bajt, TCNT1L młodszy bajt. Jest zarówno dostępny do zapisu jak i odczytu. Gdy zapis do rejestru TCNT1 następuje w chwili wystąpienia impulsu zegarowego, najpierw będzie wykonane zliczenie, później zaś rejestr zostanie ustawiony zgodnie z zapisaną daną. 16

Jedną z interesujących funkcji Licznika/Timera1 jest moŝliwość przechwytywania (capture). Jeśli TC1 pracuje w tym trybie, to podanie impulsu wyzwalającego na wejście ICP powoduje przepisanie aktualnego stanu licznika TC1 do rejestrów ICR1H i ICR1L. Tak więc, po wyzwoleniu licznik zlicza w ustalonym cyklu, a jego stan w chwili wyzwolenia został zatrzaśnięty w 16-bitowym rejestrze ICR1. Układ TC1 oprócz typowych trybów pracy jako zwykły timer lub licznik, umoŝliwia dodatkowo realizację funkcji: porównywania wyjścia (Output Compare), modulacji PWM (Pulse Width Modulation - modulacja szerokości impulsu), przechwytywania wejścia (Input Capture). Moduły licznikowe mogą dostarczać informacji o zdarzeniach, mających miejsce w trakcie ich pracy (np. o przepełnieniu, zgodności porównania). Sprawdzenie, czy dane zdarzenie miało miejsce, moŝe odbywać się poprzez odczyt specjalnych znaczników stanu (ang. polling - odpytywanie) lub na drodze mechanizmów przerwaniowych. Do obsługi przerwań wprowadzono rejestry je uaktywniające i rejestry zawierające znaczniki stanu: W rejestrach TIMSK przechowywane są bity, których ustawienie uaktywnia wybrane przerwania. Rejestry o oznaczeniach TIFR zawierają natomiast znaczniki ich Ŝądań - znaczniki informujące zarazem o wystąpieniu danego zdarzenia. 3.2.1. Mechanizm buforowy W celu zapewnienia jednoczesności zapisu i odczytu obu bajtów rejestrów 16-bitowych (np. TCNTn, ICRn, OCRnx) zastosowano mechanizm dostępu buforowanego. Wprowadzono specjalny rejestr tymczasowy (niewidoczny dla programisty), słuŝący do przechowywania starszego bajtu rejestru, na którym przeprowadzana jest operacja zapisu lub odczytu. W celu modyfikacji zawartości rejestru buforowanego w pierwszej kolejności konieczne jest zapisanie jego starszego bajtu (MSB), co w rzeczywistości spowoduje załadowanie rejestru tymczasowego. Następnie zapisana musi być część młodsza (LSB), co wywoła automatyczne i jednoczesne ładowanie obu części rejestru 16-bitowego. 17

Przykład 2. Zapis buforowanego rejestru 16-bitowego (TCNT1) cli ; wyłącz obsługę przerwań ldi R16, low(1234) ;ładuj rejestr pomocniczy R16 LSB wartości zapisywanej ldi R17, high(1234) ;ładuj rejestr pomocniczy R17 MSB wartości zapisywanej out TCNT1H, R17 ;ładuj bufor tymczasowy out TCNT1L, R16 ;zapisz 16-bitowy rejestr TCNT1 wartością 1234 sei ;włącz obsługę przerwań Odczyt prowadzony powinien być w kolejności odwrotnej. Najpierw odczytywany musi być bajt młodszy (LSB) - powoduje to jednoczesne zapisanie zawartości części starszej w rejestrze tymczasowym. Następujący później odczyt bajtu starszego powoduje w rzeczywistości pobranie zawartości bufora. Przykład 3. Odczyt buforowanego rejestru 16-bitowego (TCNT1) cli ;wyłącz obsługę przerwań in R16, TCNT1L ;odczytaj LSB rejestru TCNT1, a MSB zapisz w buforze in R17, TCNT1H ;pobierz MSB TCNT1 z bufora tymczasowego sei ;włącz obsługę przerwań PoniewaŜ ten sam rejestr tymczasowy wykorzystywany jest przy dostępie do róŝnych rejestrów buforowanych, zalecane jest, aby w czasie korzystania z niego obsługa przerwań pozostawała wyłączona. Działanie to pozwala wyeliminować ryzyko przypadkowego zniszczenia zawartości rejestru tymczasowego przez podprogram obsługi przerwania. 3.3. Tryb pracy normalnej Tryb pracy normalnej jest wybierany poprzez odpowiednią nastawę znaczników WGMn z rejestru TCCRn (TCCRnx) - takie ustawienie wymaga zwykle ich wyzerowania (np. WGM13...WGM10=0000). Jeśli bity CSn z tego samego rejestru są odpowiednio ustawione (wybierają jedno z aktywnych źródeł sygnału taktującego), licznik zaczyna pracować. W trybie pracy normalnej układ licznikowy zlicza do wartości maksymalnej (wynikającej z pojemności licznika, a więc do 255 lub 65535), a przepełnienie powoduje rozpoczęcie zliczania od początku (od zera). Zdarzenie przepełnienia moŝe być wykorzystywane do generacji przerwań. W kaŝdym momencie pracy licznika moŝliwe jest sprawdzenie jego stanu przez odczyt rejestru TCNTn. RównieŜ zapis tego rejestru w normalnym trybie pracy nie wprowadza Ŝadnego ryzyka. NaleŜy jedynie zwrócić uwagę na fakt, Ŝe w przypadku liczników 16- bitowych rejestr TCNTn jest buforowany. 18

Przykład 4. Uaktywnienie 16-bitowego licznika1 w trybie normalnym (ATmega16) in R16, TCCR1A ;operacje na rejestrze pomocniczym cbr R16, 1<<WGM11 cbr R16,1<<WGM10 out TCCR1A, R16 ;włącz tryb normalny poprzez odpowiednie ustawienie ;znaczników WGMn w rejestrze TCCR1A ldi R16, (1<<CS12) (0<<CS11) I (1<<S10) (0<<WGM13) I (0<<WGM12) out TCCR1B, R16 ;skonfiguruj licznik 1. ;licznik od tej pory zlicza z częstotliwością systemową ;podzieloną w stosunku 1:1024 moŝliwy jest odczyt lub ; zapis wartości zliczonej cli in R16, TCNT1L in R17, TCNT1H sei ;mechanizm buforowy - ładowanie wartości zliczonej ;do rejestrów R16 (LSB) i R17 (MSB) 3.4. Porównywanie Tryb pracy normalnej jest dość ubogi i w czystej postaci rzadko wykorzystywany. Dla jego rozszerzenia wprowadzono moŝliwość porównywania wartości zliczonej z wartością ustaloną. Niektóre moduły licznikowe umoŝliwiają przy tym porównywanie z wieloma wartościami stałymi, do których przechowywania słuŝą rejestry OCRnx. Zrównanie zawartości rejestru licznikowego (TCNTn) z zadaną wartością ustaloną (z OCRnx) moŝe wywoływać specjalne przerwanie i powodować zmianę na przydzielonym licznikowi wyjściu o dodatkowym oznaczeniu OCn lub OCnx (np. OC1A, OC1B - w przypadku, gdy dany licznik ma dwa moduły porównujące).. Do określenia sposobu, w jaki moduł licznikowy powinien nimi sterować, słuŝą znaczniki COMn lub COMnx z rejestru TCCRn (TCCRnx). Wystąpienie zgodności pomiędzy zawartościami rejestrów OCRnx i TCNTn - w zaleŝności od nastawy COMnx - moŝe mieć następujący wpływ na linię OCnx: brak operacji (COMnx1...COMnx0=00), zmiana stanu linii na przeciwny (COMnx1...COMnx0=01), ustawienie stanu niskiego (COMnx1...COMnx0=10), ustawienie stanu wysokiego (COMnx1...COMnx0=11). W pierwszym przypadku linia OCnx jest odłączona od modułu licznikowego i pracuje jako zwykły port wejścia-wyjścia. Inne ustawienie bitów COMnx powoduje juŝ, Ŝe stan znacznika PORTxn (z rejestru PORTx) odpowiadającego linii OCnx jest ignorowany, a kontrolę nad wyprowadzeniem przejmuje licznik. 19

Jeśli licznik pracuje w trybie innym niŝ PWM (np. normalnym), moŝliwe jest wymuszenie zmiany stanu na wyprowadzeniu OCn (OCnx) tak, jakby wystąpiło zdarzenie zgodności porównania. Dokonuje się tego, zapisując odpowiedni znacznik FOCn (FOCnx) w rejestrze TCCRn (TCCRnx) wysoką wartością logiczną. Operacja ta nie generuje przerwania wynikającego ze zgodnego porównania, a jedynie zmienia stan linii OCnx w sposób zaleŝny od nastawy znaczników COMnx z rejestrów TCCRnx. Przykład 5. Automatyczna generacja sygnału wyjściowego (ATmega16).. ;zakładamy, Ŝe licznik 0 pracuje w trybie normalnym ldi ;R16, 100 ;ładuj rejestr pomocniczy out OCR0, R16 ;wartość porównywana wynosi 100 in R16, TCCR0 ;operacje na rejestrze pomocniczym cbr R16, 1<<COM01 sbr R16, 1<<COM00 out TCCR0, R16 ;załaduj COM01...00=01 w rejestrze TCCR0 sbi DDRB, DDB3 ;linia OC0 pracuje jako wyjście (OC0=PB3).. ;od tej chwili wyjście OC0 zmienia swój stan ;logiczny, gdy TCNT0 przekracza wartość 100 3.5. Przechwytywanie MoŜliwością niejako komplementarną dla porównywania jest tzw. przechwytywanie (dostępne tylko w przypadku liczników 16-bitowych). Polega ono na automatycznym przepisaniu zawartości głównego rejestru licznika (TCNTnH i TCNTnL) do specjalnego rejestru ICRx (dokładniej rzecz ujmując, do ICRxH i ICRxL) w ściśle określonej chwili. Zdarzeniem wyzwalającym taką operację moŝe być wystąpienie narastającego lub opadającego zbocza w sygnale na wyprowadzeniu o dodatkowym oznaczeniu ICPn. Określenie parametru wyzwalającego polega na odpowiedniej nastawie bitu ICESn w rejestrze TCCRn (TCCRnx), którego ustawieniu odpowiada wybór zbocza narastającego. Sygnał z wejścia ICPn jest próbkowany w kaŝdym okresie zegarowym Przykładowo, funkcja ta pozwala na określenie chwili występowania pewnych zdarzeń zewnętrznych, umoŝliwia pomiar okresu lub wypełnienia dołączonego sygnału itd. KaŜde zdarzenie przechwycenia moŝe takŝe generować dedykowane mu przerwanie. 20

Rejestr ICRx jest 16-bitowym rejestrem buforowanym, którego odczyt powinien być dokonywany poczynając od bajtu młodszego. Przykład 6. Oczekiwanie na zdarzenie przechwycenia (ATmega16) ; zakładamy, Ŝe licznik 1 pracuje w trybie normalnym ; i Ŝe nie korzystamy z mechanizmów przerwaniowych cbi DDRD, DDD6 ; linia ICP1 działa jako wejście (ICP1=PD6) in R16, TCCR1B ;operacje na rejestrze pomocniczym sbr R16, 1<<ICES1 out TCCR1B, R16 ; zbocze narastające na ICP1 wywołuje przechwytywanie ldi R16, 1<<ICF1 out TIFR, R16 ; zeruj znacznik przechwycenia - ICF1 Czekaj: in R16, TIFR sbrs R16, ICF1 rjmp Czekaj ; pętla oczekująca na zdarzenie przechwycenia ; dalsza część programu jest wykonywana po przechwyceniu ldi R16, 1<<ICF1 out TIFR, R16 ; zeruj znacznik przechwycenia - ICF1 in R16, ICR1L ;ładuj LSB wartości przechwyconej do rejestru R16 in R17, ICR1H ;ładuj MSB wartości przechwyconej do rejestru R17 21