Hi,
also folgende Fehler sind mir auf die schnelle aufgefallen:

Bits löschen nicht so:
Code:
PORTC |= ( 0 << PC0 );
sondern so:
Code:
PORTC &= ~(1 << PC0);
Warum und weswegen lässt sich in verschiedensten Tutorials nachlesen.

Weiterhin hast du in deiner Funktion Motor zunächst Prüfung ob speed < 0 oder >= 0 ist, dann setzt du aber danach egal wie speed ist eh und je PORTC nochmal, dass muss raus.
Hier mal die berichtigte Funktion:

Code:
void motor(int speed)
{
 if (speed<0)
 {
   PORTC &= ~(1 << PC0); // Linksdrehen
   PORTC |= ( 1 << PC1 );
   OCR0 = -speed;          // Vergleichswert festlegen=Geschwindigkeit einstellen(0-255)
 }
 
 if (speed>=0)
 {
   PORTC |= ( 1 << PC0 ); // Rechtsdrehen
   PORTC &= ~(1 << PC1);
   OCR0 = speed;
 }
}
Die Unterschiede kannst du dir ja selbst anschauen .. weiterhin gibt die Funktion ja keinen Wert zurück, deswegen void als Rückgabetyp.

In deiner pwm_init setzt du auch DDRC falsch. Die Bits werden von hinten an gezählt .. also
Code:
DDRC = 0x00000011;
Damit PC0 und PC1 auf Ausgang gestellt sind.

Dein TCCR0 hab ich mir jetzt nicht angeschaut, hast du ja bestimmt irgendwo rauskopiert?



So, das waren erstmal alle Fehlerchen, die ich auf Anhieb gefunden habe.

Viele Grüße CsT

EDIT:
ein
Code:
return 0;
gehört noch ans Ende deiner main-Funktion! Hinter der while-Schleife!