Naja, ich versuch mal das wesentliche zusammenzufassen
Code:
$crystal = 8000000                                'Quarzfrequenz
$baud = 9600                                      'Baudrate für RS232

Config Timer0 = Timer , Prescale = 64           'Timer 1mS
Const Tmr_c_preload = 131

Dim Timflag  As Byte  

Dim Stpleft As Byte                              '
Dim Speedleft As Byte                          ' 

Dim Stpright As Byte                            '
Dim Speedright As Byte                        '

Enable Interrupts                                 'General enable

On Timer0 Interrupt_ticker                        ' Timer for Timer Queue

Enable Timer0
Start Timer0                                      ' timer starten

Timer0 = Tmr_c_preload


  Speedleft   = 10   ' Geschwindigkeit linker Mot
                           ' je kleiner, je schneller 
                          '   ca 2 od. 3 ist maximum, je nach motor
  Speedright = 15   ' rechter Mot    (etwas langsamer)                     



Do
      if Timflag  = 1 then 
          Timflag  = 0
          decr Stpleft
          if Stpleft = 0 then 
                Stpleft = Speedleft
                call schrittlinks()      ' ein schritt linker motor
          end if
          decr Stpright
          if Stpright = 0 then 
                Stpright = Speedright
                call schrittrechts()   ' ein schritt rechter motor
          end if
      end if


  Loop

 End

'=============================
Interrupt_ticker:
Timer0 = Tmr_c_preload
      Timflag  = 1
Return
Wie gesagt, der Timer gibt alle mS ein Signal
das merkt er in der Do-Schleife und setzt das Signal zurück.
dann wird erst vom linken Zähler eins abgezogen
kommt null raus, --> ein Schritt und Zähler wieder auf "speed"

dann dasselbe rechts

In einer mS mach der 8 MHZ - AVR 8000 Cycles, d.h Zeit genug, zwischendurch sich mit der Tastatur zu befassen oder mit sensoren.
Warteschleifen sind allerding pfui.

Die Speed kann jederzeit irgendwo anders im Programm geändert werden