So, nun sieht es so aus und funktioniert auch, wei geplant
Dafür klkappts noch nicht mit der Bluetooth+Bresenham Variante, ich zeig die gleich nochmal.
Code:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "uart.h"
#include <avr/interrupt.h>
#include <stdint.h>
//#include <avr/pgmspace.h>
#define UART_BAUD_RATE 250000
#define m_delay 1500
volatile uint16_t motor1=0;
volatile uint16_t motor2=0;
//absolute direction in degree (-180 to 180, -90 to 90)
volatile int16_t xpos = 0;
volatile int16_t ypos = 0;
#define speed 50
#define deframp 200
#define rf 2
const unsigned char halfstep[8]={5,1,9,8,10,2,6,4};
void init()
{
DDRA = 0b00000011;
DDRB = 0b11111111;
DDRD = 0b00000000;
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
sei();
}
void _vdelay_us(int delay)
{
int cnt;
for (cnt=0;cnt<delay;cnt++)
{
_delay_us(10);
}
}
void _vdelay_ms(int delay)
{
int cnt;
for (cnt=0;cnt<delay;cnt++)
{
_delay_ms(1);
}
}
void step_x(int dir)
{
motor1 = motor1 + dir;
PORTB = (halfstep[(motor1 & 7)])| (PORTB & (0b11110000));
_vdelay_us(speed);
}
void step_y(int dir)
{
motor2 = motor2 + dir;
PORTB = (halfstep[(motor2 & 7)]) << 4| (PORTB & (0b00001111));
_vdelay_us(speed);
}
void turn_x(int steps)
{
int cnt;
int ramp = deframp;
int shortramp=0;
char m=0;
m = motor1;
if (abs(steps)<(ramp*2))
{
shortramp=ramp-(abs(steps)/2);
ramp= abs(steps)/2;
}
else
shortramp=0;
PORTA |= (1<<0);
if (steps>0)
{
for (cnt=0;cnt<=steps;cnt++)
{
step_x(1);
// ramp start/stop
if (cnt<ramp) //start
{
_vdelay_us((ramp-cnt+shortramp)*rf);
}
if (cnt>(steps-ramp)) //stop
{
_vdelay_us((cnt-(steps-ramp-shortramp))*rf);
}
}
}
else
if (steps<0)
{
for (cnt=0;cnt>=steps;cnt--)
{
step_x(-1);
// ramp start/stop
if (abs(cnt)<ramp) //start
{
_vdelay_us((ramp-abs(cnt)+shortramp)*rf);
}
if (abs(cnt)>(abs(steps)-ramp)) //stop
{
_vdelay_us((abs(cnt)+(steps+ramp)+shortramp )*rf);
}
}
}
motor1 += steps;
PORTA&=~(1<<0); //motor disable
}
void turn_y(int steps)
{
int cnt;
int ramp = deframp;
int shortramp=0;
char m=0;
m = motor2;
if (abs(steps)<(ramp*2))
{
shortramp=ramp-(abs(steps)/2);
ramp= abs(steps)/2;
}
else
shortramp=0;
PORTA |= (1<<1);
if (steps>0)
{
for (cnt=0;cnt<=steps;cnt++)
{
step_y(1);
// ramp start/stop
if (cnt<ramp) //start
{
_vdelay_us((ramp-cnt+shortramp)*rf);
}
if (cnt>(steps-ramp)) //stop
{
_vdelay_us((cnt-(steps-ramp-shortramp))*rf);
}
}
}
else
if (steps<0)
{
for (cnt=0;cnt>=steps;cnt--)
{
step_y(-1);
// ramp start/stop
if (abs(cnt)<ramp) //start
{
_vdelay_us((ramp-abs(cnt)+shortramp)*rf);
}
if (abs(cnt)>(abs(steps)-ramp)) //stop
{
_vdelay_us((abs(cnt)+(steps+ramp)+shortramp )*rf);
}
}
}
motor2 += steps;
PORTA&=~(1<<1); //motor disable
}
void turn_deg_x(int16_t deg)
{
turn_x(deg*67);
}
void turn_deg_y(int16_t deg)
{
turn_y(deg*67);
}
unsigned char serialin(void)
{
unsigned int c;
c = uart_getc();
while ( c & UART_NO_DATA )
c = uart_getc();
return c;
}
void remote_move()
{
int16_t x,y;
x=serialin()+(serialin()<<8);
y=serialin()+(serialin()<<8);
turn_deg_x(x-(xpos));
turn_deg_y(y-(ypos));
xpos = x;
ypos = y;
uart_putc(0);
}
void remote(void)
{
unsigned int c;
c = uart_getc();
if ( c & UART_NO_DATA )
{
/*
* no data available from UART
*/
}
else
{
/*
* new data available from UART
* check for Frame or Overrun error
*/
if ( c & UART_FRAME_ERROR )
{
/* Framing Error detected, i.e no stop bit detected */
//uart_puts_P("UART Frame Error: ");
}
if ( c & UART_OVERRUN_ERROR )
{
/*
* Overrun, a character already present in the UART UDR register was
* not read by the interrupt handler before the next character arrived,
* one or more received characters have been dropped
*/
//uart_puts_P("UART Overrun Error: ");
}
if ( c & UART_BUFFER_OVERFLOW )
{
/*
* We are not reading the receive buffer fast enough,
* one or more received character have been dropped
*/
//uart_puts_P("Buffer overflow error: ");
}
//doing commands
switch(c)
{
case 1:
remote_move();
break;
}
}
}
int main(void)
{
init();
while (1)
{
remote();
}
}
Lesezeichen