Forum: Mikrocontroller und Digitale Elektronik Eingabe und Berechnung mit Modulo


von Paul (Gast)


Lesenswert?

Hallo
Habe ein Problem.
Es soll eine Eingabe von 1 bis 100 gemacht werden. Also 1- oder 2- oder 
3- stellig. von dieser Eingabe sollen die Zahlen dann einzeln getrennt 
werden und weiter verarbeitet werden.
Mit diesem Code kann ich die einzelnen Zahlen ausrechnen:
1
anzs1a=anz2 % 10;  // Berechnung Ausgabe Zahlen 
2
anzs1b=anz2/10;
3
anzs1c=anzs1b % 10;
4
anzs1d=anzs1b/10;
Die Berechnung erfolgt mit 3 Zahlen.
Wie kann ich die z.B. eine 1 oder 12 eingeben damit ich als Ausgabe 0 0 
1 oder 0 1 2 erhalte?
LG Paul

von Karl M. (Gast)


Lesenswert?

Die Dezimalzahl d, mit 0 <= d < 1000, ist auch zu schreiben als:

d = a_2 *10^2 + a_1 *10^1 + a_0 *10^0

dabei sind a_n, a_n E{0,..,9} und n E{0,1,2} die einzelnen "Stellen" 
Koeffizienten der Dezimalzahl d.

Nun frage dich bitte, was mit diese Darstellung gemeint ist:

d = b_2 *16^2 + b_1 *16^1 + b_0 *16^0

von Karl M. (Gast)


Lesenswert?

Vielleicht noch ein wichtiger Zusammenhang.

"+" Addition,
"-" Subtraktion,
"*" Multiplikation und
"/" Division sind bekannt.

"%" Modulo auch, aber wie ist der Modulo über die anderen 
Rechenoperatoren definierbar ?

von Jobst M. (jobstens-de)


Lesenswert?

Mach eben erst ein Modulo 100 ...

Eieieiei ... :-)


Gruß

Jobst

von Jacko (Gast)


Lesenswert?

Hast du denn schon die Eingabe fertig?
Wenn jemand einen Buchstaben tippt, oder ein Komma?

Nur so interessehalber...

Ansonsten gibts auch HAUSARBEITEN-PUNKT-DE. ;-)

von Paul (Gast)


Lesenswert?

Die Eingabe ist fertig. Eigentlich wird wird ein Punkt auf einem TFT 
festgelegt, an dem eine Ausgabe erfolgen soll. Leider sind verschiedene 
Eingaben, Grössen un Zusätze möglich.
Beispiel:
- Das Display hat einen Spalten und Zeilenzahl von 100 x 30
- Damit Eingabe eines Punkte an der Stelle 50 und 15 (Displaymitte)
- Eingabe nach Angabe Hersteller muss mit 48,53,48 , 49,53 erfolgen
- Diese Werte entsprechen den Zahlen als Char nach Tabelle
- Diese Eingabe ist sehr verwirrend
- Bei der Eingabe von Figuren kommen dabei ca. 10 bis 15 Zahlen zustande
- Angabe der Koordinaten erfolgt im Programm dadurch kein Komma oder 
Buchstaben möglich
- Werte der Zahle von 1 - 9 für einstellig
- oder von 10 - 99 für zweistellig
- oder nur 100 für dreistellig, danach Begrenzung
- andere Richtung von 1 - 9 und 10 -30
- Möchte die Zahlen mit Modulo in die einzelnen Zahlen aufteilen z.B. 
Eingabe Zahl 65, aufgeteilt in 0 , 6 , 5 und übergabe in eine Funktion
- damit habe ich für die Angabe eines Quadrate nur 40, 10, 70, 25
- sonst ist 0,4,0,1,0,7,0,2,5 und Zusätze für Farbe mit 3 x 0-FF, 
Hintergrundfarbe, Schriftfarbe, Schriftart, Randfarbe, Randbreite, 
Randmuster usw. nötig.

Bis her bin ich an dieser sache dran:

if (a < 10)
{ ... Modulo einstellig)
if (a >9 und <99)
[ ... Modulo zweistellig)
if (a == 100)
{ ... Modulo dreistellig}

hat jemand eine bessere Idee dazu?

LG

PS: Es ist ein I2C TFT Display in Farbe und 5 Zoll mit ca 100 Befehlen 
mit einem 3 stelligen Buchstabencode, eigenen Prozessor, eigenen 
Bildspeicher, eigenen IOs, USB und 3,3V nicht vergessen. Etwas richtig 
anspruchsvolles Teil und leider nicht billig. Als Programmierung wird 
das Smallprotokoll verwendet

von Paul (Gast)


Lesenswert?

Paul schrieb:
> if (a >9 und <99)
> [ ... Modulo zweistellig)

muss natürlich

if (a >9 und <100)

sein

von Jobst M. (jobstens-de)


Lesenswert?

Paul schrieb:
> hat jemand eine bessere Idee dazu?

Jo. Habe ich schon geschrieben.


Gruß

Jobst

von Paul (Gast)


Lesenswert?

Jobst M. schrieb:
> Mach eben erst ein Modulo 100 ...

Wie meinst du das?
Habe doch eine Rechnung mit Modulo und 100 drin.

Karl M. schrieb:
> d = a_2 *10^2 + a_1 *10^1 + a_0 *10^0

Sorry da komme ich nicht mit wie du das meinst. Kannst mir mal auf die 
Sprünge helfen

von Karl M. (Gast)


Lesenswert?

Paul schrieb:
> Karl M. schrieb:
>> d = a_2 *10^2 + a_1 *10^1 + a_0 *10^0
>
> Sorry da komme ich nicht mit wie du das meinst. Kannst mir mal auf die
> Sprünge helfen

123 = 1*10^2 + 2*10^1 + 3*10^0

von posti (Gast)


Lesenswert?

Hi

Ich habe 'Es' noch nicht verstanden :/

Hast Du eine Eingabe, ziffernweise?
Oder ist die Eingabe bereits 'im Chip' und soll nun ausgegeben werden?

Ziffernweise Eingabe:
Ergebnis=0
nextchar:
Ergebnis=Ergebnis*10
X=Eingabe (als ASCII)
X=X-$30    ;ziehe '0' von der Eingabe ab
Ergebnis=Ergebnis+X
fertig?
N -> goto nextchar
--> in Ergebnis steht die in DEZ eingegebene Zahl

Ausgabe, ziffernweise von Hinten nach Vorne:
nextchar2:
Zeichen=Zahl%10  (Modulo)
Zahl=Zahl/10     (Integer-Division)
Ausgabe Zeichen (als ASCII +$30 ... oder auch "0")
Ist Zahl>0 ? goto nextchar2

MfG

von Paul (Gast)


Lesenswert?

Gut, verstanden, habe in der falschen Ecke gedacht. Wie wird das bei 
meinem Problem angewendet?

von Karl M. (Gast)


Lesenswert?

Hallo Paul,

ich glaube, dass wir im 4 Schuljahr diese Darstellung von Zahlen zur 
Basis 2 schon durch genommen hatten.
Wenn das bei Dir keine Grundlagen sind, dann würde ich das jetzt 
nachholen.

von Jobst M. (jobstens-de)


Lesenswert?

Zahlen zur Basis 2 helfen ihm bei seinem Problem aber nicht.

Hunderter = DeineZahl/100
Rest = DeineZahl%100
Zehner = Rest/10
Einer = Rest%10


Echt heavy ...


Edit: Ich glaube gerade, ich habe Dein Problem genau umgekehrt 
verstanden.
Du möchtest nicht 0 1 2 als Ergebnis, sondern Du möchtest das als 
Ergebnis, was Dir 0 1 2 liefert ...?


Gruß

Jobst

: Bearbeitet durch User
von Paul (Gast)


Lesenswert?

Hallo
scheinbar habe ich das Problem nicht richtig erklärt.
Das Display möchte als Eingabe 48, 53, 48, 49, 48 haben. das müssten die 
Zahle in Asci für 0, 5, 0 und 1, 5 sein.
Ich möchte zur besseren Eingabe aber die Zahlen 50, 15 nehmen.
Ich muss also von diesen beiden Zahlen die Länge (1 oder 2 oder 3 
Stellig)ermitteln und dann anschliessend auf 48,53,48 umrechnen.
Das ich z.B. mit Modulo machen.

