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
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);
}
Habt ihr eine Idee?
gruß marcus
Lesezeichen