www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo ansteuerung! Hab ich was übersehen? [AVR GCC]


Autor: Florian Kinzinger (kinzinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI

Bin grad beim herumspielen mit servos, und will den Servo über eine
einzelne prozedur ansteuern, die ich bei Bedarf mit neuen werten
aufrufe, da ich keine grossen lasten damit halten muss, sondern nur die
stellung eines Schalters verändern...

Habe hier im Forum schon einiges darüber gefunden, und auch der code
den ich hier poste, ist ein aus dem Forum angepasster

Allerdings hab ich das Problem, dass es da iergendwelche komplikationen
gibt, die ich im Moment nciht sehe...
kann es sein, dass der compiler aufruf die delays übergeht, bzw. den
code so umändert, dass eine andere Taktung herauskommt?
Ich aprogramiere auf dem myavr Board

Hier der Code:

#define F_CPU 3686400UL

#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>


void Move_Servo(uint8_t Impuls)
{
uint8_t i;

PINB = (0 << 5);     // löscht Bit 5 an PortB
_delay_ms(20);
PINB = (1 << 5);    // setzt Bit 5 an PortB auf 1
_delay_ms(1);
for(i=0;i<Impuls;i++)   //solange die Highflanke machen bis i = Impuls
  {
  _delay_us(4);
  }
PINB = (0 << 5);     // löscht Bit 5 an PortB


}

int main (void)
{

DDRB = (1 << 5); // Pins B5 als Ausgänge setzen

while(1)
  {
  Move_Servo(150);
  }
}

Compiler:
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT servo_self.o
-MF dep/servo_self.o.d  -c  ../servo_self.c
avr-gcc.exe -mmcu=atmega8  servo_self.o     -o servo_self.elf
avr-objcopy -O ihex -R .eeprom  servo_self.elf servo_self.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load"
--change-section-lma .eeprom=0 -O ihex servo_self.elf servo_self.eep

Autor: Thorsten Fritzke (thorsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ersetze mal PINB durch PORTB

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist das erste Mal, dass ich den Fehler in die "andere Richtung"
sehe.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PINB = (0 << 5);

Auch wenn Du PORTB anstatt PINB schreibst: Das macht nicht viel Sinn...
Ne Null bleibt ne Null, auch wenn Du sie noch so oft shiftest;-)

> PINB = (1 << 5);

...und das gibt (auch mit PORTB) spätestens dann Probleme, wenn Du
einen anderen Pin an Port B für andere Aufgaben nutzen willst.

Pin löschen: PORTB &= ~(1 << 5);
Pin setzen: PORTB |= 1 << 5;

Damit bleiben alle anderen Pins von PORTB unberührt.

Autor: Florian Kinzinger (kinzinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für dei antworten.
hab das mim setzen bzw löschen der Pins auch in anderen Projekten
verwendet allerdings währe mir da nie irgendeine Fehlfunktion
aufgefallen...

Hab jetzt jedes Setzen ausgetauscht, und schon bewegt sich der Servo
auch, allerdings noch nciht so wie gewünscht...

wenn ich das Programm auf den µC lade, dann startet der servo jedesmal,
egal welche werte ich für die Prozedur eingebe komplett nach rechts an
den Anschlag...

verwende ich werte kleiner 50 so fängt er am Anfang an sich kurz nach
links zu drehen, um dann nach ein paar Sekunden wieder den weg Richtung
rechten Anschlag einzunehmen...

hab leider kein Oszi zur hand, dass ich mir die Impulse genauer
anschauen kann, aber ich denke mal da passt irgendwas mit der
Verzögerungsschleife nicht, allerdings komme ich nicht dahinter wo der
Hund liegen könnte

erstmals Danke, und würde mich freuen, wenn mir jemand noch mit dem
Timing helfen könnte

greeets
Flo

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast die Fuses richtig gesetzt (Stichwort externer Oszillator)
Aber Achtung, nicht einfach an den Fuses "herumspielen" Durch
falsches Setzen bestimmter Fuses kann man sich schnell "aussperren"

Die Delays würd ich übrigens nicht verwenden, sondern die Impulse über
einen Timer bzw. über den PWM Ausgang erzeugen, dann kann der Proz
nebenbei noch was anderes machen.

Gruß
Roland

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast die Optimierungen ausgeschaltet. Dadurch werden die in den
delay-Funktionen benötigten Fließkommaberechnungen zur Laufzeit
durchgeführt und verlängern das Delay. Deine 4 Mikrosekunden werden
also vermutlich in Wirklichkeit ein Vielfaches dieser Zeit sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.