
%\newpage
\section{Selbsttest-Funktion}
\label{sec:selftest}
Beginnend mit Version 0.9k habe ich eine Selbsttest-Funktion eingebaut.
Die Benutzung ist einfach.
Wenn Sie Prüfspitzen mit Klemmen verwenden, klemmen Sie alle Klemmen auf ein unisoliertes Stück Draht und drücken Sie
den Start-Taster.
Das Programm bemerkt die kurzgeschlossenen Klemmen und startet den Selbsttest, wenn innerhalb von
zwei Sekunden durch einen Tastendruck der Starttaste bestätigt wird. Diese Bestätigung ist eingebaut
worden, damit der Tester nicht von selbst beim Messen von einem defekten Transistor in den Selbsttest geht.
Nach Beenden des Selbsttestes wird der Tester mit normaler Messung fortfahren.
Wenn kein Bauteil angeschlossen ist, wird der TransistorTester mit der
Meldung ,,kein,unbek. oder defektes Bauteil'' enden.
Man kann die Selbsttest-Funktion nur für einen ATmega168 oder ATmega328 wählen.
Bevor die Testschritte durchgeführt werden, wird zuerst der Null-Widerstand für alle drei Testpin-Kombinationen
(T1:T3, T2:T3 und T1:T2) bestimmt. Diese Nullwiderstände werden für die zukünftigen ESR- und Widerstands-Messungen
unter \(10\Omega\) berücksichtigt. 
Es werden nur Nullwiderstandswerte unter \(0.90\Omega\) akzeptiert, da diese Korrekturwerte bei der Messung 
von Widerständen über \(10\Omega\) nicht berüchsichtigt werden.
Bei der Verwendung von Kabeln muß also auf entsprechend
geringe Widerstandswerte geachtet werden.
Falls die später gemessenen Widerstandswerte den jeweiligen Nullwiderstand um mehr als \(0,2\Omega\) unterschreiten,
wird der Tester auf ,,unkalibriert'' zurückgesetzt. 
Dies wird durch den aktivierten Positionszeiger (Cursor)  beim Testen angezeigt.
Die einzelnen Schritte der Selbsttestfunktion werden für Test~1 bis Test~7 in Zeile~1 des LC-Displays mit dem Buchstaben T
gefolgt von der Schritt-Nummer dargestellt.
Die Schritte 1 bis 7 werden viermal wiederholt, bevor das Programm zum nächsten Schritt geht.
Aber wenn man den Start Taster gedrückt hält, wenn ein Durchlauf beendet wird, wird dieser Test nicht
mehr wiederholt.
Wenn man den Taster während dem gesamten Selbsttest gedrückt hält, wird jeder Schritt nur einmal ausgeführt.

Ohne die AUTO\_CAL-Option werden in jedem Schritt nur Messergebnisse dargestellt, es wird keine Fehleranalyse durchgeführt.
Man  muss die Ergebnisse selbst interpretieren.
An dieser Stelle möchte ich noch einen wichtigen Hinweis geben. Führen Sie niemals Messungen mit
eingestecktem ISP-Stecker durch!
Die ISP-Schnittstelle stört die Messungen.

\vspace{1cm}
Hier ist die Liste der derzeit eingebauten Tests:
\vspace{1cm}

\begin{enumerate}

\item {\bf Messung der \(1,3V\) (oder \(1,1V\)) Referenzspannung (band gap Reference).} In Zeile~1 wird der Text ,,Ref='' und die
gemessene Spannung in mV angezeigt.
Für den ATmega8 sollte die gemessene Spannung nahe bei \(1,3V\) liegen, für die anderen Prozessoren liegt
die Referenzspannung normal um die \(1,1V\).
Die zweite Zeile zeigt den resultierenden Faktor für die Kapazitäts-Messung mit dem \(470k\Omega\) Widerstand.

\item {\bf Vergleich der \(680\Omega\) Widerstände.} 
In Zeile~1 wird der kryptische Text  ,,+RL- 12 13 23'' angezeigt. Das bedeutet:
RL ist eine Kurzform für Resistor Low, was die \(680\Omega\) Widerstände meint. Die ,,12'' steht für: 
Widerstand am Pin~1 ist verbunden mit VCC (+) und Widerstand am Pin~2 ist verbunden mit GND (-). 
Das Ergebnis dieser Messung steht in Zeile~2 an erster Stelle als Differenz zum theoretischen Wert.
 In Zeile~1 folgt nun ,,13'', was bedeutet, dass der Widerstand von Pin~1 wieder nach VCC verbunden ist,
