www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zahl verdoppeln und anzeigen


Autor: Anfänger Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann mir jemand einen Tipp geben, warum wenn  ich die Variable zahl 
verdoppel sie dann nicht mehr richtig auf dem LCD angezeigt wird? Er 
macht 2  4  6 u.s.w. sprünge.
Kommentiere ich die Zeile: zahl = (zahl*2); raus, zählt er richtig hoch.
Ich will die Variable zahl in der Funktion verdoppeln. In der main wird 
die Variable ganz normal mit data++; hochgezählt und die Funktion dann 
so aufgerufen: zaehlen(data);



//Globale Var.
volatile uint8_t data;
volatile uint8_t einer = 0;
volatile uint8_t zehner = 0;


void zaehlen (uint8_t zahl)
{

for(;;)
  {
  zahl = (zahl*2);    //hier scheint was schief zu gehen



  zehner  = (zahl / 10) | 0x30;
        einer  = (zahl % 10) | 0x30;


  lcd_move_cur(LCD_LINE_2,3);
  lcd_putc(zehner);
  lcd_move_cur(LCD_LINE_2,4);
  lcd_putc(einer);


}

Gruss

Autor: Anfänger Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//Globale Var.
volatile uint8_t data;
volatile uint8_t einer = 0;
die for(;;) schleife gehört da nicht mehr rein. Hatte vergessen sie zu 
entfernen.



volatile uint8_t zehner = 0;


void zaehlen (uint8_t zahl)
{



  zahl = (zahl*2);    //hier scheint was schief zu gehen



  zehner  = (zahl / 10) | 0x30;
  einer  = (zahl % 10) | 0x30;


  lcd_move_cur(LCD_LINE_2,3);
  lcd_putc(zehner);
  lcd_move_cur(LCD_LINE_2,4);
  lcd_putc(einer);


}

Gruss

Autor: Verdoppler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch klar. Du verdoppelst die Zahl. Da können nur noch gerade Zahlen 
rauskommen. "int" kann ja keine Kommastellen speichern.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Anfänger Gast (Gast)

>kann mir jemand einen Tipp geben, warum wenn  ich die Variable zahl
>verdoppel sie dann nicht mehr richtig auf dem LCD angezeigt wird? Er
>macht 2  4  6 u.s.w. sprünge.

Nimmst du Drogen?
Was soll den sonst rauskommen, wenn du die Zahl vor der Anzeige 
verdoppelst?

MFG
Falk

Autor: Osterhase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du verdoppelst eine lokale Kopie von zahl, die ursprüngliche 
zahl-Variable aus der main-Methode bleibt unangetastet.
Übergib einfach mal nur den Zeiger, dann kannst du sie auch ändern.

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk Brunner

ne Drogen nehme ich nicht. Ich dachte nur, dass wenn ich z.b. eine 25 
übergebe, dass dann mit der  zahl = (zahl*2); daraus eine 50 wird. Nur 
das vedoppeln will ich erreichen.
Gruss

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Olli (Gast)

>ne Drogen nehme ich nicht. Ich dachte nur, dass wenn ich z.b. eine 25
>übergebe, dass dann mit der  zahl = (zahl*2); daraus eine 50 wird.

Das wird es auch. Aber nur bei der Kopie IN der Funktion, nicht der 
Zahl, welche beim Funktionsaufruf dort eingesetzt wird. Stichwort Call 
by reference, Call by value.

> Nur das vedoppeln will ich erreichen.

Und warum machst du das nicht einfach VOR dem Funktionsaufruf?

MFG
Falk

Autor: Anfänger Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe jetzt die main folgendermassen abgeändert. Und trotzdem ist das 
Ergebnis falsch. Was mache ich falsch?
void main (void)
{
   for(;;)
   {
   zahl++;

  zahl = (zahl*2);    //hier scheint was schief zu gehen



  zehner  = (zahl / 10) | 0x30;
  einer  = (zahl % 10) | 0x30;


  lcd_move_cur(LCD_LINE_2,3);
  lcd_putc(zehner);
  lcd_move_cur(LCD_LINE_2,4);
  lcd_putc(einer);
  }

}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger Gast schrieb:
> ich habe jetzt die main folgendermassen abgeändert. Und trotzdem ist das
> Ergebnis falsch.

Nämlich wie?

Erwarten würde ich von deinem Programm

2 6 14 30 ....

> Was mache ich falsch?

Du machst Hauruckprogrammierung

(Welche Ausgabe ist eigentlich richtig?)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Anfänger Gast (Gast)

>ich habe jetzt die main folgendermassen abgeändert. Und trotzdem ist das
>Ergebnis falsch.

Welches Ergebnis erwartest du denn?

> Was mache ich falsch?

Du weisst nicht was du willst ;-)

