Hallo mal wieder ,
nachdem ich mein Timer funktioniert, hab ich mich an meine nächste Aufgabe gesetzt. ich wollte ein modellbauservo ansteuern. Dazu habe ich meinen Timer umgebaut. Wie ein Servo funktioniert hab ich kapiert. Ich hab mir jetzt gedacht ich schalte meinen Servoport an und nach 1.5ms schalte ich ihn wieder ab (hört sich erstmal nicht sooo sinnig an, will aber step by step weiter machen). Somit müßte ich doch einen definierten Ausschlag haben. Und zwar Mittelstellung. Mein Code habe ich angehängt.
Das Servo verhält sich aber folgendermaßen: Es läuft in Stufen auf eine Position, leider auf keine definierte. Wenn ich den uC resete läuft er weiter. Dürfte doch eigenltich nicht sein oder?
LG Anna
Code:
#include <stdlib.h>
#include <avr/interrupt.h>
volatile uint16_t Izeit_1; // Timervariable
volatile double servopos;
void wait_1_5ms(void) //kann eingestellt werden bis zu 3 s
{
cli();
Izeit_1 = 0;
sei();
while(Izeit_1<(20*servopos)) //zweite zahl in klammern steht für die zeit in ms
{
{
}
}
}
void Timer2_init(void)
{
TCCR2 |= (1<<WGM21) | (1<<CS01); // Prescaler eingestellt auf 8
OCR0 = 100; // nach der Formel foc0=fclk/(2*N*(1+ocr0))
TIMSK |= (1<<OCIE2);
}
ISR(TIMER2_COMP_vect)
{
if (Izeit_1 <= 60000)
Izeit_1 ++;
else
{
Izeit_1 = 0;
}
}
int main(void)
{
Timer2_init();
DDRC |= 0xff;
DDRD |= 0xff;
PORTC=0x00;
PORTD=0x00;
//while(1)
{
PORTC |= (1<<PC0); //LED anschalten, zur Kontrolle
PORTD |= (1 << PD5); //Servoport anschalten
servopos =1.5;
wait_1_5ms();
PORTD &= ~(1 << PD5); //Servoport ausschalten
PORTC &= ~(1 << PC0); //LED ausschalten, zur Kontrolle
}
}
Lesezeichen