Forum: Mikrocontroller und Digitale Elektronik PIC18 Rechnung effizienter lösen


von Osccon (Gast)


Lesenswert?

Hallo,
ich habe ein kleines Programm in C mit dem C18 Compiler für den 
PIC18F46K80 geschrieben.
Dabei bin ich auf ein kleines Problem gestoßen.
Ich muss folgende Rechnung lösen:
1
float tn = ...
2
...
3
...
4
for(...
5
{
6
    tn = 1.0 / (1.0 / tn + tn * acceleration);
7
}
Da der PIC18 aber keine Hardware Unterstützung für Fließkommazahlen hat 
wird diese entsprechen langsam gelöst (ca. 2000 Cycle).
Aber ich muss es schaffen diese innerhalb von 1000 Cycle zu lösen.
Ich habe es versucht einfach mit großen Nichtkommazahlen zu 
beschleunigen jedoch wurde das ganze nur noch langsamer (3600 Cycle).
1
tn = (100000000000000 + rest) / (100000000000000 / tn + tn * acceleration);
2
rest = (100000000000000 + rest) % (100000000000000 / tn + tn * acceleration);
Ich musste zusätzlich noch den Rest mitberechnen um die Genauigkeit zu 
steigern.
Sieht jemand Möglichkeiten die Rechnung effizienter zu gestalten?
tn liegt im Mikrosekunden Bereich und wird benötigt um einen Timer zu 
initialisieren.
Ich betreibe den PIC mit eine 50MHz Oscillator.
Ich frage mich aber auch ob das an dem C18 compiler liegt, da ich nur 
die Free Version habe(Wenn ich mir manchmal den erzeugten Assembler Code 
ansehe schmeißt der Compiler da ganz viel unnötige Operationen rein um 
den Code un effizienter zu machen).
Das ärgert mich bei den PIC Mikrocontrollern, dass es keine vernünftigen 
Compiler umsonst (Oder auch für kleine Preise bis 80 Euro) gibt mit dem 
man Effizienten Maschinencode erzeugen kann.
Hat jemand Erfahrung mit anderen Mikrocontrollern bei denen es 
effiziente Compiler umsonst gibt oder gibt es vielleicht doch noch einen 
effizienteren Compiler für die PICs?

von H.Joachim S. (crazyhorse)


Lesenswert?

Wenn ich die Formel richtig interpretiere, steh da

tn²*acc=1

von chris (Gast)


Lesenswert?

"tn²*acc=1"

du hast eine 1 übersehen

es sollte tn²*acc=0 rauskommen

wenn man davon ausgeht das acc eine endliche zahlt ist landet man allso 
bei tn=0

ich glaube da ist ein wurm in der angabe ;p

von Karsten (Gast)


Lesenswert?

Wie im Ursprungspost neulich, versteht noch immer keiner dein Problem. 
Deinen Pillepallekäs' rechnet ein PIC18 selbst mit int32 Festkomma in 
deutlich < 1000 Takten.

Dein erstes Problem ist, dass da float steht, dein zweites Problem, 
dass du die Hinweise auf dem anderen Thread nicht umgesetzt hast und das 
Prinzip der Festkommaarithmetik nicht verstehen willst

von Sascha (Gast)


Lesenswert?

https://www.wolframalpha.com/input/?i=x%3D+1%2F+%281%2Fx+%2B+x*a%29

Zuerst schreibt man das mal um, dann ist man schonmal ne Division los.

Weiterhin machst du das ganze in einer for-Schleife. Da sollte man 
Werte, die sich innerhalb der Schleife nicht ändern, im Vorraus 
berechnen und ablegen (wenn das die Compileroptimierung nicht schon 
tut).

Verstehe ich das richtig, dass du den Wert tn Brute-Force errechnest?
Und das konvergiert dir nicht schnell genug?

https://de.wikipedia.org/wiki/Fixpunktiteration

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Willst du uns jetzt jede Woche die gleiche Frage stellen oder was?

Beitrag "PIC18 Algorithmus Implementieren"

von H.Joachim S. (crazyhorse)


Lesenswert?

chris schrieb:
> "tn²*acc=1"
>
> du hast eine 1 übersehen

Stimmt :-)

von Severino R. (severino)


Lesenswert?

Osccon schrieb:

> Das ärgert mich bei den PIC Mikrocontrollern, dass es keine vernünftigen
> Compiler umsonst (Oder auch für kleine Preise bis 80 Euro) gibt mit dem
> man Effizienten Maschinencode erzeugen kann.

Du kannst den XC8 PRO Compiler für USD 29.95 pro Monat nutzen (und nach 
einem Monat wieder abbestellen, später wieder abonnieren etc.).
http://www.microchipdirect.com/ProductSearch.aspx?Keywords=SW006021-SUB

von Torben K. (tokuhila)


Lesenswert?

Gegen groben Unfug hilft auch der PRO Compiler nicht

von флурц (Gast)


Lesenswert?

weg mit dem Troll

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.