Merge branch 'master' of github.com:wieerwill/Informatik

This commit is contained in:
WieErWill 2021-11-02 14:48:22 +01:00
commit cd13805412
12 changed files with 862 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -47,6 +47,30 @@ Grundlage ist der piezoresestive Widerstandseffekt: Durch Zug/Druck nimmt der el
Die Widerstandsänderung ist linear abhängig von der Temperaturabhängigkeit des spez. Widerstandes, jedoch nicht linear abhängig von der mechanisch bedingten Änderung der
Abmessungen. Natürlich hängen die Längenänderung und die des Durchmessers zusammen. Der konkrete Zusammenhang ist jedoch durch die Konstruktion und das Material gegeben und kann nicht verallgemeinert werden. Da für die Messung allein die Längenänderung von Interesse ist, wird im weiteren nur diese betrachtet.
- $\frac{\delta R}{R}=k\frac{\delta l}{l}=k*\epsilon$, $\epsilon$-relative Dehnung
- $\epsilon=\frac{F}{EA}$, $F=\frac{\delta R}{R}*\frac{EA}{k}$, E-Elastizitätsmodul
- In der Praxis aus Kostengründen und wegen geringer Temperaturabhängigkeit meistens Konstant an (54% Cu, 45% Ni, 1% Mn mit $k=2,05$) verwendet
Messverfahren: Widerstandsmessung mit Brückenschaltung
- Wheatstone'sche Brücke: $U_A\rightarrow 0|_R \Rightarrow \frac{R_x}{R_V}=\frac{R_2}{R_1}$
- $R_X=R_V\frac{R_2}{R_1}$
- ![](./Assets/Biosignalverarbeitung-wheatstone-brücke.png)
- Warum wird Rx mit Wheatstone-Brücke und nicht klassisch über Stromeinspeisung und Spannungsmessung bestimmt?
- Das Messsignal (Ua) ist stärker bzw. die Empfindlichkeit der Messanordnung ist höher als bei einer reinen Strom/Spannungsmessung, außerdem ist Temperaturkompensation möglich.
- Starkes Messsignal ist sinnvoll wegen der immer vorhandenen Störungen vom Netz und Leitungen, die direkt auf die Kabel der Messanordnung wirken.
Folien-DMS:
- Widerstandsdraht mit ca $20\mu m$ Durchmesser oder Halbleiter
- Träger Acrylharz, Epoxydharz, Polyamid
- ![](Assets/Biosignalverarbeitung-folien-dms.png)
Dehnungsmessrosette:
- Messung in drei Richtungen
- ![](Assets/Biosignalverarbeitung-Dehnungsmessrosette.png)
Wie man an diesen Konstruktionsbeispielen gut erkennen kann, bilden die Leitungen ungewollterweise eine Antenne, die alle vorhandenen Störungen aus der Umgebung aufnimmt, vor allem Netzeinstreuung, Mobilfunk und Computernetze.
### Durchfluss, Volumen
### Optische Sensoren
### Akustische Sensoren

Binary file not shown.

View File

