Naja, ich versuch mal das wesentliche zusammenzufassen
Wie gesagt, der Timer gibt alle mS ein SignalCode:$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
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
Lesezeichen