Forum: Mikrocontroller und Digitale Elektronik Veränderbaren Wert (z.B. Spannung) auf einer LCD darstellen


von Hans M. (Gast)


Lesenswert?

Hallo zusammen,

ich möchte mir eine Spannung die über einen ADC gemessen wird auf einer 
LCD darstellen. Mit der ausgabe auf die RS 232 Funktioniert das schon 
mal.

Aber ich hab keine Ahnung wie ich den gemessenen Wert auf die LCD 
bringe.
Arbeite mit der Bibliothek von Peter Fleury. LCD wird im 4-Bit Modus 
angesteuert.

Wäre nett wenn ihr mir helfen könnt.

von Michael B. (planlessmichi)


Lesenswert?

Welche Sprache? Welches Display?
Das hier schon gesehen: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

von Karl H. (kbuchegg)


Lesenswert?

Hans M. schrieb:

> Aber ich hab keine Ahnung wie ich den gemessenen Wert auf die LCD
> bringe.

Im Prinzip aus deiner Sicht fast genauso, wie auf die UART.

> Arbeite mit der Bibliothek von Peter Fleury. LCD wird im 4-Bit Modus
> angesteuert.

Und?
Funktioniert das LCD grundsätzlich?
Sprich: Kannst du Texte aufs LCD ausgeben?

> Wäre nett wenn ihr mir helfen könnt.

Dazu müsste man erst mal wissen, welches genau dein Problem ist.
Wenn du Zahlen in Textform auf die UART ausgeben kannst, dann tauscht du 
die Ausgabefunktion gegen eine, die einen Text auf LCD ausgeben kann und 
... fertig.

Deine Frage ist irgendwie so: Ich bin es gewohnt, dass die Türschnalle 
an einer Tür auf der rechten Seite ist. Jetzt ist sie aber links! Hilfe, 
wie krieg ich die Tür auf?

von Hans M. (Gast)


Lesenswert?

Programmiersprache ist C
und das Display ist ein 4 x 20 von AZ Displays

im Tutorial steht:

lcd_gotoxy(0,0); // LCD-Schreibzeiger positionieren
   char Buffer[20];
   itoa( Spannung, Buffer, 10 );
   lcd_puts( Buffer );

hab ich ausprobiert und funktioniert teilweise...

Sehe beim verstellen der Spannung nur 1 oder 2 oder 3 oder 3 oder 4... 
keine Kommazahl und dazu kann man die zahlen noch ned mal richtig lesen 
weil sie seher blass sind. Kontrasteinstellung ist in ordnung.

von Hans M. (Gast)


Lesenswert?

Ja ich kann einen Text auf das LCD ausgeben.
und auf die UART kann ich die Spannung darstellen (Hyper Terminal).

Funkioniert alles.

Nur wie kann ich nun diesen Variablen Wert auf das LCD darstellen?

von Joachim (Gast)


Lesenswert?

Hallo

Kann es sein, das du die Ausgaben zu schnell hintereinander machst?
Zeig mal dein Programm.

Gruß
Joachim

von Karl H. (kbuchegg)


Lesenswert?

Zeig mal das Programm, das du hast.

Dein flacher Kontrast klingt für mich nach einer Endlosschleife, in der 
das LCD laufend immer wieder gelöscht und neu beschrieben wird.

Und um die Kommazahlen musst du dich selbst kümmern, genauso wie du das 
bei einer UART auch müsstest.

Letztenendes kümmern sich sowohl UART als auch LCD nicht darum was sie 
anzeigen. Für die ist das einfach nur ein Text. Wie du den Text 
erzeugst, ist dein Bier.

von Hans M. (Gast)


Angehängte Dateien:

Lesenswert?

Ahhh hab jetzt noch ne Wartezeit eingebaut jetzt funktionierts. Aber nur 
Ganze Zahlen und keine Kommazahl.
Das heist von 0-5V sehe ich nur 1,2,3,4

von Karl H. (kbuchegg)


Lesenswert?

Hans M. schrieb:
> Ahhh hab jetzt noch ne Wartezeit eingebaut jetzt funktionierts.

Das war die falsche Lösung.

Stell dir vor, deine bessere Hälfte lässt dich die Zeitung lesen. Aber 
sie zeigt dir die Zeitungsseite nur 1 Sekunde lang, danach ist sie 
wieder weg. Ud das über einen Zeitraum von 2 Minuten. Immer: 1 Sekunde 
siehst du die Zeitung, 2 Sekunden siehst du sie nicht.
Da kann kein Mensch etwas lesen.
Genau das machst du aber mit dem clear Screen innerhalb der Schleife. 
Dein LCD flackert sich zu tode und wenn du schnell genug schauen 
könntest, würdest du sehen, dass der Text immer nur kurz aufleuchtet um 
gleich darauf wieder gelöscht zu werden.

Und die Lösung besteht jetzt nicht darin, die Zeit für das Anzeigen zu 
verlängern, sondern auf den clear Screen komplett zu verzichten. Die 
Devise heißt: neuer Text übermalt den vorher dort gestandenen alten 
Text. Und nicht: neuer Text wird hingemalt, indem zuerst der alte Text 
gelöscht wird.

von Hans M. (Gast)


Lesenswert?

Und wie sieht die richtige aus?

Bei UART mach ich das so:

rprintfFloat(3,Spannung);

rprintfloat für kommazahl
der 3er für die Stellen

Wie sieht den der Befehl für die LCD aus?

von Karl H. (kbuchegg)


