Forum: Mikrocontroller und Digitale Elektronik c51, AT89S8252, kommazahlen


von Nico (Gast)


Lesenswert?

Hi

ich hab folgendes problem...und zwar hab ich einen abstandsmesser(einer
von Sharp(sicher bekannt)) und dieser ist mit einem A/D-wandler
verbunden....da der abstand nicht ~ zur gemessenen spannung ist, brauch
ich eine funktion die die werte ausgibt...

jetzt hab ich eine funktion aufgestellt die kommazahlen beinhaltet...

so sieht mein code aus in C:
  unsigned int exp1 = 1;
  unsigned int exp2 = 1.017066;
  unsigned int exp3 = 3.763158;

                for(aa=0;aa<scanner_read_range;aa++){
        exp1 = exp1 * exp2;


    }
    scanner_read_range = exp1 * exp3;

bei der funktion handelt es sich um eine expotenzialfunktion..also der
form y=a*b^x (x ist hier die gemessene spannung) und y soll dann der
abstand in cm sein...

mein problem ist nun das er mir für z.b. exp2^100 = 1 ausgibt, was ja
normal 5.43142 ist....


wo liegt der fehler ? bzw ist es möglich mit so viel nachkommastellen
zu rechnen ? da es ja ein eigentlich ein binärsystem ist...

danke im voraus

von Rahul (Gast)


Lesenswert?

>unsigned int exp3 = 3.763158;

Wie soll das denn gehen? Int ist eine Ganze Zahl, ohne irgendwelche
Nachkommastellen.
Was du brauchst, sind float oder double.

von Nico (Gast)


Lesenswert?

übel, float und double sind gesperrt in der eval version von keil vision
3 wenn ich mich recht entsinne:)

von Nico (Gast)


Lesenswert?

hat jemand ne alternative ?

von Rahul (Gast)


Lesenswert?

Mulipliziere die Zahlen so, dass keine Nachkommastellen mehr entstehen:
aus 1.017066 würde dann 1017066 werden. Dazu brauchst du dann natürlich
eine (noch) grössere Ganzzahl...
Andere Möglichkeit: Kauf dir die Vollversion, benutze einen anderen
Controller für den es kostenlose Vollversionen gibt oder benutze einen
kostenlosen Compiler für deinen Controller.
Hast du mal bei IAR geguckt? Vielleicht habe die eine Version für den
C51, die nur speicherbegrenzt ist (so wie die für den AVR...).

von Karl H. (kbuchegg)


Lesenswert?

Welchen Wertebereich hat den scanner_read_range?
Ev. könnte man mit einer Tabelle arbeiten:

  y = Tabelle[x];

Dann brauchst Du nur noch die Tabelle geeignet anhand
der ursprünglichen Formel anlegen.
Ev. würde es auch reichen nur jeden 2.-ten oder 3.-en
Tabellenwert tatsächlich anzulegen und dazwischen zu
interpolieren.

Möglichkeiten gibts genug.

von Nico (Gast)


Lesenswert?

naja, so hatte ich es schon probiert... leider hatte ich dann 20 zeilen
code oder mehr, dachte das muss kürzer gehn...deswegen die eine
funktion... naja, muss mal weiter schauen....

kennt evtl jemand nen c compiler der hex-files macht und kostenlos ist
? also nicht von keil ^^ und der float vars unterstützt ?

von Nico (Gast)


Lesenswert?

oh, für den Atmel 89S8252...

von Joe (Gast)


Lesenswert?

na klar, SDCC. Oder MIDE51 herunterladen und du hast ne komplette IDE
mit ASM und C.

Gruß

Joe

von Roland Schmidt (Gast)


Lesenswert?

Probier's mal mit der Demo des µc/51 von http://www.wickenhaeuser.de/

von Joe (Gast)


Lesenswert?

Der Wickenhäuser ist 8k limited. SDCC ist frei und somit unlimited, ich
setzte seit mehreren Jahren nur noch auf Freeware und es gibt keine
Probleme.

Joe

von Joe (Gast)


Lesenswert?

Anbei noch einige Samples für den AT89S8252.

Joe

http://sdccokr.dl9sec.de/resources.htm

von Nico (Gast)


Lesenswert?

Hey vielen danke leute ! :)

von Cri Gri (Gast)


Lesenswert?

Und???gehts schon????
Bin neugierig :)

mfg Cri

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.