Wer kann Assembler ?

Hier könnt ihr alles loswerden, was sonst nirgendwohin passt, außer Anzeigen - die werden rigoros gelöscht!

Moderatoren: solo, Kilroy, Stefan Philipp (M)

Antworten
Benutzeravatar
MK
Beiträge: 5801
Registriert: Di 16. Okt 2001, 01:00
Wohnort: Wolfenbüttel

Wer kann Assembler ?

Beitrag von MK »

Ich habe folgende Code in der EFI zur Ermittlung der endgültigen Pulsweite. Ich möchte darin den Term TPSACCEL * 100 negieren.


asm-File:
***************************************************************************
** F O R V E T A B L E 1 and 3
** Calculation of Final Pulse Width
**
** The following equation is evaluated here:
**
** High Res Calculation
** PWCALC2H:L = (TPSACCEL * 100) + tmp5:tmp6 + tmp13:tmp14
**
** Note that InjOCFuel (injected fuel during injector open and
** close) is currently a constant - eventually it will be a function
** of battery voltage.
**
***************************************************************************
CALC_FINAL:

; lda tmp11 ; From required fuel, above.
; beq PW_Done ; If no calculated pulse, then
; don't open at all.

;accel in 0.1ms units 100 = 10ms
lda TPSACCEL
tax
lda #$64 ; accel is in 0.1ms units
mul
add tmp14
sta tmp20
txa
adc tmp13
sta tmp19
clc

lda tmp20
add tmp6
sta tmp20
lda tmp5
adc tmp19
sta tmp19

h-File:
tpsaccel: ds 1 ; Acceleration enrichment - percent
tmp1-22 alle als ds 1 definiert


Jetzt fehlt mir nur wie ich
** PWCALC2H:L = tmp5:tmp6 + tmp13:tmp14 - (TPSACCEL * 100)
daraus machen kann.
Oder
** PWCALC2H:L = (TPSACCEL * -100) + tmp5:tmp6 + tmp13:tmp14

Hat hier ev. einer Plan von Assembler ? Der Einäugige reicht mir Blindem völlig aus ;-)

Wieso weshalb warum ? Siehe hier:
http://www.megasquirt.de/msforum/viewto ... f=2&t=1774
Ciao
Martin
---------------------------------
SSDD (Stephen King, Dreamcatcher)
Benutzeravatar
Zweitaktfahrer
Beiträge: 716
Registriert: Do 3. Jul 2003, 01:00
Wohnort: D > CH
Kontaktdaten:

Beitrag von Zweitaktfahrer »

Urgs....
Anmerkung: Vorsicht Halbwissen!

(TPSACCEL * 100) steht in tmp19 und tmp20 (16 Bit auf zwei 8 Bit Register verteilt)

Hier werden tmp5:tmp6 und tmp19:tmp20 addiert:

lda tmp20
add tmp6
sta tmp20
lda tmp5
adc tmp19
sta tmp19

Imho müsste man das in eine Subtraktion umbasteln, oder?

Die Befehle zum Prozessor gibt's hier:
http://www.physics.mcmaster.ca/tech/HC9 ... ructionSet
Es Grüessli
Uli

http://www.monetative.de/
Frank L.
Beiträge: 1306
Registriert: Fr 4. Jan 2002, 01:00
Wohnort: Aachen

Beitrag von Frank L. »

Hallo Martin,

Hier werden 3 positive Werte addiert. Deswegen wird es niemals ein negatives Ertgebnis geben können. Und deswegen wird im vorhandenen Code auch nicht überprüft, ob es evtl. ein Ergebnis kleiner als Null gibt.

Du willst aus einer reinen Addition aber was machen, in dem eine Subtraktion vorkommt. Schnell mal eben am Vorzeichen frimmeln ist da schonmal ganz nett, aber du hast keine anschliessende Bereichsüberwachung, das könnte also knallen.

Aber mal so als Hinweis:

Der Pseudo-Code

InteressanteZahl:= (AktuelleGasGriffStellung-VorherigeGasgriffstellung)/ZeitdauerZwischenDenMessungen

liefert eine Zahlenkolonne InteressanteZahl(t) namens "Zeitdiskrete Darstellung der ersten Ableitung der zeitdiskreten Funktion GasgriffStellung(t)", gerne auch als GasGriffstellung´(t) geschrieben.

Und der Pseudocode

