Seite 1 von 1

TunerStudio für eigene Projekte

Verfasst: So Sep 29, 2024 4:30 pm
von Hemi
Mahlzeit zusammen,

sind heure Leute an Bord, die TunerStudio auch bei ihren eigenen Projekten einsetzen?
Ich habe ein Verhalten, was ich mir nicht erklären kann und wollte erstmal fragen, bevor ich Romane schreibe :)

Danke Euch!

Re: TunerStudio für eigene Projekte

Verfasst: So Sep 29, 2024 4:34 pm
von ibizafreak
Definiere „eigene Projekte“ :-)

Also ich stimme damit meinen Wagen ab. Ist das jetzt ein eigenes Projekt oder gehts im Erweiterungen usw.?

Grüße

Re: TunerStudio für eigene Projekte

Verfasst: So Sep 29, 2024 4:36 pm
von Hemi
Nein, das ist kein "eigenes Proejkt". :)

Eigenes Projekt: ein Stück Elektronik, was nichts direkt mit MS und Konsorten zu tun hat. Ich nutze es für die Konfiguration von meinem Breitbandlambda-Kontroller und für ein Luftmassenmesser-Adapter. Also was ganz anderes als MS/Speeduino und Konsorten.

Re: TunerStudio für eigene Projekte

Verfasst: Mo Sep 30, 2024 6:43 pm
von Alfagta
Ja ich nutze es für viele "eigene" Projekte.

Was ist dein verhalten?

Re: TunerStudio für eigene Projekte

Verfasst: Mi Okt 02, 2024 10:01 pm
von Hemi
Moinsen.

Ich versuche es mal zu erklären, die INI vom Projekt habe ich angehängt.

Es geht um die Page 2, sie ist als zwei Arrays von uint16_t definiert, mit Faktor 0.001 und Offset 0. Also, wenn ich einen Wert von 1,123 haben will, sendet TS 1123 zur MCU. So weit so gut.

Ich setze einen Wert, sagen wir mal 1.234 (das gebe ich im CurveEditor ein), TS schickt dann 1234 zur MCU, ich schreibe das in die Konfig, alles super. Im Debugger sieht mein Empfangspuffer dann so aus:
grafik.png
grafik.png (10.09 KiB) 18188 mal betrachtet
Jetzt ändere ich diesen Wert (alt 1.234) auf 0, das klappt auch, Empfangspuffer sieht so aus:
grafik.png
grafik.png (10.28 KiB) 18188 mal betrachtet
Ich ändere den Wert wieder auf 1.234 und Empfangspuffer sieht so aus:
grafik.png
grafik.png (12.01 KiB) 18188 mal betrachtet
Alles richtig.

Wenn ich jetzt den Wert von 1.234 marginal ändere, auf sagen wir mal 1,172, dann sieht mein Empfangspuffer so aus:
grafik.png
grafik.png (9.57 KiB) 18188 mal betrachtet
Das bedeutet dann:
-> Offset ist 0, word(payload[4], payload[3])
-> Länge ist 1, word(payload[6], payload[5])
-> Wert ist 148, word(payload[8], payload[7])

Was macht er hier für ein Mist? Ich hätte erwartet, dass Länge 2 ist und der Wert dann 1172 ist...
Nach dem Schreiben in die Page habe ich dann 0.148 drin stehen, was natürlich falsch ist...

Hast Du eine Idee, was da schief läuft?

Danke Dir

Re: TunerStudio für eigene Projekte

Verfasst: Do Okt 03, 2024 8:09 pm
von Alfagta
Hallo,

wieso er macht doch alles richtig.
Er tauscht im Byte mit Offset 0 das aus was sein muss.

Sieh dir mal 1234 Binär an
(Bit 15....Bit 0)
0000010011010010
So etzt sehen wir uns 1172 Binär an
(Bit 15....Bit 0)
0000010010010100

Also in den Bits 8-15 ändert sich nichts, die bleiben unverändert.
In den Bits 0-7 ändert sich was und bei der Zahl 1172 steht eben im Byte 0 148 drinnen.

Du musst es also so machen, das was TS dir sendet auf Offset 0 in deiner Tabelle schreiben.

Ich glaube man kann dieses Verhalten aber deaktivieren, tsWriteBlocks=off sollte bewirken das immer die ganze Variable / der ganze Wert geschrieben wird.

Er sollte dann für änderung von 1234 auf 1172 2 Bytes senden statt einem Byte.

