Forum: Mikrocontroller und Digitale Elektronik Laufbalken auf LCD ADC wert


von Andy Hempel (Gast)


Lesenswert?

hallo

ich hab ne frage, vielleicht kennt sich da jemand bissel aus.

ich wollte am ADC einen drucksensor anhängen und den druck dann
anhand eines balkens auf dem LCD darstellen.
ich hab mir dazu ein paar zeichen erstellt.
ich weiß allerdings nicht richtig wie ich es anstellen soll das LCD
erst ein zeichen nach rechts geht wenn das segment voll ist.
also es soll vom ADC der wert von 0 - 5 volt genommen werden und dann
die ganze zeile ausgefüllt werden.

hat sowas schon mal jemand gemacht?

ich wollte es in Assembler probieren.

bin noch ganz neu hier.

ich hab zum besseren verständnis ein video gemacht wie ich es mir
vorstelle.

http://www.net-pong.de/MVI_0651.avi

mfg andy

von Rahul (Gast)


Lesenswert?

Dürfte auf Modulo (oder wie hieß die Division mit Rest?) rauskommen:
Alle Segmente (in deinem Fall 16) deines Displays zusammen ergeben den
maximalen Wert des ADC (1023?).
Also hast du pro komplettem Segment 1024/16 = 64 (1024 lässt sich im
Moment leichter rechnen, ist ja auch die Anzahl aller Werte...)
Wenn du jetzt noch die Segmente unterteilst (5 Balken?), kannst du noch
etwas schöner auflösen.
Eigentlich kann man das recht einfach machen:
Solange vom ADC-Wert 64 abziehen, bis dieser kleiner als 64 ist. Der
Rest verteilt sich dann auf das nächste Segment.

von Eerhard (Gast)


Lesenswert?

Aaaargh !! 5 MB und nur 8 Sekunden Film ?! Schaeme dich, und mach er
bitte ein bisschen kleiner.

von Andy Hempel (Gast)


Lesenswert?

ok, das ich das teilen muss ist mir auch in den sinn gekommen.
aber ich hab echt keine ahnung wie ich das anstellen soll.

hast du vielleicht mal ein kleines code-beispiel? an dem ich mal bissel
testen kann?

mfg andy

sorry wegen dem 5mb film, aber ich hatte keine zeit das umzuwandeln.
bei DSL ist das doch wurst ;)

von Rahul (Gast)


Lesenswert?

Hab leider keine Ahnung von ASM...
Müsste aber so ähnlich aussehen:
Wiederhole solange ADC-Wert<64
{
 Erhöhe Segmentanzahl
 ziehe 64 vom ADC-Wert ab
}
Wie das in ASM aussieht, weiß ich aber nicht. Sollte aber relativ
einfach gehen.

von johnny.m (Gast)


Lesenswert?

Hallo,

Was für ein µC ist das denn? Ohne die Info kann Dir keiner brauchbaren
Assembler-Code zur Verfügung stellen.

Gruß

Johnny

von Lupin (Gast)


Lesenswert?

Das Spiel auf deiner Seite ist echt cool, hab nur 18.6 sekunden
geschafft aber bin mir sicher mit training ist noch viel mehr drin.

Wie hast du es denn im video gemacht? Also im einfachsten fall machst
du eine schleife die bis zu deinen ADC wert durch zählt und jedes mal
den balken in der aktuellen Zelle ein stück länger macht (das symbol
wechselt) und jedes mal wenn die Zelle voll ist zur nächsten wechselt.

von johnny.m (Gast)


Lesenswert?

In AVR-Assembler könnte man so was machen (ohne Gewähr!):

.equ balken = r16

;... Initialisierung ...

       in r24, ADCL ;ADC-Register einlesen
       in r25, ADCH

CLOOP: sbiw r25:r24, 64 ;64 abziehen
       brmi ENDE        ;wenn negativ, dann Ende
       inc balken       ;balken hochzählen
       rjmp CLOOP       ;und nochmal

ENDE:         ;... balken ausgeben

Wenn der erste Balken schon erscheinen soll, wenn ein Wert zwischen 0
und 64 vorliegt, muss man balken noch mal um eins erhöhen. Ansonsten
sollte das klappen. Dann musste nur noch entsprechend der Zahl in
balken deine Balken auf dem LCD ausgeben.

Gruß

Johnny

von Stevko (Gast)


Lesenswert?

Guten Morgen Andy,

das ist eine schöne Aufgabe um sich sukzessiv ins
Mikrocontrollergebiet+ASM einzuarbeiten.
Wie Rahul schon sagte, wirst Du etwas rechnen müssen. Natürlich kann
man die Auflösung noch verfeinern, indem "Sonderzeichen" definiert
werden. Denn wenn Du Dir das Display mal genau ansiehst, wirst Du
sehen, dass ein LCD-Segment aus 5 Spalten besteht. Somit erhälst Du
eine Auflösung von 1024/(16*5) = ca. 13. Dadurch sieht die Anzeige
dynamischer aus, aber zuerst zu den Grundlagen.

