\chapter{Budowa mikrokontrolerów AVR ATmega}

\section{Architektura}

Mikrokontrolery serii AVR zaprojektowane zostały z myślą o językach wysokiego poziomu. Ich budowa konsultowana była ze specjalistami w dziedzinie implementacji języka C. Dzięki temu otrzymano wygodny dla użytkownika, elastyczny i przede wszystkim wydajny rdzeń, pomimo iż skonstruowany jest on w architekturze 8 bitowej. 

Układy AVR zbudowane są w oparciu o architekturę RISC\footnote{ang. Reduced Instruction Set Computers - komputery o zredukowanej liczbie rozkazów}. Rdzeń mikrokontrolera dysponuje 131 instrukcjami, z których większość wykonywana jest w jednym cyklu zegarowym. Dzięki zastosowaniu układu sprzętowego operacje dzielenia wykonywane są jedynie w dwóch cyklach zegarowych.

Większość układów dysponuje zarówno interfejsem ISP\footnote{ang. In-System Programming} jak i JTAG pozwalającym na debugowanie układu w czasie jego pracy.

Do standardowych peryferiów każdego mikrokontrolera można zaliczyć:
\begin{itemize}
 \item 8 i 16 bitowe liczniki pracujące w tybach: preskalera, komparatora
 \item Licznik czasu rzeczywistego z oddzielnym oscylatorem
 \item kanały PWM
 \item 8-kanałowy, 10-bitowy przetwornik analogowo cyfrowy (w tym kanały różnicowe)
 \item konparator analogowy
 \item interfejs SPI
 \item Watchdog
\end{itemize}

\begin{figure}[!ht]
	\begin{center}
		\includegraphics[width=15cm]{img/atmega_architektura}
		\caption{Budowa mikrokontrolera ATmega16 \cite{avr}}
		\label{atmega_architektura}
	\end{center}
\end{figure}

\clearpage
\section{Porty wejścia/wyjścia}
Porty wejścia-wyjścia są podstawowym elementem komunikacyjnym mikrokontrolera. W przypadku układów AVR są one bardzo rozbudowane lecz ich programowanie nie sprawia większych problemów. Charakteryzują się one następującymi właściwościami: 
\begin{itemize}
\item dwukierunkowość
\item trójstanowość (patrz tabela \ref{table:avr_io})
\item opcja wewnętrznego podciągania (należy ustawić flagę PUD w SFIOR\footnote{ang. Special Function I/O Register})
\item duża wydajność prądowa stopni wyjściowych
\item symetryczna charakterystyka wyjściowa
\item możliwość zmian linii na poziomie bitowym
\end{itemize}
Każdy mikrokontroler ATmega posiada kilka osobnych portów wejścia-wyjścia składających się z conajmniej ośmiu konfigurowanych niezależnie linii. Większość lini jest współdzielona z innymi peryferiami dlatego należy uważnie projektować układy. Każdy z portów dysponuje trzema rejestrami:
\begin{itemize}
 \item PORT - Rejestr danych
 \item DDR (ang. Data Direcion Register) - Rejestr kierunkowy
 \item PIN - Rejestr wejściowy portu
\end{itemize}

\begin{table}[!h]
 \caption{Konfiguracje linii wyjściowych \cite{baranowski_avr}}
 \centering
 \renewcommand{\arraystretch}{1.5}
 \begin{tabular}{c|c|c|c|l}
 \hline\hline
 DDR$xn$ & PORT$xn$ & PUD & Tryb & Opis \\ [0.5ex]
 \hline
 0 & 0 & x & wejście & Stan wysokiej impedancji (Hi-Z)\\
 0 & 1 & 0 & wejście & Podciągnięcie do zasilania\\
 0 & 1 & 1 & wejście & Stan wysokiej impedancji (Hi-Z)\\
 1 & 0 & x & wyjście & Wyjście w stanie niskim (Sink)\\
 1 & 1 & x & wyjście & Wyjście w stanie wysokim (Source)\\
 \hline
 \end{tabular}
 \\[1.5ex] Gdzie $n$ oznacza port (np. A) a $x$ oznacza linię (np. 0).
 \label{table:avr_io}
