Servo Ansteuerung basierend auf das Mikrocontroller.net Beispiel

Gast #1264108
Lesenswert?

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
Lesenswert?

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
Lesenswert?

> 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
Lesenswert?

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

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