diff --git a/Praesentationen/folien_vorstellung/img/system_small.pdf b/Praesentationen/folien_vorstellung/img/system_small.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9cfc2c49947e6a7add0b2eb081398c9aaf830350
Binary files /dev/null and b/Praesentationen/folien_vorstellung/img/system_small.pdf differ
diff --git a/Praesentationen/folien_vorstellung/slides/slides.tex b/Praesentationen/folien_vorstellung/slides/slides.tex
index ed7ee58e0695e64dbf5a86256b28c1455eb73f3a..e4c639ca74852209d8def7faa2ec33204acfa526 100644
--- a/Praesentationen/folien_vorstellung/slides/slides.tex
+++ b/Praesentationen/folien_vorstellung/slides/slides.tex
@@ -73,38 +73,6 @@
 \end{frame}
 
 
-\section{Motivation f\"ur die Abl\"oseerkennung}
-\begin{frame}\frametitle{Motivation f\"ur die Abl\"oseerkennung}
-	\begin{itemize}
-		\item \textbf{Problem}: Erste Druckschichten k\"onnen sich von Buildplate l\"osen \\ $\Rightarrow$ Drucker erkennt diesen Fehler nicht und macht einfach weiter!
-	\end{itemize}
-\end{frame}
-\begin{frame}\frametitle{Motivation f\"ur die Abl\"oseerkennung}
-	\includegraphics[width = 0.9\textwidth]{../Bilder_Alex/Fail}
-\end{frame}
-\begin{frame}\frametitle{L\"osung}
-	\begin{itemize}
-		\item Diesem kann teilweise durch ein beheiztes Druckbett entgegengewirkt werden, kann jedoch trotzdem noch passieren!
-		\item IDEE: Implenentierung einer \"Uberwachungseinheit, die bei Erkennung den Druckprozess anh\"alt (und ggf. jmd. darauf hinweist)
-	\end{itemize}
-\end{frame}
-\begin{frame}\frametitle{Also welche M\"oglichkeiten gibt es?}	
-	\begin{itemize}
-		\item Idee 1: Lichtschrankenarray? $\Rightarrow$ Nein!
-		\item Idee 2: Entfernungsmessung? $\Rightarrow$ Nein!
-		\item Idee 3: Kamera? $\Rightarrow$ Ja!	
-	\end{itemize}
- %Kurz auf jede einzelne Idee eingehen und sagen warum wir uns gegen sie entschieden bzw. für die Kamera entschieden haben, später als Note hinzufügen bitte!
-\end{frame}
-\begin{frame}\frametitle{Prinzip der Erkennung}
-	\begin{itemize}
-		\item	Kamera ist auf einen bestimmten Punkt fixiert  % bei uns die Ecke, da es sich meistens zuerst an den Ecken ablöst
-		\item So positioniert, dass das Filament bzw. die erste Schicht des Druckes gut sichtbar ist
-		\item	L\"ost sich nun die Schicht von der Platte, registriert die Kamera nun eine Pixeländerung und stoppt den Druckprozess %wäre vlt auch noch gut hier eine Skizze einzufügen?
-	\end{itemize}
-\end{frame}
-
-
 \section{DMU}
 \begin{frame}\frametitle{Digital Mock-Up}
 	\center \includegraphics[width = 0.9\textwidth]{../Bilder_Alex/DMU}
@@ -130,7 +98,7 @@
 \begin{frame}\frametitle{PETG} 
 	\begin{itemize}
 		\item Teile: Gerüstteile
-		\item Gründe: Eigentlich in fast allen Punkten besser als PLA $\Rightarrow$ hitzestabiler, höhere mechanische Belastbarkeit, einfach zu Drucken; Bei uns: Weil wir es konnten!
+		\item Gründe: Eigentlich in fast allen Punkten besser als PLA -- hitzestabiler, höhere mechanische Belastbarkeit, einfach zu Drucken; Bei uns: Weil wir es konnten!
 		\item	Settings: Schichtdicke: , Hotendtemperatur: , Betttemperatur: ? \textdegree C, Bauteillüfter: 100\%
 		\center \includegraphics[width = 0.6\textwidth]{../Bilder_Alex/PETG}
 	\end{itemize}
@@ -187,9 +155,9 @@
 	\begin{itemize}
 		\item Einhaltung der Anleitung aus dem Internet
 		\item Allerdings Improvisation bei nicht verfügbaren bauteilen
-			\\$\Rightarrow$ k\"urzere Schrauben f\"ur Buildplate
+			\\$\Rightarrow$ K\"urzere Schrauben f\"ur Buildplate
 		 	\\$\Rightarrow$ Schl\"auche und Zahnriemen aus TPU gedruckt
-			\\$\Rightarrow$ größerer Lüfter
+			\\$\Rightarrow$ Größerer Lüfter
 			\\$\Rightarrow$ Entwurf und Bau einer Platine f\"ur \"ubersichtliches und stabileres Kabelmanagment
 	\end{itemize}
 \end{frame}
@@ -199,14 +167,14 @@
 	\begin{itemize}
 		\item Grund:
 			\begin{itemize}
-				\item Bau der Platine der \"Ubersicht wegen
-				\item Um ein st\"andiges Ein- und Ausstecken der Kabel zu vermeiden
+				\item Verteilen der 5V- und 3V3-Leitungen
+				\item Zwei Motoren auf Z-Achse -- Signal teilen
+				\item Eliminieren des Jumper-Kabel-Waldes
 			\end{itemize}
 		\item Bau:
 			\begin{itemize}
 				\item Entworfen im OpenSource-Programm KiCAD
-				\item Platine und das \"Atzenbad im FabLab 
-				\item Auf das allgemeine Vorgehen soll hier nicht n\"aher eingegangen werden 
+				\item Platine und das \"Atzenbad im FabLab
 			\end{itemize}
 		\item Anmerkungen:
 			\begin{itemize}
@@ -219,7 +187,7 @@
 	\begin{itemize}
 		\item Eine GND-Leiterbahn ist beim Ätzen verloren gegangen
 		\item 3V3 für Thermistor mit 5V vertauscht
-		\item Überflüssige GND anschlüsse
+		\item Überflüssige GND-Anschlüsse
 	\end{itemize}
 	\center \includegraphics[width = 0.6\textwidth]{../Bilder_Alex/Platine1}
 \end{frame}
@@ -227,41 +195,81 @@
 	\begin{itemize}
 		\item Bessere Kabelführung für größere Übersichtlichkeit
 		\item Alle Datenpins mit auf der Platine
-		\item Ausführung als "Shield" $\Rightarrow$ weniger Fehleranfällig
+		\item Ausführung als "Shield" $\Rightarrow$ weniger fehleranfällig
 	\end{itemize}
 	\center \includegraphics[width = 0.6\textwidth]{../Bilder_Alex/Platine2}
 \end{frame}
 \begin{frame}\frametitle{Zusatzänderungen}
 	\begin{itemize}
-		\item Schaltung mit Transistor nicht funktionsfähig \\$\Rightarrow$ benutzen von zwei L298N Bausteinen %theoretisch würde einer reichen, allerdings wird dieser dann zu warm -> bei zwei ist T < 65-70°C
+		\item Schaltung mit Transistor nicht funktionsfähig \\$\Rightarrow$ Benutzen von zwei L298N-Bausteinen %theoretisch würde einer reichen, allerdings wird dieser dann zu warm -> bei zwei ist T < 65-70°C
 		\item PC13 zu PC4 überbrückt, da PC13 nur als Input funktioniert
 	\end{itemize}
 \end{frame}
 
 
-\section{Fertiger physischer Drucker}
+\section{Firmware}
+\begin{frame}\frametitle{Firmware}
+	\center{\includegraphics[width=0.8\textwidth]{img/system_small.pdf}}
+\end{frame}
+
+
+\section{Fertiger Drucker}
 \begin{frame}\frametitle{Fertiger Drucker}
 %Bild des fertigen Druckers einfügen (sollte er jemals fertig werden) oder doch lieber auf den echten zeigen? Würd Bilder / kurzes Video einfügen, je nachdem wie das mit dem Livestream ist
 	\begin{itemize}
 		\item Abweichungen zur Vorlage:
 			\begin{itemize}
-				\item Kein Arduino
-				\item Eigene Firmware weil besser und Christian ein kranker Mofo ist 
-				\item Zahnriemen aus TPU weil besser 
-				\item Befestigung f\"ur Endstops zu gro{\ss} $\Rightarrow$ Verwendung von Hei{\ss}kleber
+				\item Kein Arduino, eigene Firmware 
+				\item Zahnriemen aus TPU sind günstiger 
+				\item Befestigungslöcher f\"ur Endstops zu weit auseinander $\Rightarrow$ Verwendung von Hei{\ss}kleber
 				\item Eigene Platine verwendet
 			\end{itemize}
 	\end{itemize}
 \end{frame}
 
 
-\section{Firmware }
-\begin{frame}\frametitle{Firmware und der Rotz mit der Kamera} %Da habe ich keine Ahnung, Chris du musst diesen Abschnitt übernehmen. Die Kamera kansnt du da auch gleich mit reinnehmen
-\end{frame}
-
-
 %Noch ein extra Abschnitt zu kalibrierung? Oder lieber bei Firmware?
 
+\section{Abl\"oseerkennung}
+\begin{frame}\frametitle{Motivation f\"ur die Abl\"oseerkennung}
+	\begin{itemize}
+		\item \textbf{Problem}: Erste Druckschichten k\"onnen sich von Buildplate l\"osen \\ $\Rightarrow$ Drucker erkennt diesen Fehler nicht und macht einfach weiter!
+	\end{itemize}
+\end{frame}
+\begin{frame}\frametitle{Motivation f\"ur die Abl\"oseerkennung}
+	\includegraphics[width = 0.9\textwidth]{../Bilder_Alex/Fail}
+\end{frame}
+\begin{frame}\frametitle{L\"osung}
+	\begin{itemize}
+		\item Diesem kann teilweise durch ein beheiztes Druckbett entgegengewirkt werden, kann jedoch trotzdem noch passieren!
+		\item IDEE: Implementierung einer \"Uberwachungseinheit, die bei Erkennung den Druckprozess anh\"alt (und ggf. jmd. darauf hinweist)
+	\end{itemize}
+\end{frame}
+\begin{frame}\frametitle{Also welche M\"oglichkeiten gibt es?}	
+	\begin{itemize}
+		\item Idee 1: Lichtschrankenarray? $\Rightarrow$ Nein!
+		\item Idee 2: Entfernungsmessung? $\Rightarrow$ Nein!
+		\item Idee 3: Kamera? $\Rightarrow$ Ja!	
+	\end{itemize}
+ %Kurz auf jede einzelne Idee eingehen und sagen warum wir uns gegen sie entschieden bzw. für die Kamera entschieden haben, später als Note hinzufügen bitte!
+\end{frame}
+\begin{frame}\frametitle{Demonstration}
+	\begin{itemize}
+		\item Erstens: Ansteuerung einer Kamera \"uber das Board
+		\begin{itemize}
+			\item Parallel zur Verarbeitung und Auf\"uhrung von G-Code
+			\item Konfiguration von Bildeinstellungen
+			\item M\"ogliche Aufl\"osung und Bildrate?
+		\end{itemize}
+		\item Zweitens: M\"oglichkeiten f\"ur das Erkennen von sich abl\"osenden Teilen
+		\begin{itemize}
+			\item Prototypisch implementiert, abseits vom Board
+			\item Analyse von Bildern der Board-Kamera
+			\item Drei m\"ogliche Ans\"atze zur Erkennung von Abl\"osen
+		\end{itemize}
+	\end{itemize}
+\end{frame}
+
 
 \section{Budget}
 \begin{frame}\frametitle{Budget}
@@ -283,7 +291,7 @@ Ein detaillierterer Budgetplan findet sich auf unserem Wiki
 			\end{itemize}
 		\item Kosten aus dem FabLab:
 			\begin{itemize}
-				\item Lasercut $\Rightarrow$ 4.50 \euro
+				\item Lasercutter $\Rightarrow$ 4.50 \euro
 				\item Platinenfertigung x3 $\Rightarrow$ 9 \euro
 				\item Spende zwecks Kabelbinder, Hei{\ss}kleber und alte Kabel $\Rightarrow$ 2 \euro 
 			\end{itemize}
@@ -304,7 +312,7 @@ Ein detaillierterer Budgetplan findet sich auf unserem Wiki
 	\begin{itemize}
 		\item Fr\"uher Anfangen!
 		\item Bauteile aus China sind nicht immer zuverl\"assig!
-		\item Firmware jederzeit wieder selber schreiben
+		\item Firmware kann man selber schreiben
 		\item Sehr zeitaufw\"andig
 		\item L\"osung eines Problems f\"uhrt zu einem neuen Problem
 		\item Implementierung der Kamera war keine gute Idee, lieber Lichtschranke, da simpler (oder bessere Kamera)
diff --git a/ToyRep/firmware/axis.c b/ToyRep/firmware/axis.c
index 661b41b2efcd950d8d87b80617087bb90c2c679f..94aa5da0f8422cd07f57eb7d8ae7936d8b196d93 100644
--- a/ToyRep/firmware/axis.c
+++ b/ToyRep/firmware/axis.c
@@ -22,7 +22,7 @@ void setAxisValues_extruderBolt(axis* axis, motor* motor) {
 	axis->stepsPerMm = (axis->motor->stepsPerRevo * axis->motor->gearRatio * gearRatio) / pitch;
 	axis->mmPerStep = 1.0 / axis->stepsPerMm;
 	axis->isReversed = false;
-	axis->homeNoReverse = false;
+	axis->homeReverse = false;
 	axis->isRelative = true;
 }
 
@@ -34,7 +34,7 @@ void setAxisValues_M5(axis* axis, motor* motor) {
 	axis->stepsPerMm = (axis->motor->stepsPerRevo * axis->motor->gearRatio) / pitch;
 	axis->mmPerStep = 1.0 / axis->stepsPerMm;
 	axis->isReversed = false;
-	axis->homeNoReverse = false;
+	axis->homeReverse = false;
 	axis->isRelative = false;
 }
 
@@ -47,13 +47,13 @@ void setAxisValues_T25(axis* axis, motor* motor, uint8_t teeth) {
 	axis->stepsPerMm = (axis->motor->stepsPerRevo * axis->motor->gearRatio) / (pitch * teeth);
 	axis->mmPerStep = 1.0 / axis->stepsPerMm;
 	axis->isReversed = false;
-	axis->homeNoReverse = false;
+	axis->homeReverse = false;
 	axis->isRelative = false;
 }
 
 void homeAxis(axis* axis) {
 	int8_t one = 1;
-	if (axis->isReversed && !axis->homeNoReverse) one = -1;
+	if (axis->isReversed ^ axis->homeReverse) one = -1;
 	while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 0) {
 		while (diy_gpio_read_pin(axis->endstopPort, axis->endstopPin) == 0) {
 			setMotorMotion(axis->motor, -one, 1);
diff --git a/ToyRep/firmware/axis.h b/ToyRep/firmware/axis.h
index 40fd42dc4423d8374fb8ebc656da602c250306b3..a01be04fe96ea2a1cc5f3d6ef77bfcf8b7ef44d1 100644
--- a/ToyRep/firmware/axis.h
+++ b/ToyRep/firmware/axis.h
@@ -10,7 +10,7 @@
 typedef struct {
 	motor* motor;
 	bool isReversed;
-	bool homeNoReverse;
+	bool homeReverse;
 	bool isRelative;
 	mutex_t lock;
 	double homePos;
diff --git a/ToyRep/firmware/hello.c b/ToyRep/firmware/hello.c
index c6367205654d89b71b2c764fce9469cab71321cc..dc5d776d5d1ef7d6e33c35b9ad78cbb1e84dcb06 100644
--- a/ToyRep/firmware/hello.c
+++ b/ToyRep/firmware/hello.c
@@ -104,11 +104,17 @@ static cyg_uint32 serial_isr_handler(cyg_vector_t vector, cyg_addrword_t data);
 #define TEMP_KD 800.0
 
 /* ISR data */
-#define CAMERA_BUFFER_AMOUNT 32
+#define CAMERA_BUFFER_AMOUNT 2048
+#define CAMERA_IMAGE_WIDTH 176
+#define CAMERA_IMAGE_HEIGHT 144
 static volatile uint16_t cameraBuffer[CAMERA_BUFFER_AMOUNT];
 static volatile uint8_t cameraBufferPos;
-static volatile uint8_t cameraImage[176*2*144];
-static volatile uint8_t cameraImagePos;
+static volatile uint8_t cameraImage[CAMERA_IMAGE_HEIGHT][CAMERA_IMAGE_WIDTH*2];
+static volatile uint16_t cameraImagePosX = 0;
+static volatile uint16_t cameraImagePosY = 0;
+static volatile bool cameraImageStarted = true;
+static volatile bool cameraImageLineStarted = true;
+static volatile bool cameraImageFinished = false;
 static cyg_handle_t pclk_handle;
 static cyg_interrupt pclk_interrupt;
 /* ISR functions */
@@ -183,10 +189,10 @@ void thread_axis(cyg_addrword_t arg)
 	setAxisValues_T25(&axis_x, &mot_x, 20);
 	axis_x.mmPerStep *= 1.01875;
 	axis_x.stepsPerMm /= 1.01875;
-	axis_x.maxMmPerMin = 600.0;
+	axis_x.maxMmPerMin = 300.0;
 	axis_x.homePos = 100.0;
 	axis_x.isReversed = true;
-	axis_x.homeNoReverse = true;
+	axis_x.homeReverse = true;
 	axis_x.endstopPort = X_ENDSTOP_PORT;
 	axis_x.endstopPin = X_ENDSTOP_PIN;
 	
@@ -199,8 +205,10 @@ void thread_axis(cyg_addrword_t arg)
 	setAxisValues_T25(&axis_y, &mot_y, 20);
 	axis_y.mmPerStep *= 1.0125;
 	axis_y.stepsPerMm /= 1.0125;
-	axis_y.maxMmPerMin = 600.0; // could actually be 680
-	axis_y.isReversed = true;
+	axis_y.maxMmPerMin = 300.0; // could actually be 340
+	axis_y.homePos = 100.0;
+	axis_y.isReversed = false;
+	axis_y.homeReverse = true;
 	axis_y.endstopPort = Y_ENDSTOP_PORT;
 	axis_y.endstopPin = Y_ENDSTOP_PIN;
 	
@@ -222,7 +230,7 @@ void thread_axis(cyg_addrword_t arg)
 	setup_motor_gpio(E_AXIS_PORT, E_AXIS_PIN1, E_AXIS_PIN2, E_AXIS_PIN3, E_AXIS_PIN4);
 	setMotorValues_28BYJ48(&mot_e, E_AXIS_PORT, E_AXIS_PIN1, E_AXIS_PIN2, E_AXIS_PIN3, E_AXIS_PIN4);
 	setAxisValues_extruderBolt(&axis_e, &mot_e);
-	axis_e.maxMmPerMin = 60.0;
+	axis_e.maxMmPerMin = 30.0;
 	axis_e.mmPerStep /= 1.064516129;
 	axis_e.stepsPerMm *= 1.064516129;
 	axis_e.isReversed = true;
@@ -546,13 +554,13 @@ void thread_gcodeexecutor(cyg_addrword_t arg)
 				ezs_printf("ok\n");
 			} else if (gc->operationId == 10) {
 				// G10: Retract
-				setAxisTarget(&axis_e, axis_e.lastPosMm-5, axis_e.maxMmPerMin);
+				setAxisTarget(&axis_e, axis_e.lastPosMm-1, axis_e.maxMmPerMin);
 				allAxesFinished = false;
 				while (!allAxesFinished) {}
 				ezs_printf("ok\n");
 			} else if (gc->operationId == 11) {
 				// G11: Unretract
-				setAxisTarget(&axis_e, axis_e.lastPosMm+5, axis_e.maxMmPerMin);
+				setAxisTarget(&axis_e, axis_e.lastPosMm+1, axis_e.maxMmPerMin);
 				allAxesFinished = false;
 				while (!allAxesFinished) {}
 				ezs_printf("ok\n");
@@ -648,19 +656,31 @@ static cyg_handle_t handle_camerareader;
 static cyg_thread   threaddata_camerareader;
 void thread_camerareader(cyg_addrword_t arg)
 {
-    /*while(1){
-        if(cameraDataAvailable){
-        	uint8_t byte = 0, i = 0;
-        	while (i < 8) byte = (byte << 1) + cameraData[i++];
-	        ezs_printf("Camera: %d (%d/%d, %d printed)\n", byte, cameraDataReceived, 640*480, cameraDataPrinted++);
-	        cameraDataAvailable = false;
+    while(1){
+        if(cameraImageFinished){
+        	cameraImageFinished = false;
+        	ezs_serial_putc('B');ezs_serial_putc('G');ezs_serial_putc('N');ezs_serial_putc('\n');
+        	uint16_t xP = 0, yP = 0, printed = 0;
+        	while (yP < CAMERA_IMAGE_HEIGHT) {
+	        	while (xP < CAMERA_IMAGE_WIDTH*2) {
+    				ezs_printf("%d x %d\n", xP, yP);
+	        		ezs_serial_putc(cameraImage[yP][xP]);
+	        		printed++;
+	        		xP++;
+	        	}
+	        	yP++;
+	        }
+        	ezs_serial_putc('E');ezs_serial_putc('N');ezs_serial_putc('D');ezs_serial_putc('\n');
+        	ezs_printf("Dumped %d bytes.", printed);
         }
         ezs_delay_us(1e4);
-    }*/
+    }
 }
 
 void cyg_user_start(void)
 {
+	rcc_clock_setup_hse_3v3(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]);
+	
     ezs_counter_init();
     ezs_serial_init();
     ezs_gpio_init();
@@ -703,7 +723,7 @@ void cyg_user_start(void)
     cyg_interrupt_attach(serial_isr_handle);
     cyg_interrupt_unmask(SERIAL_IRQ);
     
-    /*ezs_printf("// Initializing Camera Pins...\n");
+    ezs_printf("// Initializing Camera Pins...\n");
 	
 	setup_input_gpio(CAMERA_DATA_PORT, CAMERA_DATA_PIN1
 										| CAMERA_DATA_PIN2
@@ -719,6 +739,8 @@ void cyg_user_start(void)
     ezs_printf("// Initializing Camera Clock...\n");
 
 	rcc_periph_clock_enable(RCC_GPIOA);
+	rcc_osc_on(RCC_HSI);
+	rcc_wait_for_osc_ready(RCC_HSI);
 	gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO8);
 	gpio_set_af(GPIO8, GPIO_AF0, GPIO8);
     gpio_set_output_options(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100MHZ, GPIO8);
@@ -739,15 +761,15 @@ void cyg_user_start(void)
 	tmp = 0b00011111;
 	writeSCCB(&sccb, 0x11, tmp);
 	
-	tmp = readSCCB(&sccb, 0x3E);
+	/*tmp = readSCCB(&sccb, 0x3E);
 	tmp &= 0b11100000;
-	tmp |= 0b00011100;
+	tmp |= 0b00010100;
 	writeSCCB(&sccb, 0x3E, tmp);
 	
 	tmp = readSCCB(&sccb, 0x73);
 	tmp &= 0b11110000;
 	tmp |= 0b00000100;
-	writeSCCB(&sccb, 0x73, tmp);
+	writeSCCB(&sccb, 0x73, tmp);*/
 	
 	tmp = readSCCB(&sccb, 0x0C);
 	tmp |= 0b00001000;
@@ -758,6 +780,10 @@ void cyg_user_start(void)
 	tmp |= 0b00001000;
 	writeSCCB(&sccb, 0x12, tmp);
 	
+	tmp = readSCCB(&sccb, 0x09);
+	tmp |= 0b00010000;
+	writeSCCB(&sccb, 0x09, tmp);
+	
 	ezs_printf("// Initializing Camera Interrupt...\n");
 	
 	setup_input_gpio(CAMERA_PCLK_PORT, CAMERA_PCLK_PIN, false);
@@ -775,7 +801,7 @@ void cyg_user_start(void)
     
 	nvic_enable_irq(NVIC_EXTI15_10_IRQ);
 	exti_select_source(EXTI15, GPIOA);
-	exti_set_trigger(EXTI15, EXTI_TRIGGER_RISING);*/
+	exti_set_trigger(EXTI15, EXTI_TRIGGER_RISING);
     
     ezs_printf("// Starting threads...\n");
 
@@ -783,9 +809,13 @@ void cyg_user_start(void)
     cyg_thread_resume(handle_hotend);
 	cyg_thread_resume(handle_gcodereader);
 	cyg_thread_resume(handle_gcodeexecutor);
-	//cyg_thread_resume(handle_camerareader);
+	cyg_thread_resume(handle_camerareader);
 	
-	// hotend ready thread is also responsible for sending "start" when all systems are ready*/
+	// hotend ready thread is also responsible for sending "start" when all systems are ready
+	
+	tmp = readSCCB(&sccb, 0x09);
+	tmp &= 0b11101111;
+	writeSCCB(&sccb, 0x09, tmp);
 }
 
 // ISR for reading from serial port
@@ -816,38 +846,54 @@ static void serial_dsr_handler(cyg_vector_t vector, cyg_ucount32 count, cyg_addr
 
 }
 
-volatile long unsigned int camCount;
-volatile uint8_t vsyncCountdown = 1;
 static cyg_uint32 pclk_isr(cyg_vector_t vector, cyg_addrword_t data){
+    cyg_interrupt_acknowledge(vector);
+    
+	if (diy_gpio_read_pin(GPIOB, GPIO15) == 1) { // VSync Pin (B15)
+		if (cameraImageStarted) {
+			cameraImagePosX = cameraImagePosY = 0;
+			cameraImageLineStarted = cameraImageFinished = true;
+			cameraImageStarted = false;
+		}
+	} else if (diy_gpio_read_pin(GPIOB,GPIO14)) { // HRef Pin (B14)
+		cameraImage[cameraImagePosY][cameraImagePosX++] = (GPIOD_IDR >> 8) & 0x000000FF; // pins D8 to D15
+		cameraImageStarted = true;
+		if (cameraImagePosX >= CAMERA_IMAGE_WIDTH * 2) {
+			cameraImagePosY++;
+			cameraImagePosX = 0;
+		}
+	}
+	return CYG_ISR_HANDLED;
+}
+
+static void pclk_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) {}
+
+/*static cyg_uint32 pclk_isr(cyg_vector_t vector, cyg_addrword_t data){
     cyg_interrupt_acknowledge(vector);
     
 	uint16_t signal = (GPIOB_IDR >> 14) & 0x00000003; // pins B14 and B15
-	if (signal != 0 && vsyncCountdown == 0) {
-		signal |= ((GPIOD_IDR >> 8) & 0x000000FF); // pins D8 to D15
+	if (signal != 0) {
+		signal |= (GPIOD_IDR & 0x0000FF00); // pins D8 to D15
 		cameraBuffer[cameraBufferPos++] = signal;
 		return CYG_ISR_CALL_DSR | CYG_ISR_HANDLED;
 	} else {
-		if (vsyncCountdown > 0 && (signal & 0x0200) != 0) {
-			vsyncCountdown = 0;
-		}
 		return CYG_ISR_HANDLED;
 	}
 }
 
 static void pclk_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data){
 	uint8_t i = 0;
-	camCount += count;
-	if (CAMERA_BUFFER_AMOUNT < cameraBufferPos) return;
 	while (i < cameraBufferPos) {
-		ezs_printf("Buf: %4x\n", cameraBuffer[i]);
-		uint8_t signal = (cameraBuffer[i] >> 8);
-		if ((signal & 0x02) != 0) { // VSync Pin (B15)
-			ezs_printf("Result: %d : %d\n", camCount, cameraImagePos);
-			cameraImagePos = camCount = 0;
-		} else if ((signal & 0x01) != 0) { // HRef Pin (B14)
-			cameraImage[cameraImagePos++] = cameraBuffer[i] & 0x000000FF;
+		//ezs_printf("Buf: %#04x\n", cameraBuffer[i]);
+		uint16_t buf = cameraBuffer[i];
+		if ((buf & 0x02) != 0) { // VSync Pin (B15)
+			ezs_serial_putc('V');
+			ezs_serial_putc('S');
+			ezs_serial_putc('C');
+		} else if ((buf & 0x01) != 0) { // HRef Pin (B14)
+			ezs_serial_putc((buf >> 8) & 0x00FF);
 		}
 		i++;
 	}
 	cameraBufferPos = 0;
-}
+}*/
diff --git a/ToyRep/firmware/system.odg b/ToyRep/firmware/system.odg
index de1dd087e1a3d3db122246be56605102550d0f25..af9070ac6fd4c486599529e4bc4705152d2abeae 100644
Binary files a/ToyRep/firmware/system.odg and b/ToyRep/firmware/system.odg differ
diff --git a/ToyRep/firmware/system_small.odg b/ToyRep/firmware/system_small.odg
new file mode 100644
index 0000000000000000000000000000000000000000..50c64c3855a2e902ddf9557006aaceef5f9f96a5
Binary files /dev/null and b/ToyRep/firmware/system_small.odg differ