Hi,
danke für die Antworten, ich habe jetzt versucht das mit Interrupt umzusetzen. Alle 10 µs wird ein Interrupt ausgelöst bei dem eine 'TimerVariable' hochgezählt wird. Mit einer Funktion frage ich diese Variable ab und mache über zwei Vergleichswerte (Periodendauer und Highzeit) die PWM zu steuern:
Theoretisch sollte die PWM den Port 1,5 ms anschalten und 20,5 ms aus sein.
Praktisch ist das Verhältniss von high und low aber 50 %.
Ich hab schon einiges an den Werten geändert, es hat sich allerdings nichts getan. Ich seh im moment den Wald vor lauter Bäumen nicht Habt ihr eine idee?
Code:
void init()
{
//--- Timer 2 initialisieren ---
TCCR2=0x01; // Teiler 1/1
TCCR2|=0x28; // Modus: Zählen bis Vergleichswert
OCR2=80; // Vergleichswert speichern
TIMSK=0x80; // Interrupt bei Vergleichswert A
//--- Interrupts erlauben ---
sei();
sbi(DDRC,3); // PortC3 auf Ausgang
}
//--------------------------------------------------------------------
// TIMER2_COMP_vect - Timer2 Interrupt bei Vergleichswert A
// aktuelle Einstellung: 100000 Hz 10 µs
//--------------------------------------------------------------------
volatile int timer01=0; //Timer zählvariable
int spwm=50; // PWM-Wert
bool x = false;
ISR(TIMER2_COMP_vect)
{
timer01++;
}
void servo (int timer01)
{
if (timer01<=2200) //2200 * 10 µs = Periodendauer
{
if (timer01<=(spwm+100))
{
if (x == false)
{
sbi(PORTC,3);
x = true;
}
}
if (timer01>(spwm+100))
{
if (x == true)
{
cbi(PORTC,3);
x = false;
}
}
}
else {timer01=0; //Nachdem die Periode vorbei ist, wird der
//Timerzähler wieder auf null gesetzt
}
}
main()
{
init();
while (true)
{
servo(timer01);
}
}
vielen danke
gruß Tobias
Lesezeichen