1. Ermittel die länge ob 1 oder 2 oder 3 stellig
2. Emittel die einzelnen Zahlen
3. adiere zu den einzelnen Zahlen jeweils 48 und gebe es zum Display

Beispiel:

50, 15 soll ergeben 48, 53, 48 und 49, 53
Dazu "zerlege" ich die 50 in 5 und 0 und adiere dazu 48. Das ergibt 53 
und 48. Es fehlt noch die führende 0

Das mit der 2 versteh ich ohne Probleme. Ob es in der 4. Klasse war, 
kann ich mich nicht mehr erinnern. Benutze dann aber die schreibweise 
00001101.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wie wird die '50,48' eingegeben?
Wenn ziffernweise, kannst Du bei jedem Tastensruck den ASCII-Wert direkt 
beibehalten.
Beim 'Zahl-Ende-Zeichen' ... hier wohl das Komma oder das Return, gibst 
Du die drei Werte aus.
Initialisiert wurden alle drei Werte zuvor mit 48 ($30, ASCII '0').
Bei jeder Eingabe werden die hinteren zwei Werte um Eins nach vorne 
kopiert und der Einer-Wert von der Eingabe übernommen.

Wenn die Zahlen als Variabel vorliegen, kannst Du die Zahl entweder 
durch wiederholtes Subtrahieren oder durch Modulo zerlegen, um an die 
Einzelziffern zu kommen.
BCD wäre auch möglich ;)

Diese Einzelziffern jeweils wieder +48 ($30, ASCII '0') und ausgeben.

Die Zahleneingabe 'macht sich besser' in HEX - hier sind $30 - $39 die 
Ziffern 0 bis 9 (und zusätzlich +7, wenn die Zahl immer noch größer als 
9 ist und zu einem Buchstaben wird).

MfG

von Jobst M. (jobstens-de)


Lesenswert?

Paul schrieb:
> Es fehlt noch die führende 0

Moment ... was?

Paul schrieb:
> scheinbar habe ich das Problem nicht richtig erklärt.

Ich glaube, dieses Mal ist es nicht viel besser ...


> Das Display möchte als Eingabe 48, 53, 48, 49, 48 haben.

Das Display nimmt, was Du ihm gibst. Es möchte nicht.
Es sieht danach aus, dass DU ASCII Zeichen haben möchtest.


> das müssten die Zahle in Asci für 0, 5, 0 und 1, 5 sein.

Nö. Das ist 0 5 0 1 0. Egal. Ja.


> Ich möchte zur besseren Eingabe aber die Zahlen 50, 15 nehmen.

Eingabe. Wo passiert die? Auf dem Display gibst Du nichts ein, das ist 
ein Ausgabegerät.
Wie kann man Zahlen besser eingeben?
Die Zahlen 50, 15 sind besser als was?
Ich meine 50 ist 50 - wie kann die besser sein?

> Ich muss also von diesen beiden Zahlen die Länge (1 oder 2 oder 3
> Stellig)ermitteln und dann anschliessend auf 48,53,48 umrechnen.

??


> Das ich z.B. mit Modulo machen.

Dieser Satz kein Verb ..?


> 1. Ermittel die länge ob 1 oder 2 oder 3 stellig
> 2. Emittel die einzelnen Zahlen
> 3. adiere zu den einzelnen Zahlen jeweils 48 und gebe es zum Display
>
> Beispiel:
>
> 50, 15 soll ergeben 48, 53, 48 und 49, 53
> Dazu "zerlege" ich die 50 in 5 und 0 und adiere dazu 48. Das ergibt 53
> und 48. Es fehlt noch die führende 0

Dann zerlege Deine 50 in 0 5 0. Das habe ich oben schon gezeigt und Dein 
ganz oben geschriebener Code macht das auch. Da ist die Null doch schon 
da.

Was willst Du?


Gruß

Jobst

von Paul (Gast)


Lesenswert?