Auflösung = 63!!!!! da nur zum Lernen:
Dein ADC-Wert ist vom Type Word 0...65535 -> es gibt einen Low- und ein
HighValue.
Für die Subtraktion existieren 2 Möglichkeiten, subiw oder
sub(Low)+sbc(High).

Ich nehme mal sbiw für die Doppelregister. Achtung 63 ist hier die
Obergrenze aber später wird mal 13 eigesetzt.

1. Werte ins Doppelregister laden

ldi XL, ADC_Value_Low
ldi XH, ADC_Value_High

2. nun immer 63 abziehen bis Ergebnis < 63 und brav mitzählen
;Zähler säubern
clr R17
;Temp säubern
clr R16
;Schleife für Zähler
LCD_Calc_Row:
  sbiw XH:XL,63
  ;und Durchgang speichern
  inc R17
  ;Vergleich ob < 63
  ;erst mal Low
  cpi XL,63
  ;jetzt High(sollte 0 sein)
  cpc XH,R16
  ;wenn größer oder gleich dann weiter mit Subi
  brsh LCD_Calc_Row
  ;so in R17 stehen jetzt die Durchgänge
  laber
   laber
    laber

Dies sind nur die Gründzüge und es gibt auch andere bzw. effiziente
Möglichkeiten. Lade die Schleife mal ins AVR-Studio und teste sie.
Probiere das ganze mit SUB und SBC.

Gruß
  Stevko

von peter dannegger (Gast)


Lesenswert?

"Aaaargh !! 5 MB und nur 8 Sekunden Film ?! Schaeme dich, und mach er
bitte ein bisschen kleiner."


Wenns nur das wäre.

Ist wohl wieder son DIVX-Scheiß, wo man irgendnen exotischen Dekoder
vom Admin installieren lassen muß.

Hast Du ne Ahnung, was das für ein Krampf ist, auf nem Firmenrechner
exotische Software installiert zu bekommen ?


Peter

von Rahul (Gast)


Lesenswert?

@Stevo: Wie kommst du auf die 63?
Wenn man 16x63 rechnet, kommt man nur auf 1008. Da fehlen noch 15-16
mögliche Werte...

von Rolf Magnus (Gast)


Lesenswert?

> Ist wohl wieder son DIVX-Scheiß, wo man irgendnen exotischen
> Dekoder vom Admin installieren lassen muß.

Erstens ist DivX weder ein Scheiß noch exotisch (jeder Feld-, Wald- und
Wiesen-DVD-Player kann es und jedes Betriebssystem außer Windows kann es
per Default auch), zweitens ist das Video überhaupt nicht in DivX. Es
ist in mjpg, was vermutlich direkt von der Kamera kommt. Deshalb ist es
auch so riesig. DivX wäre viel kompakter.

von Stevko (Gast)


Lesenswert?

@Rahul:

Natürlich hast Du richtig gerechnet!
Ich wollte den Weg mit SBIW (=Subtrahiere vom Word eine Konstante und
zwar zackig) aufzeigen. Aber die Konstante hat einen Wertebereich von
0..63!
Hintergrund dieser Aktion war das Definieren der (feinen)Auflösung als
Konstante.

.equ LCD_Auflösung = 13

;und später in der Schleife
sbiw XL:XH, LCD_Auflösung

;und noch später beim Vergleich
cpi XL,LCD_Auflösung

Somit bleibt Andy variabel beim Testen bzw. späteren Änderungen.

Gruß
  Stevko

von Lupin (Gast)


Lesenswert?

peter: http://www.mplayerhq.hu/ geht auch ohne installation und spielt
fast alles

von Andy Hempel (Gast)


Lesenswert?

sorry, noch ma wegen dem video.
ich habs halt nur schnell von meiner digicam

hab heut leider keine zeit, aber ich werd das mit dem video noch
ändern.

auch wenn man es vielleicht nich gut sehen kann, aber ich habe bereitz
sonderzeichen ins LCD programmiert damit die auflösung besser ist.

ich nutze einen Atmega8L

ich schreibe alles in AVR Studio.
ich habe mir ein buch gekauft von myavr.de aber irgendwie komm ich mit
diesen interrupt funktionen nicht richtig klar.
wenn ich es so mache wie im buch passiert eigentlich nix.
baue ich die abfrage des ADC direkt mit in die programmschleife ein
funktioniert es.

das code beispiel von oben werde ich morgen mal testen.

erstmal viele dank ;)

von Conlost (Gast)


Lesenswert?

Hallo Andy,

Hast du den Stack richtig initialisiert?
Hast du den Interrupt-Vektor an die richtige Stelle geschrieben?
Im Interrupt sie wichtigen Register auf den Stapel gelegt?

Ohne Code kann man leider auch nichts weiter dazu sagen.

Es grüsst,
Arno

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.