Hi,
wir sind so langsam am verzweifeln, da die von uns durchdachte Servoansteuerung nicht funktioniert.
Wir arbeiten mit einem AtMega32 8MHz
Plan war es das Signal für die Servosteuerung durch Interrupts zu erstellen (Interrupts alle 10µs)
Nur leider ist das Ergebnis nicht das von uns Gewünschte 1,5ms(High) zu 17,5ms(Low) Verhältnis. wir bekommen eine Highzeit von ca. 9ms und demenstprechender Lowzeit.
Der Fehler tritt sowohl bei der Benutzung des internen, als auch bei der Benutzung eines Externen Taktes auf.
Der Timer scheint zu langsam zu sein, aber warum? woran kann das liegen
Habt ihr eine Idee?Code:#include <avr/io.h> #include <avr/interrupt.h> // volatile Interupt Zugriff volatile int s_AnZeit = 150; // "Lenkzeit" in microsecond volatile int s_AnZeit_tmp = 150; // Sicherheits Zwischenspeicher für Lenkzeit volatile long int s_Counter = 0; // Zählervariable für den Servo PORTD =0x00; // PORTD auf Low setzen ISR(TIMER0_OVF_vect) { TCNT0 = 176; if (s_Counter == 0) { PORTD =0x40; // PORTD6 auf High setzen } if (s_Counter == s_AnZeit_tmp) { PORTD =0x00; // PORTD auf Low setzen } s_Counter++; if (s_Counter == 2000) { s_AnZeit_tmp = s_AnZeit; // Holen der neuen "Lenkzeit" s_Counter = 0; // Zurücksetzen der Zählervarible } } int main () { DDRD=0xff; // PORTD6 auf Ausgang PORTD =0x00; // PORTD vorsichtshalber mal auf Low gesetzt TCCR0 |= (0<<WGM01)|(1<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<CS00); TCNT0 = 176; TIMSK |= (1<<TOIE0); sei(); do { } while (1); }
gruß marcus
Lesezeichen