\documentclass[12pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\usepackage[table,dvipsnames]{xcolor}

\definecolor{tablehead}{hsb}{0,0,0.9}

\title{Pinlock: Dokumentation}
\subtitle{Mikrocontroller-Seminar}
\author{Leonard Kugis, Mattes Melius}

\begin{document}

\maketitle

\tableofcontents

\newpage

\section{Idee}

\section{Hardware}

\subsection{Platinenaufbau}

\subsection{Mikrocontroller ATmega16A}

\subsection{Sonstige Komponenten}

\section{Software}

Das Programm wurde in AVR-Assembler geschrieben, mit Assemblerdirektiven
für den \emph{Avra}-Assembler.

\subsection{Grundprinzip}

Nach Zurücksetzen des Mikrocontrollers durchläuft das Programm eine Initialisierungsroutine.
Diese beinhaltet im Wesentlichen folgende Schritte:

\begin{enumerate}
  \item Initialisierung des Stackpointers mit den Grenzen des verfügbaren RAMs
  \item Konfiguration der GPIO-Ports
  \item Initialisierung der Displays
  \item Lesen des Zugangscodes aus dem EEPROM
\end{enumerate}

Anschließend wird eine endlose Hauptschleife durchlaufen, die folgende Aktionen
periodisch ausführt:

\begin{enumerate}
  \item Warte 12240 Zyklen.
  \item Lese alle Tasten der Eingabematrix aus.
  \item Ermittle Änderungen des neuen Tastenstatus zu dem alten Tastenstatus.
  \item Bei positiver Flanke (Taste war vorher nicht gedrückt und ist jetzt gedrückt):
    Behandle den Tastendruck bezüglich des aktuellen Zustands (s.u.).
  \item Puffere den neuen Tastenstatus.
\end{enumerate}

Die Behandlung der (neu) gedrückten Taste bezüglich des aktuellen Zustandes erfolgt nach der
in Abbildung~\ref{fig:states} dargestellten \emph{Finite-State-Machine} (FSM).
Dabei folgt die Notation der Transitionsbedingungen dem Schema \colorbox{lightgray}{\texttt{<Taste> / <Wesentliche Aktionen>}}.
Die Tastendarstellungen innerhalb des Programmes unterliegen dabei der Zuordnung in
Tabelle~\ref{tbl:keymap}.
Die Zustände sind dabei nach folgendem Schema benannt:

\begin{tabular}{r@{: }l r@{: }l}
  \texttt{A} & \emph{Authenticating}, Authentifizierung findet gerade durch Codeeingabe statt \\
  \texttt{AS} & \emph{Authentication Submitted}, Code wurde bestätigt und wird überprüft \\
  \texttt{AD} & \emph{Authenticated}, Benutzer ist authentifiziert und hat Zugriff \\
  \texttt{C} & \emph{Change}, Benutzer ändert den Zugriffscode
\end{tabular}

\begin{figure}[!htb]
  \centering
  \includegraphics[width=0.7\linewidth, keepaspectratio]{resources/states}
  \caption{FSM der Behandlung von Tastendrücken (schematisch)}
  \label{fig:states}
\end{figure}

\begin{table}[!htb]
  \centering
  \begin{tabular}{|c|c|}
    \hline
    \rowcolor{tablehead} Taste extern & Taste intern \\ \hline
    \texttt{0..9} & \texttt{0x00..0x09} \\ \hline
    \texttt{A..D} & \texttt{0x0A..0x0D} \\ \hline
    \texttt{*} & \texttt{0x0E} \\ \hline
    \texttt{\#} & \texttt{0x0F} \\ \hline
  \end{tabular}
  \caption{Zuordnung von externen zu internen Tastendarstellungen}
  \label{tbl:keymap}
\end{table}

\subsection{Funktionen}

Das Auslesen der Tasten der Eingabematrix erfolgt über die Schieberegister:
eines (Serial-In-Parallel-Out) zur Selektion der auszulesenden Zeile und eines (Parallel-In-Serial-Out)
zum eigentlichen Auslesen selbiger. Dies wird innerhalb der Ausleseroutine mit jeder
Zeile gemacht, um gedrückte Tasten zu identifizieren.

\section{Bedienung}

\end{document}
