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


von Florian K. (kinzinger)


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

von Thorsten F. (thorsten)


Lesenswert?

ersetze mal PINB durch PORTB

von Rahul (Gast)


Lesenswert?

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

von johnny.m (Gast)


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.

von Florian K. (kinzinger)


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

von Roland P. (pram)


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

von Rolf Magnus (Gast)


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.

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.