Messwerte umwandeln

Gast #330754
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
@...: Mmmmh irgendwie weiß ich net worauf Du dich beziehst bzw. was Du
mir sagen willst... Daher wundert mich die Pisa-Studie in Bezug auf
deinen Kommentar auch nicht... ;-)
Gast
@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!
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
@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
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
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
>> (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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.