mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Messwerte umwandeln


Autor: jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde da nicht sowas passen wie:

(eingang - 625) / 1000

?

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@jan
Mich wundert bei der Pisa-Studie nichts mehr.

Autor: jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Autor: xXx (Gast)
Datum:

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

Autor: jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: walifogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

;-)

Autor: .... (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.