Da ich noch keine Sensoren habe, möchte ich mein Chassis zum Test erst mal ein bischen mit der Fernbedienung durch die Gegend scheuchen.
Ich habe zuerst ein kleines Programm zur Auswertung der RC5 Signale der Fernbedienung zusammenkopiert, das funktioniert auch.
Dann habe ich das Beispielprogramm zur Servo-Ansteuerung das bei Bascom dabei ist etwas angepasst, das funktionierte auch.
Dann habe ich versucht beides zu kombinieren, das klappt aber nicht.
Ich bekomme ständig dieselbe Fehlermeldung, das blöde ist nur, dass die Zeile mit dem fehlerhaften Code immer hinter meinem Programmende liegt und mir die Fehlermeldung gar nichts sagt.
Die Fehlermeldungen lauten:
Code:
Error : 60 Line : 204 Duplicate label [_SYSTEM_T0_ISR ] , in File : C:\PROGRAMME\BASCOM-AVR\MYPROJECTS\MINIBOT2.BAS
Error : 60 Line : 204 Duplicate label [_SYSTEM_T0_ISR_EXIT ] , in File : C:\PROGRAMME\BASCOM-AVR\MYPROJECTS\MINIBOT2.BAS
Error : 221 Line : 204 Backward jump out of range [_SYSTEM_T0_ISR_EXIT [ 275]] , in File : C:\PROGRAMME\BASCOM-AVR\MYPROJECTS\MINIBOT2.BAS
Kann es sein, dass Bascom das angeblich doppelte Label selber verursacht, weil intern in den Routine für RC5 Auswertung und für die Servos jeweils ein Label mit demselben Namen verwendet wird?
Oder reservieren sich vielleicht beide Routinen denselben Timer oder irgendeine andere Resource?
Wenn ich entweder alles was mit Servos oder alles was mit RC5 zutun hat rauschmeisse sind die Fehlermeldungen weg.
Vielleicht kann ja mal jemand einen kurzen Blick auf den Code werfen, ob er den Fehler entdeckt.
Ist zwar relativ lang, sind aber nur ein paar relevante Zeilen, der Rest sind Konstanten und ein paar ganz simple Routinen.
Code:
'Servo's need a pulse in order to operate
'with the config statement CONFIG Servos we can specify how many servo's we
'will use and which port pins are used
'A maximum of 16 Servos might be used
'The SERVO statements use one byte for an interrupt counter and the TIMER0
'This means that you can not use TIMER0 anymore
'The reload value specifies the interval of the timer in uS
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
'$lib "mcsbyte.lbx"
$crystal = 4000000
$baud = 9600
'we must configure the port pins used to act as output
Config Portd = Output
' PinD.2 als Eingang RC5-Fernbedienung
Config Pind.2 = Input
Config Rc5 = Pind.2
'we use 2 Servos with 10 uS resolution(steps)
Config Servos = 2 , Servo1 = Portd.5 , Servo2 = Portd.4 , Reload = 10
'finally we must turn on the global interrupt
'Enable Interrupts
Print "#######################################################################"
Print "Programmstart:"
'Konstanten für Tastenbelegung Fernbedienung
Const T_ahead1 = 2
Const T_ahead2 = 130
Const T_back1 = 8
Const T_back2 = 136
Const T_left1 = 4
Const T_left2 = 132
Const T_right1 = 6
Const T_right2 = 134
Const T_rotleft1 = 1
Const T_rotleft2 = 129
Const T_rotright1 = 3
Const T_rotright2 = 131
Const T_stop1 = 5
Const T_stop2 = 133
Const T_speedlow1 = 0
Const T_speedlow2 = 128
Const T_slower1 = 7
Const T_slower2 = 135
Const T_faster1 = 9
Const T_faster2 = 137
Const T_off1 = 45
Const T_off2 = 173
' Konstanten für Servo Ansteuerung
'links Stillstand = 56 portd.5
'rechts Stillstand = 59 Portd.4
Const Loff = 56
Const Lfor = 100
Const Lback = 0
Const Roff = 59
Const Rfor = 0
Const Rback = 100
Dim Adress As Byte , Command As Byte
Gosub _init
Wait 1
Gosub _init
Print "Programmstart:"
'###############################################################################
Do
Getrc5(adress , Command)
Waitms 50
Print Command
'Stop
If Command = T_stop1 Then
Print "Stop"
Elseif Command = T_stop2 Then
Print "Stop"
'Vor
Elseif Command = T_ahead1 Then
Print "Vor"
Elseif Command = T_ahead2 Then
Print "Vor"
'zurück
Elseif Command = T_back1 Then
Print "Zurück"
Elseif Command = T_back2 Then
Print "Zurück"
'links
Elseif Command = T_left1 Then
Print "Links"
Elseif Command = T_left2 Then
Print "Links"
' Gosub F_lmotoff
'rechts
Elseif Command = T_right1 Then
Print "Rechts"
Elseif Command = T_right2 Then
Print "Rechts"
'rotate links
Elseif Command = T_rotleft1 Then
Print "Rotate Links"
Elseif Command = T_rotleft2 Then
Print "Rotate Links"
'rotate rechts
Elseif Command = T_rotright1 Then
Print "Rotate Rechts"
Elseif Command = T_rotright2 Then
Print "Rotate Rechts"
End If
Waitms 50
Loop
'###############################################################################
_init:
Gosub _off
Return
_off:
Servo(1) = Loff
Servo(2) = Roff
Print "Motoren stopp"
Return
_for:
Servo(1) = Lfor
Servo(2) = Rfor
Print "fahre vorwaerts"
Return
_left:
Servo(1) = Loff
Servo(2) = Rfor
Print "fahre links"
Return
_right:
Servo(1) = Lfor
Servo(2) = Roff
Print "fahre rechts"
Return
_back:
Servo(1) = Lback
Servo(2) = Rback
Print "fahre rueckwaerts"
Return
_rotleft:
Servo(1) = Lfor
Servo(2) = Rback
Print "rotiere links"
Return
_rotright:
Servo(1) = Lback
Servo(2) = Rfor
Print "rotiere rechts"
Return
Ende:
'Do
Print "Programmende"
'Loop
End
Lesezeichen