Che Guevara
19.08.2008, 12:28
hallo leute,
ich bin gerade dabei mir einen robi zu bauen, der rechts und links einen motor besitzt und vorne sitzt ein us-sensor auf einem servo, welcher ganz vorne befestigt ist.
der servo soll sich drehen (in best. großen schritten) und wenn der us-sensor etwas ortet, soll der robi mit einer dementsprechenden richtungsänderung darauf reagieren. ansonsten soll der robi immer geradeausfahren.
im prinzip ist es also ein roboter, der sich mit nur einem sensor in einem raum bewegen kann, ohne anzuecken.
hier aber mein problem:
ich habe die hardware schon komplett fertig, nur die software fehlt noch.
ich habe einen atmega32, einen l293 als motortreiber und einen billigen bausatz vom großen blauen c als us-sensor.
[shadow=red:033799863b]hier mein code:[/shadow:033799863b]
'header
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 64
$hwstack = 32
$swstack = 10
'\header
'subs declarieren
Declare Sub Abfrage()
Declare Sub Berechnung()
Declare Sub Servo()
'\subs declarieren
'configurieren
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
Config Adc = Single , Prescaler = Auto
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 , Timer = Timer0
Config Portb.0 = Output
Config Portc.5 = Output
Config Porta.0 = Input
'\configurieren
'Motoren
Config Portb.0 = Output
Config Portb.1 = Output
Config Portc.6 = Output
Config Portc.7 = Output
'\Motoren
'alias-befehle
Ml1 Alias Portb.0
Ml2 Alias Portb.1
Mr1 Alias Portc.6
Mr2 Alias Portc.7
'\alias-befehle
'(
Pwm1a = Geschw. - - > Rechter Motor
Pwm1b = Geschw. - - > Linker Motor
')
'variablen deklarieren
Dim X As Word
Dim J As Word
Dim S As Word
Dim Pos As Word
Dim Nega As Word
'\variablen deklarieren
'hauptschleife
Do
Call Abfrage
Call Servo
'Call Berechnung
Loop
'\hauptschleife
'subs
Sub Abfrage
X = Getadc(0)
If X < 200 Then 'ultraschall-sensor ortet nichts
Portc.5 = 0 'alles ok - kein hinderrniss
Ml1 = 1
Ml2 = 0
Mr1 = 1
Mr2 = 0
Elseif X > 200 Then 'ultraschall-sensor ortet etwas
Call Berechnung
Portc.5 = 1 'hinderniss geortet
Ml1 = 0
Ml2 = 1
Mr1 = 0
Mr2 = 1
Waitms 800
End If
End Sub
Sub Berechnung
Pos = J - 20 'j = 20 to 170
Pwm1a = Pos + 50 'pwm1a & pwm1b = 50 to 200
Nega = Pos + 50
Pwm1b = 250 - Nega 'pwm1a & pwm1b = geschw. der motoren
End Sub
Sub Servo
If J < 170 Then
S = S + 30
Elseif J >= 170 Then
S = 20
End If
Servo(1) = J
Waitms 300
End Sub
'\subs
End
pwm1a und pwm1b sind für die geschwindigkeitsregelung der motoren.
ich weis, dass noch viele fehler drin sind, hab manches einfach so ohne zu überlegen hineingeschrieben, ich hoffe, ihr könnt mich auf ein paar fehler aufmerksammachen, und ggbf. sogar eine lösung mit mir bearbeiten?!
mein größtes problem ist allerdings, dass wenn ich das ganze complimieren will, eine fehlermeldung kommt:
assignment error (servo(1) .......) blablabla
anscheinend habe ich einen fehler beim servo-config gemacht, mir fällt er aber nicht auf!
könntet ihr mir sagen, wo der fehler liegt?!?!
ich bedanke mich jetzt schon für eure beiträge und freue mich auf anregungen/feststellungen.
mfg
chris
ich bin gerade dabei mir einen robi zu bauen, der rechts und links einen motor besitzt und vorne sitzt ein us-sensor auf einem servo, welcher ganz vorne befestigt ist.
der servo soll sich drehen (in best. großen schritten) und wenn der us-sensor etwas ortet, soll der robi mit einer dementsprechenden richtungsänderung darauf reagieren. ansonsten soll der robi immer geradeausfahren.
im prinzip ist es also ein roboter, der sich mit nur einem sensor in einem raum bewegen kann, ohne anzuecken.
hier aber mein problem:
ich habe die hardware schon komplett fertig, nur die software fehlt noch.
ich habe einen atmega32, einen l293 als motortreiber und einen billigen bausatz vom großen blauen c als us-sensor.
[shadow=red:033799863b]hier mein code:[/shadow:033799863b]
'header
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 64
$hwstack = 32
$swstack = 10
'\header
'subs declarieren
Declare Sub Abfrage()
Declare Sub Berechnung()
Declare Sub Servo()
'\subs declarieren
'configurieren
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
Config Adc = Single , Prescaler = Auto
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 , Timer = Timer0
Config Portb.0 = Output
Config Portc.5 = Output
Config Porta.0 = Input
'\configurieren
'Motoren
Config Portb.0 = Output
Config Portb.1 = Output
Config Portc.6 = Output
Config Portc.7 = Output
'\Motoren
'alias-befehle
Ml1 Alias Portb.0
Ml2 Alias Portb.1
Mr1 Alias Portc.6
Mr2 Alias Portc.7
'\alias-befehle
'(
Pwm1a = Geschw. - - > Rechter Motor
Pwm1b = Geschw. - - > Linker Motor
')
'variablen deklarieren
Dim X As Word
Dim J As Word
Dim S As Word
Dim Pos As Word
Dim Nega As Word
'\variablen deklarieren
'hauptschleife
Do
Call Abfrage
Call Servo
'Call Berechnung
Loop
'\hauptschleife
'subs
Sub Abfrage
X = Getadc(0)
If X < 200 Then 'ultraschall-sensor ortet nichts
Portc.5 = 0 'alles ok - kein hinderrniss
Ml1 = 1
Ml2 = 0
Mr1 = 1
Mr2 = 0
Elseif X > 200 Then 'ultraschall-sensor ortet etwas
Call Berechnung
Portc.5 = 1 'hinderniss geortet
Ml1 = 0
Ml2 = 1
Mr1 = 0
Mr2 = 1
Waitms 800
End If
End Sub
Sub Berechnung
Pos = J - 20 'j = 20 to 170
Pwm1a = Pos + 50 'pwm1a & pwm1b = 50 to 200
Nega = Pos + 50
Pwm1b = 250 - Nega 'pwm1a & pwm1b = geschw. der motoren
End Sub
Sub Servo
If J < 170 Then
S = S + 30
Elseif J >= 170 Then
S = 20
End If
Servo(1) = J
Waitms 300
End Sub
'\subs
End
pwm1a und pwm1b sind für die geschwindigkeitsregelung der motoren.
ich weis, dass noch viele fehler drin sind, hab manches einfach so ohne zu überlegen hineingeschrieben, ich hoffe, ihr könnt mich auf ein paar fehler aufmerksammachen, und ggbf. sogar eine lösung mit mir bearbeiten?!
mein größtes problem ist allerdings, dass wenn ich das ganze complimieren will, eine fehlermeldung kommt:
assignment error (servo(1) .......) blablabla
anscheinend habe ich einen fehler beim servo-config gemacht, mir fällt er aber nicht auf!
könntet ihr mir sagen, wo der fehler liegt?!?!
ich bedanke mich jetzt schon für eure beiträge und freue mich auf anregungen/feststellungen.
mfg
chris