\end{table}

Dokładne informacje o portach wejścia-wyjścia można znaleźć w dokumentacji konkretnego układu. Specyfikacje techniczne dla układów ATmega8, ATmega16 oraz ATmega32 znajdują się na załączonej płycie CD w katalogu \textit{$\backslash$dokumenty$\backslash$AVR$\backslash$}


\clearpage
\section{Przerwania}
Przerwanie jest to sygnał generowany przez układy wewnęrzne (przerwanie wewnętrzne), zewnętrzne (przerwanie zewnętrzne) lub sam program (przerwanie programowe) powodujący wstrzymanie aktualnie wykonywanego programu i przejście do procedury obsługi danego przerwania. Po zakończeniu wykonywania procedury obsługi wykonywanie programu jest wznawiane. Miejsce w pamięci, gdzie znajduje się procedura obsługi przerwania jest zdefiniowane sprzętowo i nazywa się wektorem przerwania. Listę wektorół przerwań można znaleźć w dokumentacji mikrokontrolera.

\begin{figure}[!ht]
	\begin{center}
		\includegraphics[width=12cm]{img/interrupt}
		\caption{Obsługa przerwania}
		\label{interrupt}
	\end{center}
\end{figure}


Ponieważ wiele peryferiów ma możliwość generowania przerwań, wszystkie z nich są domyślnie zablokowane. Odblokowanie ich następuje poprzez wywołanie odpowiedniego kodu poprzez program mikrokontrolera. Każde z przerwań może być maskowane przez kasowanie bitów w odpowiednich rejestrach i w rejestrze statusu. Aby zapobiec nakładaniu się przrwań posiadają one priorytety.


Rejestry systemu obsługi przerwań:
\begin{itemize}
 \item TIFR - Znaczniki przerwania z liczników/czasomierzy
 \item TIMSK - Maska przerwań liczników/czasomierzy
 \item GIMSK - Globalna maska przerwań 
\end{itemize}
\clearpage
\section{Układy licznikowe}
Układy licznikowe to prawdopodobnie najczęściej wykorzystywane układy peryferyjne mikrokontrolerów ``Najczęściej służą one do odmierzania czasu, zliczania zdarzeń, generacji przebiegów o zmiennej częstotliwości i wypełnieniu.'' \cite{baranowski_avr}. 

Rodzina mikrokontolerów AVR jest dobrze wyposażona w tego typu układy. Najprostrze z nich wyposażone są w conajmniej 2 układy licznikowe. Firma atmel przyjęła stałe oznaczenie dla liczników znajdujących się w urządzeniach, liczniki 8-bitowe oznaczone są cyframi 0 i 2, natomiast 16-bitowe - 1 i 3. W dokumentacji technicznej są one nazywane układami \textit{Timer/Counter}. 

``Każdy z układów licznikowych ma minimum kilka rejestrów funkcyjnych, którw służą do nastawy parametrów pracy i informują o aktualnym stanie danego licznika. Ostatni człon nazwy takiego rejestru tworzy najczęściej cyfre, określająca numer przyporządkowanego mu licznika - nie jest to jednak regułą. Podobnie jest w przypadku zawartych w rejestrach znaczników - one zawsz są oznaczone cyfrą informującą o tym, którego licznika dotyczą.'' \cite{baranowski_avr}

Podstawowym rejestrem przyporządkowanym każdemu licznikowi jest \textbf{TCNTn}, gdzie \textbf{n} oznacza numer licznika. ``Zawiera on aktualną wartość zliczoną przez licznik i może być rejesterm 8- lub 16- bitowym, zależnie od typu licznika. W drugim przypadku TCNTn tworzą rejestry \textbf{TCNTnH} (MSB\footnote{Most Significant Bit - ang. najbardziej znaczący bit}) i \textbf{TCNTnL} (LSB\footnote{Least Significant Bit - ang. najmniej znaczący bit}), z których pierwszy jest rejestrem buforowanym. Cecha ta powoduje, że oba rejestry są zapisywane i odczytywane zawsze jednocześnie, mimo 8-bitowej architektury mikrokontrolera. [...]

