diff --git a/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo b/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo
index 55e60fb340b458c9138b47408fd1140916de7ca5..0871b8c868f38dfd65e529bf3b267f96084d33da 100644
Binary files a/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo and b/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo differ
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
index ae796b24588979e22622fe25411d915f299abbc1..36ab2b207b6a14040d34f594d5759422b76f2673 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
@@ -31,51 +31,51 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){
 			case APA_HANDLER_INSIDE:
 				switch (packet[i]){
 					case DELIM_KEY_POSITION_FLOAT:
-						if(i + 5 < length){
-							break; // broken data
+						if(i + 5 > length){
+							i ++;
 						} else {
 							float position = 0;
 							position = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
 							stepper_targetposition_float(&stepper, position);
 							i += 5; // bring packet ptr to next key (should)
-							break;
 						}
+						break;
 						
 					case DELIM_KEY_POSITION_STEPS:
-						if(i + 5 < length){
-							break; // broken data
+						if(i + 5 > length){
+							i ++;
 						} else {
 							int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
 							stepper_targetposition_steps(&stepper, steps);
 							i += 5; // bring packet ptr to next key (should)
-							break;
 						}
+						break;
 						
 					case DELIM_KEY_SPEED_FLOAT:
-						if(i + 5 < length){
-							break; // broken data
+						if(i + 5 > length){
+							i ++;
 						} else {
 							float speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
 							stepper_targetspeed_float(&stepper, speed);
 							i += 5; // bring packet ptr to next key (should)
-							break;
 						}
+						break;
 					
 					case DELIM_KEY_SPEED_STEPS:
-						if(i + 5 < length){
-							break; // broken data
+						if(i + 5 > length){
+							i ++; // avoiding hangup
 						} else {
-							int32_t speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
+							uint32_t speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
 							stepper_targetspeed_steps(&stepper, speed);
 							i += 5; // bring packet ptr to next key (should)
-							break;
 						}
+						break;
 																
 					default:
 						// probably an error
+						i ++;
 						break;
 				} // end interior switch
-				i ++;
 				break;
 				
 			default: 
@@ -88,6 +88,8 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){
 
 
 void apa_return_packet(uint8_t *packet, uint8_t length){
+	//uart_sendchar_buffered(ups[1], 120);
+	//uart_sendchars_buffered(ups[1], packet, length);
 	uint8_t ackpack[length];
 	ackpack[0] = length;
 	// find route header
@@ -114,5 +116,10 @@ void apa_return_packet(uint8_t *packet, uint8_t length){
 			ackpack[u] = packet[u];
 		}
 		uart_sendchars_buffered(ups[ackpack[1]], ackpack, length);
+		// NOW:
+		// looking for justice: why no return packet on double length hop?
+		// debug with 2nd ftdi
+		//uart_sendchar_buffered(ups[1], 121);
+		//uart_sendchars_buffered(ups[1], ackpack, length);
 	}
 }
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/main.c b/embedded/mkstepper-v011/mkstepper-v011/main.c
index ddf48c88b602719fc010a60f059e71f7b5967a9e..80565ea457dcacdb7c86249d43e65ad8df0ab961 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/main.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/main.c
@@ -247,8 +247,9 @@ int main(void)
 	pin_output(&dir_pin);
 	
 	stepper = stepper_new(&step_pin, &dir_pin, 360.0, 64);
+	stepper_reset(&stepper);
 	
-	stepper_targetspeed_steps(&stepper, 400);
+	stepper_targetspeed_steps(&stepper, 500); // so slow
 	
 	uint8_t lpcnt = 0;
 	uint8_t stpcnt = 0;
@@ -260,18 +261,21 @@ int main(void)
 	
 		if(stepper.position_ticks_target == stepper.position_ticks){
 			stpcnt ++;
-			stepper_targetposition_steps(&stepper, 1000 * (stpcnt %2));
-			stepper_targetspeed_steps(&stepper, 500);
+			pin_clear(&stlr);
+			//stepper_targetposition_steps(&stepper, 1000 * (stpcnt %2));
+			//stepper_targetspeed_steps(&stepper, 500);
 			//stepper_goto(&stepper, 360 * (stpcnt % 2), 1200);
+		} else {
+			pin_set(&stlr);
 		}
     }
 }
 
 /*
 next steps (haha)
-- mkteriminal to write float values for keys ...
-- do float positions / conversions / speeds / etc -> setup and doc values, types, what units are
-- make sure you can run -ve positions
+- do steps, steps/s speed checking, and direction
+- unit test all commands on all ports using mkterminal
+
 - this quickly so that you can mods compose
 
 further reading:	
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.c b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
index eabea0cebc437196e5c59e0e003e28960a24321b..53d2df978b03ea8e33dd947eb374c7ec88dc91d3 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
@@ -59,14 +59,19 @@ void stepper_targetspeed_float(stepper_t *stepper, float speed){
 	// do more business
 }
 
-void stepper_targetspeed_steps(stepper_t *stepper, int32_t speed){
-	stepper->speed_period = 3000000 / ((speed / (stepper->position_per_200_steps / 200)) * stepper->microsteps);
+void stepper_targetspeed_steps(stepper_t *stepper, uint32_t speed){
+	uint32_t speedmin = ((speed / (stepper->position_per_200_steps / 200)) * stepper->microsteps); // enforce no division by 0
+	(speedmin < 1) ? speedmin = 1 : (0);
+	// timing not accurate to real-world yet
+	stepper->speed_period = 300000000 / speedmin;
 }
 
 void stepper_update(stepper_t *stepper){	
 	if(stepper->position_ticks_target != stepper->position_ticks){ // still have somewhere to go
 		TICKER_SYNC;
 		uint32_t now = TICKER;
+		// check if it's time to step
+		// todo: do timer update to fire this f'n at precisely the right time: nice for accel, deccel etc
 		if(now - stepper->last_time > stepper->speed_period){
 			int32_t gap = stepper->position_ticks_target - stepper->position_ticks;
 			if(gap < 0){
@@ -82,5 +87,6 @@ void stepper_update(stepper_t *stepper){
 			}
 			stepper->last_time = now;
 		} // end step cycle
-	}
+		
+	}// end step if not there cycle
 }
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.h b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
index e9462d1a1c34470a86a2c020439a98d0f3930891..581023aefb96254b423f5aae2a37f17d89067692 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
@@ -24,6 +24,7 @@ typedef struct {
 	uint32_t last_time;
 	
 	// float conversions
+	// not used in runtime, only during command calls
 	float position_per_200_steps; // units (mm or deg, probably) moved per full rotation
 	uint32_t microsteps;
 	float position;
@@ -40,7 +41,7 @@ void stepper_reset(stepper_t *stepper);
 void stepper_goto(stepper_t *stepper, float position, float speed);
 void stepper_targetposition_steps(stepper_t *stepper, int32_t steps);
 void stepper_targetposition_float(stepper_t *stepper, float position);
-void stepper_targetspeed_steps(stepper_t *stepper, int32_t speed);
+void stepper_targetspeed_steps(stepper_t *stepper, uint32_t speed);
 void stepper_targetspeed_float(stepper_t *stepper, float speed);
 
 void stepper_update(stepper_t *stepper);