@ -0,0 +1,268 @@
\documentclass[a4paper,10pt,titlepage]{scrartcl}
\usepackage[sc]{mathpazo} % Schrift - wie Funcky und in PDF zu Fonts beschrieben
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[a-1b]{pdfx}
\usepackage[ngerman]{babel}
\usepackage[amssymb]{SIunits}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{float}
\usepackage[iso,german]{isodate} %his package provides commands to switch between different date formats
\usepackage{hyperref}
\usepackage{listings}
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0.5pt}
%Abstand zwischen Absätzen, Zeilenabstände
\voffset26pt
\parskip6pt
%\parindent1cm %Rückt erste Zeile eines neuen Absatzes ein
\usepackage{setspace}
\onehalfspacing
\begin{document}
\pagenumbering{roman}
\titlehead
{
\small
{
Technische Universität Ilmenau\\
Fakulät IA\\
Fachgebiet Neuroninformatik\\
Praktikum Neuroinformatik\\
WS 2021/22}
}
\title {Versuchsprotokoll}
\subtitle{Neuroinformatik}
\author{}
\date{\today\\*[60pt]}
\maketitle
\pagestyle{fancy}
\fancyhead[R]{Praktikumsbericht: Neuroinformatik}
\pagenumbering{arabic}
\newpage
\section{Vorbereitung: Virtuelle Python Umgebung}
Ordner erstellen mit \lstinline{mkdir}
dann virtuelle Umgebung mit \lstinline{python3 -m venv env}
Dieser Ordner enhält daraufhin:
\begin{itemize}
\item bin: Dateien die mit der virtuellen Umgebung interagieren
\item include: C Header Dateien um Python Pakete zu kompilieren
\item lib: eine Kopie der Python version mit Abhängigkeiten
\end{itemize}
Aktiviere die virtuelle paket isolation \lstinline{source env/bin/activate}
Zum deaktivieren \lstinline{deactivate}
Pip Pakete installieren:
\begin{lstlisting}
pip install jupyterlab notebook spyder setuptools matplotlib scikit-learn numpy scipy ipython jupyter pandas sympy nose conda
\end{lstlisting}
NeuroInformatik Pakete runterladen:
\lstinline{pip install tui-ni-practical-course --upgrade --extra-index-url <URL-vom-Fachgebiet>`}
danach Anaconda herunterladen und installieren:
\lstinline{bash ~/Downloads/Anaconda3-2020.02-Linux-x86_64.sh}
\section*{Aufgabe 1a: Kohonen Kette}
Bash:\lstinline{tui-ni-kohonen-chain}
\subsection*{1.}
\textit{Wählen Sie ,,L-shape'' als Datenverteilung aus (Dieser Input wird für die Aufgaben 1-5 verwendet). Starten Sie die Simulation (,,Start'') und beobachten Sie die Bewegungen der Gewichtsvektoren im Inputraum. Stoppen Sie die Simulation, wenn sich die Gewichtsvektoren stabilisiert haben.}
mit ca 300 Schritten passt sich das Kohonen Netz der Datenverteilung an
\subsection*{2.}
\textit{Stoppen Sie die letzte Simulation (,,Stop'') und initialisieren Sie die Kohonen-Kette neu (,,Reset''). Beobachten Sie die Bewegung der Gewichtsvektoren bei Nutzung des Einzelschrittbetriebs (,,Step'') für ca. 20 Schritte. Beobachten Sie dabei, wie die Neuronen in Abhängigkeit des Inputs und der Nachbarschaftsfunktion aktiviert werden (rote Färbung).}
\begin{itemize}
\item nähern sich immer weiter an
\item bilden eine Linie
\item ab ca Schritt 10 gleichen sie sich der L-Shape an
\end{itemize}
\subsection*{3.}
\textit{Vergleichen Sie die Ergebnisse mit denen von Kohonen-Ketten, die die Lernraten $\eta=0, \eta=1, \eta=2$ sowie $\eta=-0.5$ nutzen (Nach jeder Änderung der Lernrate das Netzwerk zurücksetzen (,,Reset'')). Worin bestehen die wesentlichen Unterschiede der entsprechenden Netze? Welche Lernrate ist in diesem Beispiel für einen praktischen Einsatz am geeignetsten und warum? Traten topologische Defekte auf: falls ja, wodurch wurden sie verursacht?}
\begin{itemize}
\item $\eta=0$
\begin{itemize}
\item das Kohonen Netz wird nicht angepasst/verändert
\item die Nachbarschaftsfunktion ändert sich
\end{itemize}
\item $\eta=1$
\begin{itemize}
\item mit 6 schritten in einer reihe
\item Kohonen Kette springt immer wieder über L-Ecke hinaus
\item erst später richtige anpassung an L-Shape, ca 240 Schritte
\end{itemize}
\item $\eta=2$
\begin{itemize}
\item sehr große Sprünge der gesamten Kette
\item viele Überkreuzungen der Nachbarschaften
\item springt aus L Shape heraus
\end{itemize}
\item $\eta=-0.5$
\begin{itemize}
\item Kohonen Karte wird immer größer
\item ab ca 20 Schritten Karte nicht mehr zu sehen
\end{itemize}
\end{itemize}
am geeignetsten hier: $\eta=1$, da schnellste (überhaupt) anpassung
\subsection*{4.}
\textit{Initialisieren Sie (,,Reset'') eine Kohonen-Kette mit den folgenden Parametern: 20 Neuronen, Lernrate $\eta=0.2$, Decay Lernrate $\delta\eta=0.999$, Lernradius $r=10$ und Decay Lernradius $\delta r=0.99$. Starten Sie die Simulation im Einzelschrittbetrieb (,,Step''). Verfolgen Sie die Entwicklung der Gewichtsvektoren.}
\begin{itemize}
\item Ab ca 400 Schritten komplette Anpassung an L-Shape
\item langsame anpassung an Shape
\item ab 50 schritten schon ungefähr L-Shape, nur nicht ausgefüllt
\end{itemize}
\textit{Vergleichen Sie die Ergebnisse mit denen von Kohonen-Ketten, die die Lernradien $r=100$ sowie $r=0.001$ nutzen! Worin bestehen die wesentlichen Unterschiede der entsprechenden Netze? Welcher Lernradius ist in diesem Beispiel für einen praktischen Einsatz am geeignetsten und warum? Traten topologische Defekte auf: falls ja, wodurch wurden sie verursacht?}
\begin{itemize}
\item $r=100$
\begin{itemize}
\item bildet erst punkt
\item ab ca 100 schritten bildet sich linie
\item ab ca 400 anpassung an L Shape, ab ca 600 fertig
\end{itemize}
\item $r=0,001$
\begin{itemize}
\item passt nur gewichtsvektoren an die schon im L Shape sind, weiter entfernte bleiben außerhalb des Netzes
\item viele Überkreuzungen möglich
\end{itemize}
\end{itemize}
hier am praktischsten: $r=10$, hat schon früh eine relaitv gute anpassung an L-Shape
\subsection*{5.}
\textit{Initialisieren Sie (,,Reset'') eine Kohonen-Kette mit den folgenden Parametern:
\begin{itemize}
\item 20 Neuronen, Lernrate $\eta=0.2$, Decay Lernrate $\delta\eta=0.9$, Lernradius $r=10$ und Decay Lernradius $delta r=0.99$ sowie
\item 20 Neuronen, Lernrate $\eta=0.2$, Decay Lernrate $\delta\eta=0.999$, Lernradius $r=10$ und Decay Lernradius $\delta r=0.5$.
\end{itemize}
Starten Sie die Simulation im Einzelschrittbetrieb (,,Step''). Beobachten Sie die Adaptation der Gewichtsvektoren! Worin liegen die Ursachen der aufgetretenen Probleme?}
\begin{enumerate}
\item nach ca 100 Schritten bewegt sich nichts mehr
\item sehr schneller abfall der anpassung, nach weniger als 100 Schritten keine anpassung mehr
\item zu schneller abbau der Lernrate; Lernradius zu klein, sodass weiter entfernte Gewichtsvektoren nicht mehr beachtet werden
\end{enumerate}
\subsection*{6.}
\textit{Initialisieren Sie (,,Reset'') eine Kohonen-Kette mit 20 Neuronen sowie den Parametern Lernrate $\eta=0.2$, Decay Lernrate $\delta\eta=0.999$, Lernradius $r=10$ und Decay Lernradius $\delta r=0.99$. Wählen Sie als Inputpattern ,,equally distributed'' und starten Sie die Simulation (,,Start''). Welches grundsätzliche Problem ist bei der Nutzung einer Kohonen-Kette in einem zweidimensionalen Inputraum zu berücksichtigen?}
passt sich dem 2D Raum an, jedoch jedes mal anders, da es keinen richtigen orientierungspunkt hat.
\subsection*{7.}
\textit{Initialisieren Sie (,,Reset'') eine Kohonen-Kette mit 20 Neuronen sowie den Parametern Lernrate $\eta=0.5$, Decay Lernrate $\delta\eta=0.999$, Lernradius $r=10$ und Decay Lernradius $\delta r=0.99$. Wählen Sie als Inputpattern ,,Omega-shape'' und starten Sie die Simulation 3 mal (,,Reset''+,,Start''). Überlegen Sie, warum sich die Nachbarschaftsbeziehung der Neuronen in der Kette in diesem Fall als hinderlich für den Lernprozess erweist?}
durch die verkettung benötigt es mehr schritte und passt sich nicht genau an
\section*{Aufgabe 1b: Neural Gas}
\lstinline{tui-ni-neural-gas}
\subsection*{1.}
\textit{Wählen Sie ,,Omega-shape'' als Datenverteilung aus. Starten Sie die Simulation (,,Start'') und beobachten Sie den Lernprozess. Welche Unterschiede ergeben sich im Vergleich zu dem Lernprozess der Kohonen-Kette. Betrachten Sie dabei auch die Aktivierung der Neuronen im Einzelschrittbetrieb.}
- nach ca 200 Schritten fertig, wesentlich schneller als Kohonen Kette
- zieht sich Anfangs nicht so stark zusammen wie kohonen kette
\subsection*{2.}
\textit{Wählen Sie ,,Travelling Salesman'' als Datenverteilung und vergegenwärtigen Sie sich welches Problem dabei gelöst werden soll: Problem des Handlungsreisenden. Initialisieren Sie (,,Reset'') ein Neural Gas mit 20 Neuronen sowie den Parametern Lernrate $\eta=0.2$, Decay Lernrate $\delta\eta=0.999$, Lernradius $r=10$ und Decay Lernradius $\delta r=0.99$. Können Sie mit dem Netzwerk eine Lösung für das Problem finden?}
\begin{itemize}
\item ab 400 Schritten kaum mehr bewegung, die meisten (bis auf vier) sind auf die ,,Orte'' verteilt
\item kürzester Weg kann so nicht gefunden werden da es keine verknüpfung/reihenfolge zwischen den orten gibt
\end{itemize}
\subsection*{3.}
\textit{Initialisieren Sie (,,Reset'') ein Neural Gas mit den folgenden Parametern: 20 Neuronen, Lernrate $\eta=0.5$, Decay Lernrate $\delta\eta=0.999$, Lernradius $r=10$ und Decay Lernradius $\delta r=0.99$. Wählen Sie als Inputpattern ,,slowly moving rectangle'' und starten Sie die Simulation (,,Start''). Welche Parameter müssen Sie adaptieren, damit sich die Gewichtsneuronen an den sich ständig ändernden Input anpassen können?}
\begin{itemize}
\item anfangs gute anpassung an viereck, jedoch mit vortschreitenden schritten keine anpassung mehr
\item Lernrate/Lernradius Decay muss auf ,,1'' gesetzt werden, um stetige anpassung aller Punkte zu garantieren
\end{itemize}
\section*{Aufgabe 2a: Transferfunktion}
\lstinline{tui-ni-transfer-function}
\subsection*{1.}
\textit{Setzen Sie bitte die Gewichte auf die Werte $w_0=0.5$ und $w_1=0.5$. Machen Sie sich durch unterschiedliche Wahl von Aktivierungs- und Ausgabefunktion mit der Bedienung des Applets vertraut. Variieren Sie dabei auch den Parameter ,,Classification threshold'' auf der rechten Seite der Visualisierung, um die Auswirkung der virtuellen Trennebene (Schwellwert über die Ausgabe des Neurons) für die Lösung eines Zweiklassenproblems zu untersuchen.}
\subsection*{2.+3.}
\textit{Aktivieren Sie die Checkbox ,,Dataset classification'' um den ersten Datensatz in die Visualisierung einzublenden. Wählen Sie als Aktivierungsfunktion ,,Dot product'' und als Ausgabefunktion ,,linear''. Variieren Sie die Gewichte des Neurons (w0,w1,bias) und den Klassifikationsschwellwert (,,Classification threshold'') um eine korrekte Klassifikation der Datenpunkte zu erreichen. Bei dem grünen Datenpunkten muss die Ausgabe des Neurons oberhalb der Klassifikationsschwelle liegen und bei den roten Datenpunkten unterhalb der Schwelle. Korrekt klassifizierte Datenpunkte werden vergrößert dargestellt. Wählen Sie nacheinander die Datensätze 2 bis 5 und kombinieren Sie jeweils geeignete Aktivierungs- und Ausgabefunktionen, um die Daten, mit dem einen realisierten Neuron, jeweils korrekt in zwei Klassen zu trennen.}
\begin{tabular}{c|c|c|c|c|c|c}
Datensatz & $w_0$ & $w_1$ & bias & Threshold & Aktivierungsfunktion & Ausgabefunktion \\
Point Set 1 & $0,5$ & $0,5$ & $0$ & $0$ & Dot Product & Linear \\
Point Set 2 & 0,5 & 0,5 & 0 & 0,18 & Dot Product & Gaussian \\
Point Set 3 & 0,5 & 0,5 & 0 & 0 & Min Distance & Linear \\
Point Set 4 & 0,5 & 0,5 & 0 & 0,27 & Mahalanobis, $\phi=143$, $\sigma_0=0$, $\sigma_1=12.5$ & Symetric Sigmoidal \\
Point Set 5 & 0,5 & 0,5 & 0 & 0 & Mahalonobis, $\phi=143$, $\sigma_0=\infty$, $\sigma_1=3.57$ & Gaussian, $\sigma=0.04$ \\
\end{tabular}
\subsection*{4.}
\textit{Wenn alle Datensätze korrekt klassifiziert wurden, wird der ,,Submit''-Button aktiviert. Klicken Sie auf den ,,Submit''-Button und geben Sie in dem sich öffnenden Fenster Ihre E-Mail-Adresse ein. Klicken Sie anschließend auf ,,Generate!'' und kopieren Sie den angezeigten, kodierten (nicht lesbaren) Text, welcher die von Ihnen bei der Bearbeitung eingestellten Parameter enthält. Diesen Text reichen Sie in der dazugehörigen Aufgabe in Moodle ein. Bitte beachten Sie dabei die Einreichungsfrist im Moodle-Kurs.}
\section*{Aufgabe 2b: Delta Regel}
\lstinline{tui-ni-delta-rule}
\subsection*{1.}
\textit{Wählen Sie bitte die ,,Teacher function'' ,,y=x'' und die ,,Output function'' ,,Linear''! Starten Sie die Simulation im Schrittbetrieb (,,Step'')!}
\textit{1. Beobachten Sie dabei den Verlauf der Fehler E(t) bzw. E(w) sowie des Gradienten von E(w) in Abhängigkeit der präsentierten Inputs! Wodurch entsteht der periodische Verlauf der beiden Fehlerfunktionen?}
der Input pendelt periodisch zwischen $\pm 1$, das Neuron versucht entgegenzusteuern
\textit{2. Initialisieren Sie das Netz neu (,,Reset'') und wählen Sie eine ,,Batch size'' von ,,11 samples''! Beobachten Sie erneut den Verlauf der Fehler E(t) bzw. E(w) sowie des Gradienten von E(w) im Einzelschrittbetrieb (,,Step'')! Starten Sie nach etwa 30 Lernschritten den Trainingsprozess (,,Start''). Welcher Unterschied ergibt sich für den Verlauf des Fehlers E(t)?}
\begin{itemize}
\item Fehler fallen exponentiell ab
\item kein Periodischer Verlauf der Fehler mehr
\item Neuron passt sich immer weiter den Input-Werten an
\end{itemize}
\subsection*{2.}
\textit{Stoppen Sie bitte die letzte Simulation und initialisieren Sie das Netz neu (,,Reset'')! Wählen Sie ,,$y=|x|$'' als ,,Teacher function'' und starten Sie den Lernprozess (,,Start'')! Warum konvergiert der Fehler nicht gegen den Wert Null? Wie kann dieses Problem behoben werden?}
\begin{itemize}
\item Fehler $E_t$ konvergiert gegen $0,4$
\item Fehler $E_w$ konvergiert gegen $0,6$
\item Ausgabefunktion ReL nähert den Fehler $E_w$ an $0,2$ und $E_t$ immer weiter an $0$ an
\end{itemize}
\subsection*{3.}
\textit{Wählen Sie die lineare Ausgabefunktion und aktivieren Sie die Checkbox ,,Use own output implementation''. Da diese Ausgabefunktion die Aktivierung identisch weiterleitet, müssen Sie dem y-Wert einfach die Aktivierung zuweisen. Tragen Sie dazu bitte: $y=z$ ein. Klicken Sie anschließend auf ,,Check code''. Bei einer korrekten Umsetzung wird die Textbox grün hinterlegt.}
\subsection*{4.}
\textit{Aktivieren Sie die Checkbox ,,Use own derivative''. Wenn Sie die Funktion $y=z$ nach $z$ ableiten, erhalten Sie die Ableitung von 1. Weisen Sie daher der Variablen $dy_{dz} = 1$ zu. Klicken Sie wieder auf ,,Check code'' um Ihre Umsetzung zu testen.}
\subsection*{5.}
\textit{Wählen Sie ,,Sigmoid'' als Ausgabefunktion. Aktivieren Sie die Checkbox ,,Use own output implementation'' und geben Sie die Fermi-Ausgabefunktion ein (siehe Skript Neuroinformatik). Die erfolgreiche Umsetzung wird durch einen Haken hinter ,,Sigmoid output function'' im unteren Bereich gekennzeichnet. Geben Sie anschließend auch die Gleichung für die Ableitung der Fermi-Funktion ein (Hinweis: die Ableitung enthält y, welches in diesem Code-Fenster noch nicht berechnet vorliegt).}
\begin{itemize}
\item Implementation: $y= 1/(1+exp(-c*z))$
\item derivate: $dy_dz= c*y (1-y) = c*(1/(1+exp(-c*z))) (1-(1/(1+exp(-c*z))))$
\end{itemize}
\subsection*{6.}
\textit{Wählen Sie ,,ReLU'' als Ausgabefunktion und setzen Sie die Ausgabefunktion und deren Ableitung um. Beachten Sie für die Ableitung, dass sich die ReL-Funktion, abhängig von z, wie eine Konstante oder wie eine lineare Ausgabefunktion verhält. Die Umsetzung von If-Abfragen finden Sie am Ende dieser Seite.}
\begin{itemize}
\item Implementation: $y=max(0,z)$
\item derivate:
\begin{lstlisting}
if z<= 0:
dy_dz=0
else:
dy_dz=1
\end{lstlisting}
\end{itemize}
\subsection*{7.}
\textit{Wenn alle Funktionen korrekt umgesetzt wurden, wird der ,,Submit''-Button aktiviert. Klicken Sie auf den ,,Submit''-Button und geben Sie in dem sich öffnenden Fenster Ihre E-Mail-Adresse ein. Klicken Sie anschließend auf ,,Generate!'', kopieren Sie den angezeigten, kodierten (nicht lesbaren) Text, welcher die von Ihnen bei der Bearbeitung eingestellten Parameter. Reichen Sie diesen Text über die dazugehörige Aufgabe in Moodle ein. Bitte beachten Sie dabei die Einreichungsfrist im Moodle-Kurs.}
\end{document}

Binary file not shown.

View File

@ -0,0 +1,457 @@
\documentclass[a4paper,12pt,titlepage]{scrartcl}
\usepackage[sc]{mathpazo} % Schrift - wie Funcky und in PDF zu Fonts beschrieben
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[a-1b]{pdfx}
\usepackage[ngerman]{babel}
\usepackage[amssymb]{SIunits}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{float}
\usepackage[iso,german]{isodate} %his package provides commands to switch between different date formats
\usepackage{hyperref}
\usepackage{listings}
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0.5pt}
%Abstand zwischen Absätzen, Zeilenabstände
\voffset26pt
\parskip6pt
%\parindent1cm %Rückt erste Zeile eines neuen Absatzes ein
\usepackage{setspace}
\onehalfspacing
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
%Code listing style named "mystyle"
\lstdefinestyle{mystyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2
}
%"mystyle" code listing set
\lstset{style=mystyle}
\begin{document}
\pagenumbering{roman}
\titlehead
{
\small
{
Technische Universität Ilmenau\\
Fakulät IA\\
Fachgebiet Rechnerarchitektur\\
Praktikum Rechnerarchitektur 1\\
WS 2021/22}
}
\title {Versuchsprotokoll}
\subtitle{Versuche zur x86-Assemblerprogrammierung}
\author{}
\date{16.11.2021\\*[60pt]}
\maketitle %Erstellt das Titelblatt wie oben definiert
%Einstellungen zur Kopf- und Fußzeile
\pagestyle{fancy}
\fancyhead[R]{Praktikumsbericht: RA1}
\pagenumbering{arabic}
\newpage
\section*{A1: Lauflicht}
Versuchsaufbau anhand einfacher Assemblerprogramme. Benutze parallele digitale Ein- und Ausgabebaugruppen, die mit den LED-Reihen, der Tasten- und der Schalterreihe sowie den Sieben-Segment-Anzeigen verbunden sind.
\subsection*{Grundaufgabe a: Funktionen ermitteln}
\begin{lstlisting}
; Programmbereich:
anf: MOV EDX,400000H ;Groessee der Verzoegerung
MOV [verzoe],EDX ;Verzoegerung speichern
m1: MOV EDI,10 ;EDI=10
MOV ESI,OFFSET ziff ;Adresse von ziff in ESI
m2: MOV AL,[ESI+EDI-1] ;AL=ziff+9
OUT 0B0H,AL ;SiebenSegment schreibt AL
CALL zeit ;warten
DEC EDI ;EDI=EDI-1
JNZ m2 ;if(EDI!=0) goto m2
MOV AL,0FFH ;AL=255 (dec)
m3: OUT 5CH,AL ;LED Reihe links schreiben
NOT AL ;AL negieren
OUT 5DH,AL ;LED Reihe rechts schreiben
CALL zeit ;warten
MOV BL,AL ;Inhalt von AL wird noch gebraucht
IN AL,59H ;Tastenreihe rechts lesen auf AL
BT EAX,7 ;Bit 7 von EAX in Carry Flag
MOV AL,BL ;AL bekommt alten Wert zurueck
JC m1 ;if(m1==0) goto m1
JMP m3 ;goto m3 (Loop)
;zeit ist ein Unterprogramm, welches nur Zeit verbrauchen soll:
zeit: MOV ECX,[verzoe] ;Lade wartezeit
z1: DEC ECX ;ECX=ECX-1
JNZ z1 ;if(ECX!=0) goto z1
RET ;zurueck zum Hauptprogramm
; Datenbereich:
verzoe DD ? ;Eine Speicherzelle (Doppelwort)
ziff DB 3FH,03H,6DH,67H,53H,76H,7EH,23H,7FH,77H
\end{lstlisting}
\begin{description}
\item[anf] setzt die Länge der Wartezeit
\item[m1] Lädt Register
\item[m2] Zählt auf Sieben Segment Anzeige
\item[m3] schreibt auf LED Reihe links und invertierend rechts
\item[zeit] Verbraucht Zeit nach "verzoe"
\end{description}
\subsection*{Grundaufgabe b}
\subsubsection*{einfaches Lauflicht}
auf der rechten LED-Reihe soll ein sichtbarer Lichtpunkt von links nach rechts laufen und immer wieder von links beginnen
\begin{lstlisting}
anf: MOV EDX,400000H
MOV [verzoe],EDX
MOV AL, 80H ;Startwert fuer LED Reihe
lauf: OUT 5CH, AL ;Wert auf LED Reihe schreiben
CALL zeit ;warten
ROR AL, 1 ;Bits um 1 nach rechts
JMP lauf ;Schleife wiederholen
zeit: MOV ECX,[verzoe]
z1: DEC ECX
JNZ z1
RET
\end{lstlisting}
\subsubsection*{Lauflicht mit Geschwindigkeitsumschalter}
das Lauflicht soll durch den linken Schalter zwischen "schnell" (Schalter oben) und "langsam" (Schalter unten) umschalten
\begin{lstlisting}
anf: MOV Al, 80H
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
MOV [verzoe], EDX ;"langsam" in Speicher
OUT 5CH, AL ;LED Reihe schreiben
MOV BL, AL ;AL speichern
IN AL, 58H ;Schalter einlesen
BT AL, 7 ;7. Bit von AL in Carry Flag
JNC langsam ;Carry Flag = 0, schalter unten
MOV EDX, 200000H ; Wert fuer "schnell"
MOV [verzoe], EDX ;"schnell" in Speicher
CMC ;Carry Flag umschalten (0)
langsam: CALL zeit ;warten
MOV AL, BL ;AL aus speicher zurueck
ROR AL,1 ;Bits um 1 nach rechts
JMP anf ;Schleife wiederholen
zeit: MOV ECX,[verzoe]
z1: DEC ECX
JNZ z1
RET
\end{lstlisting}
\subsubsection*{Lauflicht verändert Richtung}
zusätzlich zum oben implementierten soll die Bewegungsrichtung des Lichtpunktes durch den rechten Schalter der Schalterreihe zwischen "nach links" und "nach rechts" wechseln.
\begin{lstlisting}
anf: MOV Al, 80H
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
MOV [verzoe], EDX ;"langsam" in Speicher
OUT 5CH, AL ;LED Reihe schreiben
MOV BL, AL ;AL speichern
IN AL, 58H ;Schalter einlesen
BT AL, 7 ;7. Bit von AL in Carry Flag
JNC langsam ;Carry Flag = 0, Schalter unten
MOV EDX, 200000H ; Wert fuer "schnell"
MOV [verzoe], EDX ;"schnell" in Speicher
CMC ;Carry Flag umschalten
langsam: CALL zeit ;warten
MOV AL, BL ;AL aus speicher zurueck
BT AL, 0 ;0. Bit von AL in Carry Flag
JNC rechts ;Carry Flag = 1; Schalter oben
ROL AL,1 ;Bits um 1 nach links
CMC ;Carry Flag umschalten (0)
JMP anf ;Schleife wiederholen
rechts: ROR AL, 1 ;Bits um 1 nach rechts
JMP anf ;Schleife wiederholen
zeit: MOV ECX,[verzoe]
z1: DEC ECX
JNZ z1
RET
\end{lstlisting}
\subsubsection*{Lauflicht mit Invertierung}
durch drücken einer beliebigen Taste der blauen Tastenreihe wird die Anzeige invertiert, d.h. der Lichtpunkt ist dunkel etc. Invertierung nur solange die Taste gedrückt wird.
\begin{lstlisting}
anf: MOV Al, 80H
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
MOV [verzoe], EDX ;"langsam" in Speicher
MOV BL, AL ;Kopie von AL anlegen
IN AL, 59H ;Tastenreihe einlesen
AND AL, FFH ;UND Operation mit FF
JZ nopress ;kein Schalter gedrueckt
NOT BL ;BL invertieren
MOV AL, BL ;AL ueberschreiben
nopress: OUT 5CH, AL ;LED Reihe schreiben
IN AL, 58H ;Schalter einlesen
BT AL, 7 ;7. Bit von AL in Carry Flag
JNC langsam ;Carry Flag = 0, Schalter unten
MOV EDX, 200000H ; Wert fuer "schnell"
MOV [verzoe], EDX ;"schnell" in Speicher
CMC ;Carry Flag umschalten
langsam: CALL zeit ;warten
MOV AL, BL ;AL aus speicher zurueck
BT AL, 0 ;0. Bit von AL in Carry Flag
JNC rechts ;Carry Flag = 1; Schalter oben
ROL AL,1 ;Bits um 1 nach links
CMC ;Carry Flag umschalten (0)
JMP anf ;Schleife wiederholen
rechts: ROR AL, 1 ;Bits um 1 nach rechts
JMP anf ;Schleife wiederholen
zeit: MOV ECX,[verzoe]
z1: DEC ECX
JNZ z1
RET
\end{lstlisting}
\subsection*{Zusatzaufgabe}
Erweiterungen des Programms nach eigenen Ideen:
\begin{itemize}
\item symetrische LED Reihe zur Mitte
\item Sieben Segment zählt 9 Schritte mit
\end{itemize}
\begin{lstlisting}
anf: MOV Al, 80H
MOV EDI, 0
MOV ESI, OFFSET ziff
lauf: MOV EDX, 400000H ; Wert fuer "langsam"
MOV [verzoe], EDX ;"langsam" in Speicher
MOV BL, AL ;Kopie von AL anlegen
IN AL, 59H ;Tastenreihe einlesen
AND AL, FFH ;UND Operation mit FF
JZ nopress ;kein Schalter gedrueckt
NOT BL ;BL invertieren
MOV AL, BL ;AL ueberschreiben
nopress: OUT 5CH,AL ;LED Reihe links schreiben
NOT AL ;AL negieren
OUT 5DH,AL ;LED Reihe rechts schreiben
MOV BH,[ESI+EDI-1] ;Sieben Segment berechnen
OUT 0B0H,BH ;Sieben Segment schreiben
DEC EDI ;Sieben Segment runterzaehlen
JZ timer ;Timer auf 0 setzen
IN AL, 58H ;Schalter einlesen
BT AL, 7 ;7. Bit von AL in Carry Flag
JNC langsam ;Carry Flag = 0, Schalter unten
MOV EDX, 200000H ; Wert fuer "schnell"
MOV [verzoe], EDX ;"schnell" in Speicher
CMC ;Carry Flag umschalten
langsam: CALL zeit ;warten
MOV AL, BL ;AL aus speicher zurueck
BT AL, 0 ;0. Bit von AL in Carry Flag
JNC rechts ;Carry Flag = 1; Schalter oben
ROL AL,1 ;Bits um 1 nach links
CMC ;Carry Flag umschalten (0)
JMP anf ;Schleife wiederholen
rechts: ROR AL, 1 ;Bits um 1 nach rechts
JMP anf ;Schleife wiederholen
timer: MOV BH, 0FFH
RET
zeit: MOV ECX,[verzoe]
z1: DEC ECX
JNZ z1
RET
\end{lstlisting}
\section*{A2: Timerbaustein}
Arbeite mit einem programmierbaren Interfacebaustein, der über eigene Register angesprochen wird. Als Beispiel dient ein Programmierbarer Intervalltimer (PIT, auch als „Zähler-Zeitgeber-Baustein“ oder „Timerbaustein“ bezeichnet) vom Typ 8254.
\begin{center}
\begin{tabular}{| l | c | c | c | c | c | c | c | c | }
\hline
\multicolumn{9}{|c|}{Frequenzen der C-Dur Tonleiter}\\
\hline
\hline
Ton & c' & d' & e' & f' & g' & a' & h' & c'' \\\hline
f(Hz) & 261,6 & 293,7 & 329,6 & 349,2 & 392,0 & 440,0 & 493,9 & 523,2 \\\hline
Zählkonstante & 7662 & 6825 & 6079 & 5730 & 5102 & 4545 & 4056 & 3824 \\\hline
Freq(Hex) & 1DEEH & 1AA9H & 17BFH & 1662H & 13EEH & 11C1 & FD8H & EF0H\\\hline
\end{tabular}
\end{center}
\subsection*{Grundaufgabe a}
Der Kanal 0 des Timerbausteins soll als programmierbarer Frequenzgenerator benutzt werden. Dazu wird die Betriebsart „Mode 3“ verwendet (Frequenzteiler mit symmetrischer Rechteckschwingung am Output). Die Output-Frequenz soll 440 Hz betragen. Als Input benutzen Sie den eingebauten 2-MHz-Generator.
$$\text{Zählkonstante: } \frac{2 MHz}{440 Hz} = 4545,4545 = (11C1)_{16}$$
\begin{lstlisting}
MOV AL, 36H; Steuerbyte 00110110
OUT 57H, AL
MOV AL, 0C1H; LSB
OUT 54H, Al
MOV AL, 011H; MSB
OUT 54H, AL
\end{lstlisting}
\subsection*{Grundaufgabe b}
Schalten Sie die Tonausgabe zunächst wieder ab und erweitern Sie das Programm um die Initialisierung der PIT-Kanäle 1 und 2. Die am Output des Kanals 2 angeschlossene LED soll mit einer Periodendauer von 0,5s blinken. Es ist wiederum Mode 3 zu benutzen. Da beide Kanäle hintereinander geschaltet (kaskadiert) sind, müssen Sie die benötigte Frequenzteilung auf beide Kanäle aufteilen. Außer der LED haben Sie diesmal keine weitere Kontrollmöglichkeit.
$$\text{Zählkonstante: } \frac{2 MHz}{2 Hz} /2 = 1000000 / 2 = 500000$$
\begin{lstlisting}
MOV AL, 0B6H; Kanal 2
OUT 57H, AL
MOV AL, 0FFH
OUT 56H, AL
MOV AL, 0FFH
OUT 56H, AL
MOV AL, 076H ;Kanal 1
OUT 57H, AL
MOV AL, 0FFH
OUT 55H, AL
MOV AL, 0FFH
OUT 56H, AL
\end{lstlisting}
\subsection*{Grundaufgabe c}
Die Tonausgabe von Kanal 0 wird wieder eingeschaltet. Sie soll jetzt aber nur noch dann aktiv sein, wenn gerade eine beliebige Taste in der blauen Tastenreihe gedrückt ist. Dazu müssen Sie in der Endlosschleife des Programms eine entsprechende Abfrage einbauen.
\begin{lstlisting}
noton: MOV AL, 59H
OUT 57H, AL
taste: IN AL, 59H
AND AL, 0FFH
JZ noton ;keine taste gedrueckt
JMP ton
ton: MOV AL, 0C1H
OUT 54H, AL
MOV AL, 011H
OUT 54H, AL
JMP taste
\end{lstlisting}
\subsection*{Fortgeschrittene Aufgabe d}
Erweitern Sie das Programm dann so, dass den einzelnen Tasten unterschiedliche Frequenzen zugeordnet sind. Es wird angenommen, dass nicht mehrere Tasten gleichzeitig gedrückt werden. Das Blinken der LED von Aufgabe b) soll weiterhin funktionieren.
\begin{lstlisting}
noton: MOV AL, 59H
OUT 57H, AL
taste: IN AL, 59H
MOV BL, AL
AND AL, 0FFH
JZ noton ;keine taste gedrueckt
MOV AL, BL
AND AL, 001H ; Taste A
JNZ tonA
MOV AL, BL
AND AL, 003H ; Taste B
JNZ tonB
MOV AL, BL
AND AL, 004H ;Taste C
JNZ tonC
JMP taste
tonA: MOV AL, 0C1H
OUT 54H, AL
MOV AL, 011H
OUT 54H, AL
JMP taste
tonB: MOV AL, 008H
OUT 54H, AL
MOV AL, 0FDH
OUT 54H, AL
JMP taste
tonC: MOV AL, 000H
OUT 54H, AL
MOV AL, 0EFH
OUT 54H, AL
JMP taste
\end{lstlisting}
\subsection*{Zusatzaufgabe}
\section*{A3: Matrixtastatur}
Eine 4x4 Matrixtastatur ist über Zeilen- und Spaltenleitungen verbunden. Um eine gedrückte Taste zu erkennen müssen alle Zeilen nacheinander abgefragt werden. Bei jedem Abfrageschnitt erhält man die Information über die gedrückten Tasten jeweils einer Zeile.
\subsection*{Grundaufgabe a}
Alle Zeilen der Matrix je einmal abfragen und zurückkehren. Falls eine gedrückte Taste erkannt wurde, soll in einem gewählten Byteregister eine von Null verschiedene Tastennummer übergeben werden.
Tastaturbelegung:
\begin{tabular}{c|c|c|c}
1 & 2 & 3 & 4\\
5 & 6 & 7 & 8\\
9 &10 &11 &12\\
13 &14 &15 &16
\end{tabular}
\begin{lstlisting}[caption= matr]
\end{lstlisting}
Wie \textit{matr} soll das Unterprogramm \textit{wmatr} alle Zeilen der Matrix abfragen aber erst beim Erkennen eines Tastendrucks zurückkehren. Das bedeutet, dass es das Drücken einer Taste abwartet und dann deren Nummer übergibt.
\begin{lstlisting}[caption= wmatr]
\end{lstlisting}
Zur Durchführung sollen die Unterprogramme nacheinander in einem Hauptprogramm aufgerufen werden. Das Hauptprogramm selbst soll in einer "ewigen" Schleife arbeiten und die erkannte Tastennummer binär auf einer der LED-Zeilen anzeigen.
\begin{lstlisting}[caption= mainA]
\end{lstlisting}
\subsection*{Grundaufgabe b}
Realisiere ein Programm, das die jeweils gedrückte Ziffer in lesbarer Darstellung auf der linken Stelle der Sieben-Segment-Anzeigen anzeigt.
\begin{lstlisting}[caption= mainB]
\end{lstlisting}
\subsection*{Fortgeschrittene Aufgabe c}
Erweitere das Programm so dass gedrückte Ziffern der Reihe nach nebeneinander angezeigt werden und beim erreichen der letzten Stelle wieder links beginnt.
Das Drücken einer nicht als Ziffer definierten Taste soll eine leere Stelle erzeugen.
\begin{lstlisting}[caption= mainC]
\end{lstlisting}
\subsection*{Fortgeschrittene Aufgabe d}
Verhindere das Prellen der Tasten durch Software um doppelte Tastendrücke zu vermeiden.
\begin{lstlisting}[caption= mainD]
\end{lstlisting}
\subsection*{Zusatzaufgabe}
Realisiere einen einfachen Taschenrechner der einstellige nichtnegative Dezimalzahlen addiert und das ein- bis zweistellige Ergebnis auf der Sieben-Segment-Anzeige anzeigt.
Definiere dafür Tasten für ,,+'' und ,,=''.
\begin{tabular}{c|c|c|c}
1 & 2 & 3 & 4\\
5 & 6 & 7 & 8\\
0 & 0 & 0 & 0\\
+ & 0 & 0 & =
\end{tabular}
\begin{lstlisting}[caption= addition]
\end{lstlisting}
\end{document}

Binary file not shown.

View File

@ -0,0 +1,58 @@
\documentclass[a4paper,12pt,titlepage]{scrartcl}
\usepackage[sc]{mathpazo} % Schrift - wie Funcky und in PDF zu Fonts beschrieben
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[a-1b]{pdfx}
\usepackage[ngerman]{babel}
\usepackage[amssymb]{SIunits}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{float}
\usepackage[iso,german]{isodate} %his package provides commands to switch between different date formats
\usepackage{hyperref}
\usepackage{listings}
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0.5pt}
%Abstand zwischen Absätzen, Zeilenabstände
\voffset26pt
\parskip6pt
%\parindent1cm %Rückt erste Zeile eines neuen Absatzes ein
\usepackage{setspace}
\onehalfspacing
\begin{document}
\pagenumbering{roman}
\titlehead
{
\small
{
Technische Universität Ilmenau\\
Fakulät IA\\
Fachgebiet Rechnerarchitektur\\
Praktikum Rechnerarchitektur 2\\
WS 2021/22}
}
\title {Versuchsprotokoll}
\subtitle{Versuche Befehlsausführung und Mikrocontroller}
\author{}
\date{\today\\*[60pt]}
\maketitle %Erstellt das Titelblatt wie oben definiert
%Einstellungen zur Kopf- und Fußzeile
\pagestyle{fancy}
\fancyhead[R]{Praktikumsbericht: RA2}
\pagenumbering{arabic}
\newpage
\section{Versuch B: Befehlsausführung}
Simulative Untersuchung der Ausführung von Maschinenbefehlen in unterschiedlichen Pipeline-Architekturen
\section{Versuch M: Mikrocontroller}
Assemblerprogrammierung mit dem 8-Bit-Mikrocontroller ATtiny25
\end{document}

BIN
Praktikum Schaltsysteme.pdf Normal file

Binary file not shown.

View File

@ -0,0 +1,55 @@
\documentclass[a4paper,12pt,titlepage]{scrartcl}
\usepackage[sc]{mathpazo} % Schrift - wie Funcky und in PDF zu Fonts beschrieben
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[a-1b]{pdfx}
\usepackage[ngerman]{babel}
\usepackage[amssymb]{SIunits}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{float}
\usepackage[iso,german]{isodate} %his package provides commands to switch between different date formats
\usepackage{hyperref}
\usepackage{listings}
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0.5pt}
%Abstand zwischen Absätzen, Zeilenabstände
\voffset26pt
\parskip6pt
%\parindent1cm %Rückt erste Zeile eines neuen Absatzes ein
\usepackage{setspace}
\onehalfspacing
\begin{document}
\pagenumbering{roman}
\titlehead
{
\small
{
Technische Universität Ilmenau\\
Fakulät IA\\
Fachgebiet Schaltsysteme\\
Praktikum Schaltsysteme\\
WS 2021/22}
}
\title {Versuchsprotokoll}
\subtitle{Versuche A3 und A10}
\author{}
\date{04.11.2021\\*[60pt]}
\maketitle
\pagestyle{fancy}
\fancyhead[R]{Praktikumsbericht: Schaltsysteme}
\pagenumbering{arabic}
\newpage
\section*{Aufgabe 3: Kreuztisch}
\section*{Aufgabe 10: Ampelsteuerung}
\end{document}