Forum: Mikrocontroller und Digitale Elektronik Servo mit Atmega8 - Fehler im Code


von Simon A. (pr0stl)


Angehängte Dateien:

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

von Klaus (Gast)


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

von Klaus (Gast)


Lesenswert?

Ach ja ist für einen Atmega 32 mit externen Quarz 16 Mhz

von Chris (Gast)


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

von Bernd (Gast)


Lesenswert?

Du setzt zwei mal Pins von PortB als Ausgang, aber nicht von PortC
1
...
2
  // Definiere Port C 0, 1, 2 als Ausgang
3
  DDRB |= (1<<0);

von Spess53 (Gast)


Lesenswert?

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

von Simon A. (pr0stl)


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.

von troll (Gast)


Lesenswert?

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.

von Simon Ang (Gast)


Lesenswert?

Ok Danke für den Tipp.

von Simon A. (pr0stl)


Lesenswert?

Es funktoiniert endlich.

Vielen Dank für die Kommentare!

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.