PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aufteilung einer Zahl in Einer, Zehner,... Hilfe!!! [gelöst]



021aet04
11.06.2009, 19:20
Hallo Roboterfreunde, schreibe gerade an einem Programm, damit ich auf einem SAA1064 eine Zahl ausgeben kann (Wert des AD Wandlers) zum lernen. Als Controller verwende ich den R8Ctiny von Renesas. Da ich für den SAA 1064 die Vier Stellen einzeln ansteuern kann, muss ich die Zahl aufteilen (1er, 10er, 100er, 1000er). Dazu habe ich das geschrieben.

if (k>=10000)
{
for(k; k<10000; k=k-10000)
{
e++;
p1_2=1;
}
}
else p1_2=0;
if (k>=1000)
{
for (k; k<=1000; k=k-1000) d++;
}
if (k>=100)
{
for(k; k<=100; k=k-100) c++;
}
if (k>=10)
{
for(k; k<=10; k=k-10) b++;
}
a=k;
Ganz am Anfang habe ich noch eingefügt, wenn die Zahl größer als 10k ist soll eine Led angehen, damit ich weiß das die Zahl größer ist. Die Ausgabe auf das Display funktioniert. Wenn ich für jede Stelle eine Zahl eingebe zeigt es die Zahl an. Mein Problem ist, wenn ich den oberen Code verwende, zeigt das Display nur Mist an. Es kommt nicht vom ADC. Habe auch schon direkt eine 4 stellige Zahl eingegeben, geht auch nicht.

k= Ausgangszahl
a-d = 4 Stellen + eine Led (Variable d)

Hier sind 2 Bilder (einmal richtig, einmal falsch)
http://www.bilder-hochladen-kostenlos.de/files/imagecache/600x400/DSCN2615.JPG ==> Richtige Anzeige (68E4)
http://www.bilder-hochladen-kostenlos.de/files/imagecache/600x400/DSCN2619.JPG ==> Falsche Anzeige (sollte 1024 sein)

Kann mir bitte jemand helfen

MfG Hannes

Andun
11.06.2009, 21:38
Moin

Du willst doch einfach nur auf die Zeichen A bis E die Werte deiner Zahl aufteilen, ne?

Ein mögliches vorgehen:
Für die z.b. 1.000er Stelle:
Du nimmst deine Zahl modulo 10.000
Dadurch hast du eine Zahl, an dem die weiteren führenden Zahlen abgeschnitten sind.

Die Zahl zwischen 0 und 10.000 teilst du anschließend durch Tausend.(nicht runden, sondern einfach das Komma abschneiden. Wenn du auf Integern arbeitest, musst du also nichts beachten!)

Dadurch hast du nun eine Zahl zwischen 0 und 10, die dir die tausender-Stelle anzeigt.

Das sollte funktionieren. (Evtl. musst du noch prüfen, ob modulo 10.000 für eine 10.000 eben 10k oder 0 ist. Aber mit dem Prinzip solltest du was anfangen können.

Warum dein Code nicht funktioniert, hab cih mir jetzt ehrlich gesagt nciht weiter angesehen.

mfg
Andun

Besserwessi
11.06.2009, 22:10
Die Variablen e,b,c,d werden am Anfang nicht auf Null gesetzt. Nicht jeder Compiler macht das.

Nur nebenbei:
Statt der Kombination aus if und for schleife wäre ein Schleife mit While( k <...) übersichtlicher.

021aet04
11.06.2009, 22:44
Habe die Variablen auf 0 gesetzt, ist nur nich auf dem Ausschnitt.
Werde es mit Modulo probieren

021aet04
11.06.2009, 23:14
Danke es funktioniert. Habe es jetz mit Modulo gelöst. :cheesy: :cheesy:

Gock
12.06.2009, 11:43
Alternativ ginge auch der Fußweg:
T = Zahl / 1000
H = (Zahl - (T * 1000)) / 100
Z = (Zahl - (T * 1000 + H * 100)) / 10
E...
Das kann man natürlich noch optimieren...
Es sieht zwar komplizierter aus, aber je nach Datentyp, Größe und Optimierung entsteht beim Modulo manchmal erstaunlich viel Code...
Gruß

Edit: siehe oben

021aet04
12.06.2009, 12:46
Das ist der Ausschnitt, wie ich es jetzt gelöst habe:


e=(k%100000)/10000;
d=(k%10000)/1000; //Tausender
c=(k%1000)/100; //Hunderter
b=(k%100)/10; //Zehner
a=k%10; //Einer
if(k>=10000) p1_2=1;
else p1_2=0;