xymotors.h


unsigned char x_cycle, y_cycle;

// move the x rod forwards
void x_forw(int time_ms){
	switch(x_cycle)
	{
		case 0: PORTB = 0x80 | (PORTB & 0x0f); break;
		case 1: PORTB = 0x40 | (PORTB & 0x0f); break;
		case 2: PORTB = 0x20 | (PORTB & 0x0f); break;
		case 3: PORTB = 0x10 | (PORTB & 0x0f); break;
		default: x_cycle = x_cycle%4; break;  // default: if half cycle used,
	}	                                          //     x_cycle may not be in 0-3 range
	x_cycle = (x_cycle + 1)% 4;
	delay_ms(time_ms);
}

// move the x rod backwards
void x_backw(int time_ms){
	switch(x_cycle)
	{
		case 0: PORTB=0x20 | (PORTB & 0x0f);
				x_cycle=3;
				break;
		case 1: PORTB=0x10 | (PORTB & 0x0f);
				x_cycle=0;
				break;
		case 2: PORTB = 0x80 | (PORTB & 0x0f);
				x_cycle=1;
				break;
		case 3: PORTB = 0x40 | (PORTB & 0x0f);
				x_cycle=2;
				break;
		default: x_cycle = x_cycle%4; break;
	}
	delay_ms(time_ms);
}

// move the y rod forwards
void y_forw(int time_ms){
	switch(y_cycle)
	{
		case 0: PORTB= 0x08 | (PORTB & 0xf0); break;
		case 1: PORTB= 0x04 | (PORTB & 0xf0); break;
		case 2: PORTB= 0x02 | (PORTB & 0xf0); break;
		case 3: PORTB= 0x01 | (PORTB & 0xf0); break;
		default: y_cycle = y_cycle%4; break;
	}
	y_cycle = (y_cycle + 1)%4;
	delay_ms(time_ms);
}

// move the y rod backwards
void y_backw(int time_ms){
	switch(y_cycle)
	{
		case 0: PORTB=0x02 | (PORTB & 0xf0);
				y_cycle=3;
				break;
		case 1: PORTB=0x01 | (PORTB & 0xf0);
				y_cycle=0;
				break;
		case 2: PORTB = 0x08 | (PORTB & 0xf0);
				y_cycle=1;
				break;
		case 3: PORTB = 0x04 | (PORTB & 0xf0);
				y_cycle=2;
				break;
		default: y_cycle = y_cycle%4; break;
	}
	delay_ms(time_ms);
}

// move x-rod half-step forward
void x_forw_half(int time_ms){
	switch (x_cycle)
	{
		case 0: PORTB = 0x80 | (PORTB & 0x0f); break;
		case 1: PORTB = 0xc0 | (PORTB & 0x0f); break;
		case 2: PORTB = 0x40 | (PORTB & 0x0f); break;
		case 3: PORTB = 0x60 | (PORTB & 0x0f); break;
		case 4: PORTB = 0x20 | (PORTB & 0x0f); break;
		case 5: PORTB = 0x30 | (PORTB & 0x0f); break;
		case 6: PORTB = 0x10 | (PORTB & 0x0f); break;
		case 7: PORTB = 0x90 | (PORTB & 0x0f); break;
	}
	x_cycle = (x_cycle + 1)% 8;
	delay_ms(time_ms);
}

// move x rod half-step backwards
void x_backw_half(int time_ms){
	switch (x_cycle)
	{
		case 0: PORTB = 0x20 | (PORTB & 0x0f);
				x_cycle = 7;
				break;
		case 1: PORTB = 0x30 | (PORTB & 0x0f);
				x_cycle=0;
				break;
		case 2: PORTB = 0x10 | (PORTB & 0x0f);
				x_cycle=1;
				break;
		case 3: PORTB = 0x90 | (PORTB & 0x0f);
				x_cycle=2;
				break;
		case 4: PORTB = 0x80 | (PORTB & 0x0f);
				x_cycle=3;
				break;
		case 5: PORTB = 0xc0 | (PORTB & 0x0f);
				x_cycle=4;
				break;
		case 6: PORTB = 0x40 | (PORTB & 0x0f);
				x_cycle=5;
				break;
		case 7: PORTB = 0x60 | (PORTB & 0x0f);
				x_cycle=6;
				break;
	}
	delay_ms(time_ms);
}

// move y rod half-step forward
void y_forw_half(int time_ms){
	switch (y_cycle)
	{
		case 0: PORTB = 0x08 | (PORTB & 0xf0); break;
		case 1: PORTB = 0x0c | (PORTB & 0xf0); break;
		case 2: PORTB = 0x04 | (PORTB & 0xf0); break;
		case 3: PORTB = 0x06 | (PORTB & 0xf0); break;
		case 4: PORTB = 0x02 | (PORTB & 0xf0); break;
		case 5: PORTB = 0x03 | (PORTB & 0xf0); break;
		case 6: PORTB = 0x01 | (PORTB & 0xf0); break;
		case 7: PORTB = 0x09 | (PORTB & 0xf0); break;
	}
	y_cycle = (y_cycle + 1)% 8;
	delay_ms(time_ms);
}

// move y rod half-step backwards
void y_backw_half(int time_ms){
	switch (y_cycle)
	{
		case 0: PORTB = 0x02 | (PORTB & 0xf0);
				y_cycle = 7;
				break;
		case 1: PORTB = 0x03 | (PORTB & 0xf0);
				y_cycle=0;
				break;
		case 2: PORTB = 0x01 | (PORTB & 0xf0);
				y_cycle=1;
				break;
		case 3: PORTB = 0x09 | (PORTB & 0xf0);
				y_cycle=2;
				break;
		case 4: PORTB = 0x08 | (PORTB & 0xf0);
				y_cycle=3;
				break;
		case 5: PORTB = 0x0c | (PORTB & 0xf0);
				y_cycle=4;
				break;
		case 6: PORTB = 0x04 | (PORTB & 0xf0);
				y_cycle=5;
				break;
		case 7: PORTB = 0x06 | (PORTB & 0xf0);
				y_cycle=6;
				break;
	}
	delay_ms(time_ms);
}