Niemalże wszystkie liczniki umożliwiają porównywanie wartości zliczanej z wartością ustaloną. Do przechowywania tej ostatniej służy rejestr \textbf{OCRn} lub rejestry \textbf{OCRnx} (zany licznik może mieć ich bowiem kilka, np. OCR1A, OCR1B, OCR1C) Podobnie jak w przypadku głównego rejestru licznikowego, również OCRnx mogą mieć postać 8- i 16-bitową (w drugim przypwadku podzielone są one na \textbf{OCRnxH} i \textbf{OCRnxL}).Mechanizm buforowy i tutaj ma zastosowanie, ale odnosi się tylko do operacji zapisu.

16-bitowe układy licznikowe mają funkcję przechwytywania aktualnej wartości licznika w skutek wykrycia pewnych zdarzeń wewnętrznych. Do przetrzymywania wartości ''przechowywanej`` służą rejestry \textbf{ICRnH} i \textbf{ICRnL}. Tworzą one kolejny, 16-bitowy rejestr buforowany.

Rejestrami, które służą do do nastawy trybu pracy liczników, są \textbf{TCCRn} (lub \textbf{TCCRnx} - niektóre liczniki wymagają bowiem większej ich liczby).  Przechowywane są w nich bity \textbf{CSn} (zwykle trzy dla jednego modułu licznikowego, np. CS00, CS01, CS02), określające źródło sygnału taktującego przyporządkowany im licznik (ich znaczenie jest zależne od typu mikrokontrolera i rodzaju licznika). Bity o oznaczeniu \textbf{WGMn} (zwykle dwa lub cztery dla jednego modułu np. WGM10, WGM11, WGM12 i WGM13) określają natomiast tryb pracy danego licznika (normalny, CTC, PWM). Znaczniki \textbf{COMn} (zwykle ich para, np COM00 i COM01) pozwalają wybrać sposób automatycznej generacji sygnałów wyjściowych, a ich znaczenie jest zależne od nastawy bitów WGMn.'' \cite{baranowski_avr}

\newpage

\clearpage
\section{Programowanie}
Pamięć programu orazraz bity sterujące (\textbf{\textit{Fuse bits}} wszystkich układów serii AVR mogą być programowane conajmniej na dwa sposoby. ``Programowanie to może odbywać się w urządzeniu, w którym mikrokontroler pracuje lub w specjalnym programatorze. Programowania w systemie ISP\footnote{ang. In System Programming} dokonuje się najczęściej poprzez interfejs szeregowy \textbf{SPI} (czasem stosowany jest JTAG). $[\cdots ]$ 

Programatory SPI umożliwiają programowanie układu w urządzeniu docelowym (tryb ISP), co stanowi duże udogodnienie. Tryb ISP jest dostępnu, ponieważ interfejs ISP używa tylko trzech linii sygnałowych. Liniami tymi są: \textbf{SCK} (linia zegarowa), \textbf{MISO} (szeregowe wyjście), \textbf{MOSI} (szeregowe wejście). ''\cite{baranowski_avr}

Na rysunku \ref{ISP_Polaczenie} przedstawiono układ połączenia interfejsu programowania do układu. Ważne jest aby współdzielone linie portu nie zakłócały procesu programowania.


\begin{figure}[!ht]
	\begin{center}
		\includegraphics[width=12cm]{img/ISP_Polaczenie}
		\caption{Sposób podłączenia programatora ISP do mikrokontrolera w układzie docelowym \cite{baranowski_avr}}
		\label{ISP_Polaczenie}
	\end{center}
\end{figure}

``Poza interfejsami programowania większość mikrokontrolerów ATmega wyposażono w tzw. interfejs uruchomieniowy\footnote{ang. debug interface}, którym jest \textbf{JTAG} lub \textbf{debugWIRE}. Ten ostatni jest najnowszym wynalazkiem firmy Atmel i pozwala na transmisję jednoprzewodową.''\cite{baranowski_avr}

%\clearpage
%\section{Parametry elektryczne}
%Wybrane parametry elektryczne układów ATmega przedstawione są w poniższej tabeli.