Forum: Mikrocontroller und Digitale Elektronik Atmega8 Servo mit Timer in C


von Julian (Gast)


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;
}

von Stefan F. (Gast)


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.

von Julian (Gast)


Lesenswert?

Es kommt leider nichts an.... :/

Angeschlossen wird doch über PB1 (OC1A) oder bin ich da schon verkehrt?

von Nil (nilsnilss)


Lesenswert?

PB1 auch als Ausgang konfiguriert?

von c-hater (Gast)


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.

von Julian (Gast)


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.

von Stefan F. (Gast)


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.

von wendelsberg (Gast)


Lesenswert?

Julian schrieb:
> jetzt blinkt sie.

Blinkt oder flimmert? Zufaellig mit ca. 1/8 der gewuenschten Frequenz?
Dann weiter wie Stefan Us schrieb.

wendelsberg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.