Hallo zusammen, ich bin gerade dabei eine Servosteuerung über pwm mit einem Atmega32 (8 Mhz)zu programmieren. Dabei soll der servo ein paar Sekunden in einer position stehen und dann in eine andere Position drehen (Lenkung: von links nach rechts). Dabei bereitet mir genau diese Wartezeit Probleme. Und zwar ist Timer 2 (8-bit-timer) für das pwm signal zuständig und für die Wartezeit möchte ich Timer 1 (16 Bit-timer) verwenden. Dafür habe ich mir folgendes überlegt: als Prescaler wähle ich 1024 ---> 8 Mhz/1024 = 7812,5 Hz ---> 65534 / 7812,5 = 8,39 Sekunden, d.h. der Timer benötigt 8,39 Sekunden für einen Durchgang und 4,2 sekunden um bis 32767 zu zählen. Diese 4,2 Sekunden passen sehr gut für meine Verweilzeit des Servos in einer Position. Also dachte ich mir ich programmiere zwei if-Entscheidungen um diese beiden zustände (Timer <32767 bzw. > 32767) abzufragen und ordne die jeweils gewünschten Sensorpositionen zu. Hier der Quelltext: //Timer 1 für Wartezeit, Initialisierung void timer_warte_initial (void) { TCCR1A = 0x00; //Normal Mode, Prescaler 1024 TCCR1B = 0x05; TCNT1 = 0x0000; //Startwert 0 } //Initialisierung des Timer 2 für PWM-Lenkung (Lenkservo) void timer2_initial(void) { TCCR2 = 0x73; //Mode 1, Signale invertieren,Prescaler 64 DDRD |= (1<<PD7); //OC2 (Pin 21) als PWM-Ausgang setzen } int main(void) { timer_warte_initial(); timer2_initial (); if ( TCNT1 < 0x7FFF) // Grenzwert:32767 OCR2 = 0xC4; //Servoposition ganz rechts if (TCNT1 > 0x7FFF) OCR2 = 0x71; //Servoposition ganz links } DasProblem ist, das OCR2 immer auf 0xC4 bleibt und auch bei überschreiten des Grenzwertes (TCNT1>0x7FFF) nicht auf 0x71 umschaltet. Und ich habe keine Ahnung warum er das nicht macht. DieSensorpositionen stimmen alle, nacheinander angesteuert funktionieren die Werte einwandfrei. Hat hier jemand Vorschläge, warum es nicht funktioniert? Oder auch generell für Tipps die Wartezeit zu realisieren bin ich dankbar. mit delay möchte ich das nicht machen, da der Controller noch einen zweiten servo steuern muss, und ich ihn deswegen nicht blockieren möchte. Vielen Dank für alle Tipps/Hinweise, ich hoffe mein Problem ist klar geworden.Wenn nicht, beantworte ich gerne alle auftretenden Fragen. Herzliche Grüße, Gregor
Gregor007 schrieb: > Und ich habe keine Ahnung warum er das nicht macht. Weil du die ganze Abfrage nur ein einziges Mal machst -- danach schickst du den Controller in die ewigen Jagdgründe, ähem, in die Funktion exit() (wird implizit beim Verlassen von main() aufgerufen). Mit anderen Worten: dein Programm braucht eine Hauptschleife. p.s.: bitte benutze die Formatierungskennzeichen, siehe auch Formatierung im Forum
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.