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
@...: 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... ;-)
@Jan: Wollt damit nur sagen ,dass du dich nur dumm stellst... Dein Problem kann man mit Nachdenken lösen!!!
@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
@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
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
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.
>> (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;
;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.