Wenn ich 50, 15 schreibe fehlt die führende 0 bei 50 also ist die 
korrekte Eingabe 050. Das kann ich aber nicht schreiben, weil das 
Display nur 48, 53, 48 akzeptiert. Da ich teilweise viele Zahlen angeben 
muss ist das ganze zu lang. Für die Eingabe eines Rechteckes muss ich 
dann eingeben:

48,51,48,49,54,48,55,48,50,55

zusätzlich kommt noch dazu

48,53,48,49,52 für die Angabe der Mitte (Anker)

und noch ca 10 weitere. Das geht doch einfacher z.B.:

30, 14, 60, 25, 40, 23

Das letzte ist viel übersichtlicher und macht nicht soviel Fehler


Die 50 und 48 wird durch das Programm eingegeben:

void Cursor_Position(48,53,48,49,53)

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Dein Problem besteht darin, daß der Code:
void Cursor_Position(48,53,48,49,53)

die jeweils 3-stellige Zeichenfolge 048 053 048 049 053 ans Display 
schicken soll?

Wie zeitkritisch ist die Routine?

Wenn zwischen den einzelnen Ziffern etwas Zeit liegen darf, kannst Du in 
der Routine, ganz banal, wo die Zeichen gesendet werden, die Zahlzeichen 
errechnen und ausgeben.

Ich nehme jetzt an, daß die Routine aktuell bei 50 eine '2' (=ASCII 50d) 
sendet, aber eine '5' '0' senden soll?

Dann zeig bitte die Innereien dieser Sende-Routine.

MfG

von Paul (Gast)


Lesenswert?

Bis her sieht es so aus:
1
Graphik_C_Cursor_Position(0,9,9,2,9);
das andere
1
void Graphik_C_Cursor_Position(uint8_t x1, uint8_t x2, uint8_t x3, uint8_t y1, uint8_t y2)
2
{
3
  uint8_t x1a, x2a, x3a, y1a, y2a;
4
  x1a = x1 + 48;
5
  x2a = x2 + 48;
6
  x3a = x3 + 48;
7
  y1a = y1 + 48;
8
  y2a = y2 + 48;
9
  uint8_t bcc;
10
  bcc = DC1 + 0x0b + ESC + END + 0x2c + 'Y' + 'C' + 'P' + x1a + x2a + x3a + y1a +y2a;
11
  i2c_start(slave_adresse_1);
12
  i2c_write(DC1);
13
  i2c_write(0x0b);  // len 07
14
  i2c_write(ESC);
15
  i2c_write('Y');    // Y
16
  i2c_write('C');    // C
17
  i2c_write('P');    // P
18
  i2c_write(x1a);
19
  i2c_write(x2a);
20
  i2c_write(x3a);
21
  i2c_write(0x2c);
22
  i2c_write(y1a);
23
  i2c_write(y2a);
24
  
25
  i2c_write(END);
26
  i2c_write(bcc);
27
  i2c_stop();
28
  
29
  _delay_us(100);
30
  
31
  i2c_start(slave_adresse_2);
32
  e = i2c_readAck();
33
  i2c_stop();
34
  
35
  itoa( e, Buffer, 10 );
36
  lcd_printlc(1,5,Buffer);
37
  _delay_us(100);
38
  
39
}
Damit geht es, bis auf die führende 0 bzw die Eingabe und die Menge der 
möglichen Zahlen.
Das mit Modulo geht noch nicht

von Paul (Gast)


Lesenswert?

Sorry vergessen anzugeben. Der untere Teil des Codes dient nur zur 
Ausgabe der Prüfsumme auf einem zweiten Display auch über den Bus

von Jobst M. (jobstens-de)


Lesenswert?

Paul schrieb:
> Wenn ich 50, 15 schreibe fehlt die führende 0 bei 50 also ist die
> korrekte Eingabe 050. Das kann ich aber nicht schreiben, weil das
> Display nur 48, 53, 48 akzeptiert.

Ich verstehe Dein Problem immer noch nicht. Diese Dinge hast Du alle 
bereits gelöst.

Zahl = 50 (Woher auch immer 'Eingabe' stammt)
Hunderter = Zahl/100 = 0
Rest = Zahl%100 = 50
Zehner = Rest/10 = 5
Einer = Rest%10 = 0

Hunderter + 48 = 0 + 48 = 48
Zehner + 48 = 5 + 48 = 53
Einer + 48 = 0 + 48 = 48

