Forum: Mikrocontroller und Digitale Elektronik Zahl verdoppeln und anzeigen


von Anfänger Gast (Gast)


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

von Anfänger Gast (Gast)


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

von Verdoppler (Gast)


Lesenswert?

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

von Falk B. (falk)


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

von Osterhase (Gast)


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.

von Olli (Gast)


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

von Falk B. (falk)


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

von Anfänger Gast (Gast)


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);
  }

}

von Karl H. (kbuchegg)


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?)

von Falk B. (falk)


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

von Anfänger Gast (Gast)


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

von Falk B. (falk)


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

von Anfänger Gast (Gast)


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.?

von Tony R. (tony)


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

von Karl H. (kbuchegg)


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.

von Tony R. (tony)


Lesenswert?

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

von Anfänger Gast (Gast)


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.

von Karl H. (kbuchegg)


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

von Dani77 (Gast)


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);
 }

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.