Atmega8 Servo mit Timer in C

Gast #4136467
Lesenswert?

Hallo zusammen,

ich habe große Probleme mit meinen Servo :/
Leider läuft es nicht und ich bin schon fast am verzweifeln.
Ich hab mich am Tutorial gehalten aber leider bewegt sich das Ding kein 
bisschen.

Servo sollte nicht defekt sein. Per Soft PMW gehts.

Danke schon mal für euro Hilfe.
Julian

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

ISR( TIMER1_COMPA_vect )                // Interruptbehandlungsroutine
{
  OCR1A = 2500-OCR1A;      // Das Servosignal wird aus der Differenz von
  // Periodenlänge (2500*0,008ms=20ms) und letztem
  // Vergleichswert (OCR1A) gebildet
}


int main (void)
{
  DDRD = 0b11111100;
  PORTD = (1<<PD1) | (1<<PD0);          // Pullup für PD0 und PD1

  TCCR1A = (1<<COM1A0);                 // Togglen bei Compare Match
  TCCR1B = (1<<WGM12) | (1<<CS11);      // CTC-Mode; Prescaler 8
  TIMSK  = (1<<OCIE1A);                 // Timer-Compare Interrupt an

  OCR1A = 2312;                         // Neutralposition 
((2500-2312)*0.008ms)=1,5ms)

  sei();                                // Interrupts global an

  while( 1 ) {

    if ( !(PIND & (1<<PIND0)) ) {       // Impuls-Zeit verlängern
      cli();
      OCR1A = OCR1A + 3;
      sei();
      _delay_ms(50);
    }

    if ( !(PIND & (1<<PIND1)) ) {       // Impuls-Zeit verkürzen
      cli();
      OCR1A = OCR1A - 3;
      sei();
      _delay_ms(50);
    }
  }

  return 0;
}
Gast #4136473
Lesenswert?

> Ich hab mich am Tutorial gehalten aber leider bewegt sich das
> Ding kein bisschen.

Dann Kreise den Fehler ein. Erste Frage dazu wäre:

Kommt am Ausgang überhaupt ein Signal raus? Das kannst du ja ganz 
einfach mit einer LED feststellen. Die muss sichtbar flimmern.

Oder du schließt ein wie auch immer geartetes Frequenzmessgerät an. 
Sollte etwa 50Hz anzeigen.
Gast #4136542
Lesenswert?

Julian schrieb:

> Per Soft PMW gehts.
           ^^^
[...]

>   TCCR1B = (1<<WGM12) | (1<<CS11);      // CTC-Mode; Prescaler 8
                                             ^^^^^^^^

Fällt dir da nichts auf? Vor allem unter dem Aspekt, dass Timer1 nicht 
nur einen PWM-Modus beherrscht, sondern sogar gleich drei verschiedene?

Da ist es ziemlich unsinnig, die Sache per Software in ISRs abzuhandeln, 
wenn der Timer das wunderbar ganz alleine kann...

Tipp: Du mußt ihn nur einmal initialisieren und kannst dann sogar zwei 
Servos damit steuern.
Gast #4136624
Lesenswert?

okay, das klingt ja schon mal super :)
habe es jetzt so geschrieben:

TCCR1A = (1<<COM1A0);                 // Togglen bei Compare Match
  TCCR1B = (1<<CS11);
  TIMSK  = (1<<OCIE1A);                 // Timer-Compare Interrupt an

jetzt blinkt sie. Hatte auch noch vergessen port B auf Ausgang zu 
setzen.

Servo funktioniert immer noch nicht. Ich denke es liegt nun an der 
Periodenlänge.

Könnt ihr mir dazu noch ein Tipp geben? Benutze einen Quarz 8MHz.
Gast #4136661
Lesenswert?

> Könnt ihr mir dazu noch ein Tipp geben?

Ja, das Datenblatt lesen, da steht alles wichtige drin. Insbesondere 
unter den Stichwörtern Fuses, Clock Source, CLKDIV8, Prescaler und 
natürlich Timer.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren