Forum: Mikrocontroller und Digitale Elektronik Variable auf LCD anzeigen


von David G. (ded)


Lesenswert?

Hi Leute,

ich habe hier im Forum schon gefühlte 1000 Threads zu diesem Thema 
gelesen. Allerdings war nichts dabei was mir geholfen hat. Zu meinem 
Problem: Ich habe ein HD44780 kompatibles 2x16 LCD, welches ich in C mit 
HEW4 über einen M16C28 ansteuere. Die normale Ausgabe von Strings 
funktioniert auch fehlerfrei. Allerdings würde ich nun gerne Variablen 
anzeigen lassen. Im Forum habe ich dazu zwei Lösungen gefunden: Zum 
einen per sprintf. Da kommen bei mir aber nur sinnlose Zeichen. Und zum 
anderen mit itoa(). Aber da sagt mir der Compiler nur "'itoa' value is 
undefined"
Kann mir irgendjemand helfen? Vielen Dank.

Grüße David

von gra (Gast)


Lesenswert?

1
.....
2
3
char strBuf[20];
4
5
....
6
7
 sprintf(strBuf, "%3x", help1); // help1 deine Variable

Gehts so nicht?

von gra (Gast)


Lesenswert?

Hab vergessen,"%3x" steht hier für die Ausgabe in Hexadezimal.

von David G. (ded)


Lesenswert?

Hi gra,

erst einmal vielen Dank für deine schnelle Antwort. Leider funktioniert 
das nicht. Wenn ich nun versuche strBuf auszugeben bleibt das Display 
leer.

von David G. (ded)


Lesenswert?

Hatte es auch schon mit "%d" versucht.

von gra (Gast)


Lesenswert?

Code zeigen bitte.

von David G. (ded)


Lesenswert?

Gern. In verkürzter Form:
1
void main(void)
2
{
3
  int b=150;
4
  init_lcd();
5
  
6
  set_cursor(2,1);
7
  ItoA(b);
8
  
9
  while(1){          
10
  }
11
}
12
13
ItoA(int z){
14
  char strBuf[20];
15
  sprintf(strBuf, "%d", z);
16
  send_string(strBuf);
17
}

von Helfer (Gast)


Lesenswert?

#include <stdio.h> feht, ansonsten ist das Programm so lauffähig.

Das Problem versteckt sich eventuell in den nicht gezeigten Funktionen 
(init_lcd, set_cursor, send_string) oder es besteht ein Laufzeitproblem 
im unverkürzten Code (z.B. Speichermangel).

Konstrast am LCD ist korrekt eingestellt?

von David G. (ded)


Lesenswert?

Hi Helfer,

ich kann mir eigentlich nicht vorstellen dass die anderen Funktionen 
oder der Kontrast schuld sind, da ich ja über send_string normale 
Strings anzeigen kann. An sich funktioniert die Ausgabe ja. Nur die 
Umwandlung eines Integers zu einem String eben nicht.
Den Header habe ich gerade noch eingefügt, aber dann füllt sich das 
Display mit Unsinn.

von gra (Gast)


Lesenswert?

Schreib mal "%2d". Und versuch es nochmal. Glaub das Problem hatte ich 
auch schon mal.

von David G. (ded)


Lesenswert?

Ändert leider nichts am Ergebnis...

von David G. (ded)


Angehängte Dateien:

Lesenswert?

Also falls es hilft habe ich mal meinen gesamten Code angehängt.

von Düsendieb (Gast)


Lesenswert?

Mache es zu Fuß:


/*-------------------------------------
 *  Display integer 0-9999
 *--------------------------------------------------*/
void print4(unsigned int x)
{
  unsigned int y;


    y=x/1000;lcd_data(y+0x30);x-=(y*1000);
    y=x/100;lcd_data(y+0x30);x-=(y*100);
    y=x/10;lcd_data(y+0x30);x-=(y*10);
    lcd_data(x+0x30);

}



lcd_data gibt ein Zeichen aus

von Düsendieb (Gast)


Lesenswert?

lcd_data heißt bei Dir send_char

von David G. (ded)


Lesenswert?

Super. Es funktioniert endlich. Vielen Dank. =)

von Karl H. (kbuchegg)


Lesenswert?

David G. schrieb:
> Ändert leider nichts am Ergebnis...

Hat dein Compiler wieder so einen Dondermodus, bei dem er const Dinge 
nicht ins RAM sondern ins Flash legt?
1
send_string(const char *str){  //Ausgabe eines String
2
  while(*str != '\0')      //Ausgabe bis terminierende Null
3
  send_char(*str++);      //zeichenweise Ausgabe
4
}

dann könnte das nämlich die Ursache sein. Du brauchst dann eine 2-te 
SendString Funktion, die keinen const char * Übernimmt.


Und gewöhn dir bitte an, dass Funktionen einen Returntyp haben. Immer! 
Wenn du nichts sinnvolles aus einer Funktion retournieren kannst, dann 
sind das eben void Funktionen. So wie du das jetzt hast, ist das nämlich 
im Grunde alles fehlerhaft: Der Default ist int und du returnierst 
nichts.
1
void send_string(const char *str){  //Ausgabe eines String
2
  while(*str != '\0')      //Ausgabe bis terminierende Null
3
    send_char(*str++);      //zeichenweise Ausgabe
4
}

von David G. (ded)


Lesenswert?

Normalerweise schreibe ich auch immer ein void vor meine Funktionen. 
Allerdings erhalte ich hier eine Fehlermeldung vom Compiler wenn ich 
einen Returntyp davor schreibe.(Error: type declaration of 
[Funktionsname])

von David G. (ded)


Lesenswert?

Habe mich verschrieben. Die Fehlermeldung lautet: type redeclaration of 
[Funktionsname].
Bei manchen Funktionen kann ich ein void schreiben und bei anderen 
bekomme ich diese Fehlermeldung. Hat jemand eine Idee woran das liegen 
könnte?

von Karl H. (kbuchegg)


Lesenswert?

David G. schrieb:
> Habe mich verschrieben. Die Fehlermeldung lautet: type redeclaration of
> [Funktionsname].

Tja. Du brauchst natürlich Funktionsprototypen (und ein C Buch).

Geh deinen Code von oben nach unten durch. Jede Funktion muss dem 
Compiler ert mal bekannt gemacht werden, ehe du sie benutzen kannst. 
Dies geschieht, indem du zb eine Funktionsdeklaration (aka Protoyp) 
vorsetzt oder aber, in dem du die Funktionsdefinition vor der ersten 
Verwendung schreibst.

Also entweder
1
void foo( int i )
2
{
3
  ...
4
}
5
6
7
int main()
8
{
9
   foo( 5 );
10
}
(also Funktion definieren, ehe du sie benutzt)

oder so
1
void foo( int i );    // es gibt eine Funktino foo und das sind ihre Argumente
2
3
int main()
4
{
5
  foo( 5 );
6
}
7
8
void foo( int i )     // und da ist sie jetzt: tata, die Funktion höchstpersönlich
9
{
10
  ...
11
}


> Bei manchen Funktionen kann ich ein void schreiben und bei anderen
> bekomme ich diese Fehlermeldung. Hat jemand eine Idee woran das liegen
> könnte?

Im eigentlichen Sinne liegt es daran, dass du kein C-Buch hast, in dem 
du im Kapitel über Funktionen das alles und noch viel mehr gelesen 
hättest.

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.