Soweit ich das überblicke, kann man die Division einer ganzen Zahl wie eine LONG nur durch Shift right ersetzten, wenn der Divisor eine Zweierpotenz ist.
"Shift _long_tmp , Right, 15, Signed" bedeutet eine Division durch 2^15 ( 32768 ) unter Beibehaltung des Vorzeichens. Damit kannst Du Divisionen durch 32768 ersetzten. Das funktioniert in Bascom Vers. 1.11.9.8 auch mit negativen Dividenden - zumindest im Simulator.
Divisionen durch Zweierpotenzen finde ich aber in Deinem Code nicht. Wirst also andere Ergebnisse mit Shift als mit einer Division herausbekommen; also anderes Verhalten des Kopters.
PS solche "Experimente" kann man gut im Simulator mit kurzen Testprogrammen machen.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Ok, dann muss ich wohl erst abfragen, ob die Zahl negativ ist oder nicht und anschließend wenn nötig erst positiv machen zum shiften.... Aber im Simulator hats auch mit negativen Zahlen funktioniert?! Mal wieder so eine Unwahrheit, die im Simulator zutage tritt? Ohne Signed ist das falsche Ergebnis im Simulator rausgekommen, mit Signed wars richtig?!IMHO gilt nur bei positiven Zahlen, daß ein Right Shift einer Division entspricht.
Ich weiß, dass das shiften um 15 einer Division durch 32768 entspricht! Deswegen hatte ich beim ausprobieren auch die Regler-Parameter verändert, sodass eigentlich das richtige Ergebnis rauskommen hätte müssen, sprich:Divisionen durch Zweierpotenzen finde ich aber in Deinem Code nicht. Wirst also andere Ergebnisse mit Shift als mit einer Division herausbekommen; also anderes Verhalten des Kopters.
Ich habe die erste Division durch 200 durch ein Shift 8 ersetzt und die anderen beiden Divisionen durch ein Shift 15.
Dann habe ich die jeweiligen Parameter neu berechnet und eingesetzt. Jedoch funktionierts nicht..
Gruß
Chris
Hab trotzdem noch ein bißchen mit dem Simulator gespielt.
Dort bringt ein Shift auf eine negative Zahl ein um 1 niedrigeres Ergebnis als die entsprechende Division, wenn die Division nicht ganzzahlig aufgeht.
temp = -65536
SHIFT temp , right , 15 , signed
ergibt -2
temp = -65536
temp = temp / 32768
ergibt auch -2
aber
temp = -65535
SHIFT temp , right , 15 , signed
ergibt -2
temp = -65535
temp = temp / 32768
ergibt -1
Also doch nicht so ohne weiteres ersetzbar![]()
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Hm, also ob das Ergebnis um 1 kleiner ist oder nicht spielt hier keine so große Rolle! Im Simulator hat das ganze bei mir auch gefunzt, nur aufm AVR eben nicht?! Evtl. kann das ja mal jemand bei sich ausprobieren?
Gruß
Chris
Lesezeichen