aber dass jetzt der \(680\Omega\) Widerstand von Pin~3  mit GND verbunden ist.
Das Ergebnis steht in Zeile 2 an der mittleren Stelle als Differenz zum theoretischen Wert.

Die letzte Messung dieses Tests ,,23'' bedeutet, dass nun der Widerstand von Pin~2 mit VCC verbunden ist und
der Widerstand von Pin~3 mit GND verbunden ist.
Das Ergebnis steht in der zweiten LCD-Zeile an letzter Stelle als Differenz zum theoretischen Wert.
Ich möchte daran erinnern, dass die Auflösung des ADC etwa \(4,88mV\) beträgt!
Die Messsituation wird auch in Abbildung~\ref{fig:test2} dargestellt.
Der theoretische Wert ergibt sich im Hinblick auf die internen Port-Widerstände wie folgt:
\(\frac{5001 \cdot  (19+680)}{ (19+680+680+22)} = 2493\) .

\begin{figure}[H]
\centering
\includegraphics[width=17cm]{../FIG/Test2.eps}
\caption{Vergleich der \(680\Omega\)-Widerstände }
\label{fig:test2}
\end{figure}

\item {\bf Vergleich der \(470k\Omega\) Widerstände.}
Jetzt zeigt das Display in Zeile 1 ,,+RH- 12 13 23''. Das gleiche Verfahren wie in Schritt~2 wird wiederholt mit den
 \(470k\Omega\)-Widerständen (Symbol RH).
Die Ergebnisse werden als Differenz zu  \(\frac{VCC \cdot (19 + 470000]}{ (19 + 470000 + 470000 + 22)} \) für alle Kombinationen dargestellt.

\item In diesem Schritt wird nichts gemessen, es erfolgt lediglich die {\bf Anweisung ,,isolate Probe!''},
was bedeutet, dass es nun Zeit ist die Klemmen zu trennen (vom blanken Draht lösen).
Dieser Schritt wird nur beendet, wenn Sie die Verbindung zwischen den Testports getrennt haben.

\item Dieser Schritt testet die {\bf Fähigkeit von mit GND (-) verbundenen \(470k\Omega\)-Widerständen (H) die Testpins auf GND zu ziehen.}
Zeile 1 zeigt den Text ,,RH-''.
Zeile 2 sollte für alle drei Pinne  Null mV anzeigen.

\item Dieser Schritt testet die {\bf Fähigkeit von mit VCC (+) verbundenen \(470k\Omega\)-Widerständen (H) die Testpins auf VCC zu ziehen.}
Zeile 1 zeigt den Text ,,RH+''.
Der bestmögliche mV Wert für die drei Messungen wäre 0 in Zeile~2, da die Diffenz zu VCC dargestellt wird.
Große Abweichungen vom Idealwert für Schritt 5 und 6 sind Fehler wie Isolations-Problem, Flussmittelreste oder beschädigter Port.

\item {\bf Dieser Schritt testet die Spannungen der \(470k\Omega / 680\Omega\)  Widerstandsteiler.}
Zeile 1 zeigt den Text ,,RH/RL''.
Für alle drei Testpins wird die Abweichung von der erwarteten Spannung eines \(470k\Omega\) / \(680\Omega\) \(5V\)-Teilers 
in Zeile 2 des Displays ausgegeben.
Abweichungen von mehr als einige mV weisen auf einen Bestückungsfehler der Widerstände hin.

\item {\bf Messung des Innenwiderstandes eines auf GND geschalteten Ausgangs.}
Dieser und die folgenden Schritte werden nur bei gewählter AUTO\_CAL-Option durchgeführt.
Die internen Port-C-Widerstände von auf GND (-) geschalteten Ausgängen werden mit dem Strom
der nach VCC (+) geschalteten \(680\Omega\) Widerstände gemessen, siehe Abbildung~\ref{fig:test7}.
Es werden nur die drei Pins des ADC-Ports vermessen, die Widerstands-Ports  PB0, PB2 und PB4 können nicht
ohne Veränderung der Hardware gemessen werden.
Es wird angenommen, dass die Portwiderstände von unterschiedlichen Ports nahezu identisch sind.
Der Widerstandswert wird im nächsten Schritt mit ausgegeben.
\begin{figure}[H]
\centering
\includegraphics[]{../FIG/Test7.eps}
\caption{Messung des Innenwiderstandes von auf GND geschalteten Port-C-Ausgängen.}
\label{fig:test7}
\end{figure}

