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
Das ist das erste Mal, dass ich den Fehler in die "andere Richtung" sehe.
> 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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.