Hier der Code den ich verwende
Code:
#include "asuro.h"
#include <stdlib.h>

#define OFFSET	0x3F
#define STEP	5

#define RWD_KEY   '2'
#define FWD_KEY   '8'
#define LEFT_KEY  '4'
#define RIGHT_KEY '6'
#define STOP_KEY  '5'

volatile unsigned char switchPressed;
int speedLeft,speedRight;

SIGNAL (SIG_INTERRUPT1)
{
	unsigned int i;

	DDRD |= SWITCHES;				// Switches as Output
	SWITCH_ON;						// Output HIGH for measurement
	ADMUX = (1 << REFS0) | SWITCH;	// AVCC reference with external capacitor
	for (i = 0; i < 0xFE; i++);

	ADCSRA |= (1 << ADSC);			// Start conversion
	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
	ADCSRA |= (1 << ADIF);			// clear ADCIF
	i = ADCL + (ADCH << 8);

	// und ab gehts --- fahr zurьck
	MotorDir(RWD,RWD);
	MotorSpeed(200,200);
	FrontLED(ON);
	BackLED(ON,ON);
	for (i = 0; i < 0xFFFD; i++);   // Sleep does not work here

	switchPressed = TRUE;
	SWITCH_OFF;
	DDRD &= ~SWITCHES;					// Switches as Input => ext. Int 1 
}

void PCFwd(void)
{
	speedRight += STEP;
	speedLeft  += STEP; 
	if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1; 
	if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1; 
	FrontLED(ON);
	BackLED(OFF,OFF);
}

void PCRwd(void)
{
	speedRight -= STEP;
	speedLeft  -= STEP;
	if (speedRight > 0 && speedRight <= OFFSET)  speedRight = -1; 
	if (speedLeft > 0 && speedLeft <= OFFSET)  speedLeft = -1; 
	FrontLED(OFF);
	BackLED(ON,ON);
}

void PCLeft (void)
{
	speedLeft  -= STEP;
	if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
	speedRight += STEP;
	if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
	FrontLED(OFF);
	BackLED(ON,OFF);
}

void PCRight (void)
{
	speedLeft  += STEP;
	if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1; 
	speedRight -= STEP;
	if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1; 
	FrontLED(OFF);
	BackLED(OFF,ON);
}


void PCStop(void)
{
	speedRight = speedLeft = 0;
	FrontLED(OFF);
	BackLED(OFF,OFF);
}


void PCDemo(void)
{
	unsigned char cmd;
	unsigned char leftDir = FWD, rightDir = FWD;

	Init();
	StartSwitch();
	sei();
	for(;;) {
		cmd = 0;	
		SerRead(&cmd,1,0xFFFE);
		switch (cmd) {
			case RWD_KEY :	PCRwd(); break;
			case FWD_KEY :	PCFwd(); break;
			case LEFT_KEY :	PCLeft(); break;
			case RIGHT_KEY : PCRight(); break;
			case STOP_KEY :	PCStop(); break;
		}
		if (speedLeft > 0 && speedLeft <  OFFSET) speedLeft += OFFSET;
		if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
		if (speedRight > 0 && speedRight <  OFFSET) speedRight += OFFSET;
		if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;
	
		if (switchPressed) {
			speedLeft  = 0;
			speedRight = 0;
			switchPressed = FALSE;
		}

		leftDir = rightDir = FWD;
		if (speedLeft < 0)  leftDir = RWD; 
		if (speedRight < 0) rightDir = RWD; 
			
		if (speedLeft >   255) speedLeft  =  255; 
		if (speedLeft <  -255) speedLeft  = -255;
		if (speedRight >  255) speedRight =  255;
		if (speedRight < -255) speedRight = -255;

		MotorDir(leftDir,rightDir);
		MotorSpeed(abs(speedLeft),abs(speedRight));
	} 	
}