Messwerte umwandeln

Gast #330754
Lesenswert?

So ich hab ein kleines Problem, ich messe mit meinem ATMega 16
Frequenzen, das klappt auch schon ganz gut. Nun soll ich die aber
umsetzen in 8-Bit, sprich ich bekomme von der Frequenzmessung z.B: das
Ergebnis 1000 für 1KHz und soll das nun in eine 0 (8-Bit) umwandeln.
Hier mal eine kleine Tabelle:
625 -> 0
750 -> 0
875 -> 0
1000 -> 0
1125 -> 0
1250 -> 0
1375 -> 0
1500 -> 0
1625 -> 1
1750 -> 1
1875 -> 1
2000 -> 1
2125 -> 1
2250 -> 1
2375 -> 1
2500 -> 1
2625 -> 2
...
256000 -> 255

Wie würdet ihr das am schnellsten machen? Mir kam der Gedanke entweder
mit Tabelle (wie geht das mit C) oder aber mit einem Algorithmus. Bin
für jeden Vorschlag dankbar.
Gruß jan
Gast #330759
Lesenswert?

@xxx bzw @...: Wenn Du meine Frage genau gelesen hättest, dann wäre Dir
vielleicht aufgefallen dass ich gar keine Lösung des Problems wollte,
sondern ich nur wissen wollte, welche Lösung (Tabelle oder Algorithmus)
in C die schnellere ist. Aber egal... Ich sehe die Diskussion mit dir
über Pisa und Co hiermit als beendet.

Nun aber nochmal zu meiner zweiten Frage, wie wird sofern man mit
Tabellen arbeitet, dieses in C realisiert? Hat jemand ein Beispiel?
Danke!
#330760
Lesenswert?

Wie willst du das denn mit Tabellen machen ?
Ne Tabelle mit ~256000 Einträgen ? also 256KByte RAM/FLASH nur für die
Tabelle ?

Oder ne Tabelle mit 255 Einträgen a 18 Bit. Aber auch da wird der
Zugriff sicherlich langsamer als direkt zu rechnen.

>(eingang - 625) / 1000
wird in jedem Fall schneller als ne (externe) 256KB Tabellenlösung sein
:-X
(zumindest bei nem atmega)

Bzw du könntest auch zb
(eingang - 625) / 1024 = (eingang - 625)>>10
rechnen (falls der Fehler nicht stört)
Das /1024 geht sehr schnell zu berechnen (einfach um 10 Stellen nach
rechts schieben)

Bye, Simon
Gast #330761
Lesenswert?

@Jan

Bei ``PC`` C/C++ würde ich sagen Berechnen, aber die uC, können zwar,
sind aber eigentlich nicht auf Mathe ausgelegt. Das Problem ist wenn du
eine Tabelle verwendest, dann benötigst du 256 Register. Das ist nur mit
einem Externen EEPROM machbar.

Wenn du dann noch intelligente Vergleichsalgorithmen
``Halbierungsmethode`` verwendest, müsste das auch recht flott gehen.

df
Gast #330762
Lesenswert?

x=0;
while(frequenz>=1625)
 {
 x++;
 frequenz = frequenz-1000;
 }

Wie wärs mit der Lösung? würde ja auch gehen und man würd sich die
division ersparen. Und Divisionen sind ja immer so eine sache :D
Gast #330763
Lesenswert?

Okay ich seh schon, dass die Idee mit der Tabelle wohl nicht so gut war.


Aber wie würde so eine Tabelle in C z.B. für 10 Werte aussehen (z.B.
7-Segmentanzeige). Und wie würde man die Tabelle ansprechen.
Gast #330764
Lesenswert?

>> (eingang - 625) / 1000

etwas optimiert
x = eingang - 625
x / 1024 * 1,024
=>
x >>= 10
x *= 262
Fehler ~0.01%

Falls noch die Multiplikation mit 262 optimiert werden soll
y = x << 2;
y -= x;
x <<= 7;
x += y;
x <<= 1;

;-)

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