Forum: Mikrocontroller und Digitale Elektronik Division durch 10


von Marc H. (bauerpilot)


Lesenswert?

Hallo,
ich habe schon das Forum durchstöbert aber keine Lösung gefunden.
Ich möchte eine 4-stellige Dezimalzahl in die einzelnen Ziffern 
zerlegen. Habe mal irgendwo eine "Bitmanipulation" als Ersatz für die 
Division durch 10 gesehen, leider finde ich es nicht wieder.
Wer hat eine Lösung?
Atmega 16 mit AVR Studio in C.

Gruß Marc

Besten Dank im voraus.

von Floh (Gast)


Lesenswert?

Marc Höner schrieb:
> Atmega 16 mit AVR Studio in C.

Division und Modulo gibts doch in C. Da brauchste keinen Ersatz :-)

von mar IO (Gast)


Lesenswert?

Such mal in der Codesammlung nach Beispielen, wie die Dezimalzahlen auf 
einem Display ausgeben. Da wird dies z.B. verwendet

von Martin (Gast)


Lesenswert?

/ und %

von Thomas (Gast)


Lesenswert?

Ich denke mal du erinnerst dich da an die Division bzw Multiplikaion 
durch bitweises verschieben. Das funktioniert aber nur für Potenzen von 
zwei
Also z.B.
12 * 2  = 12 << 1
12 * 4  = 12 << 2
12 * 8  = 12 << 3
12 * 16 = 12 << 4
usw.

Division ist dann eben genau andersrum. Wie auch immer - für die 10 
funktioniert das so ohne weiters nicht.

von Peter D. (peda)


Lesenswert?


von Marc H. (bauerpilot)


Lesenswert?

Besten Dank für die vielen Antworten.
Die einfache Version mit / und % funktioniert leider nicht. Irgendwie 
scheint es bei der Division zu Ungenauigkeiten zu kommen.
Im Moment scheint mir der Tipp von Peter der vielversprechendste zu 
sein.

Vielen Dank für eure Hilfe
Gruß Marc

von Karl H. (kbuchegg)


Lesenswert?

Marc Höner schrieb:
> Besten Dank für die vielen Antworten.
> Die einfache Version mit / und % funktioniert leider nicht. Irgendwie
> scheint es bei der Division zu Ungenauigkeiten zu kommen.

Ungenauigkeiten?
Bei einer Integer Division?

Du beliebst zu scherzen. Zeig mal.

(Ich lehn mich mal aus dem Fenster und behaupte du hast Flieskomma im 
Spiel und keine Rundungskorrektur gemacht)

von Klaus (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ungenauigkeiten?
> Bei einer Integer Division?

War früher in der Schule auch immer so. Der Lehrer hat das dann auf "6 
setzen!" korrigiert ;-)

MfG Klaus

von Marc H. (bauerpilot)


Lesenswert?

Hier der Code:

        switch (xpdr_cursor) {
        case 1:
          value = xpdr_code/1000;
          break;
        case 2:
          value = xpdr_code/100;
          value = value%10;
          break;
        case 3:
          value = xpdr_code/10;
          value = value%10;
          break;
        case 4:
          value = xpdr_code%10;
          break;
        default:
          break;

xpdr_code ist max 4-stellig, soll in seine digits zerlegt werden und ist 
int16, value ist int8

Fehler habe ich bei case 3 (3. Stelle), hier werden teilweise, aber 
nicht immer falsche Werte ausgegeben. Das mit der Division war so eine 
Vermutung, hatte ich mal gehört. Bin nicht so der Experte.
Fliesskomma ist allerdings nicht im Spiel.

Gruß Marc

von kyrel (Gast)


Lesenswert?

vom welchem Datentyp sind die Variablen?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn die Division im Compiler – zumal die durch 10 – fehlerhaft wäre, 
dann wär das schon längst aufgefallen. Der Fehler stekt vermutlich 
woanders, in der Ausgaberoutine, Glitch, Stacküberlauf, Puffer zu 
klein...

Dein Beispiel lässt sich lzudem nicht übersetzen und nachvollziehen, da 
es kein gültiger C-Code ist: Keine Deklarationen, etc.

von Marc H. (bauerpilot)


Lesenswert?

xpdr_cursor ist 8bit unsignedInteger
xpdr_code ist 16 bit unsignedInteger
value ist 8bit unsignedInteger

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Und den Rest vom Code soll man raten...

von DirkB (Gast)


Lesenswert?

Und wie äußert sich der Fehler?
Komplett falsche Zahlen oder +/- 1 vom richtigen Wert oder gar etwas 
Anderes?

von Marc H. (bauerpilot)


Lesenswert?

Das Problem ist gelöst.

Marc Höner schrieb:
> case 3:
>           value = xpdr_code/10;
>           value = value%10;

Der Fehler lag in der Variablendeklaration. Ich habe jetzt value als 
int16 deklariert und alles klappt. Ist ja auch logisch. Wenn ich eine 
4-stellige Zahl durch 10 teile können Werte größer 255 herauskommen. Man 
muss nur mal drauf gestossen werden.
Besten Dank an alle die Tipps gegeben haben.
Gruß Marc

von Martin (Gast)


Lesenswert?

Marc Höner schrieb:
> value = xpdr_code/10;
> value = value%10;


16bit / 10 = 8bit
Kann in die Hose gehen

von Marc H. (bauerpilot)


Lesenswert?

Genau so ist es, habe es wie gesagt auch gerade bemerkt.

Gruß Marc

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.