Forum: Mikrocontroller und Digitale Elektronik Spannung oder Temperatur auf LCD ausgeben


von Chaos (Gast)


Lesenswert?

Hallo,

und zwar habe ich ein LCD an meinem ATMEGA32 zum laufen gebracht 
(programmiert wurde in C). Text usw lassen sich auch ausgeben, ist alles 
kein Problem!
Ich bin auch schon mit einem Poti an einen Analogeingang gegangen und 
habe den Ausgabewert als:

lcd_putc(messwert);

am Display ausgegeben. Durch das drehen des Potis werden jetz aber alle 
Zeichensätze (Zahlen, Buchstaben, Zeichen etc.) ausgegeben.
Wenn ich jetzt z.B. eine Spannung messen möchte dann will ich nicht für 
jeden schritt bei 10 Bit = 1024 Werte zuweisen... Dann würde ich ja 2 
Tage tippen und das Programm wäre gedruckt 50 Din-A4 Seiten lang...

Ich will festlegen das z.B. 0= 0,00V ist und 1024 = 5V ist. Weiß nicht 
zufällig jemand wie eine solche Funktion in "C" aussehen könnte?
Ich programmiere erst 3 Monate :/ der kram fällt mir noch ein wenig 
schwer.

Als kleiner Ansatz: (So würde ich vorgehen)
1
lcd_gotoxy(0,0);
2
lcd_putc(messwert_fuer_0-5V);
3
4
lcd_gotoxy(1,0);
5
lcd_putc(",");   //<---- Das "komma-Zeichen"
6
7
lcd_gotoxy(2,0);
8
lcd_putc(messwert_fuer_100-900mV); 
9
10
lcd_gotoxy(3,0);
11
lcd_putc(messwert_fuer_10-90mV);
12
13
14
//d.h. für jeden 10er-Satz immer ein Zeichenfeld mit eigener funktion

Danke fürs bemühen!!!

Grüße Chaos

von Detlev T. (detlevt)


Lesenswert?

Du könntest z.B. die Spannung in mV berechnen und mit itoa in einen 
String verwandeln:
1
 
2
char buffer[8];
3
int16_t spannung = (5000L * messwert) / 1024;
4
itoa(spannung, buffer, 10);
In buffer[] ist jetzt der Messwert als Zeichenkette, den du auf dem LCD 
ausgeben kannst.

von Chaos (Gast)


Lesenswert?

Hallo!!!
Danke für den Code, ich hab den mal bei meinem Programm hinzugefügt und 
ich kann jetz tatsächlich eine Zahlenkette ausgeben!
1
lcd_puts(buffer);

Wenn ich jetzt jedoch den Poti auf 0V habe und den µC resete, dann zeigt 
das Display auch eine "0" an. Wenn ich den Poti "hoch drehe" dann steigt 
der Wert.
Dreh ich nun zurück kommt er nicht wieder auf die 0 sondern zeigt mir 
"0920" auf dem LCD.

Woran kann das liegen?

Sorry bin echt noch ein anfänger... Wäre schön wenn das endlich klappen 
würde.


Grüße

Chaos

von MaWin (Gast)


Lesenswert?

Weil du nach dem Ausgaben des Messwerts vielleicht noch Leerzeichen 
auffüllen solltest.

von huibu (Gast)


Lesenswert?

Mach doch die Zeile vor jedem Darstellen eines Messwertes komplett leer. 
Die 920 koennten Rueckstaende im Puffer von vorherigen Messwerten sein.

itoa koennte, je nach Implementierung naemlich nicht den gesamten Buffer 
fuellen.

von Chaos (Gast)


Lesenswert?

MaWin schrieb:
> Weil du nach dem Ausgaben des Messwerts vielleicht noch Leerzeichen
> auffüllen solltest.

Hallo,

sorry kann nicht ganz folgen was meinst du damit?


Liebe Grüße

von huibu (Gast)


Lesenswert?

Chaos schrieb:
> MaWin schrieb:
>> Weil du nach dem Ausgaben des Messwerts vielleicht noch Leerzeichen
>> auffüllen solltest.
>
> Hallo,
>
> sorry kann nicht ganz folgen was meinst du damit?
>
>
> Liebe Grüße

Rueckstaende im Puffer. Deswegen mach den Pufferspeicher leer vor jedem 
Schreiben auf das Display.

von Chaos (Gast)


Lesenswert?

Achso, jetzt klappts nur das Display "flackert", da meine Methode nicht 
die Elegante ist (siehe Code). Weiß jemand eine bessere Idee um den 
Speicher zu löschen?
1
while(1)
2
{
3
4
lcd_clrscr();  // <--- Hiermit "Cleare" ich das Display
5
6
7
char buffer[8];
8
int16_t spannung = (5000L * messwert) / 1024;
9
itoa(spannung, buffer, 10);
10
11
12
lcd_gotoxy(0,1);
13
lcd_puts(buffer);
14
15
16
}

Grüße

von huibu (Gast)


Lesenswert?

Wie MaWin bereits schrieb:

Du koenntest die leeren Stellen des Puffers mit Leerzeichen auffuellen.

von Helmut L. (helmi1)


Lesenswert?

char buffer[8];
int16_t spannung = (5000L * messwert) / 1024;
itoa(spannung, buffer, 10);

// einfach das hier mal einfuegen

while(strlen(buffer) < 4) strcat(buffer," ");

lcd_gotoxy(0,1);
lcd_puts(buffer);

fuellt dir den Buffer mit Leerzeichen auf wenn er nicht die volle laenge 
von 4 Zeichen hat.

Alternative solltes du dich mal mit sprintf beschaeftigen. Damit kannst 
du auch deine Ausgabe formatieren.

