So ein Mist...wir waren tierisch happy das der Servo überhaupt geht....es ist nicht so das ich hier einfach nur reinposte weil ich zu faul bin mich drum zu kümmern. Das ist nur nen superkurzfristiges Projekt an der FH...

Ich poste euch mal grade den Code den wir für die Servoansteuerung nutzen...welche Register ich da genau wo verwende weiß ich im Grunde garnicht, der Code wurde nur mit viel ausprobieren angepasst.

Ich würde mich gerne tiefer in de Thematik einarbeiten aber ihr wisst ja selber das das nicht in ein paar Tagen möglich ist....

################################################## #
rncontrol.h

Diese Header-Datei stellt grundlegende Funktionen in C zur Verfügung.
Dominik Wiechard
Bearbeitet von
################################################## #####
*/
#include <avr/io.h>
#include <stdlib.h>
/*-----------------------------------------------------------------------------------*/
/*###Portkonfiguration###*/
/*Pins bzw. Ports als Ein-/Ausgänge konfigurieren*/




void PORTCONFIG(void)
{
//-> alle Pin´s von Port F als Eingänge
DDRB |= (1<<PB1); //PB5 Servo 1 OC1A
DDRC |= (1<<PC0);
}

/*-------------------------------------------------------------------------------------*/
/*###PWM Konfiguration###*/

void PWM_INIT(void)
{
// normale 8-bit PWM aktivieren (nicht invertiert), COM1A1=1 und COM1A0=1-->set 1 upcounting set 0 downcounting

TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(0<<WGM10)|(0<<WGM11);

// Einstellen der PWM-Frequenz (Prescaler = 8-->CS11)

TCCR1B = (0<<CS10)|(1<<CS11)|(0<<CS12)|(0<<WGM12)|(1<<WGM13 ); // Mode 8 aktiviert

TCNT1H=0x00;
TCNT1L=0x00;

// Interrupts für Timer1 deaktivieren
// Achtung: Auch die Interrupts für die anderen Timer stehen in diesem Register
//TIMSK &= ~0x3c;
TIMSK1=0x00;

ICR1 = 20000;
}

/*-------------------------------------------------------------------------------------*/
/*### ADC-Ansteuerung ###*/

uint16_t adcwert(uint8_t kanal)
{
uint16_t wert = 0; //Variable für Ergebnis deklarieren

ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //Register zur ADC Messung aktivieren

ADMUX = kanal;
ADMUX = (0<<REFS1)|(1<<REFS0);

ADCSRA |= (1<<ADSC); //nach Aktivierung des ADC wird ein Wert eingelesen und verwirft diesen wieder, um den ADC "warmlaufen zu lassen"
while(ADCSRA & (1<<ADSC)) {} //auf Abschluss der Konvertierung warten
wert = ADCW; //ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.

/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
wert = 0;
for(uint8_t i=0; i<4; i++)
{
ADCSRA |= (1<<ADSC); //eine Wandlung "single conversion" starten
while(ADCSRA & (1<<ADSC)) {} //auf Abschluss der Konvertierung warten
wert = wert + ADCW; //Wandlungsergebnisse aufaddieren
}

ADCSRA &= ~(1<<ADEN); //ADC deaktivieren

wert = wert/4; //Durchschnittswert bilden

return wert;
}