PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Label not found [_DBL_K2SRAM ]



oratus sum
01.05.2010, 21:03
Hallo

Ich bekomme folgende Fehlermeldung in Bascom:

Error:61 Line:660 Label not found [_DBL_K2SRAM ]
Error:221: Line:660 Backward jump out of range [_DBL_K2SRAM [2966]]
Error:61 Line:660 Label not found [_DBL_K2SRAM ]
Error:221: Line:660 Backward jump out of range [_DBL_K2SRAM [2966]]

Was soll das Bedeuten?
Line 660 ist meine letzte Zeile, wie ihr sehen könnt st das Programm nicht gerade klein.

Hat es was mit den Stacks oder so zu tun?

Der Anfang sieht so aus:

$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat" 'Definitionsfile für M2560 Prozessor
$hwstack = 82 '80 Hardwarestack
$framesize = 68 '64 Framesize
$swstack = 68 '44 Softwarestack
$baud = 19200 'Baudrate für UART
$crystal = 16000000

Ich habe das Programm immer wieder getestet und hat bisher funktioniert, ich hab gerade nur etwas hinzugefügt und dann kam eben dieser Fehler.

Vorschläge?

Jaecko
01.05.2010, 21:09
Da wäre mal interessant, wie das Programm aussieht und was da hinzugefügt wurde. Nur mit dem bisschen Code kann es alles sein.

oratus sum
01.05.2010, 21:13
Hinzugefügt wurde:


ISR_DECODERR:
If Kette_Rechts >= 0 Then Incr LEFT_DISTANCE
If Kette_Rechts <= 0 Then Decr LEFT_DISTANCE
Return

ISR_DECODERL:
If Kette_Links >= 0 Then Incr RIGHT_DISTANCE
If Kette_Links <= 0 Then Decr RIGHT_DISTANCE
Return

auch noch was anderes, aber wenn ich jeweils die IF-Teile auskommentiere kommt der Fehler nicht, es ist eine Interrupt Routine.

Jaecko
01.05.2010, 21:16
Zeig mal das ganze Programm.
Der Code, der dasteht, sagt alleine nix aus. Der Fehler kann woanders auch liegen.

oratus sum
01.05.2010, 21:19
Beitrag von Autor gelöscht.

oratus sum
01.05.2010, 21:21
2. Teil Hauptschleife, Funktionen usw

Trennung musste sein wegen Limit der Zeichen in einem beitrag

Jaecko
01.05.2010, 21:46
Wunderbar... sieht mal wieder nach nem Bug in Bascom aus.
Wenn man die beiden ISRs nämlich umschreibt:


Isr_decoderr:
If Kette_rechts >= 0 Then Left_distance = Left_distance + 1
If Kette_rechts <= 0 Then Left_distance = Left_distance - 1
Return

Isr_decoderl:
If Kette_links >= 0 Then Right_distance = Right_distance + 1
If Kette_links <= 0 Then Right_distance = Right_distance - 1
Return


... dann funktionierts. Keine Ahnung warum.
Wenn ich ne andere Double-Variable deklariere und die mit INCR/DECR veränder, dann klappt das auch. Also ich werd da draus nicht schlau, warum Bascom hier so rumzickt.

oratus sum
01.05.2010, 21:50
Vielen Dank!

Ersetzt der Compiler das DECR/INCR nciht sowieso durch die Operation? Komisch...

Jaecko
01.05.2010, 21:54
Hm keine Ahnung.
In C ist eigentlich x++ und x = x + 1 auch das gleiche...

for_ro
01.05.2010, 22:00
Wenn du dies
Left_Distance = 0
einfügst, nachdem Left_Distance deklariert ist, geht es auch.
Seltsam.

peterfido
02.05.2010, 13:00
Ich habe den Code jetzt nicht gesehen. Wenn Du aber z.B. die MCSByte oder so ähnlich einbindest, dann funktioniert unter Anderem INCR und DECR nur noch für Bytes und evtl integer. Der Sinn darin ist, dass das Programm kleiner wird. Sprünge out of Range entstehen bei relativen Sprüngen, wo die Adressen zu weit auseinander sind. Da hilft es manchmal die Subs im Programm nach weiter Vorn oder Hinten zu schieben.

Jaecko
02.05.2010, 13:33
Naja diese Sache hab ich mit dem Code auch getestet. Wenn ich ne neue Variable einbinde (Typ egal ob Byte, Word, Double etc..) und die dann in der ISR mit INCR/DECR bearbeite, dann meckert Bascom da nicht.

Noch was seltsames: Wenn ich die ISRs mit dem x=x+/-1-Code Zeilenweise auf INCR/DECR umbaue und nach jeder Zeile Compiliere, geht das etwa bis zur 3. Zeile, danach kommt wieder dieses Label not found. Geh ich eine Zeile zurück (wo es zuvor noch ging!), bleibt der Fehler! Erst wenn wieder ALLE Zeilen auf x=x+/-1 umgebaut sind, verschwindet der Fehler wieder. Scheinbar ist Bascom hier nicht gerade das, was man deterministisch nennt.

