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