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.
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
Einziger Nachteil dieser Art der Programmierung ist, dass man keinen zweiten Zeitkritischen Prozess laufen lassen kann.
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