peterfido
02.05.2010, 15:13
Der Code wäre mal interessant...

oratus sum
02.05.2010, 15:25
Ich hab dir den Code per N geschickt.

Ich möchte den Code heir (noch) nicht veöffentlichen da das ganze meine ein Teil meiner Informatik-Maturaarbeit im Gymnasium ist.

peterfido
02.05.2010, 15:55
Danke.

Wenn ich Long statt Double nehme, funzt es. Muss es Double sein? Weil incr bei einer Double ist nicht das Gleiche wie Double=double+1. Bei incr wird die Variable Bitweise (Auch die Stellen hinter dem Komma) erhöht. Des Weiteren wird bei incr 11111111 ein 00000000 rauskommen.

oratus sum
02.05.2010, 15:59
Nein Double muss es nicht sein. Ich habe Double genommen da in der Variable die Odometrie gespeichert wird und ich nicht mit den Stellenwerten rumflicken will.

Mich interessiert daher auch nicht ob was hinterm Komma steht, da dort sowieso nichts stehen sollte.

Ich meine, dass ich jetzt statt dem Decr es "per Hand" ausrechnen muss ist jetzt überhaupt kein Drama....

btw,

Ich hab grad mal ene Frage:

Wenn bei einer Interrupt-Routine für den UART ein Waitkey aufgerufen wird also:

on uart isr_uart

isr_uart:
If inByte = 20 Then
inservo = Watikey(#3)
End If

Wir dann die INterrupt routine doppelt aufgerufen? Nein, da wärend eine ISR abgearbeitet wird die INterrupts global abgeschaltet werden, oder irre ich mich da?

peterfido
02.05.2010, 16:05
Oh, habe mein Post wohl etwas spät editiert. Demnach hätte das mit incr(decr) eh nicht richtig funktioniert.

oratus sum
02.05.2010, 16:07
Und noch was:
Ich bekomme eine Fehlermeldung wenn ich diese Zeile einfüge:

Config Timer5 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Compare C Pwm = Clear Up , Prescale = 256

Fehlermeldung:
Error: 222 Line:70 Illegal character [expected (, got " [TCC53a]]

Ich möchte nur ein PWM Signal auf OC5 abgeben, exakt der gleiche Code funktioniert mit Timer4.

Ist übrigens ein RN2560 Modul mit Atmega2560 drauf

peterfido
02.05.2010, 16:11
waitkey und Dinge, welche viel Rechenzeit benötigen sind in einer ISR schlecht aufgehoben. Bei waitkey würde die isr ständig neu aufgerufen werden. Du kannst den Interrupt zwar zwischenzeitlich deaktivieren und zwischenzeitlich aufgetretene IRQ löschen, aber gemacht habe ich es so noch nie. In einer ISR nur eine Variable (Flag) setzen und dieses in der Hauptschleife abfragen ist für mich in jedem Fall die sauberere Weise.

peterfido
02.05.2010, 16:14
Kann evtl Timer5 kein PWM? Müsste man mal ins Datenblatt schauen.

oratus sum
02.05.2010, 16:14
Okay dann werde ich das so machen.

Und das Timer 5 Problem?

Jaecko
02.05.2010, 16:14
Ich glaub zum Problem mit Timer5 und ATmega2560 hab ich hier scho mal was gelesen. Irgendwie haut das (noch) nicht so richtig hin

oratus sum
02.05.2010, 16:25
Ja stimmt hatte auch schonwas dazu gefragt.

Ich bin nun auf diese Seite gelandet
http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=6610&highlight=timer5

Da steht die Lösung. Mal testen...



'set Timer5, pwm mode 1, phase correct 8-bit
Tccr5a.wgm50 = 1

'Compare C Pwm = Clear Up
Tccr5a.com5c1 = 1

'prescale=256
Tccr5b.cs52 = 1

peterfido
02.05.2010, 16:55
Probier mal das:

'set Timer5, pwm mode 1, phase correct 8-bit
Tccr5a.wgm50 = 1

'Compare C Pwm = Clear Up
Tccr5a.com5c1 = 1
'Compare B Pwm = Clear Up
Tccr5a.com5b1 = 1
'Compare A Pwm = Clear Up
Tccr5a.com5a1 = 1

'prescale=256
Tccr5b.cs52 = 1



edit: Da war ich auch grad...
edit: 2. Code wurde "angemeckert"

oratus sum
02.05.2010, 17:41
Vorerst benötige ich den Timer5 doch nicht, da ich mir noch andere Servoplätze eingebaut habe und damit omme ich mal aus...

Vielen Dank an euch als kleine Belohnung gibt es ein Bild des Bots im voraus, ihr könnt dann später noch welche auf meiner Webseite betrachten:

Auch schön Detailrecih mit hoher Auflösung deswegen der Link:
http://www.techgeek.at/wp-content/uploads/2010/04/006.JPG

Danke nochmal