Hallo Leutz,
ich habe meinen Servo soweit, dass er sich entsprechend seiner Funktion verhält.
Warum weiss ich allerdings nicht.
Kann mir einer meinen Code erklären (klingt lächerlich, ich weiss)?Code:#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int ontime = 0; int offtime = 2000; ISR(TIMER0_COMP_vect) { static int onBuf; if( offtime - ontime > 0 ) { onBuf = ontime; offtime--; } else { if( onBuf == 0 ) { offtime = 8000; PORTA &= ~0x80; onBuf = ontime; } else { if( onBuf == ontime ) PORTA |= 0x80; onBuf--; } } } int main(void) { DDRA = 0x80; PORTA = 0x00; // CLK/8 Prescaler CS01 TCCR0 = (1<<CS01); OCR0 = 20; // 16000000/8 = 1999490/20 = 99974,50Hz => 0,01ms TIMSK |= (1<<OCIE0); sei(); int i = 0; ontime = 3; // links for(i=0;i<312;i++) _delay_ms( 16 ); ontime = 11; // mitte for(i=0;i<312;i++) _delay_ms( 16 ); ontime = 19; // rechts for(i=0;i<312;i++) _delay_ms( 16 ); ontime = 0; while(1); }
Warum müsste lt. Theorie die Interrupt-Routine alle 0.01ms aufgerufen werden oder täusche ich mich da?
@Hubert G.: Du hattest recht, auch wenn diese minimalistische Bemerkung, das hätte was mit 1MHz zu tun, in der avr-Libc-Doku irgendwie missverständlich für eine _delay_ms-Funktion ist.
Warum veranlasst ein ontime=4 die linke Position, wenn das theoretisch niemals 1ms sein kann?
Warum diese komischen anderen Werte für Mitte/Links?
Ich benutze kein PWM, generiere ich da unwissentlich ein Software-PWM?
Bewegt sich ein Servo immer in so ruckartigen Bewegungen, oder gibt es eine Möglichkeit von einer zur nächsten Position kontinuierlich zu kommen?
thx4Help
Banzai







Zitieren

Lesezeichen