Servo Ansteuerung basierend auf das Mikrocontroller.net Beispiel

Gast #1264108
Hallo allerseits,

ich habe unter

http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung

ein Beispiel für eine Servo Ansteuerung gefunden und folgendermaßen 
verändert:

#include <avr/io.h>                             //Grundfunktionen
#ifndef F_CPU                                   //Vordefinieren für 
delay.h
#define F_CPU 1000000UL                         //Definition von F_CPU 
in Herz
#endif
#include <util/delay.h>                         //Warteschleifen
#include <stdint.h>                             //Variablen
#include <avr/interrupt.h>                      //Interruptroutinen

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


int main (void)                                 //Hauptfunktion
{                                               //Anfang der 
Hauptfuktion
  unsigned int direction = 1;

  DDRB=0b11111100;                             //Alles Ausgänge bis auf 
PB0 und PB1
  PORTB=0b00000011;                             //Pullup für PB0 und PB1
  TCCR1A=0b01010000;                           //Tooglen von PB3
  TCCR1B=0b00001010;                           //CTC-Mode und; Prescaler 
8; Prozessortakt
  TIMSK=0b01000000;                             //Interrupt
  OCR1A=2250;                                   //Startposition ganz 
link bzw. ganz rechts, werde ich noch herausfinden
  sei();                                       //Interrupt an
  while(1)
  {
    if ( (OCR1A < 2375)  && (direction == 1) )
    {
      cli();
      OCR1A=OCR1A+5;
      sei();
      _delay_ms(50);                           //Verlangsamung der 
Veränderung
    }
    if ( (OCR1A == 2375) && (direction == 1) )
    {
      direction = 0;
    }

    if ( (OCR1A > 2250) && (direction == 0) )
    {
      cli();
      OCR1A=OCR1A-5;
      sei();
      _delay_ms(50);                           //Verlangsamung der 
Veränderung
    }
    if ( (OCR1A == 2250) && (direction == 0) )
    {
      direction = 1;
    }
  }
  return 0;
}


Ich möchte also, dass mein Servo periodisch zwischen den Stellungen ganz 
links und ganz rechts hin und her fährt. Was ich an dem Beispiel aber 
noch nicht verstanden habe: An welchem Pin wird die Steuerleitung des 
Servos angeschlossen? An einem der PB Pins 2 - 7?

Denn bei mir tut sich noch nichts am Servo. Was mache ich falsch?

LG Mark
Gast #1264160
Ich bin noch recht neu im Umgang mit µCs und habe hier zum Spielen ein 
STK500 Board. Könnte das oben beschriebene Problem vielleicht damit 
zusammenhängen, dass ich den Taktgeber (d. h. Quarz oder interner RC 
Oszillator, etc.) nicht explizit vorgegeben habe? Woher weiß ich 
überhaupt mit welcher Frequenz mein Programm läuft? Oder wie müsste ich 
vorgehen um den internen 1MHz Takt auszuwählen?

LG Mark
#1264173
> Woher weiß ich
> überhaupt mit welcher Frequenz mein Programm läuft?

Normalerweise, weiss man was man eingestellt hat, bzw. welcher Quarz da 
drann hängt :-)

Kannst du an irgendeinem Pin eine LED anschliessen?
(ICh gah mal davon aus, dass du das am Pin 2 vom Port B (also PB2) 
machen kannst

Probier mal folgendes Programm aus
1
#define F_CPU 1000000UL
2

3
include <avr/io.h>
4
#include <util/delay.h>                         //Warteschleifen
5

6
int main()
7
{
8
  DDRDB = 0xFF;
9

10
  while( 1 ) {
11
    PORTB |= ( 1 << PB2 );
12
    _delay_ms( 1000 );
13
    PORTB &= ~( 1 << PB2 );
14
    _delay_ms( 1000 );
15
  }
16
}

Und schalte auf jeden Fall die Optimierung des Compilers auf -Os

Blinkt die LED im Sekundentakt (1 Sek ein, 1 Sek aus)?
Wenn ja, dann läuft dein µC mit 1Mhz.
Gast #1264571
Dank eurer Tipps (Link zu Fuses Doc. und LED Bsp) weiß ich nun ganz 
sicher, dass der interne Oszillator arbeitet. Der extern aufgesteckte 
Quarz macht nämlich genau 4 Mhz und die LED blinkt im 1 Sek. Takt.

Nun denn, vielleicht kann mir einer verraten, ob und wie ich das obige 
Bsp. modifizieren müsste, um den Servo mit dem Signal zu versorgen.

LG Mark
Gast #1270853
Hallo Daniel,

meine Anwendung läuft mittlerweile. Ich benutze jetzt allerdings den 
16Bit Timer im PWM Mode. Mit deiner Anwendung hatte ich zuletzt noch 
Schwierigkeiten gehabt. Das liegt aber wohl eher an mir als an deinem 
Code.

Mark

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.