Toon posts:

[Lego RCX] ERIKA => Gen floating point getallen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een schoolopdracht moet ik met Lego Mindstorms een meter maken die zo genaamd het verbruik van bijvoorbeeld gas meet. Op de lego brock draait het besturingssysteem ERIKA.
Het probleem is dat de H8 controler van Hitachi, die in de brick zit, geen floating point getallen kent. Berekeningen uitvoeren is dus niet mogelijk. Weet iemand misschien een andere oplossing om met bijvoorbeeld twee integers een float te simuleren????

Er zit wel een bibliotheek bij ERIKA die deze functionaliteit ook zou moeten bieden maar die werkt niet correct. Als ik 5,5 + 5,5 doe zegt hij dat de uitkomst 10 is. Dit klopt dus niet.

Zou echt super zijn als iemand een oplossing weet.

Alvast bedankt voor jullie hulp.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:01

Creepy

Tactical Espionage Splatterer

Fixed point math.

Zie http://www.google.nl/sear...&q=fixed+point+math&meta=

In feite simuleer je nu een floating point getal in een integer. http://www.wwnet.net/~stevelim/fixed.html geeft er een flinke uitleg over hoe zoiets werkt.

[ Voor 24% gewijzigd door Creepy op 28-10-2005 16:29 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
Op de site van ERIKA staat zelfs dat fixed point math library al inbegrepen is.

Zie de ERIKA manual voor de library functies (ERIKA_int2sf, ERIKA_sf2int, ERIKA_sf_mul, ERIKA_sf_div etc.). Lijkt me stug dat deze niet werken iig.
Waarschijnlijk gebruik je de library gewoon niet goed?

[ Voor 21% gewijzigd door Lone Gunman op 28-10-2005 20:39 ]

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


Verwijderd

Topicstarter
Bedankt voor jullie reacties!!

Het lijkt mij idd ook stug dat dit niet werkt. Ik heb echter het een en ander geprobeert maar krijg steeds verkeerde antwoorden. Er zijn op de ERIKA site ook geen voorbeelden te vinden waarin de Fixed-Math typen en functies gebruikt worden.

Ik gebruik nu een work-arround waarin ik alles met 1000 vermenigvuldig. Als ik later de "echte" waarde weer nodig heb deel ik weer door 1000.

Volgende probleem waar ik op stuit is dat ik make-errors krijg tijdens berekeningen. Onderstaand stuk code:

ERIKA_UINT16 s2 = 0, verbruik = 0;
THREAD thread0(void)
{
s2 = read_sensor2(); // Lees een kleurmeting met sensor2 in.
verbruik = ((s2 - 733) / 106) * 16700;
}


Geeft de volgende error tijdens een make-opdracht:

out/code.o(.text+0x4a):code.c: undefined reference to `___udivhi3'
out/code.o(.text+0x50):code.c: undefined reference to `___mulhi3'
make: *** [energiemeter.srec] Error 1


Groeten Steffen.

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Je bent dan waarschijnlijk een library vergeten mee te compilen.

[ Voor 10% gewijzigd door Radiant op 30-10-2005 13:40 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:01

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op zondag 30 oktober 2005 @ 13:38:
Volgende probleem waar ik op stuit is dat ik make-errors krijg tijdens berekeningen. Onderstaand stuk code:

ERIKA_UINT16 s2 = 0, verbruik = 0;
THREAD thread0(void)
{
s2 = read_sensor2(); // Lees een kleurmeting met sensor2 in.
verbruik = ((s2 - 733) / 106) * 16700;
}


Geeft de volgende error tijdens een make-opdracht:

out/code.o(.text+0x4a):code.c: undefined reference to `___udivhi3'
out/code.o(.text+0x50):code.c: undefined reference to `___mulhi3'
make: *** [energiemeter.srec] Error 1


Groeten Steffen.
Ok, duidelijk. En wat heb je nu al zelf geprobeerd om dit op te lossen? We zijn er hier niet om jouw code te debuggen natuurlijk, dat doe je in eerste instantie zelf. Lees aub P&W FAQ - De "quickstart" eens door zodat je weet wat we hier eigenlijk van je verwachten.

Je bent waarschijnlijk een library vergeten mee te linken.

En groeten onder je posts hoeven niet, je naam staat toch al naast je post ;)

[ Voor 4% gewijzigd door Creepy op 30-10-2005 13:43 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik zal er aan denken mijn berichten beter te formuleren, ben geen ervaren forumgebruiker.
De berekening rekent een meetwaarde van een lichtsensor om naar een verbruik in mm3 aardgas. De functie read_sensor() leest een sensor op poort 2 uit, code hiervoor heb ik overgenomen uit voorbeelden in de \erika\tests\h8 directory.
Ik heb van alles geprobeert om te kijken waar de error onstaat. Ben begonnen met het volgende
C:
10
11
12
13
14
15
16
17
18
int a, b, c;

THREAD thread1(void)
{   
    a = 750;
    b = 733;
    
    c = ((a - b) / 160) * 16700;
}

Levert geen errors op. Als ik de int verander in ERIKA_UINT16 gaat de bovenstaande berekening ook nog goed. Als ik vervolgens a initialiseer met een waarde die door een lichtsensor wordt gelezen verschijnt de error.
C:
10
11
12
13
14
15
16
ERIKA_UINT16 a, b, c;
THREAD thread1(void)
{   
    a = read_sensor2();
    b = 733;
    c = ((a - b) / 160) * 16700;
}

Geeft de volgende errors:
out/code.o(.text+0x2c):code.c: undefined reference to `___udivhi3'
out/code.o(.text+0x34):code.c: undefined reference to `___mulhi3'

Als ik library vergeten zou zijn zou hij het in geen enkel geval doen toch?? Ook de waarde van de sensor eerst terug casten naar een int helpt niet.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
schoonveld: Als ik library vergeten zou zijn zou hij het in geen enkel geval doen toch??
Een mogelijk oorzaak hiervan is dat de compiler in het eerste geval al at-compile time de expressies evalueert omdat het allemaal constanten zijn. Dit is een redelijk standaard optimalisatie die vrijwel elke compiler uitvoert. De functies zijn dan dus niet nodig, omdat het programma eigenlijk helemaal niets meer doet qua berekeningen. In het twee geval heeft 1 van de variabelen een dynamische waarde, waardoor de expressies niet at compile-time berekend kunnen worden.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Thnx voor je reply.

Volgens de manual compiling & using op de ERIKA site wordt ERIKA geinstalleerd met gcc-2.95.2. Ik probeer ERIKA nu te installleren met gcc4.x, hopelijk heb ik dan minder problemen. Float's en double's zijn iig wel ondersteund.

Verwijderd

Omdat de tussenresultaten van de formule

C:
1
 verbruik = ((s2 - 733) / 106) * 16700;


niet goed passen in een 16-bits integer , gaat je nauwkeurigheid naar de haaien. Je weet vast wel dat je maximaal 65535 in een 16-bits getal kunt opslaan. Reken dit maar eens uit:

C:
1
 verbruik = X * 16700;


Denk hier eens over na: Wat is het hoogste getal dat je kunt vermenigvuldigen met 16700 waarbij je antwoord in dit bereik valt? antwoord : 3
Om gebruik te maken van het hele bereik dat 16-bits getallen je geven en je nauwkeurigheid hoger te maken, moet je je formule anders opzetten. Stel je formule zo op dat alle tussenresultaten altijd kunnen worden opgeslagen in het variabele type dat je gebruikt, in dit geval 16-bits getallen. Anders krijg je onzin resultaten. Ik ken ERIKA niet maar ik veronderstel dat op zo'n kleine processor geen range overflow fouten worden gemeldt. Dat moet je dus zelf doen.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
ERIKA is een of ander OS, CPU is een Hitachi. Evengoed zul je waarschijnlijk een silent overflow krijgen, ja.

Sowieso is het niet handig om met 1000 te vermenigvuldigen. *1024 is een bitshift. *1000 is waarschijnlijk 3 bitshifts en 2 keer aftrekken.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1