Code Erklärung

Link zur MegaSquirt'nSpark Homepage
Antworten
Greeny
Beiträge: 12
Registriert: Do Mär 05, 2009 10:19 am

Code Erklärung

Beitrag 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
Acki
Beiträge: 2753
Registriert: Mo Feb 11, 2008 8:28 pm
Wohnort: BaWü/Lausitz

Re: Code Erklärung

Beitrag von Acki »

Dachte MS2 wäre in C++?!
Fiat Uno Racing, K16, UMC1, Gslender 3.2.1, LC-1, 355cc, Bluetooth
Greeny
Beiträge: 12
Registriert: Do Mär 05, 2009 10:19 am

Re: Code Erklärung

Beitrag von Greeny »

Also zumindest is der Teil bei mir in assembler eingebunden.

Hab doch nicht etwa den komplett falschen Code runtergeladen :shock: :D
dridders
Beiträge: 1274
Registriert: Do Sep 07, 2006 6:34 pm
Wohnort: Weidenbach
Kontaktdaten:

Re: Code Erklärung

Beitrag 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
Greeny
Beiträge: 12
Registriert: Do Mär 05, 2009 10:19 am

Re: Code Erklärung

Beitrag von Greeny »

Muchas Gracias und vielen Dank sag ich mal, nun kanns weiter gehen :)
Greeny
Beiträge: 12
Registriert: Do Mär 05, 2009 10:19 am

Re: Code Erklärung

Beitrag 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.
Benutzeravatar
Münchhausen
Beiträge: 312
Registriert: Di Jun 23, 2009 10:03 am
Wohnort: Damsdorf

Re: Code Erklärung

Beitrag von Münchhausen »

Warum per pn?

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

Gruß
Münchhausen
Vielen Dank für die Beachtung aller Sicherheitshinweise.
Fahrzeug: VW Typ3, 2L Typ4(GB), MS2 PCB3 ,Ansaugtrakt(Eigenbau), COPs mit EDIS, LC1 = R.I.P 2012
Mein Dank geht an: Kiesow GmbH Norderstedt. ;)
Antworten