Seite 1 von 1

Code Erklärung

Verfasst: Di Mär 24, 2009 4:23 pm
von Greeny
Hiho,

bestimmt kann mir jemand hier sagen was der folgende Code macht :) Ist ein Auszug aus der get_adc function im MS2 Extra Code.
Versuche grad mich bisschen reinzuarbeiten in die Programmierung :)

__asm__ __volatile__ (
"ldd %1\n"
"subd %2\n"
"ldy %3\n"
"emul\n"
"ldx #1023\n"
"ediv\n"
"tfr y,d\n"
"addd %2\n"
: "=d"(outpc.map)
: "m"(flash4.mapmax),
"m"(flash4.map0),
"m"(ATD0DR0)
: "y", "x");

auf was genau bezieht sich %1 %2 usw. Die Instructions hab ich nachgeschaut aber blicks trotzdem nich. Bin auch nicht gerade der assembler-Gott 8)

Hoffe ihr könnt mir helfen! Danke schonmal !

Grüße

Re: Code Erklärung

Verfasst: Di Mär 24, 2009 5:53 pm
von Acki
Dachte MS2 wäre in C++?!

Re: Code Erklärung

Verfasst: Mi Mär 25, 2009 9:17 am
von Greeny
Also zumindest is der Teil bei mir in assembler eingebunden.

Hab doch nicht etwa den komplett falschen Code runtergeladen :shock: :D

Re: Code Erklärung

Verfasst: Mi Mär 25, 2009 12:24 pm
von dridders
Nein, hast du nicht. Der Code ist teils in C, teils in Assembler. Alle wo der Compiler entweder Mist macht oder es zeitkritisch ist, wie die Interrupt-Handler, ist in ASM geschrieben. C++ kommt nirgends zum Einsatz, das hat im kleinen Embeddedbereich nix verloren und kommt erst auf groesseren Kisten a la ARM zum Einsatz die dann auch ein OS fahren.

Zum Code:
Hier wird der MAP-Wert berechnet. Der ADC liefert nur einen Wert von 0-1024 entsprechend 0-5V. Gemaess den Einstellungen in Megatune (Map0 und MapMax fuer die Druckwerte bei 0 und 5V) wird dann hier der aktuelle MAP-Wert (*10) errechnet.
ldd %1 -> lade flash4.mapmax in Register D
subd %2 -> subtrahiere flash4.map0 von Register D
ldy %3 -> lade den Wert vom AD-Wandler Channel 0 nach Register Y
emul -> multipliziere (y*d nehme ich mal an, Ergebnis in einen von beiden)
ldx #1023 -> lade den Wert 1023 in Register X
ediv -> teile (den Wert aus der vorherigen Multiplikation durch 1023)
tfr y,d -> aehm... transfer glaube, also y nach d kopieren
addd %2 -> addiere flash4.map0 auf Register D

: "=d"(outpc.map) -> am Ende des Blocks kopiere Register D noch outpc.map
: "m"(flash4.mapmax),"m"(flash4.map0)","m"(ATD0DR0) -> Deine %1-%3, "m" sagt das hier auf Speicher verwiesen wird
: "y", "x" -> benutzte Register, die der Compiler ggf. vor der Routine sichern muss da sie von dir ueberkritzelt werden

Re: Code Erklärung

Verfasst: Mi Mär 25, 2009 1:45 pm
von Greeny
Muchas Gracias und vielen Dank sag ich mal, nun kanns weiter gehen :)

Re: Code Erklärung

Verfasst: Fr Mär 27, 2009 2:58 pm
von Greeny
So hab grad bisschen Schwierigkeiten mit dem wheel decoder.

Gibt es jemanden hier der sich gut mit dem MS2Extra Code auskennt und mir evtl. per pn ein paar Fragen speziell zum Wheel decoder beantworten kann?
Würde z.B. gerne wissen wie das mit der time prediction für den Zündzeitpunkt genau funktioniert.

Re: Code Erklärung

Verfasst: Di Nov 02, 2010 10:15 am
von Münchhausen
Warum per pn?

Wäre doch schön, wenn hier jeder Interessierte mitlesen könnte.

Gruß
Münchhausen