Was fehlt Dir noch?


**Goosfraba*


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Paul schrieb:
> Damit geht es, bis auf die führende 0 bzw die Eingabe und die Menge der
> möglichen Zahlen.

Dein Satzbau ist eine Katastophe. Und rück endlich raus, wo Dein Problem 
bei der Eingabe ist, die Du uns nicht verraten willst.

Und wieso wird bei x1 = 0 keine 0 ausgegeben?


Gruß

Jobst

von Paul (Gast)


Lesenswert?

Die führende 0 soll weg. Gebe ich 50 statt 050 wird automatisch anders 
gerechnet, 50 ist zweistellige Eingabe und 050 ist dreistellige Eingabe. 
Gebe ich 50 statt 050 ein wird die erste Zahl von der nächsten 
Koordinate genommen und alle Koordinaten sind falsch.

von Paul (Gast)


Lesenswert?

Mein Problem habe ich mehrfach beschrieben. Scheint nicht klar rüber 
zukommen.
Das Display will 48,53,48,49,53 als Eingabe bekommen. Das sind die 
Zahlen
0, 5, 0, 1, 5.
Ich möchte eingeben 50,15 ohne die 0

von Jobst M. (jobstens-de)


Lesenswert?

Paul schrieb:
> Es fehlt noch die führende 0

Paul schrieb:
> Die führende 0 soll weg.

Unentschlossen?

Es wäre echt cool, wenn Du mal vernünftig, von vorne bis hinten, in 
verständlichen Sätzen schreibst, was Du GENAU vor hast.
Und denk dran: Andere wissen nicht, was Du evtl. weißt.

Ich bin raus.


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Paul schrieb:
> Ich möchte eingeben 50,15 ohne die 0

Dein Problem liegt in der Eingabe. Die kennen wir aber nicht.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Hiermit:
Graphik_C_Cursor_Position(0,9,9,2,9);

Gibst Du '099,29' ans Display, korrekt?

Dann musst Du doch 'nur' eine Zwischenroutine schreiben, Die Dir Deinen 
Zahlenstrom (nehme an, jeweils X und Y-Werte) in diese 3er + 2er Gruppe 
aufteilt und diese an die Funktion Graphik_C_Cursor_Position() schickt.

Das kannst Du mit den Modulo- oder mehrfachen Subtraktions-Berechnungen 
doch machen.

Mir ist trotzdem noch unklar, wie die eigentliche Eingabe der 
Koordinaten erfolgt, sind das Daten im eEprom und Du möchtest Dir nur 
das Leben bei der Eingabe erleichtern?
Also KEINE Eingabe während der Laufzeit, Du möchtest halt die Daten 
umkodieren, damit die Eingabe einfacher/weniger fehleranfällig ist?!?

(wäre verständlich, als Mensch ist man halt manch Mal faul gg)

MfG

von Paul (Gast)


Lesenswert?

Es erfolgt keine Eingabe über Tasten. Ich definiere einen Punkt auf dem 
Display wo etwas ausgegeben werden soll. Die Eingabe der Daten soll 
relativ einfach und verständlich ohne umrechnung (per Hand) erfolgen. 
Das Programm soll die Koordinaten von 50,15 auf 48,53,48,49,53 umrechnen 
und gleichzeitig prüfen ob die angebenen Koordinaten korrekt sind. 
Weiterhin möchte ich die mögliche Anzahl der Zahlen zur Eingabe aller 
notwendigen Koordinaten reduzieren. Im Programm (oben) ist ja zu sehen, 
welcher Aufwand jetzt schon ist. Teilweise arbeite ich jetzt schon mit 
10 bis 20 Graphikbefehlen fast gleichzeitig. Im original Programm ist 
eine maximale Verzögerung von 6 us drin. Es kommt noch der Bildaufbau 
und Anzeige aus dem Speicher dazu.
Eigentlich hast du recht. Mach das so wie oben schon angefangen. Brauche 
später das Teil ca. 50 bis 100 im ganzen Code für verschiedene 
Anwendungen.
Danke für die Hilfe und entschuldigung für den Satzaufbau
LG Paul

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.