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
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
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.
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
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.
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
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.
Hallo,
ich habe noch eine Frage!
kann mir jemand mal die Funktion dieses Codes erklären?
1
charbuffer[8];
2
int16_tspannung=(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
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
>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?
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
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
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
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.