mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taschenrechner mit ATMega16


Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich möchte hier einen Taschenrechner basteln, der nur mit Integers 
rechnen kann (also keine Gleitkommazahlen). Ausgabe der eingegebenen 
Zahlen und des Ergebnisses erfolgt auf einem 7 Segment Display 
(multiplexed) und die Eingabe erfolgt über ein Matrix Keyboard.
Meine Frage ist nun, ist es gescheiter, die Matrixtastatur mit nem Timer 
periodisch zu überprüfen und ein "butto pressed" flag zu setzten oder 
wäre es besser an den Stellen, wo ich eine Eingabe erwarte, auf eine 
Tastatureingabe zu warten? Derzeit hab ich die Timer Variante, hab das 
Beispiel noch nicht fertig. Bin jetzt eben ins Grübeln gekommen und hab 
gedacht ich frag mal nach.
An der Hardware kann ich nichts ändern, da es für die Uni auf einem 
Laborkit mit bestimmter Hardware (7-Segment, Matrixkeyboard, ...) laufen 
muss.

PS: Hat vl wer eine Idee, wie ich "Punkt vor Strich" (Mul und Div vor + 
und -) am einfachsten implementieren kann? Derzeit habe ich vor, in 
einem Switch / if-else-Konstrukt den gedrückten Button zu prüfen. Ich 
lese dann immer ein bis ich zwei Operationsbuttons habe. Falls der 
Zweite kein + / - ist, dann berechne ich das Ergebnis, sonst weiterlesen 
bis + / - kommt.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einem Taschenrechner (keine, die eine komplizierte Formelnotation 
verstehen) wird doch die Eingabe in einen Buffer geschrieben und 
anschließend nach Drücken einer Funktionstaste ("+","-","="...) der Wert 
gelesen und mit dem Zwischenspeicher verrechnet.

D.h. Berechnen und Eingeben sind zwei unabhängige Programmteile die 
nacheinander ausgeführt werden.

Punkt-vor-strich brauchst du hier garnicht berücksichtigen. Es wird 
immer nur die eingegebene Zahl mit dem Zwischenspeicher verrechnet. Hier 
gibt es nur eine Operation zur Zeit.

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Es sieht so aus, ich kann max. 5 stellige Zahlen eingeben (0-99999) 
jeweils +/-. Nun soll das Programm, wenn ich z.b. 2+3*4 eingebe 14 
ausspucken und nicht 20. Punkt vor Strich ist verlangt, kann ich leider 
nicht umgehen :)
Meine Überlegung sieht derzeit so aus:
Keyboard wird mittels Timer abgefragt, falls neue Taste gedrückt wurde 
wird ein globales Flag gesetzt und der Buttonwert in einer globalen 
Variable gespeichert. In der Endlosschleife von main() prüfe ich das 
Tastenflag. Wenn keine neue Taste gedrückt wurde (bzw die aktuelle Taste 
nicht zwischendruch losgelassen wurde), so wird nichts gemacht. Falls 
doch eine Taste gedrückt wurde, so wird mal geprüft ob es eine für 0-9 
ist. Ist es eine Zifferntaste, so multipliziere ich die Variable für die 
Zahleneingabe mit 10 und addiere den Wert der gedrückten Taste.
So weit, so gut. Wenn ich jetzt einen primitiven Tachenrechner machen 
müsste, wäre ja alles fein. Jetzt kommt jedoch die Punkt vor Strich 
Geschichte dazu. Da bin ich mir noch nicht ganz sicher, wie ich das 
mache.

Ausserdem würde ich gern eure Meinungen zu meiner Tastenabfrage hören. 
Also ob es mit dem Timer sinnvoll ist, oder ob ich das in eine Funktion 
geben soll und händisch aufrufen sollte, wann immer ich eine Eingabe 
erwarte.

LG

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde die Tastenabfrage incl. Entprellung im Interrupt machen.
Eine sauber erkannte Taste geht in einen 1-Byte-Buffer. Main schaut 
seinerseit öfters auf den Buffer und übernimmt die Tasendrücke in einen 
zweiten Buffer (= Anzeigebuffer). Hier könntest Du auch editieren 
(Clear, Backspace).

Nachdem ein Funktionstaste gedrückt wurde, wird der Anzeigebuffer in 
einen Formelbuffer geschrieben. Dieser besteht ggf aus einem 
parametrisierten binären Baum und wird je nach eingegebener Operation 
umorganisiert.

Die abschließende Berechnung ist dann recht einfach. Nur den Baum 
durchwandern und die gespeicherten Operationen ausführen.

Bist Du Informatiker? Hier am besten mal einen Datenstruktur-Prof 
ansprechen.

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das damals so gemacht:

 - Eingabestring bleibt editierbar bis zum "="
 - Zeichenfolge wird zerlegt in Operanden und Operatoren (2 Felder)
 - auflösen des Operatorvorangs (Klammern  vor * vor + ...)

Loop:
 - ausführen der "innersten" Op. danach Felder vereinfachen (kürzen)
 - rekursiv ausfühen bis kein Operator mehr da ist, sonst -> Loop

 = Result

Quelle in VB60 vorhanden.  Z8

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edit:

 - Eingabestring bleibt editierbar bis zum "="
 - Zeichenfolge wird zerlegt in Operanden und Operatoren (2 Felder)

Loop:
 - auflösen des Operatorvorangs (Klammern  vor * vor + ...)
 - ausführen der "innersten" Op. danach Felder vereinfachen (kürzen)
 - rekursiv ausfühen bis kein Operator mehr da ist, sonst -> Loop

 = Result

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.