Forum: Mikrocontroller und Digitale Elektronik 8051 - Taschenrechner


von Klaus M. (Firma: asd) (covo2k)


Lesenswert?

Hallo an alle.

Ich möchte einen Taschenrechner programmieren.

Verwendete IDE : Keil mvision 2
Verwendete CPU : Dallas DS87C520/DS83C520

-> Also Architektur ist 8051( wie in der Überschrift bereits erwähnt )

Und ich verwende im Moment nur den internen Simulator von Keil.

So nun zum Problem:

Ich kann EIN Zeichen einlesen folgendermaßen:
1
getString:
2
  jnb   ri, $               ; warten auf Tastendruck
3
  call  pause               ; 10 ms warten
4
  jnb  ri, getString        ; zurück wenn Tastenprellen
5
  mov  a, sbuf              ; gedrückte Taste in Akku laden
6
  call  send                ; gedrückte Taste ausgeben
7
  cjne  a, #0x23, getString ; solange nicht # wiederhole
8
9
  ; Raute-Taste wurde offentsichtlich gedrückt
10
  ret

Nun als Beispiel: Ich habe eine '1' eingegeben. Er liest diese '1' ein 
und gibt sie auch wieder auf dem Screen aus. Nun gebe ich wieder eine 
'1' ein und er liest diese wieder ein und gibt sie aus.
Das Problem ist nun, dass ich ja diese Zahl, was eigentlich eine '11' 
wäre, mit einer 2. Zahl addieren möchte. Wie mach ich das, dass ich die 
Zahlen die ich eingebe wie eine Art String behandeln kann und nicht wie 
immer ein einzelnes Zeichen.
Sodass, wenn ich zweimal die '1' drücke am Ende auch eine Zahl: '11' 
herauskommt mit der ich richtig rechnen kann.
In C wäre das die Funktion strcat( also hänge Zeichen an Zeichenkette ), 
nur wie ist das in Assembler ?

Vielen Dank für Eure Hilfe

Mfg coVo2k

von Helmut L. (helmi1)


Lesenswert?

Im Prinzip genauso.

Erstmal must du festlegen wie deine Strings in Assembler aussehen 
sollen.
Am einfachsten waere hier die C Notation zur verwenden. Also ASCII 
Zeichen mit 0x0 zu terminierung.

Dann resevierst du dir einen Speicherbereich wo die Zahl abgespeicher 
werden soll. Auf diesem Speicherbereich stellst du einen Ptr . Wenn das 
erste Zeichen eingelesen ist speicherst du es an dieser Stelle. Dann 
erhoehst du deinen Ptr . An dieser Stelle schreibst du dann mal die Ende 
0 rein. Beim naechsten Zeichen wiederholt sich das spielchen. So baut 
sich jetzt langsam im Speicher dein Eingabe String auf.
Bei irgendeiner von dir festgelegten Taste wird die Eingabe beendet und 
mit der berechnung begonnen. Aber Achtung die Zeichen liegen hier im 
ASCII Code vor und nicht als binaerwert. Du must also vorher noch eine 
ASCII -> Integer konvertierung durchfueheren.

Gruss Helmi

von Peter D. (peda)


Lesenswert?

Seit wann prellt ne UART?


Warum willst Du Dich umständlich mit Strings abquälen?

Sobald ein Digit reinkommt, einfach:

Zahl = Zahl * 10 + Digit


Peter

von HP-Nut (Gast)


Lesenswert?

Hallo,
ich habe mal einen wissenschaftlichen Taschenrechner mit Stoppuhr auf 
einem PIC programmmiert. Da ich HP-Fan bin, natürlich mit UPN :-)
Naja, du musst dir vorher ein paar theoretische Gedanken machen:
Welche Eingaben schliessen die Eingabe einer Zahl ab? Das sind die 
Rechenfunktionen (und ENTER bei UPN). Aber was ist mit dem unären Minus 
(Vorzeichenwechsel)? Und was ist mit dem Zehner-Exponenten, ist mit 
dessen Eingabe die Eingabe der Zahl direkt abgeschlossen (dann ist keine 
Korrektur möglich).
Und wie Peter schon gesagt hat, Warum mit Strings abquälen? Entweder BCD 
oder binär (wie bei Peter). Dann muss man sich aber auch des Nachteils 
der binären Darstellung bewusst werden, und sowohl bei BCD wie binär 
brauchst du intern mehr Stellen, als auf dem Display, weil du korrekt 
runden willst.

