Hi seven,
ich dachte zuerst auch,dass mein AVR voll mit Pulsemachen beschäftigt ist und keine Zeit mehr für was anderes hat. Nach einigen klasse Tips hier aus dem Forum war mir dann klar, das eine timergesteuerte Interruptroutine eine gute Lösung des Problems ist.
Das Prinzip dabei ist, dass ein Timer alle paar ms einen Interrupt auslöst, durch den dann ein Unterprogramm ausgeführt wird. Man kann im Hauptprogramm Sensoren abfragen, oder so, und die Impulserzeugung für die Motoren läuft sozusagen "von allein" im Hintergrund ab.
Ich hab mal ein paar Programmteile aus meinem Steuerprogramm ausgeschnitten um das Prinzip zu verdeutlichen. Der Code ist in Bascom für einen AVR, aber das spielt denk ich keine Rolle, es geht ja nur um's Prinzip, deswegen hab ich auch die ganze Variablendeklaration und so weggelassen.
Einziger Nachteil dieser Art der Programmierung ist, dass man keinen zweiten Zeitkritischen Prozess laufen lassen kann.Code:' Timer0 Impulse für die Motoren Config Timer0 = Timer , Prescale = 64 On Ovf0 Motoren 'Bei Überlauf wird das Unterprogramm "Motoren" ausgeführt Enable Timer0 Stop Timer0 Enable Interrupts ' +++++++++++++ Hauptprogramm ++++++++++++++ '10cm geradeaus fahren Vr = 20 'Geschwindigkeit linker Schrittmotor Vl = 20 'Geschwindigkeit rechter Schrittmotor Portc.5 = 1 'Drehrichtung links Schrittelinks = 0 'Schrittzähler links zurücksetzen Portc.4 = 0 'Drehrichtung rechts Schritterechts = 0 'Schrittzähler rechts zurücksetzten Start Timer0 Do Loop Until Schrittelinks = 180 Stop Timer0 End 'end program ' ------------------ Subs ------------------- Motoren: Timer0 = 220 If Vzl = 0 Then 'linker Schrittmotor Vzl = Vl Toggle Portc.3 Incr Schrittelinks Else Decr Vzl End If If Vzr = 0 Then 'rechter Schrittmotor Vzr = Vr Toggle Portc.2 Incr Schritterechts Else Decr Vzr End If Return
Ich habe z.B. versucht die PWM-Signale einer Fernsteuerung auswerten, es ist mir aber (noch?) nicht gelungen, diesen ebenfalls zeitkritischen Prozess so ablaufen zu lassen, dass meine Motoren nicht ins Stottern kommen, so dass das jetzt ein Copro machen soll.
Grüsse, Marvin
Lesezeichen