Forum: Mikrocontroller und Digitale Elektronik Taschenrechner mit ATMega16


von Christopher G. (cbg)


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.

von Christian H. (netzwanze) Benutzerseite


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.

von Christopher G. (cbg)


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

von Christian H. (netzwanze) Benutzerseite


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.

von Z8 (Gast)


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

von Z8 (Gast)


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

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.