Forum: Mikrocontroller und Digitale Elektronik Balkenanzeige LCD


von seppe (Gast)


Lesenswert?

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

von TheMason (Gast)


Lesenswert?

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

von seppe (Gast)


Lesenswert?

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

von TheMason (Gast)


Lesenswert?

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

von seppe (Gast)


Lesenswert?

Danke!!

von Daniel (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

Hi,

habs verstanden, es geht hier nicht um Prozentrechnung sondern nur um 
die Verhaeltnisrechnung. Bei 100 heisst es nun mal eben Prozentrechnung 
:).

Daniel

von Daniel (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.