Servo mit Atmega8 - Fehler im Code

OP #3025077
Lesenswert?

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

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

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
OP #3025586
Lesenswert?

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.

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