Forum: Mikrocontroller und Digitale Elektronik Messwerte umwandeln


von jan (Gast)


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

von Rolf Magnus (Gast)


Lesenswert?

Würde da nicht sowas passen wie:

(eingang - 625) / 1000

?

von ... (Gast)


Lesenswert?

@jan
Mich wundert bei der Pisa-Studie nichts mehr.

von jan (Gast)


Lesenswert?

@...: 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... ;-)

von xXx (Gast)


Lesenswert?

@Jan: Wollt damit nur sagen ,dass du dich nur dumm stellst... Dein
Problem kann man mit Nachdenken lösen!!!

von jan (Gast)


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!

von Ssss S. (sssssss)


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

von walifogel (Gast)


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

von Schoaschi (Gast)


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

von jan (Gast)


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.

von arc (Gast)


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;

;-)

von .... (Gast)


Lesenswert?

Woher nimmst du die Werte 625, 1625 und 256000. Sind dir die so gerade
eingefallen oder gehören genau diese Werte zur Aufgabenstellung?

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.