-
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.
-
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.
-
Der Code wäre mal interessant...
-
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.
-
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.
-
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?
-
Oh, habe mein Post wohl etwas spät editiert. Demnach hätte das mit incr(decr) eh nicht richtig funktioniert.
-
Und noch was:
Ich bekomme eine Fehlermeldung wenn ich diese Zeile einfüge:
Code:
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
-
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.
-
Kann evtl Timer5 kein PWM? Müsste man mal ins Datenblatt schauen.