Hoffe ist verständlich erklärt...

Re: TunerStudio für eigene Projekte

Verfasst: Do Okt 03, 2024 8:52 pm
von Hemi
Achtusch**sse...

Ja, das ist verständlich erklärt. Es sieht in der Tat so aus, dass wenn die Änderung nur marginal ist, dann wird nur LSB übertragen... wenn ich nämlich von 1.234 auf 1.333 ändere, dann funktioniert es.

Der Wert 1333 sieht binär dann so aus:
0000010100110101

Und da es im Vergleich zu 1234 eine Änderung im MSB bedeutet, werden zwei Bytes geschickt und meine Software merged es richtig in die Kennlinie...

Der Parameter tsWriteBlocks heißt nur, dass er die Werte "on block" schreibt, ohne eine Pause zwischen den einzelnen Bytes zu machen.

Ich habe heute Mittag eine Mail an Chris von EFI Analytics geschickt, mal schauen, was er dazu sagt.

Danke Dir auf jeden Fall!

Re: TunerStudio für eigene Projekte

Verfasst: Fr Okt 04, 2024 8:36 am
von Alfagta
Ja stimmt hast recht mit dem tsWriteBlocks, hab eben nachgelesen...
Da wartet er nicht auf das interWriteDelay sondern schreibt so schnell es geht.

Aber zu deinem Fall, TS macht alles eichtig nur du musst es in deinem uC korret handeln.
Es funktioniert alles wie gewünscht...

Code: Alles auswählen

	uint8_t *src = (uint8_t*)&BuffCmd[6];
	uint8_t *dst = (uint8_t*)&cfg;
	for (uint8_t i = 0; i <len; i++) {
		*(dst+i+offs) = *(src+i);
	}
So mache ich das, funktioniert problemlos.
offs und len kommen aus dem Buff 2,3 sowie 4,5...

Gruß

Re: TunerStudio für eigene Projekte

Verfasst: Fr Okt 04, 2024 9:14 am
von Hemi
Alfagta hat geschrieben: Fr Okt 04, 2024 8:36 am Ja stimmt hast recht mit dem tsWriteBlocks, hab eben nachgelesen...
Da wartet er nicht auf das interWriteDelay sondern schreibt so schnell es geht.
Ja, ganz genau.
Dieses Verhalten, dass nur "Deltas" (so nenne ich es mal) übertragen werden, habe ich nirgends in den Dokus gelesen.
Habe es umgebaut und es geht.

Alfagta hat geschrieben: Fr Okt 04, 2024 8:36 am Aber zu deinem Fall, TS macht alles eichtig nur du musst es in deinem uC korret handeln.
Es funktioniert alles wie gewünscht...

Code: Alles auswählen

	uint8_t *src = (uint8_t*)&BuffCmd[6];
	uint8_t *dst = (uint8_t*)&cfg;
	for (uint8_t i = 0; i <len; i++) {
		*(dst+i+offs) = *(src+i);
	}
So mache ich das, funktioniert problemlos.
offs und len kommen aus dem Buff 2,3 sowie 4,5...

Gruß
Ich mache es ähnlich

Code: Alles auswählen

uint16_t page_indentifier = word(payload[2], payload[1]);
uint16_t offset = word(payload[4], payload[3]);
uint16_t length = word(payload[6], payload[5]);
uint16_t value = word(payload[8], payload[7]);

if (length == 1)
{
	uint8_t val = payload[7];
	set_page2_value (page_indentifier, offset, &val, length);

}
else
{
	uint16_t val = word(payload[8], payload[7]);
	set_page2_value (page_indentifier, offset, &val, length);
}
Die Variable payload ist der extrahierte Payload aus der Message, die an die ECU geschickt wurde, nach der Prüfung der CRC (CRC rechne die MCU in Hardware) und etc.

und die Funktion zum Überschreiben:

Code: Alles auswählen

void set_page2_value (uint8_t page_indentifier, uint16_t offset, void* value, uint16_t length)
{
	switch (page_indentifier)
	{
		case 2:
		{
			memcpy((uint8_t*)&input_maf + offset, value, length);
		}
		break;
	}
}
So funktioniert es auf jeden Fall und wird auch richtig eingesetzt. Jetzt werde ich es mal von U16 auf F32 umbauen, dann kann ich den DSP direkt mit Floats füttern ohne casten zu müssen. DSP macht eine kubische Spline-Interpolation.

Vielen Dank Dir für die Hilfe!