Hallo

Als Bascomlaie habe ich mal ein Grundgerüst angefangen:
Code:
' nibobee mit Bascom                                                  9.12.09 mic'

' Achtung! Nach einer kurzen Verzögerung starten die Motoren!

$regfile = "m16def.dat"

$crystal = 15000000

$baud = 9600

Config Portb.0 = Output                                     ' LEDs 0-3
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output

Config Portd.4 = Output                                     ' pmw_r
Config Portd.5 = Output                                     ' pwm_l
Config Portd.6 = Output                                     ' dir_l
Config Portd.7 = Output                                     ' dir_r

Declare Sub Motorpwm(byval Pwm_l As Byte , Byval Pwm_r As Byte)
Declare Sub Motordir(byval Dir_l As Byte , Byval Dir_r As Byte)
Declare Sub Setleds(byval Leds As Byte)


Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Call Setleds(1)
Wait 3

Do
   Call Setleds(9)
   Call Motordir(1 , 1)
   Call Motorpwm(127 , 127)
   Wait 2
   Call Motorpwm(255 , 255)
   Wait 1
   Call Motorpwm(127 , 127)
   Wait 2
   Call Motorpwm(0 , 0)
   Wait 1

   Call Setleds(6)
   Call Motordir(0 , 0)
   Call Motorpwm(127 , 127)
   Wait 2
   Call Motorpwm(255 , 255)
   Wait 1
   Call Motorpwm(127 , 127)
   Wait 2
   Call Motorpwm(0 , 0)
   Wait 1
Loop

End

Sub Motorpwm(byval Pwm_l As Byte , Byval Pwm_r As Byte)
   Pwm1a = Pwm_l * 4
   Pwm1b = Pwm_r * 4
End Sub

Sub Motordir(byval Dir_l As Byte , Byval Dir_r As Byte)
   If Dir_l = 0 Then Portd.6 = 0 Else Portd.6 = 1
   If Dir_r = 0 Then Portb.7 = 1 Else Portb.7 = 0
End Sub

Sub Setleds(byval Leds As Byte)
      If Leds.0 = 1 Then Portb.0 = 1 Else Portb.0 = 0
      If Leds.1 = 1 Then Portb.1 = 1 Else Portb.1 = 0
      If Leds.2 = 1 Then Portb.2 = 1 Else Portb.2 = 0
      If Leds.3 = 1 Then Portb.3 = 1 Else Portb.3 = 0
End Sub
Ich verwende 10-bit-PWM, die Funktion Motorpwm() erwartet aber Werte zwischen 0 und 255. Diese werden dann mit 4 multpliziert in die 10-bit Timerregister geschrieben (nicht atomar!).

Im Parameter für Setleds() ist den Bits 0 bis 3 jeweils die entsprechende Led zugeordnet.

Code:
Sub Linedata()
   Config Portb.4 = Output
   Portb.4 = 0
   Linesensl = Getadc(5)
   Linesensc = Getadc(6)
   Linesensr = Getadc(7)
   Portb.4 = 1
End Sub
Die LineLEDs IR3 und IR4 hängen zwischen Vcc und PB4 (LINE_EN). Deshalb schaltet ein Low die Leds an und ein High wieder aus!

Gruß

mic