Servo mit Atmega8 - Fehler im Code

OP #3025077
Hallo,

ich habe ein kleines Board mit einem Atmega8 µC und eine billig Servo 
(der an nem Servotester getestet wurde)

Ich möchte über den Pin0 an Port C den Servo steuern und habe dabei 
folgendes Programm (siehe Anhang)

Den Servo versorge ich extern mit 5V und die Steuerleitung (hier oragen) 
ist direkt am PC0 angeschlossen.

Am Anfang soll der Servo in der Mitte stehen (1,5 ms Impulsbreite) und 
beim Drücken der Taster in den beiden Endstellungen (1 ms und 2 ms 
Impulsbreite)

Leider funktioniert das ganze nicht, und der Servo wackelt einfach gegen 
einen Anschlag und will weiter.

Hab ich etwas grundlegendes falsch? Vielleicht habe ich ja einen Fehler, 
den ich schon nicht mehr sehe und würde mich freuen, wenn jemand schnell 
über den Code schaut.

Falls noch Infos fehlen bitte fragen. Die Frequenz des Chips mit 6 MHz 
sollte auch stimmen.

Danke
Angehängte Dateien:
Gast #3025088
@Simon

Ich kann dir nicht weiter helfen aber vllt. kannst du nach Anpassung
das hier verwenden.


#define F_CPU 16000000UL

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



void timer_initialisierung(void)
{

   DDRD |= (1<<PD5);
   PORTD |= (1<<PD5);

   TCCR1A  =  ((1<<WGM11)|(0<<WGM10) |(1<<COM1A1) );
   TCCR1B  =  ((1<<WGM13)|(0<<WGM12)| (0<<CS12) | (1<<CS11) | 
(0<<CS10));
   OCR1A = 10000;
   ICR1 = 20000;


}


int main (void)
{
    volatile uint16_t i = 1500;
    DDRD = 0x00;

    timer_initialisierung();
    OCR1A = i;

    while (1)
    {
      if( (PIND & (1<<PIND2))) // Taster 1  Nach rechts +
      {
        if (i >= 2100)
        {
          i = 2100;
        }
        else
        {
          i++;
        }

            OCR1A = i;
        _delay_us(250);

      }
        else if( (PIND & (1<<PIND3))) // Taster 2 Nach links -
      {


        if (i <= 900)
        {
            i = 900;
        }
        else
        {
            i--;
        }

        OCR1A = i;
        _delay_us(250);

      }
        else  if( (PIND & (1<<PIND4)))
        {
                i = 1500;
                OCR1A = i;  // Taster 3  Neutral position

        }
        else
         OCR1A = 0;
    }
}
Gast #3025103
Hi,

läuft der Atmega mit nem Quarz?
Weil mit dem internen Oszillator kannst du garnicht auf 6 MHz kommen.
Der hat 8 MHz und standardmäßig sind die Fuses so gesetzt, dass er einen 
Prescaler von 8 benutzt --> 1MHz.

lg
Chris
Gast #3025132
Hi

>Den Servo versorge ich extern mit 5V und die Steuerleitung (hier oragen)
>ist direkt am PC0 angeschlossen.

Die Massen sind aber verbunden?

MfG Spess
OP #3025586
Also erstmal Danke, für die schnellen Antworten:

1. Die Ausgänge sind nun auch auf Port C gesetzt.

Mit

  DDRC |= (1<<0); (also hier für PC0)

2. Es ist ein 6Mhz Quarz angeschlossen und die Fuse ist auf ext.Quarz 
eingestellet. Habe gerade bei einer Recherche festgestellte, dass 
eingentlich noch Kondensatoren dazugehören (hab den Teil mit dem Quarz 
nicht selbst entworfen und ihn einfach übernommen)
Daher sollte ich vielleicht die Fuse wieder auf internen Oszillator 
stellen.
Habe ihn jetzt auf 1MHz intern gestllt und werde das Programm nochmal 
testen.

3. Ich versorge den Servo mit einer 5V Spannungsquelle (Netzteil) und 
schließe eigentlich nur die Signalleitung direkt an den Pin des µC.
Gast #3025588
Simon Ang schrieb:
> 3. Ich versorge den Servo mit einer 5V Spannungsquelle (Netzteil) und
> schließe eigentlich nur die Signalleitung direkt an den Pin des µC.
Du musst Masse vom µC und Masse von der 5V-Quelle die den Servo versorgt 
verbinden.

Antwort schreiben

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