WoWillMartinHin(t):=GasgriffStellung(t)-MartinsBastelFaktor*GasgriffStellung´(t-100ms)

Führt zu einem leichten Unterfetten, wenn kürzlich der Hahn aufgerissen wurde, und zu einem leichten Überfetten, wenn kürzlich der Hahn zugemacht wurde.

Da willst du hin... :-)

Das mit dem GasGriffStellung´(t-100ms) kriegste mit nem Schiebearray der letzten n Messwerte hin.


Am besten, du malst mal auf Milimeterpapier, wie du dir das zeitliche Verhalten der Einspritzmenge in Abhängigkeit der Gasgriffstellung vorstellst, und guckst mal, ob man das mit einer zeitlich verschobenen Subtraktion der ersten Ableitung darstellen kann. Rest (Code) kriegen wir hin, ich habe grad Urlaub... :-)

Man könnte auch die Flanken der Funktion Gasgriffstellung(t) durch einen Tiefpass-Code jagen, dadurch würden die steigenden Flanken gedämpft, und die fallenden Flanken ein bisserl nachwirken...

Gruß
Frank
Benutzeravatar
Zweitaktfahrer
Beiträge: 716
Registriert: Do 3. Jul 2003, 01:00
Wohnort: D > CH
Kontaktdaten:

Beitrag von Zweitaktfahrer »

@Frank:
Die ganze Berechnerei ist im Programmcode vom Megasquirt bereits in Form der Beschleunigungsanreicherung enthalten. Es geht hier nur noch darum, das Ergebnis der Beschlunigungsanreicherung-Brechnung der Impulszeit abuziehen um diese in eine Beschleunigungsabmagerung umzuwandeln.
Es Grüessli
Uli

http://www.monetative.de/
Benutzeravatar
MK
Beiträge: 5801
Registriert: Di 16. Okt 2001, 01:00
Wohnort: Wolfenbüttel

Beitrag von MK »

Ich hatte ja zuerst die glorreiche Idee einfach die Table "Ableitung der Gasstellung vs. Pulsweite die addiert wird" mit negativen Werten zu versehen.
Klappte soweit formal, nachdem Megatune "überredet" werden musste, aber am Stim ist die Reaktion nicht wie erwartet. Wenn man z.b. überall -1ms einträgt, dann ist nachher die Pulsweite statt 6 - 1 = 5 ms mal eben 30 ms.
Schätze mal liegt daran, dass dort ein Buffer underrun (sprich negative Werte) nicht abgefangen ist.
Source ist komplett vorhanden, soll ich den mal schicken ?
Ciao
Martin
---------------------------------
SSDD (Stephen King, Dreamcatcher)
Benutzeravatar
Zweitaktfahrer
Beiträge: 716
Registriert: Do 3. Jul 2003, 01:00
Wohnort: D > CH
Kontaktdaten:

Beitrag von Zweitaktfahrer »

Im 8-Bit Prozessor werden 16-Bit Zahlen in zwei Register aufgeteilt und nacheinander gerechnet, einfach mal Vorzeichen umdrehen ist da leider nicht drin.
Ausserdem entspricht die Anzeige im MT nicht der Zahl mit der im Programm gerechnet wird, zwischen Rohdaten und MT Anzeige wird auch noch einmal hin und her gerechnet.
Ich denk' mich bei Glegenheit noch mal da rein und probier' das in eine Subtraktion umzuwandeln.
Es Grüessli
Uli

http://www.monetative.de/
Benutzeravatar
MK
Beiträge: 5801
Registriert: Di 16. Okt 2001, 01:00
Wohnort: Wolfenbüttel

Beitrag von MK »

Heute hatt ich noch eine geniale Idee.

1) Tabelle im MT enthält statt der zu addierenden/subtrahierenden PW's
TPSdot vs. AccelEnrich%

2) Code wird geändert
von PW = PW + AccelEnrichPW
auf PW = PW * (AccelEnrich% / 100)

Schwupp sind alle Probleme mit den doofen negativen Zahlen weg.
Werte > 100% = Beschleunigungsanreicherung wie gehabt
Werte < 100% = Beschleunigungsabmagerung wie von mir gewünscht

Mal sehen ob ich das selber hin bekomme; wenn nicht frag ich nochmal konkret ....
Ciao
Martin
---------------------------------
SSDD (Stephen King, Dreamcatcher)
Antworten