PIC18 Rechnung effizienter lösen

Gast #4478373
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?
Gast #4478404
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
Gast #4478512
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
#4498095
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren