Atmega8 Servo mit Timer in C

Gast #4136467
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
> 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
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.