Hallo Leutz,
ich habe meinen Servo soweit, dass er sich entsprechend seiner Funktion verhält.
Warum weiss ich allerdings nicht.
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);
}
Kann mir einer meinen Code erklären (klingt lächerlich, ich weiss)?
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
Lesezeichen