\item {\bf Messung des Innenwiderstandes von auf VCC geschalteten Port-Ausgängen.}
Der benötigte Strom wird von auf GND geschalteten \(680\Omega\)-Widerständen geliefert.
Es ist die gleiche Messung wie die in Test~8 zur anderen Seite, wie in Abbildung \ref{fig:test8} gezeigt wird.
Der Innenwiderstand wird wie folgt berechnet:
Um den Strom zu berechnen: \((5001 - (Ergebnis von Test 8) - (Ergebnis von Test 9)) / 680\).
Die Widerstandswerte ergeben sich, wenn die gemessene Spannung durch diesen Strom dividiert wird.
Das Ergebnis für diesen Test wird dann in Zeile~1 mit dem Text ,,RI\_Hi='' in \(\Omega\) angezeigt, der Innenwiderstand
zur GND-Seite wird in Zeile~2 mit dem Text ,,RI\_Lo='' angezeigt.
Diese Werte werden ab Software-Version 1.06k bei jeder Messung neu bestimmt und hier nur dargestellt.
\begin{figure}[H]
\centering
\includegraphics[]{../FIG/Test8.eps}
\caption{Messung des Innenwiderstandes des auf VCC geschalteten Port-C-Ausgängen.}
\label{fig:test8}
\end{figure}

\item {\bf Messung des Nulloffsets der Kondensatormessung.}
Für die Pinkombinationen 1:3, 2:3 und 1:2 wird der Nullwert der Kondensatormessung in pF in Zeile~1
hinter dem Text ,,C0 '' ausgegeben.
In der Software wird ein Vorgabewert von circa \(39pF\) für die normale Messwertausgabe berücksichtigt.
Für die Ausgabe dieses Tests ist keine Korrektur berücksichtigt, es wird auch kein Nulloffset abgezogen.
Es werden auch die Nulloffsets für die umgekehrte Pinkombination ermittelt.
Die gefundenen Nulloffsets werden im EEPROM festgehalten, wenn alle Nulloffsets kleiner als \(190pF\) sind.
In Zeile 2 wird dann ein ,,OK'' ausgegeben.
Die gefundene Nulloffsets werden für die weiteren Kapazitäts-Messungen pinabhängig berücksichtigt.
Dabei wird überwacht, ob die gemessene Kapazität die festgehaltene Nullkapazität um mehr als \(20pF\) unterschreitet.
Wenn dies der Fall sein sollte, wird der Tester auf ,,unkalibriert'' zurückgesetzt.
Dies wird durch die Aktivierung des LCD-Positionszeigers (Cursor) beim nächsten Testen angezeigt.
Bitte beachten Sie, dass bei Veränderungen des Messaufbaus ein Neuabgleich sinnvoll ist.
So kann sich der Nulloffset durch Verwenden von Kabeln mit Klemmen um circa \(3pF\) gegenüber einem leeren
Sockel erhöhen.
Wenn der Tester mit der SamplingADC Funktion konfiguriert wurde, wird zusätzlich die Nullkapazität
für die SamplingADC Messmethode in doppelt so vielen Konfigurationen gemessen. 
Das kommt daher, weil die Nullkapazität in allen Pinkombinationen sowohl für den Ladevorgang als
auch für den Entladevorgang bestimmt wird.

\item {\bf Warten auf den Anschluss eines Kondensators an Pin~1 und Pin~3.}
Die Meldung ,,1 \mbox{\electricC}3 \textgreater \(100nF\)'' wird in Zeile 1 des Displays angezeigt.
Zur Vorbereitung der Messung des Spannungs-Offsets des analogen Komparators muss ein ausreichend großer
Kondensator zwischen Pin 1 und Pin 3 angeschlossen werden.
Es sollte ein Kondensator hoher Güte mit eine Kapazität zwischen \(100nF\) und \(20\mu F\) sein. 
Auf keinen Fall sollte man Elektrolyt-Kondensatoren verwenden.