von taucher (Gast)


Lesenswert?

Ich frage mich eh, wie Du in Assembler dann Sinus und Wurzeln berechnen 
willst? Allein schon floating-point-Zahlen werden ein Vergnügen 
werden...

von HP-Nut (Gast)


Lesenswert?

Cordic oder Coridic heisst der Algortihmus, der gleichzeitig 
Winkelfunktionen und Logarithmen berechnen kann. Ansonsten halt über 
eine Reihenentwicklung annähern.

siehe
http://de.wikipedia.org/wiki/CORDIC

von Helmut L. (helmi1)


Lesenswert?

>Allein schon floating-point-Zahlen werden ein Vergnügen
>werden...

Ooch die sind kein grosses Problem wenn man weiss wie eine 
Floatingpointzahl aufgebaut ist.

Gruss Helmi

von Ralph (Gast)


Lesenswert?

Warum Assembler ??????????

von Klaus M. (Firma: asd) (covo2k)


Lesenswert?

Hallo an alle.

Ich danke euch erstmal für die rege Teilnahme an meiner Frage.
Aber ich habe vielleicht ein paar Fakten vergessen, die manche Frage 
schon von alleine klären sollte.

Was ich hier vorhabe ist ein Projekt für das Studium. Es dient als 
Abschlussarbeit für ein Fach, genannt Mikroprozessortechnik.

Dieser Taschenrechner soll nur die 4 Grundrechenarten unterstützen.
Also keine Winkelfunktionen oder ähnliches.
Und es soll mit Assembler, genauer mit der Keil IDE und der 
8051-Architektur umgesetzt werden.

Ich habe aus euren Antworten versucht etwas nützliches zu programmieren, 
komme aber hier schon wieder auf ein neues Problem.
1
test:
2
        ; 1. Ziffer eingegeben
3
        mov a, #0x01  ; 1. Ziffer = 1
4
        mov r4, a     ; schreibe die 1 in register4
5
        mov b, #0x10  ; gib den mul.faktor 10 an b
6
        mul ab        ; multipliziere a und b
7
        mov r4, a     ; gebe das ergebnis in r4( 1 * 10 = 10 )
8
9
        ; 2. Ziffer eingeben
10
        mov a, #0x03  ; eingegebenes zeichen is die 3
11
        mov r5, a     ; Speichere die Ziffer 3. temporär in r5
12
        mov b, #0x10  ; b als multiplikator 10
13
        mov a, r4     ; aktuelle zahl in a von r4 schreiben
14
        ;mul ab        ; multipliziere a und b
15
        add a, r5     ; addiere die 3 an a ( = 13 )
16
        mov r4, a     ; schreibe ergebnis wieder in r4

Das Problem ist das a und b Hex-Zahlen annehmen also steht dann im 
Debugger für r4 : 0x13.
Wenn ich jetzt eine weitere Ziffer eingebe hängt er diese natürlich 
nicht an r4 dran da die Zeichenweite überschitten ist.
Muss ich da jetzt noch temporär eine Hex-Binärumwandlung durchführen ?
Oder was ist der Schritt in die richtige Richtung?

Und nebenbei, weiß jemand wie man in der KEIL - IDE das Simulator 
Fenster ( Serial Window #1 ) clear screenen kann ?
Wie man das dann über ein Entwicklungsboard macht z.b. MCS-51 weiß ich 
ja aber in dem Simulator hat man ja offentsichtlich keine Ports.

Vielen Dank im Vorraus.

Mfg coVo2k

von HP-Nut (Gast)


Lesenswert?

Tut mir leid, aber die Antwort findest du schon weiter oben: Werde dir 
erstmal über die Zahlendarstellung klar, nimm die ein Blatt Papier und 
probiere es aus. Das brauchst du eh später als Dokumentation.

von Peter D. (peda)


Lesenswert?

Du wirst nicht umhinkommen Mehrbyte-Arithmetic zu machen.

Eine fertige Arithmetiklibrary findest Du z.B. hier:

http://home.tiscali.de/peterd/appl/soft/arithmet/index.htm


Peter

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.