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.
Welche Sprache? Welches Display? Das hier schon gesehen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
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?
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.
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?
Hallo Kann es sein, das du die Ausgaben zu schnell hintereinander machst? Zeig mal dein Programm. Gruß Joachim
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.
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
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.
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?
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
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.
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.
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?
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.
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.
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.
Also hab den Mega 32 grad geflasht und Funktioniert trotz der Warnung. Vielen Dank!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.