mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 - Taschenrechner


Autor: Klaus Müller (Firma: asd) (covo2k)
Datum:

Bewertung
0 lesenswert
nicht 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:
getString:
  jnb   ri, $               ; warten auf Tastendruck
  call  pause               ; 10 ms warten
  jnb  ri, getString        ; zurück wenn Tastenprellen
  mov  a, sbuf              ; gedrückte Taste in Akku laden
  call  send                ; gedrückte Taste ausgeben
  cjne  a, #0x23, getString ; solange nicht # wiederhole

  ; Raute-Taste wurde offentsichtlich gedrückt
  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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HP-Nut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: taucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: HP-Nut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum Assembler ??????????

Autor: Klaus Müller (Firma: asd) (covo2k)
Datum:

Bewertung
0 lesenswert
nicht 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.
test:
        ; 1. Ziffer eingegeben
        mov a, #0x01  ; 1. Ziffer = 1
        mov r4, a     ; schreibe die 1 in register4
        mov b, #0x10  ; gib den mul.faktor 10 an b
        mul ab        ; multipliziere a und b
        mov r4, a     ; gebe das ergebnis in r4( 1 * 10 = 10 )

        ; 2. Ziffer eingeben
        mov a, #0x03  ; eingegebenes zeichen is die 3
        mov r5, a     ; Speichere die Ziffer 3. temporär in r5
        mov b, #0x10  ; b als multiplikator 10
        mov a, r4     ; aktuelle zahl in a von r4 schreiben
        ;mul ab        ; multipliziere a und b
        add a, r5     ; addiere die 3 an a ( = 13 )
        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

Autor: HP-Nut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.