>void main (void)
>{
>   for(;;)
>   {
>   zahl++;

Wie ist zahl initialisiert? Wahrscheinlich mit 0.
Also ist Zahl hier 1.

>  zahl = (zahl*2);    //hier scheint was schief zu gehen

Nöö, hier wird aus 1 eine 2.

Im nächsten Schleifendurchgang wird aus zahl eine 3, dann 6, dann 7 dann 
14.
Ach ja, und da das alles sehr fix geht, sieht man wahrscheinlich nur 
wirres Zeug ;-)

MFG
Falk

Autor: Anfänger Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das er mir das doppelte von zahl, auf mein lcd ausgibt. Mir geht es 
darum die Variable Zahl zu verdoppeln, bevor er sie zerlegt und auf dem 
LCD ausgibt.
gruss

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Anfänger Gast (Gast)

>das er mir das doppelte von zahl, auf mein lcd ausgibt. Mir geht es
>darum die Variable Zahl zu verdoppeln, bevor er sie zerlegt und auf dem
>LCD ausgibt.

Dann wäre es sinnvoll, eine zweite Variable zu nutzen . . .

MFG
Falk

Autor: Anfänger Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
. Aber wie könnte ich das lösen, dass er mir genau das Dopelte von 
ausgibt. Also z.b.:  zahl 3, Ausgabe 6 , zahl ist 4 Ausgabe 8 u.s.w.?

Autor: Tajas R. (tony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst aufpassen, in welcher Funktion du was wie änderst. Hinter 
"Zahl" steckt zunächst eine Speicherzelle. Den Inhalt änderst du 
dauernd... mit z=z*2 wird die zahl verdoppelt, mit z++ um eins erhöht. 
deshalb ist logisch, dass das ergebnis herauskommt, das KH Buchegger 
beschrieben hat.
Wenn du mit 2 Variablen arbeitest wird das klarer:

z=0;
s=0;

for (;;) {
z++;
s=z*2;
ausgeben(z);
ausgeben(s);
}


für z kommt dann:1,2,3,4,5
für s demnach:2,4,6,8,10

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger Gast schrieb:
> das er mir das doppelte von zahl, auf mein lcd ausgibt. Mir geht es
> darum die Variable Zahl zu verdoppeln, bevor er sie zerlegt und auf dem
> LCD ausgibt.

Warum zählst du dann 1 zu Zahl dazu?

Du möchtest also das hier?
1, 2, 4, 8, 16, 32, 64, 128

(Wenn du den Überblick verlierst, dann spiel einfach selber Computer!

Du beginnst (jetziges Programm miti Zahl == 0

zahl     zahl++    zahl = 2*zahl
 0         1          2

zahl ist also nach dem ersten Durchlauf 2. weiter gehts

 2         3          6

im nächsten Durchgang kommt dann 6 raus

 6         7         14
14  ->    15  ->     30
30  ->    31  ->     62
62  -> ...

Auch wenn man einen Computer hat, ist es nicht verboten im Kopf 
mitzurechnen.

Autor: Tajas R. (tony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst nur bei der ausgabe verdoppeln? Dann:
ausgeben(btoa(z*2));
Aber vorsicht beim Überlauf! Ein Byte geht nur bis 255!

Autor: Anfänger Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir geht es darum, das die Variable zahl, die z.b. 15 gerade ist, 
verdoppelt wird, so das auf meinem LCD immer das doppelte von der zahl 
anzeigt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger Gast schrieb:
> . Aber wie könnte ich das lösen, dass er mir genau das Dopelte von
> ausgibt. Also z.b.:  zahl 3, Ausgabe 6 , zahl ist 4 Ausgabe 8 u.s.w.?

Indem du zb 2 Variablen benutzt.
In der einen wird gezählt: 1, 2, 3, 4, 5
Die anderen erhält ihren Wert als das Doppelte der Ersten

Und die Zweite gibst du aus

   zahl    doppel = 2 * zahl
    1   ->   2
    2   ->   4
    3   ->   6
    4   ->   8
   ...


du könntest aber auch ganz einfach zu Zahl immer 2 dazu zählen, anstelle 
von 1 :-)  Viele Wege führen nach Rom

Autor: Dani77 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder ganz trivial:

 for(;;)
 {
  zahl++;

  zehner  = ((zahl *2) / 10) | 0x30;
  einer  = ((zahl *2) % 10) | 0x30;


  lcd_move_cur(LCD_LINE_2,3);
  lcd_putc(zehner);
  lcd_move_cur(LCD_LINE_2,4);
  lcd_putc(einer);
 }

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.