Code:
//Besseres Programm
#include "asuro.h"

void vorwaerts()
{
//Motor links auf vorwärts
PORTD |=(1<<PD5);
PORTD &=~(1<<PD4);

//Motor rechts auf vorwärts
PORTB |=(1<<PB5);
PORTB &=~(1<<PB4);
}

void rueckwaerts()
{

//Motor links auf rueckwaerts
PORTD |=(1<<PD4);
PORTD &=~(1<<PD5);

//Motor rechts auf rueckwaerts
PORTB |=(1<<PB4);
PORTB &=~(1<<PB5);
}

void bremsen()
{
//Motor links bremsen (den Motor kurzschliessen)
PORTD &=~(1<<PD4);
PORTD &=~(1<<PD5);

//Motor links bremsen (den Motor kurzschliessen)
PORTB &=~(1<<PB4);
PORTB &=~(1<<PB5);
}

void leerlauf()
{
//Motor kein Transistor öffnet
PORTD |=(1<<PD4); //T1 geschlossen
PORTD |=(1<<PD5);  //T3 geschlosen
OCR1A=0; //T2 und T4 geschlossen

//Motor rechts auf leerlauf
PORTB |=(1<<PB4); //T1 geschlossen
PORTB |=(1<<PB5); //T3 geschlosen
OCR1B=0; //T2 und T4 geschlossen
}

void schneller()
{
//Wichig: 255 ist das Maximum
if(OCR1A<=245) OCR1A += 10;
	else OCR1A=255;
if(OCR1B<=245) OCR1B += 10;
	else OCR1B=255;
}


void langsamer()
{
//keinen negativen wert
if(OCR1A>=10) OCR1A -= 10;
	else OCR1A=0;
if(OCR1B>=10) OCR1B -= 10;
	else OCR1B=0;
}

int main()
{
Init();
char zeichen;

// Motorrichtung einstellen
// PD4, PD5 für linken Motor, PB4, PB5 für rechten motor
// als erstes die Pins als Ausgang setzten
DDRD|=(1<<PD4) | (1<<PD5);
DDRB |=(1<<PB4) | (1<<PB5);

// PB1 und PB2 sind für die Ansteuerung der H-Brücken zuständig und werden von der PWM erzeugt
// Jedoch müssen die Pins erst als Ausgang gesetzt weden.
DDRB |= (1<<PB1) | (1<<PB2);

//PWM einheit einstellen
//Da wir jedes Bit in den Registern TCCR1A und TCCR1B aendern wollen koennen wir hier "=" benutzen und muessen nicht "|=" bzw "&=" benutzen
//Wir setzen also nicht nur WGM10, COM1A1, COM1B1 und CS11 sondern löschen auch alle anderen Bits!!!
TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); //PWM phase correct 8-Bit, clear on match when upcounting
TCCR1B = (1<<CS11); //nur CS11 etzen alles andere 0, fuer Takt/8     

//Startrichtung
vorwaerts();

//Startgeschwindigkeit 100
OCR1A=100;
OCR1B=100;

SerWrite("Eingabe:",7);
while(1)
{
	SerRead(&zeichen,1,0);

	switch(zeichen)
	{
		case 'V': 	vorwaerts();
					SerWrite("v",1); 
					break;

		case 'R': 	rueckwaerts();
					SerWrite("r",1); 
					break;

		case 'S': 	schneller();
					SerWrite("s",1); 
					break;

		case 'L': 	langsamer(); 
					SerWrite("l",1);
					break;

		case 'B': 	bremsen();
					SerWrite("b",1);
					break;
		case 'A': 	leerlauf(); 
					SerWrite("a",1);
					break;

		default: 	SerWrite("*",1);
	}
}

}


/*
//Beispiele von Studenten

	DDRB |= 54; //PB1,PB2,PB4,PB5 setzen => alle 4 als Ausgang
	DDRD |= 48; //PD4,PD5 auf Ausgang
	
	TCCR1A |= 161; //TCCR1A/B setzen wie in Vorlesungsfolien angegeben


//ist das gleiche wie
	DDRB |=(1<<PB4) | (1<<PB5) | (1<<PB1) | (1<<PB2);
	DDRD|=(1<<PD4) | (1<<PD5);

// Jedoch ist die schreibweise DDRB |= 54; deutlich unübersichtlicher und Fehleranfällig


//Mann kann sich auch Macros definieren um den COde strukturierter zu gestalten
/ Beispiel:
//********* MACROS **********
 #define setBit(Byte, BitNo)   (Byte |=  (1<<BitNo))    // sets the BitNo in Byte
 #define clrBit(Byte, BitNo)   (Byte &= ~(1<<BitNo))   // clears the BitNo in Byte
 #define chkBit(Byte, BitNo)   (Byte & (1<<BitNo)) // true (!=0) , if Bit is set.
	

//Beisüiel aus der AVR Library:
// In ./avr/include/avr/sfr_defs.h steht folgendes:
#define _BV(bit) (1 << (bit))


// Hier ein Beispiel wie die Motorensteuerung in der Asuro Bibliothek realisiert wird
inline void MotorDir (
unsigned char left_dir,
 unsigned char right_dir)
{
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
}
//als Eingabe dienen die Makros:
#define 	FWD   _BV(PB5)
#define 	RWD   _BV(PB4)
#define 	BREAK   0x00
#define 	FREE   _BV(PB4) | _BV(PB5)

*/