\item {\bf Messung des Komparatoroffsets für den Abgleich der Kondensatormessung.}
Um den Offset des analogen Komparators zu bestimmen, muss ein Kondensator an Pin~1 und Pin~3 angeschlossen sein.
Der Kondensator wird für die Pufferung der Ladespannung bei der Kondensatormessung benötigt, um den Unterschied der 
Ladespannung zur internen Referenzspannung bestimmen zu können.
Bei erfolgreicher Messung wird der Korrekturwert kurz in Zeile 1 mit dem Text ,,REF\_C='' angezeigt und in den EEPROM geschrieben.

Wenn Sie die AUTOSCALE\_ADC-Option gewählt haben, wird die Verstärkung der ADC-Lesefunktion mit der
internen Referenzspannung abgeglichen. Das geschieht durch den Vergleich der Kondensatorspannung von unter \(1V\), einmal mit
der VCC-Referenz gemessen und einmal mit der internen Referenz.
Die gefundene Differenz wird in Zeile 2 mit dem Text ,,REF\_R='' angezeigt und ebenfalls im EEPROM festgehalten.
Der REF\_R\_KORR-Wert ist dann nur ein zusätzlicher Offset für diese automatisch gefundene Differenz.

\item {\bf Warten auf einen Kondensator für die Messung kleiner Induktivitäten}
Wenn der Tester mit der SamplingADC Funktion konfiguriert wurde, ist für die Messung kleiner Induktivitäten
ein Kondensator bekannter Größe für die Berechnung der Induktivität aus der Schwingfrequenz erforderlich.
Brauchbare Kapazitätswerte sind hierfür etwa \(10nF\) bis \(27nF\). Ein geeigneter Kondensator
sollte an Pin~1 und Pin~3 angeschlossen werden, wenn die Meldung ,,\mbox{1 \electricC 3 \(10-30nF\)(L)}'' in Zeile 1 des
Displays erscheint. Genau dieser Kondensator sollte für die Induktivitätsmessung der Spule
parallelgeschaltet werden, wenn diese Art der Induktivitätsbestimmung gewünscht wird.

\end{enumerate}

Am Ende der Selbsttest-Funktion wird der Text ,,Test End'' in Zeile~1 und die Versions-Nummer der Software in Zeile~2 angezeigt.
Wenn gewählt, wird ein {\bf 50~Hz Rechtecksignal} auf Testpin~2 generiert und das gegenphasige Signal auf Testpin~3.
Testpin~1 wird auf GND geschaltet. Der Strom für Testpin 2 und 3 wird mit \(680\Omega\) Widerständen begrenzt.
Angezeigt wird das durch die Ausgabe von ,,50Hz'' am Ende der Zeile~1.
Diese Ausgabe wird dreißig Mal mit jeweils 2~Sekunden Dauer durchgeführt.
Man kann die Zeit der Verzögerungs-Aufrufe prüfen, wenn man ein Oszilloskop oder einen
Frequenz-Zähler besitzt. Abbildung \ref{fig:Frequency50} zeigt ein Oszillogramm der ausgegebenen Pegel mit Quarz-Betrieb.

\begin{figure}[H]
\centering
\includegraphics[]{../PNG/Frequency50.png}
\caption{Oszillogramm der \(50Hz\) Ausgänge von Port 2 und 3}
\label{fig:Frequency50}
\end{figure}

Wenn man für die Takterzeugung keinen Quarz benutzt, können die
Ergebnisse der Kondensatormessung ungenau sein.
Eine genaue Taktfrequenz und genaue Wartezeiten sind wichtig für die Bestimmung von Kapazitätswerten.
Die Ausgabe des \(50Hz\)-Signals kann durch Gedrückthalten des Start-Tasters vorzeitig abgebrochen werden.
Dann fährt das Programm mit der normalen Messfunktion fort.

\subsection{Einige Selbsttest-Ergebnisse}

Die Ergebnisse des Selbsttests der 9 verschiedenen ATmega168-Prozessoren und der 6 ATmega328-Prozessoren
sind in den folgenden Abbildungen dargestellt. 

\begin{table}[H]
  \begin{center}
    \begin{tabular}{| l | c | c | c |}
    \hline
Test No. &  Messtyp    & Idealwert & Abbildung \\
    \hline
    \hline
Test 1 & band gap Ref  & 1100 & \ref{fig:SelfTref} \\
    \hline
Test 2 & RL Mitte & 0 & \ref{fig:SelfTMitL} \\
    \hline
