hallo ich will einen registerwert, zb von ner adwandlung als balken(0-10) auf nem lcd anzeigen lassen. wie kann ich in aseembler am einfachsten sagen bis zu wert x 1 balken ab wert y 2balken usw? sepp
ich kenn mich zwar nicht mit deinem verwendeten prozessor aus, noch weiß ich nicht wie deine hardware aussieht, aber ich würde sagen : subtrahiere von deinem ad-wert den wert x ab. wenn das ergebnis kleiner als 0 ist (N-Flag oder C-Flag) setzt du balken eins ansonsten setzt du balken eins zurück. dasselbe machst du 10 mal (mit jeweils nem anderen wert und nem anderen balken) und dann sollte deine balkenanzeige laufen. gruß rene
hmmm gute idee ich dachte nämlich so: teste ob registerwert kleiner als x wenn nein > 1balken. ich will übrigens nen amtmega 8 oder 16 verwenden
geht auch noch anders : nimm deinen ad-wert schneide alles ab bis auf die obersten vier bits, schiebe diese nach ganz unten, multipliziere diesen wert mit 10 und schiebe wieder um 4 bit nach rechts. dann hast du deinen ad-wert von 0-10 begrenzt und mußt nur noch entsprechend dem wert die anzahl von leds setzen. bsp mit 8 bit ad-wert: x = 10101010 (dez. 170, also 66% deines max-wertes) schieben x1 = 00001010 multiplizieren x1 * 10 = 01100100 schieben y = 0110 (dez. 6) ausgabe und fertig
Hi, warum dieses schieben um 4 ? das ist doch einen Division durch 16. Ich habe das selbe mathematische Problem. Bei mir ist die Balkenanzeige fuer 128 Balken und mein Wert x ein 16 bit Integer. Mein max. Wert ist auch nicht konstant. Ich programmiere es in C.
1 | // time_act/divcount = time_max / 100
|
2 | divcount = (time_act * 100)/time_max; |
3 | divcount = divcount * 128; |
viele Fragen: Ist es richtig oder geht das auch noch einfacher? Muss ich es auf die konstante 100(Prozent) beziehen oder kann ich es auch auf einen andere konstante wie 128 oder 64 beziehen? Gibt es nicht einen überlauf bei time_act * 100 ? wird doch zu gross fuer integer, wenn time_act > 655,35 ist? Geht es auch noch anders? Vielen Dank Daniel
Hi, habs verstanden, es geht hier nicht um Prozentrechnung sondern nur um die Verhaeltnisrechnung. Bei 100 heisst es nun mal eben Prozentrechnung :). Daniel
PS: mein richtiger Code ist nun
1 | // time_act / divcount = time_max /100
|
2 | divcount = (time_act * 100) /time_max; |
3 | divcount = divcount * LINES; |
4 | divcount = divcount / 100; |
Begrenzt auf time_max < 655,35 sonst kommt muell raus Daniel
Wozu zuerst mit 100 multiplizieren um dann durch 100 zu teilen?
1 | divcount = time_act * LINES / time_max; |
> es geht hier nicht um Prozentrechnung sondern nur um > die Verhaeltnisrechnung. > habs verstanden, anscheined nicht. > Bei 100 heisst es nun mal eben Prozentrechnung :). Und ansonsten heist es Schlussrechnung, bzw. der berühmte Dreisprung. 5 Äpfel kosten 12 Euro. Wieviel kosten 8 Äpfel 5 ......... 12 8 ......... x ------------------ 8 * 12 x = --------- 5 time_max wird in LINES Elementen dargestellt, wieviele Elemente benötigt man für time_act time_max ......... LINES time_act ......... x ------------------------------ time_act * LINES x = ------------------ time_max ( Merkspruch: Die 3 Elemente ohne dem x bilden ein Dreieck. -> Zahl über x, mal Stumpf durch Spitz Spitz Zahl Stumpf x )
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.