von Falk B. (falk)


Lesenswert?


von Chaos (Gast)


Lesenswert?

Hallo,

ich habe noch eine Frage!

kann mir jemand mal die Funktion dieses Codes erklären?
1
char buffer[8];
2
int16_t spannung = (5000L * messwert) / 1024;
3
itoa(spannung, buffer, 10);

Wenn ich das z.B. anwende bekomme ich als max Wert am Display "1245" 
angezeigt. Das entspricht ja nicht der Spannung. Wie kann ich aber der 
realen Wert der Spannung in "V" umrechnen?

Grüße

von Chaos (Gast)


Lesenswert?

Gut, den:

int16_t spannung = (5000L * messwert) / 1024;

kram habe ich soeben verstanden... Ist ja nur eine normale Rechnung und 
die 5000 geben den Referenzwert vor.

Wofür steht aber das "L"?


Den Zusamenhang dieser Funktion verstehe ich komplett nicht:

itoa(spannung, buffer, 10);


Wäre jemand so nett und könnte mir zu jeder Variable kurz einen Satz 
schreiben?
Ich kann mir vorstellen das ich nerve... Aber ich finde sonst echt keine 
Informationen drüber :(

Grüße Chaos

von holger (Gast)


Lesenswert?

>Aber ich finde sonst echt keine
>Informationen drüber :(

itoa  in google eingeben und keine Informationen?
Ich schmeiß mich weg. Soll dir auch noch jemand erklären
wozu Klopapier gut ist?

von Chaos (Gast)


Lesenswert?

holger schrieb:
>>Aber ich finde sonst echt keine
>>Informationen drüber :(
>
> itoa  in google eingeben und keine Informationen?
> Ich schmeiß mich weg. Soll dir auch noch jemand erklären
> wozu Klopapier gut ist?

Es ist nunmal für Anfänger deutlich einfacher wenn ein erfahrener den 
Kram in eigenen Worten wieder gibt... Viele Fachseiten sind in einem 
niveao geschrieben, das einer der sich 3 Monate (unregelmäßig) damit 
beschäftigt, den Kram nunmal nicht versteht.
Anstatt grade Anfänge doof anzumachen hättest du dir deine Antwort 
sparen können und nichts geschrieben... Es wird hier keiner gezwungen zu 
helfen.

Chaos

von Karl H. (kbuchegg)


Lesenswert?

Chaos schrieb:
> holger schrieb:
>>>Aber ich finde sonst echt keine
>>>Informationen drüber :(
>>
>> itoa  in google eingeben und keine Informationen?
>> Ich schmeiß mich weg. Soll dir auch noch jemand erklären
>> wozu Klopapier gut ist?
>
> Es ist nunmal für Anfänger deutlich einfacher wenn ein erfahrener den
> Kram in eigenen Worten wieder gibt...

Es ist für Anfänger deutlichst am einfachsten, wenn sie nicht versuchen 
die Grundlagen einer Programmiersprache durch 'Versuch und Irrtum' zu 
lernen, sondern in die nächste Buchhandlung zu gehen und sich um wenig 
Geld eines der klassischen Lehrbücher zu ihrer Programmiersprache zu 
kaufen.

Dort steht nämlich all das was du fragst, auf den ersten 20 Prozent der 
bedruckten Seiten. Und die restlichen 80% erklären dir Dinge, von denen 
du noch gar nicht weißt, das es sie gibt und von denen du mindestens die 
Hälfte eigentlich wissen solltest um ein Programm vernünftig schreiben 
zu können.

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

von möööp (Gast)


Lesenswert?

zu itoa :

char* itoa(  int   __val,
    char *   __s,
    int   __radix
  )

Convert an integer to a string.

The function itoa() converts the integer value from val into an ASCII 
representation that will be stored under s. The caller is responsible 
for providing sufficient storage in s.

Note:
    The minimal size of the buffer s depends on the choice of radix. For 
example, if the radix is 2 (binary), you need to supply a buffer with a 
minimal length of 8 * sizeof (int) + 1 characters, i.e. one character 
for each bit plus one for the string terminator. Using a larger radix 
will require a smaller minimal buffer size.

Warning:
    If the buffer is too small, you risk a buffer overflow.

Conversion is done using the radix as base, which may be a number 
between 2 (binary conversion) and up to 36. If radix is greater than 10, 
the next digit after '9' will be the letter 'a'.

If radix is 10 and val is negative, a minus sign will be prepended.


das is aus der AVRLibC doku dazu
http://www.nongnu.org/avr-libc/user-manual/modules.html

von us73 (Gast)


Lesenswert?

Chaos schrieb:
> nur das Display "flackert"

Du machst nichts anderes, als so schnell wie möglich das Display zu 
löschen (das GESAMTE Display) und dann wieder etwas neues zu schreiben.

ein paar Hinweise:
- lösche das Display nur, wenn Du einen neuen Wert anzeigen willst. 
Ansonsten mach weder
lcd_clrscr();

noch

lcd_gotoxy(0,1);
lcd_puts(buffer);

In anderen Worten:
speichere Deinen Wert (noch besser, für Fortgeschrittene: den Inhalt 
deiner Ausgabe) irgendwo zwischen, vergleiche mit dem neuen, und nur 
wenn sich etwas ändert, schreibe die neuen Daten aufs LCD.

- itoa konvertiert vom Datentyp Integer nach String (ASCII kodiert), und 
mit der Angabe von radix=10 im menschenüblichen 10-er Zahlensystem.
Das steht aber nun wirklich in einfachem Englisch in der AVRLibC-Doku.
Und das mit den Datentypen solltest Du können, wenn nicht, schnell 
nachholen.

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.