mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik wie Integer auf display ausgeben??


Autor: Christian Berger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe folgendes Problem, ich möchte den inhalt einer integer 
Variablen z.B. i auf einem display ausgeben. Habe mir dazu eine Funktion 
putchar geschrieben der ich einen Char übergeben muss um diesen am 
display auszugeben. Ich möchte in meiner main nun die Variable 
sekündlich inkrementieren und dann immer der putchar() übergeben. Aber 
wie mache ich das nun das am Display die Zahlen angezeigt werden?
Normalerweise sieht die übergabe so aus putchar("text") wenn ich nun 
eingebe putchar("i") wir am display nur i ausgegeben und nicht der 
inhalt der variablen, so wie ich es eigentlich gern hätte.

Gruß
Christian

Autor: Oliver Döring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann so nicht funktionieren. Denn putchar("i") soll doch den String 
"i" ausgeben. Oder wie würdest Du sonst ein "i" an das Display senden?!

Du mußt Deinen Integer erst in einen String umwandeln und diesen dann 
Zeichen für Zeichen putchar() übergeben.

Wie Du das machst, ist abhängig von der verwendeten 
Entwicklungsumgebung. Dazu brauchen wir mehr Infos!

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal die Funktion itoa() an.
Wenn Du es etwas komfortabler haben möchtest, geht auch sprintf(). Das 
ist die printf() -Funktion, nur dass sie in ein Text-Array 
hineinschreibt.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du putchar benutzt kannst du 'putchar (i);' benutzen um den Inhalt 
der Variablen i auszugeben. Diese muss vorher natürlich als 'char' 
definiert werden und z.B. mit i = 'U'; gefüttert werden um z.B. ein U 
auszugeben.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, da du ja Zahlen hochzählen willst musst du für jede Ziffer eine 
Variable benutzen (oder ein Array) und die Ziffern im ASCII-Format 
hochzählen. Da die Zahlen 0..9 im ASCII-Code direkt hintereinander 
liegen ist das kein Problem. Also mit i = '0'; angefangen kannst du mit 
i ++; bis '9' hochzählen, dann die nächste Ziffer erhöhen und diese 
wieser auf '0' setzen. Das Funktioniert auch in Assembler prima!

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
von itoa() sollte man auf einem µC abstand nehmen. es gibt mehrere 
gründe, aber der triftigste ist wohl dass die funktion eine ewigkeit 
braucht. ich würde es in etwa so machen (ich gehe hier mal davon aus 
dass dein i unsigned ist):

unsigned int temp_var = i;

for(count = 0; count <=4; count++)   //int ist fünfstellig
{
   putchar((unsigned char)(temp_var % 10));
   temp_var /= 10;
}

den typecast in putchar() sollte man nochmal betrachten, evtl kann es 
dort zu "interessanten" phänomenen kommen (keine lust jetzt darüber 
nachzudenken ; )  ). ausserdem wird der der int von rechts nach links 
ausgegeben.

pumpkin

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso, ein ASCII offset muss evtl auch noch eingebracht werden.

pumpkin

Autor: Christian Berger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, hab ganz vergessen zu schreiben das ich winavr benutze.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst vermutlich:
putchar((unsigned char)(temp_var % 10)+48);

Zu beachten ist, das hier die Zahl rückwärts ausgegeben wird 
(neunhunderteinundzwanzig -> 129)

Ausserdem würde ich den schleifenkopf ändern: for (; temp_var>0;)

Und zuletzt muss ich dir noch beipflichten: es gibt funktionen in der 
libc, von denen man besser Abstand hält. Zum Einen, weil sie einfach 
zuviel Platz im Speicher fressen, zum anderen, weil sie die stabilität 
durch mögliche Überläufe massiv gefährden:

sprintf, itoa, strcpy.... alles, wo der Funktion nicht übergeben wird, 
wie gross der Quellbuffer oder sogar Zielbuffer eigentlich ist. Eine 
0-Terminierung ist dafür kein zuverlässiger Indikator!

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm.. hat er nicht geschrieben das er eine eigene Putchar-Funktion 
geschrieben hat? Ist ein wenig verwirrend, da's sowas unter dem Namen 
schon gibt! Aber ich gehe davon aus, dass das eine Funktion ist, mit der 
die Cursorposition und das zu schreibende Byte ans Display geschickt 
wird, oder liege ich da falsch? Falls das so ist kannst du meine Version 
von oben benutzen, frisst wenig Speicher und ist einfach.

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
um die reihenfolge umzukehren könnte man beispielsweise einen char-array 
anlegen und "rückwärts" befüttern um ihn anschließend per putchar() 
rauszuschieben. aber da ist der kreativität keine grenze gesetzt  ; )
das mit dem schleifenkopf ist bei dir schon besser wenn der int immer 
wesentlich weniger als 5 stellen haben - auf jeden fall ne nette idee, 
werd ich mir merken.

pumpkin

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, nette Idee mit dem Schleifenkopf...mir ist aber gerade selbst 
aufgefallen, das das falsch ist.

aus einer 100 würde ne 1 werden :)

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nö, wieso?

pumpkin

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
och nüx....:)

sorry, hab mich verlaufen :)

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gehirnknoten?  ; )        ok, genug lame....back to topic.

pumpkin

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe das folgendemasse gelöst.

/*********************************************************************** 
******/
/* LCD_putn - prints a unsigned integer number to LCD 
*/
/*********************************************************************** 
******/

void LCD_putn( unsigned int n )
{
    unsigned char i = 0;
    unsigned char buf[5];       //integers need at most 5 digits

    do                          //fill the buffer iteratively...
    {
        buf[i++] = '0' + n % 10;
        n = n / 10;
    } while (n != 0);


    while( i > 0)               //...and print it backwards
    {
        LCD_putchar( buf[ --i ] );
    }
}

LCD_putchar ist dann durch die entsprechende Funtion zu ersetzen die ein 
Zeichen auf dem LCD ausgibt.

Eckhard

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.