Test 3 & RH Mitte & 0 & \ref{fig:SelfTMitH} \\
    \hline
Test 5 & RH Low &  0 & \ref{fig:SelfTlowH} \\
    \hline
Test 6 & RH High & 0 & \ref{fig:SelfTtopH} \\
    \hline
Test 8 & R out Lo & 131 & \ref{fig:SelfTRoL} \\
    \hline
Test 9 & R out Hi & 151 & \ref{fig:SelfTRoH} \\
    \hline
Test 10 & Cap0  & 30 & \ref{fig:SelfTcap} \\
    \hline
Test 11 & Referenz-Korrektur  & 0 & \ref{fig:SelfTrefKorr} \\
    \hline
    \end{tabular}
  \end{center}
  \caption{Verzeichnis der Selbsttest-Diagramme}
  \label{tab:test_m168} 
\end{table}

\begin{figure}[H]
  \centering
  \input{../GNU/SelfTref}
  \caption{Selbsttest: Referenz-Spannungen}
  \label{fig:SelfTref}
\end{figure}

\begin{figure}[H]
  \begin{subfigure}[b]{9cm}
    \centering
    \resizebox{9cm}{!}{\input{../GNU/SelfTMitL}}
    \caption{mit \(680 \Omega\)}
    \label{fig:SelfTMitL}
  \end{subfigure}
  ~
  \begin{subfigure}[b]{9cm}
    \centering
    \resizebox{9cm}{!}{\input{../GNU/SelfTMitH}}
    \caption{mit \(470 k\Omega\)}
    \label{fig:SelfTMitH}
  \end{subfigure}
  \caption{Selbsttest: Abweichung der Mittenspannung}
\end{figure}

\begin{figure}[H]
  \begin{subfigure}[b]{9cm}
  \centering
    \resizebox{9cm}{!}{\input{../GNU/SelfTbottomH}}
    \caption{mit \(470k\Omega\) auf \(0V\)}
    \label{fig:SelfTlowH}
  \end{subfigure}
  ~
  \begin{subfigure}[b]{9cm}
  \centering
    \resizebox{9cm}{!}{\input{../GNU/SelfTtopH}}
    \caption{mit \(470k\Omega\) auf \(5V\)}
    \label{fig:SelfTtopH}
  \end{subfigure}
  \caption{Selbsttest: Eingangsspannung}
\end{figure}

\begin{figure}[H]
  \begin{subfigure}[b]{9cm}
  \centering
    \resizebox{9cm}{!}{\input{../GNU/SelfTRiLo}}
    \caption{mit \(680\Omega\) auf \(5V\)}
    \label{fig:SelfTRoL}
  \end{subfigure}
  ~
  \begin{subfigure}[b]{9cm}
  \centering
    \resizebox{9cm}{!}{\input{../GNU/SelfTRiHi}}
    \caption{mit \(680\Omega\) auf \(0V\)}
    \label{fig:SelfTRoH}
  \end{subfigure}
  \caption{Selbsttest: Ausgangswiderstand}
\end{figure}

\begin{figure}[H]
  \centering
  \resizebox{9cm}{!}{\input{../GNU/SelfTcap0}}
  \caption{Selbsttest: Nullwert der Kapazitätsmessung}
  \label{fig:SelfTcap}
\end{figure}

\begin{figure}[H]
  \centering
  \resizebox{9cm}{!}{\input{../GNU/SelfTrefKorr}}
  \caption{Selbsttest: Korrekturwerte nach automatischer Kalibration}
  \label{fig:SelfTrefKorr}
\end{figure}

Zuletzt möchte ich die Differenzen der am AREF-Pin mit einem Multimeter
gemessenen Spannungen und der intern mit dem ADC gemessenen Referenzspannungen der
15 verschiedenen ATmegas und die mit dem automatischen Abgleich
gefundenen Korrekturspannung (REF\_R\_KORR) in Abbildung~\ref{fig:SelfTrefDiff} gegenüberstellen.
Sie können sehen, dass die Werte der automatischen Kalibration nahezu den extern
gemessenen Referenz-Spannungswerten folgen.

\begin{figure}[H]
  \centering
  \resizebox{9cm}{!}{\input{../GNU/SelfTrefDiff}}
  \caption{Selbsttest: Spannungsdifferenz der internen Referenz}
  \label{fig:SelfTrefDiff}
\end{figure}