Lesenswert?

Hans M. schrieb:
> Und wie sieht die richtige aus?
>
> Bei UART mach ich das so:
>
> rprintfFloat(3,Spannung);
>
> rprintfloat für kommazahl
> der 3er für die Stellen
>
> Wie sieht den der Befehl für die LCD aus?

rprintfFloat ist kein 'Befehl' den dir C an sich zur Verfügung stellt, 
sondern deine UART Library. Dort kann man aber nachsehen, wie das dort 
gemacht wurde :-)

ABer seis drum.
Spannung ist ein float. itoa wandelt einen Integer nach ASCII. Darum 
auch das i in itoa. Und du wunderst dich jetzt wirklich, dass du keine 
Nachkommastellen bekommst?

Deine Hauptschleife könnte zb so aussehen
1
 while(1)
2
 {
3
   digitwert_ad2 = adc_read(2);
4
5
   Spannung = 5.0/1024 * digitwert_ad2;
6
7
8
   char Buffer[20];
9
   sprintf( Buffer, "Spg: %5.2f V", Spannung );
10
11
   lcd_gotoxy(0,0); // LCD-Schreibzeiger positionieren
12
   lcd_puts( Buffer );
13
  }

http://www.mikrocontroller.net/articles/FAQ#Wie_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F

von Hans M. (Gast)


Lesenswert?

Entschuldigung das ich kein C Profi bin...

Woher soll den ich wissen was itoa heisst das stand im Tutorial drin.. 
habs rauskopiert und einfach mal probiert.

Würde mir nun Bitte Bitte Bitte jemand sagen was ich schreiben muss 
damit ich den gemessenen wert (der 2 nachkommastellen haben soll) auf 
dem LCD erscheint.

von Karl H. (kbuchegg)


Lesenswert?

Hans M. schrieb:
> Entschuldigung das ich kein C Profi bin...
>
> Woher soll den ich wissen

Woher du das wissen sollst?

Aus deinem C-Buch!
Genau dafür sind die geschrieben: Dass Anfänger die Grundlagen erlernen 
können. Auch Profis haben damit angefangen C-Bücher zu lesen ehe sie 
Profis wurden. Genau deshalb sind sie heute Profis! Weil sie von der 
Pieke auf die Progammiersprache systematisch mit Hilfe von Literatur 
gelernt haben, anstelle sich Halbwissen in Foren zusammenzufragen.

von Hans M. (Gast)


Lesenswert?

Beim Bilden erscheint eine Warnung:

../LCD_Test.c:55: warning: format '%5.2lf' expects type 'double', but 
argument 3 has type 'float'

Was heisst den das genau: "Spg: %5.2lf V"
Spg = Spannung
% wird für den "Platzhalter" stehen
aber das 5.21f?

von Karl H. (kbuchegg)


Lesenswert?

Hans M. schrieb:
> Entschuldigung das ich kein C Profi bin...
>
> Woher soll den ich wissen was itoa heisst das stand im Tutorial drin..
> habs rauskopiert und einfach mal probiert.
>
> Würde mir nun Bitte Bitte Bitte jemand sagen was ich schreiben muss
> damit ich den gemessenen wert (der 2 nachkommastellen haben soll) auf
> dem LCD erscheint.

Eine Beispielimplementierung hab ich dir ja schon gezeigt.
Aber das hier beachten:
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio

Anstelle von sprintf kann man auch dtostrf benutzen.

Am besten wäre allerdings der komplette Verzicht auf Floating Point 
Operationen. Wenn du dir statt Volt einfach Millivolt ausrechnen 
würdest, wäre es ganz leicht, nach der Tausenderstelle bei der Ausgabe 
ein , einzuschmuggeln. Dann steht am LCD auch wieder alles in Volt, aber 
du brauchst keine Floating Point Operationen.

von Karl H. (kbuchegg)


Lesenswert?

Hans M. schrieb:
> Beim Bilden erscheint eine Warnung:
>
> ../LCD_Test.c:55: warning: format '%5.2lf' expects type 'double', but
> argument 3 has type 'float'

(Welcher Compiler ist das?)
Mach ein %...f da draus.

> Was heisst den das genau: "Spg: %5.2lf V"
> Spg = Spannung
> % wird für den "Platzhalter" stehen
> aber das 5.21f?

Guckst du hier
http://www.mikrocontroller.net/articles/FAQ#sprintf.28.29

Allerdings: Das ist die Kurzform!
Die Langform mit noch 100 mehr Möglichkeiten, was man mit dem 
Formatstring in sprintf oder printf anfangen kann, findest du in jedem 
C-Buch.

von Hans M. (Gast)


Lesenswert?

Compiler ist WinAVR

von Karl H. (kbuchegg)


Lesenswert?

Hans M. schrieb:
> Compiler ist WinAVR

Dann kannst du die Warnung soweit ignorieren.
(Wundert mich, dass der gcc da überhaupt warnt. An dieser SChnittstelle 
werden double und float sowieso gleich behandelt)

Also:
Entweder du benutzt überall double anstelle von float
Oder du ersetzt das lf im Formatstring durch f

Dann sollte Ruhe sein.

von Hans M. (Gast)


Lesenswert?

Also hab den Mega 32 grad geflasht und Funktioniert trotz der Warnung.

Vielen Dank!!!

von Hans M. (Gast)


Lesenswert?

hmm jetzt funktionierts Plötzlich nicht mehr
jetzt steht nur noch Spannung: ? V da

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.