if-statements- limiet in Jal

Met map bedoel ik het volgende :

code:


if toerental > 400 en & toerental < 600 then 

if mapwaarde > 40 & < 45 then 
ve = 20 
afr = 145
voorontsteking = 20 
end if 

if mapwaarde > 45 & < 50 then 
ve = 20 
afr = 145
voorontsteking = 20 
end if 


if mapwaarde > 50 & < 55 then 
ve = 20 
afr = 145
voorontsteking = 20 
end if 

end if

[Bericht gewijzigd door Henry S. op maandag 2 mei 2016 21:20:17 (19%)

heb je er geen grafiek van?

hoe ben je aan die waarden gekomen?

GMT+1

Wat gebeurt er als mapwaarde % 5 == 0? Dat is momenteel in jouw code namelijk niet gedefinieerd.

Zo goed als het vroeger was, is het nooit geweest.

Op 1 mei 2016 22:25:13 schreef Progger:
heb je er geen grafiek van?

hoe ben je aan die waarden gekomen?

als je bij google 'gm closed temp sensor curve ' ingeeft , is dat de grafiek .
De waarde begint bij nul tot de 100 % , dit was opnieuw slechts een voorbeeld.

Als je nou gewoon eens even je ECHTE code post, dan kunnen we wellicht helpen. Op deze manier met allemaal hypothetische niet werkende voorbeelden komen we nergens.

Edit: Verder ziet het er uit als een vrij standaard NTC curve. Je kan daar een lookup tabel voor maken, maar ook een formule inkloppen.

[Bericht gewijzigd door Tommyboy op zondag 1 mei 2016 23:04:35 (30%)

Zo goed als het vroeger was, is het nooit geweest.

Volgens mij heb je twee arrays nodig met grenswaardes voor toerental en mapwaarde. Daarnaast heb je drie arrays nodig voor de variablelen.

code:


array toeretalgrenzen[12];
array mapgrenzen[12];
array vemap[12][12];
array afrmap[12][12];
array voorontstekingmap[12][12];

for (i=0;i<12;i++)
   if (toerental < toerentalgrenzen[i]) break;
for (j=0;j<12;j++
   if (mapwaarde < mapgrenzen[j]) break;

ve = vemap[i][j];
afr = afrmap[i][j];
voorontsteking = voorontstekingmap[i][j];
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Wat Tommyboy zegt, je kan beter echt laten zien wat je nodig hebt want die 'voorbeeld=voorbeeld+1' die overloopt zie ik nu niet meer terug.

Ik denk dat die van rew heel goed in de buurt komt.

De term 'MAP' komt ook doordat je een twee-dimensionele array gebruikt, een "kaart" waar je een gebied opzoekt als D5, D(horizontaal)5(vertikaal) net als een schaakbord.

buckfast_beekeeper

Golden Member

Op 1 mei 2016 22:10:19 schreef ricky9:
[...]

Met map bedoel ik het volgende :

if toerental > 400 en & toerental < 600 then

if mapwaarde > 40 & < 45 then
ve = 20
afr = 145
voorontsteking = 20
end if

if mapwaarde > 45 & < 50 then
ve = 20
afr = 145
voorontsteking = 20
end if

if mapwaarde > 50 & < 55 then
ve = 20
afr = 145
voorontsteking = 20
end if

end if

mapwaarde 45 en 50 worden gewoon genegeerd. De waarde dient kleiner te zijn dan 45 of groter maar nooit gelijk. 50 idem.

Verder staat in elke if dezelfde ve, dezelfde afr en dezelfde voorontsteking. Er is dus geen enkele reden om er 3 if's van te maken.

Moet het trouwens niet if mapwaarde > 40 & mapwaarde <= 45 zijn?

code:


if mapwaarde > 40 & mapwaarde <= 55 then
   ve = 20
   afr = 145
   voorontsteking = 20
end if

zou identiek hetzelfde moeten doen.

Van Lambiek wordt goede geuze gemaakt.

ok, dit was dus ook een voorbeeld natuurlijk .... het geheel werkt helemaal, ik heb enkel het probleem van de beperking op mijn mappen nog , de rest is in orde en werkt dus goed.

rew. ik ga de array-methode proberen , zou je aub de uitleg achter je code willen zetten ? ik begrijp de c - code niet, ik kan deze niet vertalen naar Jal.

[Bericht gewijzigd door Henry S. op maandag 2 mei 2016 22:37:20 (47%)

Is je code zo top-secret dat je hem hier niet wil posten?

Zo goed als het vroeger was, is het nooit geweest.

Op 2 mei 2016 22:23:31 schreef Tommyboy:
Is je code zo top-secret dat je hem hier niet wil posten?

nee, mijn code is heel lang en onoverzichtelijk, de voorbeelden die ik aanhaalden simuleren exact het probleem dus ik zie niet in waarom ik de echte code hier moet posten... ik denk dat ik op die manier ook heel veel opmerkingen krijg die uiteindelijk niks met mijn probleem te maken hebben...
Mijn probleem is dat ik te weinig mappen kan maken en in het laatste voorbeeld heb ik dit toch duidelijk aangetoond.
De rest van het programma staat volgeschreven met variabele , formules,interrupts , stopwatches,... wat heeft het voor zin ?

Omdat je waarschijnijk met onze hulp wél werkende en overzichtelijke code krijgt, waar je bovendien wat van leert.
Verder heb je nog steeds niet uitgelegd wat in godsnaam mappen zijn in deze context.

Zo goed als het vroeger was, is het nooit geweest.
RAAF12

Golden Member

Mappen is een Windows uitvinding <G> sinds de DOS kernel overboord werd gegooid. Als extra mochten er LFN's in files worden gebruikt. In DOS heetten maps nog directories, afgekort dir, maar verder ontsporen wordt hierbij door ondergetekende dwingend vermeden.

Arco

Special Member

Arrays in ram aanmaken is ook niet zinvol, is een zinloze verkwisting van geheugen. Die opzoektabellen moet je in flash opstaan als constantes...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Henry S.

Moderator

Op 2 mei 2016 23:25:25 schreef ricky9:
nee, mijn code is heel lang en onoverzichtelijk, de voorbeelden die ik aanhaalden simuleren exact het probleem dus ik zie niet in waarom ik de echte code hier moet posten... ik denk dat ik op die manier ook heel veel opmerkingen krijg die uiteindelijk niks met mijn probleem te maken hebben...
Mijn probleem is dat ik te weinig mappen kan maken en in het laatste voorbeeld heb ik dit toch duidelijk aangetoond.
De rest van het programma staat volgeschreven met variabele , formules,interrupts , stopwatches,... wat heeft het voor zin ?

Wat een flauwekul, dat jouw programma niet goed is blijkt al uit het feit dat de compiler je bewerkingen op een 12x12 'map' niet aankan. Maar je wilt niets laten tonen. Dan wordt het ook heel erg moeilijk om aan te wijzen waar de fout zit. Wat jij wilt is gemakkelijk in eeprom te stoppen of met een algoritme te bepalen.

Op 2 mei 2016 23:54:10 schreef Tommyboy:
Verder heb je nog steeds niet uitgelegd wat in godsnaam mappen zijn in deze context.

Dat is de TS z'n 12x12 variabelen uit een ECU, in deze context wordt met 'remapping' het aanpassen van deze array genoemd.

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.

Mijn programma is niet 100% in orde maar zeg nu zelf, het zou moeten werken? Ik gebruik een rare methode maar het moet werken en zolang het werkt...is het toch goed.
Mijn geheugen in momenteel maar voor ong. 20% bezet dus het nut van eeprom zie ik ook niet in.
Verder weet ik tot nu toe alleen nog maar 'hoe slecht mijn programma wel niet is' en dat mijn voorbeelden niet werken.
Maar een oplossing voor het probleem is nog maar weinig besproken.
Het was eerst ook alleen de bedoeling om de 'compiller bug' te bespreken.
Bedankt voor het meedenken, ik ga de array methode proberen, hier mag een slot op.

[Bericht gewijzigd door Henry S. op woensdag 4 mei 2016 16:22:59 (31%)

Ik heb even een testprogramma zitten tikken. Inplaats van 12x12 heb ik 120x120 genomen. Omdat ik geen verstand heb van de grenswaardes of de toegekende waardes heb ik zo maar wat genomen. Hier is het 120x120 testprogramma. (1.5Mb source).
http://prive.bitwizard.nl/testtest.c
Dit compileert in 19 seconden met de X86 compiler tot 500k executable, en in 38 seconden tot 560k ARM executable. (het is aannemelijk dat je 100x minder executable krijgt als je maar 12x12 doet.)

Ik heb voor ieder toerental andere grenswaardes van de mapwaarde genomen. Dat maakt de array implementatie iets lastiger, maar niet onmogelijk. (je hebt dan een 12x12 array van mapgrenzen nodig).

Goed.... Conclusie: Jou compiler is kapot. Maar je doet rare dingen die je toch niet zou willen doen. Het kan veel beter.

P.S. Veel beter bijvoorbeeld is dat in een array-implementatie je gewoon een paar array referenties nodig hebt en niet zoals in mijn voorbeeld zo'n 480 vergelijkingen per opzoekactie.

[Bericht gewijzigd door rew op dinsdag 3 mei 2016 09:56:47 (10%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

ok, uiteindelijk is het gelukt met de hulp van arrays.

Waarschijnlijk niet helemaal helemaal zoals jullie het bedoelen,maar het werkt.
voor de geïnteresseerde heb ik het programma in de bijlagen gedaan.

Op 6 mei 2016 12:06:32 schreef ricky9:
ok, uiteindelijk is het gelukt met de hulp van arrays.

Mooi.
Zoek eens op "initializatie van arrays". (of in het engels). Dit zal bij het opstarten van het programma enkele milisecondes kosten en het kost ook lappen programma-geheugen (en ook RAM afhankelijk van je compiler).

Je hoeft als je "gevonden" hebt hoe dat initializatie werkt, niet direct je programma om te schrijven, gewoon voor de toekomst, handig te weten. OF als je pietje precies bent, doe je het wel. Wat je wilt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Mijn programma is niet 100% in orde maar zeg nu zelf, het zou moeten werken? Ik gebruik een rare methode maar het moet werken en zolang het werkt...is het toch goed.

En dit zijn de redenen dat er wel eens spaceshuttles uit de lucht crashen, treinen ontsporen, chemische opslagvaten ontploffen enzo.

Wat gaat er allemaal mis in jouw benzine motor als de software ontspoort? En in de door jouw motor aangedreven apparatuur?

Volslagen onoverzichtelijke code die maar per ongeluk doet wat het doen moet is echt vragen om (grote) problemen. En meetwaarde buiten het verwachtte domein en je bent weg. Je installatie gaat volslagen irrationele onverwachte en gevaarlijke acties ondernemen.

Dit is echt not done. Levensgevaarlijk.

Eigenlijk vind ik dit dus niet juist,
de array-methode is veel minder overzichtelijker dan mijn methode ... ,
er komen veel meer factoren bij,en is dus afhankelijker en gevaarlijker daarnaast is het totale programma ook veel groter...
De methode verbruikt dan ook nog meer geheugen.
Als het ging, zou ik mijn methode verkiezen boven deze ,maar dat is mijn mening...

Voor de Jal gebruikers :
Ik heb het programma samengevoegd met mijn programma en .. jawel hij blijft weer hangen,door gedeeltelijk array / if statements te gebruiken kon ik mijn programma toch nog afmaken.

[Bericht gewijzigd door Henry S. op zaterdag 7 mei 2016 18:40:47 (37%)

Ik heb jou code proberen te begrijpen om nogmaals een voorbeeld te posten hoe het "netjes" zou moeten. Ik kom er niet uit.

Je array is gedeclareert op 100 elementen, maar je adresseerd element 140. Dat kan niet kloppen.
Uit het commentaar haal ik dat de grenzen voor de toerentallen gewoon regelmatig iedere 750 zijn. Wat je grenzen voor "MAP" zijn, snap ik niet goed.

Je schrijft: i = 0 maar even later I = 1Is dat dezelfde variabele of een andere? Dat is voor een lezer van je code absoluut onduidelijk.

Je code heeft kennelijk wat includes waardoor je code voor de mensen die het helemaal willen analyseren weer incompleet is.

Je gebuikt een while lus, waar je kennelijk een for lus bedoelt. (if counter3 > 9 then i=1 )

Als je eindconditie bereikt is, loop je de lus nog 1 x "als toegift" door. Hmm.

Volgens mij gaat je code fout als de som van de indices voor de arrays meer dan negen is.

[code=C]unsigned char VEarray [8][10 /*??*/ ] = {
{ 30, 31, 32, 34, 34, 35, 36, 37, 37, 38}, // tot 750
{ 40, 40, 40, 41, 41, 42, 42, 42, 42, 42},
{ 46, 45, 45, 46, 47, 49, 51, 53, 58, 65},
{ 46, 45, 45, 47, 49, 51, 56, 62, 68, 75},
{ 50, 52, 53, 53, 56, 58, 60, 63, 70, 75},
{ 54, 56, 57, 59, 61, 63, 66, 69, 75, 80},
{ 62, 62, 63, 63, 64, 66, 67, 68, 70, 75},
{ 66, 66, 68, 69, 70, 70, 71, 72, 75, 80} // 5250 en hoger.
};

void update_params (int toerental, int map)
{
unsigned int toerentalIndex, mapIndex;

toerentalIndex = toerental / 750;
mapIndex = map / 13;
if (toerentalIndex > 7) toerentalindex = 7;
if (mapIndex > 9) mapIndex = 9; // Kan ik niet goed uit jou code halen.
VE = VEarray [toerentalIndex][mapIndex];
}
[/code](zelf die andere twee doen... :-) )

Jou code KAN niet goed zijn. Testen is lastig. Je definieert een array van 100 elementen, geeft 80 elementen een waarde maar gebruikt indices tot 140.

Nou is dat spaceshuttles verhaal onjuist. Er zijn twee spaceshuttles kapot gegaan en dat was twee keer geen software fout. Maar er zijn wel mars-missies en een arianne 5 kapot gegaan door software fouten.

In mijn code kan je ZIEN dat de array tweedimensionaal is. De compiler moet zelf die linearindex = firstindex * 10 + secondindex verzinnen en uitrekenen. Je kan ZIEN dat ik niet buiten de arrays indexeer. Je ziet alle VE waardes netjes bij mekaar zodat je het overzicht hebt. Wil je een waarde wijzigen, heb je direct door waar je moet zijn.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

rew, bedankt voor de moeite!

Nu snap ik wat jullie bedoelen,dit is inderdaad erg gemakkelijk.
Maar helaas ondersteund Jal geen twee dimensionale arrays...
Ik heb het zo opgelost :

[code=jal]

var dword toerentalindex
var dword mapindex

--
var byte VEarray [80] = {
30, 31, 32, 34, 34, 35, 36, 37, 37, 38, --// tot 750
40, 40, 40, 41, 41, 42, 42, 42, 42, 42,
46, 45, 45, 46, 47, 49, 51, 53, 58, 65,
46, 45, 45, 47, 49, 51, 56, 62, 68, 75,
50, 52, 53, 53, 56, 58, 60, 63, 70, 75,
54, 56, 57, 59, 61, 63, 66, 69, 75, 80,
62, 62, 63, 63, 64, 66, 67, 68, 70, 75,
66, 66, 68, 69, 70, 70, 71, 72, 75, 80 --// 5250 en hoger.
}

toerentalIndex = toerental / 750
toerentalindex = toerentalindex * 10

mapIndex = map / 13
if (toerentalIndex > 81) then
toerentalindex = 80
end if

if (mapIndex > 9) then
mapIndex = 9
end if

VE = VEarray [toerentalIndex + mapIndex]

[/code]

[Bericht gewijzigd door ricky9 op zaterdag 7 mei 2016 11:24:06 (73%)

Mooi! Dat lijkt ergens op!
Zoek eens of JAL nog iets als "const" kent. als je dat bij die array zet, dan weet ie dat deze array in het programma nooit verandert. (en gaat ie klagen als je dat toch probeert).
Mijn compiler weet dan dat ie de array gewoon in FLASH geheugen kan zetten en dat ie niet in RAM hoeft. Bij AVR kan het niet, maar bij PIC misschien wel. Ik weet het niet.

Ook als je compiler dit soort dingen niet ondersteunt, helpen die waarschuwingen op z'n minst als je even met iets minder aandacht in die array laat zetten....

P.S. Ik heb het opgezocht, maar het lijkt er op dat JAL inderdaad geen tweedimensionale arrays ondersteunt. Stom.
PPS: Ik zou: toerentalindex = toerentalindex * 10 weglaten en even verderop: VE = VEarray [toerentalIndex*10 + mapIndex] schrijven.
PPPS: Dit soort dingen netter opschrijven zorgt er voor dat je makkelijker bugs uit je programma haalt. Oefening: Er zit een bug in de code die je hebt gepost. VIND HEM.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

De bug is :

Als de toerentalindex 80 is , en de mapindex groter als 0 is , de pic geen positie hoger dan 80 zal vinden omdat deze niet bestaan.?

oplossing :
van dit :

c code:

if (toerentalIndex > 81) then
 toerentalindex = 80
end if

dit maken :

c code:


if (toerentalIndex >= 80) then
 toerentalindex = 70
end if

[Bericht gewijzigd door Henry S. op zaterdag 7 mei 2016 18:41:29 (61%)