LWPM Comfort Module/Tworzenie akcji: Różnice pomiędzy wersjami
Linia 75: | Linia 75: | ||
! Operacja | ! Operacja | ||
! Opis | ! Opis | ||
+ | |- | ||
+ | ! colspan="3"|operacje ładowania stałych wartości (liczb) | ||
|- | |- | ||
|style="white-space: nowrap;"|<code>00</code> | |style="white-space: nowrap;"|<code>00</code> | ||
Linia 163: | Linia 165: | ||
| | | | ||
;RestoreB: przepisz zawartość rejestru <code>save[n]</code> (rejestr <code>save</code> na pozycji <code>n</code>) do rejestru <code>b</code> | ;RestoreB: przepisz zawartość rejestru <code>save[n]</code> (rejestr <code>save</code> na pozycji <code>n</code>) do rejestru <code>b</code> | ||
+ | |- | ||
+ | ! colspan="3"|operacje ładowania parametru pracy silnika (modułu) | ||
|- | |- | ||
|style="white-space: nowrap;"|<code>20 <nn></code> | |style="white-space: nowrap;"|<code>20 <nn></code> | ||
Linia 192: | Linia 196: | ||
| | | | ||
;LoadOBD2Value: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz | ;LoadOBD2Value: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz | ||
− | :wpisz do rejestru <code>b</code> jedną | + | :wpisz do rejestru <code>b</code> jedną z wartości odczytaną z systemu OBD2 sterownika silnika |
Dostępne wartości to: | Dostępne wartości to: | ||
{| class="wikitable" | {| class="wikitable" | ||
Linia 208: | Linia 212: | ||
| | | | ||
;LoadECUInfoValue: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz | ;LoadECUInfoValue: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz | ||
− | :wpisz do rejestru <code>b</code> jedną | + | :wpisz do rejestru <code>b</code> jedną z wartości odczytaną z systemu ECUInfo modułu |
Dostępne wartości to: | Dostępne wartości to: | ||
{| class="wikitable" | {| class="wikitable" | ||
Linia 217: | Linia 221: | ||
|TODO | |TODO | ||
|} | |} | ||
+ | |- | ||
+ | ! colspan="3"|operacje konwersji danych | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>30</code> | ||
+ | | | ||
+ | <pre>b = SignExtend8(b)</pre> | ||
+ | | | ||
+ | ;ExtendSignedByte: rozszerz zawartość rejestru <code>b</code> z 8-bitowej liczby ze znakiem do 32-bitowej liczby ze znakiem | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>31</code> | ||
+ | | | ||
+ | <pre>b = ZerExtend8(b)</pre> | ||
+ | | | ||
+ | ;ExtendUnsignedByte: rozszerz zawartość rejestru <code>b</code> z 8-bitowej liczby bez znaku do 32-bitowej liczby ze znakiem | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>32</code> | ||
+ | | | ||
+ | <pre>b = SignExtend16(b)</pre> | ||
+ | | | ||
+ | ;ExtendSignedWord: rozszerz zawartość rejestru <code>b</code> z 16-bitowej liczby ze znakiem do 32-bitowej liczby ze znakiem | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>33</code> | ||
+ | | | ||
+ | <pre>b = ZeroExtend16(b)</pre> | ||
+ | | | ||
+ | ;ExtendSignedWord: rozszerz zawartość rejestru <code>b</code> z 16-bitowej liczby bez znaku do 32-bitowej liczby ze znakiem | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>34</code> | ||
+ | | | ||
+ | <pre>b = SignExtend1(b)</pre> | ||
+ | | | ||
+ | ;ExtendBit: rozszerz zawartość rejestru <code>b</code> z 1-bitowej liczby ze znakiem do 32-bitowej liczby ze znakiem | ||
+ | |- | ||
+ | ! colspan="3"|operacje arytmetyczno-logiczne | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>40</code> | ||
+ | | | ||
+ | <pre><tmp> = a | ||
+ | a = b | ||
+ | b = <tmp></pre> | ||
+ | | | ||
+ | ;Exchange: zamień miejscami zawartość rejestru <code>a</code> z rejestrem <code>b</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>41</code> | ||
+ | | | ||
+ | <pre>b = b + a</pre> | ||
+ | | | ||
+ | ;Add: Dodaj do rejestru <code>b</code> wartość rejestru <code>a</code> i zapisz wynik w rejestrze <code>b</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>42</code> | ||
+ | | | ||
+ | <pre>b = b - a</pre> | ||
+ | | | ||
+ | ;Subtract: Odejmij od rejestru <code>b</code> wartość rejestru <code>a</code> i zapisz wynik w rejestrze <code>b</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>43</code> | ||
+ | | | ||
+ | <pre>b = b * a</pre> | ||
+ | | | ||
+ | ;Multiply: Pomnóż wartość z rejestru <code>b</code> i wartość rejestru <code>a</code> i zapisz wynik w rejestrze <code>b</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>44</code> | ||
+ | | | ||
+ | <pre>b = b / a</pre> | ||
+ | | | ||
+ | ;Divide: Powiel wartość z rejestru <code>b</code> przez wartość rejestru <code>a</code> i zapisz wynik w rejestrze <code>b</code> (część całkowita wyniku dzielenia) | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>45</code> | ||
+ | | | ||
+ | <pre>b = b % a</pre> | ||
+ | | | ||
+ | ;Modulo: Powiel wartość z rejestru <code>b</code> przez wartość rejestru <code>a</code> i zapisz wynik w rejestrze <code>b</code> (reszta z wyniku dzielenia) | ||
|} | |} | ||
Wersja z 12:13, 28 wrz 2020
Moduł daje możliwość wykonania dowolnej akcji.
W tym miejscu opisany jest format akcji oraz możliwości i polecenia jakie mogą być zawarte w akcji.
Wszystkie liczby i wartości są podane w formacie szesnastkowym (HEX).
Spis treści
Format akcji
Ogólny format akcji przedstawia się następująco:
Z tego wynika, że najprostsza akcja, która nic nie robi wygląda następująco:
00 00 00 00 00
Informacje o akcji
Informacje o akcji zawierają bardziej szczegółowe informacje na temat akcji opisujące przede wszystkim sposób wykonania akcji. Przykładowo można tutaj określić szczegółowo warunki uruchomienia akcji, a także w tym miejscu możesz zdefiniować jak mają wykonywać się poszczególne etapy pętli.
Format danych
<informacje o akcji> = <długość informacji> <informacje>*
<długość informacji>
- określa długość wszystkich informacji w bajtach
<informacje>
- to szczegółowy opis zachowania akcji. Takich informacji może być kilka dla każdej akcji, przy czym każda musi być innego typu.
Każda informacja jest zapisana w ten sam sposób:
<informacje> = <typ informacji> <długość danych> <dane>
Pierwszym polem jest <typ danych>
(1 bajt) następnie podana jest <długość danych>
w bajtach (1 bajt) oraz <dane>
, których format zależy od typu danych.
Informacje o etapach wykonania pętli
<typ informacji> == 1
TODO:
Informacje o warunkach wykonania akcji
<typ informacji> == 2
Ten typ informacji określa szczegółowo, jakie muszą zajść warunki by akcja została uruchomiona.
Format informacji
<dane> = <index> <flagi> <start> <stop> <instrukcja>*
<index>
- miejsce zapisu o aktualnym stanie akcji.
- Dostępne są 4 takie miejsca (
00
-03
). - Każda akcja warunkowa powinna być wykonywana we własnym miejscu (każda powinna mieć inną wartość
<index>
) aby akcje ze sobą nie interferowały. Oczywiście akcje będą działały na tym samym indeksie, jednak może być trudno zapanować nad poprawności warunków.
<flagi>
- flagi zmieniające zachowanie kalkulatora wyliczającego warunek.
- Domyślna wartość to
00
. - Dostępne są następujące flagi:
01
- w przypadku jakiegokolwiek błędu odczytu któregokolwiek parametru pracy modułu, obliczenia zostaną uznane za poprawne - wynik obliczeń będzie prawidłowo, a wiec może dojść do uruchomienia akcji. Domyślnie jakikolwiek błąd w obliczeniach powoduje, że akcja zostanie przerwana lub się nie uruchomi.
<start>
- określa ilość prawidłowych obliczeń jaka jest wymagana by akcja się uruchomiła. W przypadku gdy wartość jest równa
00
- akcja wykona się zawsze (wartość ta w zasadzie nie ma większego sensu)
<stop>
- określa ilość prawidłowych obliczeń jaka jest wymagana by akcja się zakończyła. W przypadku gdy wartość jest równa
00
- akcja zakończy się zawsze (wartość ta w zasadzie nie ma większego sensu)
<instrukcja>*
- ciąg instrukcji dla kalkulatora
Zasada działania kalkulatora
Obliczenia warunku są wykonywane na zasadzie zbliżonej do kalkulatora działającego na zasadzie RPN (odwrócona polska notacja). Tj: najpierw podajemy argumenty instrukcji, następnie operacje jaką chcemy na tych argumentach wykonać. Wynikiem kalkulatora jest wartość 0
jeśli warunek jest niespełniony, lub wartość różna od 0
jeśli warunek jest prawdziwy i kalkulator możesz przejść do uruchomienia akcji (po określonej ilości poprawnych obliczeń).
Kalkulator posiada następujące rejestry:
a
- rejestr 32-bitowy (liczba ze znakiem)b
- rejestr 32-bitowy (liczba ze znakiem)save[x]
- 4 elementowa tablica 32-bitowych liczb ze znakiem. Do tymczasowego przechowywania danych. Na tych liczbach nie można wykonywać bezpośrednio operacji - należy je najpierw przenieść do rejestrówa
lubb
.
Dostępne instrukcje
W kalkulatorze dostępnych jest szereg instrukcji które są wykorzystywane do wykonywania obliczeń. W poniższej tabeli jest zestawienie tych instrukcji.
Instrukcja | Operacja | Opis | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
operacje ładowania stałych wartości (liczb) | ||||||||||
00
|
a = b b = 0 |
| ||||||||
01
|
a = b b = 1 |
| ||||||||
02
|
a = b b = -1 |
| ||||||||
03 <xx>
|
a = b b = <xx> |
| ||||||||
04 <xx>
|
a = b b = <xx> |
| ||||||||
05 <xxxx>
|
a = b b = <xxxx> |
| ||||||||
06 <xxxx>
|
a = b b = <xxxx> |
| ||||||||
07 <xxxxxxxx>
|
a = b b = <xxxxxxxx> |
| ||||||||
10 <nn>
|
save[<nn>] = a |
| ||||||||
11 <nn>
|
save[<nn>] = b |
| ||||||||
14 <nn>
|
a = save[<nn>] |
| ||||||||
15 <nn>
|
b = save[<nn>] |
| ||||||||
operacje ładowania parametru pracy silnika (modułu) | ||||||||||
20 <nn>
|
a = b b = ReadSTD([<nn>]) |
Dostępne wartości to:
| ||||||||
21 <nn>
|
a = b b = ReadOBD2([<nn>]) |
Dostępne wartości to:
| ||||||||
22 <nn>
|
a = b b = ReadECUInfo([<nn>]) |
Dostępne wartości to:
| ||||||||
operacje konwersji danych | ||||||||||
30
|
b = SignExtend8(b) |
| ||||||||
31
|
b = ZerExtend8(b) |
| ||||||||
32
|
b = SignExtend16(b) |
| ||||||||
33
|
b = ZeroExtend16(b) |
| ||||||||
34
|
b = SignExtend1(b) |
| ||||||||
operacje arytmetyczno-logiczne | ||||||||||
40
|
<tmp> = a a = b b = <tmp> |
| ||||||||
41
|
b = b + a |
| ||||||||
42
|
b = b - a |
| ||||||||
43
|
b = b * a |
| ||||||||
44
|
b = b / a |
| ||||||||
45
|
b = b % a |
|