Forum: Mikrocontroller und Digitale Elektronik Programmierbarer Taschenrechner mit PIC16F628


von Michael P. (Firma: n.a.) (micha1102)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

Vor kurzem habe ich meinen guten alten programmierbaren Taschenrechner 
TI58c zerlegt (Baujahr 1981, der ausgelaufene Akku hatte die Platine 
zerstört).

Dabei kam mir ein Idee.
Das Gerät konnte mit Programmbibliotheken auf austauschbaren ROMs 
erweitert werden und war trotz seiner nur 225kHz Taktfrequenz recht 
leistungsfähig.
So etwas könnte man ja mit einem Mikrocontroller heutzutage leicht 
nachbauen. Im Internet gibt es zahlreiche Seiten zum Eigenbau von 
Taschenrechnern. Auch hier im Forum habe ich viele Beiträge dazu 
gefunden.

Leider aber nichts zu meinem konkreten Vorhaben.

Mit einem Arduino, fertiger Tastatur sowie einem Display mit eigenem 
Controller und Zusammensetzen von vorhandenen Software-Blöcken wäre so 
ein Rechner heute wohl mühelos machbar. Fraglich ist nur, was man dabei 
lernt.

Zum Einarbeiten in die Hardware vom Mikrocontroller und ASM habe ich mir 
vor paar Jahren mal einen Taschenrechner (Bild 1, nur Grundrechenarten) 
selbst gebaut. Schaltung, Platine, LED-Treiber und Tastaturauswertung 
war alles selbstgestrickt. Es sollte absichtlich ein PIC16F628 mit nur 
2K Programmspeicher und wenigen Pins sein. Dadurch war ich gezwungen, 
den kompletten Treiber für die Anzeige sowie die Tasteneingabe samt 
Plausibilitätschecks möglichst platzsparend hinzubekommen (zusammen sind 
es nur 284 Worte).

Der Rechner gewinnt zwar sicher keinen Schönheitspreis, funktioniert 
aber tadellos und ist sehr gut ablesbar. Wie man sieht hat er auch nur 
minimalen Hardwarebedarf.

Nun zu meiner Idee und den Fragen dazu.

Wenn ich die bestehende Schaltung um einen EEPROM erweitere wie im Bild 
2 dargestellt (der rote Teil), könnte ich wohl mit dem  kleinen PIC 
einen hochwertigen programmierbaren wissenschaftlichen TR hinbekommen.

Wie Bild 1 zeigt, habe ich die Software schon mal so erweitert, das auch 
Zahlen mit Mantisse und Exponent ein- und ausgegeben werden können. Die 
interne Verarbeitung fehlt aber noch.

Und ich habe vor, das so zu machen:

- ich ergänze das Programm um "virtuelle Tasten" mit jeweils eigenem 
Scancode

- Beim Aufruf dieser Tastencodes führt der PIC Folgen von 
Grundoperationen in den TR-Arbeitsregistern aus, die für Berechnung von 
SIN, LOG, y^x usw. erforderlich sind (also Zweierkomplement, 
Links/Rechtsverschiebung, Vergleiche, bedingte Sprünge, 
Registertausch,INC,DEC)

- Die Befehlsfolgen dazu (die Tasten-Scancodes) kommen aus dem externen 
EEPROM

Faktisch würde der kleine PIC damit zu einer TR-spezifisch erweiterten 
ALU mit eigenem 2. Programcounter, die den erweiterten Befehlscode aus 
dem externen EEPROM erhält.

Da der EEPROM austauschbar ist und auch alle real vorhandenen Tasten 
aufrufbar sind, könnten ähnlich wie beim TI58c auch eigene 
Anwenderprogramme erstellt und genutzt werden.

Meine Frage: Geht das prinzipiell so? Und habt ihr eigene Erfahrungen 
mit diesem Thema? Über eure Ideen und Anregungen würde ich mich freuen

Beste Grüße

Micha

von Stefan F. (Gast)


Lesenswert?

Soweit ich weiss können PIC Controller nur Code aus dem internen Flash 
Speicher ausführen. Wenn Du also Code von einem externen Speicher 
ausführen willst, müsstest du ihn interpretieren (wie Java oder Basic). 
Hast du ja auch geschrieben.

Aber in diesen kleinen Pic wirst du wohl kaum einen sinnvollen 
Interpreter rein bekommen.

Laut Datenblatt hat der Chip 3,5kB Programm Speicher und nur magere 224 
Bytes RAM.

> Dadurch war ich gezwungen, den kompletten Treiber für die Anzeige
> sowie die Tasteneingabe samt Plausibilitätschecks möglichst
> platzsparend hinzubekommen

Du scheinst es als sportliche Herausforderung zu sehen. Andere würden es 
Zeitverschwendung nennen.

Ich würde lieber einen größeren Controller nehmen, zum Beispiel einen 
ATmega328P mit 32kB Programmspeicher und 2kB RAM. Da kriegt man dann 
auch einen Java Interpreter rein (siehe 
http://www.harbaum.org/till/nanovm/index.shtml).

von Stefan F. (Gast)


Lesenswert?

Ich würde auch nochmal über den LED-Strom nachdenken. 8-Fach 
Multiplexing ist schon außergewöhnlich viel, dazu sind die 15mA Strom 
(aufgeteilt auf 8 Segmente) außergewöhnlich wenig.

Sicher wird das Abends im Bastelkeller hell genug sein, aber wird es 
auch tagsüber in Arbeitsräumen reichen?

LED's soll man nicht parallel schalten. Die Widerstände gehören nach 
unten an die Leitungen a bis h.

Warum manchst du eine Hälfte mit gemeinsamer Anode und die andere mit 
gemeinsamer Kathode? Bsit du sicher, dass beide Anzeigen mit exakt den 
gleichen LED's bestückt sind, damit es nicht blöd aussieht?

von Noch einer (Gast)


Lesenswert?

> über den LED-Strom nachdenken

Diese LED Rechner kenne ich noch aus der Schule. Katastrophe! Haben sich 
nach ein paar Minuten abgeschaltet und in den Prüfungen war die Batterie 
leer.

Da kommt doch die Frage auf - warum Batterien kaufen, wenn man heute für 
das gleiche Geld einen Taschenrechner bekommt, der 10 Jahre mit einer 
Lithiumzelle läuft?

von Brummbär (Gast)


Lesenswert?

Noch einer schrieb:
> Da kommt doch die Frage auf - warum Batterien kaufen, wenn man heute für
> das gleiche Geld einen Taschenrechner bekommt, der 10 Jahre mit einer
> Lithiumzelle läuft?

Schon einmal darüber nachgedacht, dass einige wenige Menschen ein Hobby 
ohne finanzielles Interesse betreiben - rein als Spaß an der Freude?

von Thomas E. (picalic)


Lesenswert?

Interessanter Ansatz - erinnert mich ein wenig an mein PICALIC, was ja 
im Prinzip auch eine interpretative Abarbeitung von Opcodes (in dem Fall 
aus dem internen EEPROM) ist. Etwas gruseln würde mir vor dem 
Multiplexen der EEPROM-Leitungen und Tasten auf denselben Leitungen - da 
könnte man durch Drücken von zwei Tasen gleichzeitig während das 
Programm läuft einen netten Programmabsturz provozieren.

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


Lesenswert?

Ein Taschenrechner koennte auch heute noch ein sinnvolles Projekt
fuer den Eigenbau sein, wenn er Eigenschaften hat die am Markt
heute nicht verfuegbar sind:

- Einige, moeglichst potentialgetrennte AD-Kanaele (12 bit waeren gut)

- Ein oder zwei DA-Wandler (auch hier 12 bit und bitte keine PWM).

- Eine Messeinrichtung fuer Frequenz, Periodendauer, Ein- und Ausschalt-
  zeiten und das Zaehlen von Ereignissen.

- Eind Handvoll digitale Ein- und Ausgaenge. Vielleicht auch ein
  paar Relaiskontakte.

- Eine einfache Anbindung an einen "groesseren" Host/PC.
  Vielleicht seriell + Massenspeicheremulation.

- Ein einfaches Grafiksystem um Trends, Plots und Werte auszugeben.

Sowas koennt Mann vielleicht gebrauchen.
Die Befehle dafuer waeren so wie bei programmierbaren TR ueblich,
dann nur weitere Opcodes im TR-Befehlssatz.

Vermutlich ist es dann wohl einfacher so was wie das 8032AH-Basic
dafuer aufzubohren.

von VOA (Gast)


Lesenswert?

Also ich finde das Projekt ebenfalls toll!
Unbedingt bei LED-Anzeige bleiben, das hat viel mehr Stil als eine 
LCD-Gurke, womöglich in ihrer schlimmsten Reinkarnation als HD44780 dot 
Display.

Allerdings könnte ich mir vorstellen, daß es sinnvoll (und schick!) wäre 
die Stellenzahl zu vergrößern, 12 oder 16...

Stefan U. schrieb:
> Ich würde lieber einen größeren Controller nehmen, zum Beispiel einen
> ATmega328P mit 32kB Programmspeicher und 2kB RAM. Da kriegt man dann
> auch einen Java Interpreter rein

Auweia!

Nö bloss nicht, ich würde (wenn ich denn könnte,...:-))so nah wie 
möglich am Original bleiben und die Arbeitsweise eines 
Taschenrechnerschaltkreises nachbilden, mit 3 oder 4 Rechenregistern in 
denen dezimal stellenweise die Rechnerei abgewickelt wird.
In Java auf mega328 wartest du vermutlich 5 Minuten auf die fertig 
berechnete Quadratwurzel...:-)

von Dr. Sommer (Gast)


Lesenswert?

Praktischer (und realitätsnäher) als eine Erweiterbarkeit per EEPROM 
fände ich eine Möglichkeit Variablen und Funktionen zu definieren und 
dann beliebige Ausdrücke ausrechnen zu können. Man würde zB folgendes 
1:1 eingeben und würde das entsprechende Ergebnis erhalten:

a:=42;
b:=23;
f(x,y):=sin(a+b*π);
f(a+b*11)

Ein bisschen wie Mini Matlab. Ob das auf einen kleinen PIC passt ist 
aber fraglich, das würde ich lieber auf einem ARM machen. Auch hier 
könntest du Funktionen und Variablen per EEPROM (oder lieber SD Karte? 
Einfach steckbar) nachrüsten...

von W.S. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Ob das auf einen kleinen PIC passt ist
> aber fraglich, das würde ich lieber auf einem ARM machen.

Wenn man es in Assembler macht, dann paßt das.
Ich müßte mal nachschauen, wieviel Platz meine 4 und 5 
Byte-GK-Arithmetik braucht, soweit ich mich erinnere, kommt die mit 
einem K oder so aus.

Ich hab in solche kleinen PIC's schon ganz andere Sachen programmiert. 
Die 5 Byte GK Ari mit 32 Bit Mantisse hat's z.B. für nen Reziprok-Zähler 
gebraucht. Mit sowas hätte man auch genügend Stellen für einen kleinen 
Taschenrechner. Für den Rest, also Tastenabfrage, Display-Multiplex und 
Kommandointerpreter braucht man erfahrungsgemäß nicht gar so viel Platz.

W.S.

von m.n. (Gast)


Lesenswert?

Mir würde eine Kombination aus diesen Anforderungen gefallen:

(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag 
#4932224:
> - Einige, moeglichst potentialgetrennte AD-Kanaele (12 bit waeren gut)
>
> - Ein oder zwei DA-Wandler (auch hier 12 bit und bitte keine PWM).
>
> - Eine Messeinrichtung fuer Frequenz, Periodendauer, Ein- und Ausschalt-
>   zeiten und das Zaehlen von Ereignissen.
>
> - Eind Handvoll digitale Ein- und Ausgaenge. Vielleicht auch ein
>   paar Relaiskontakte.
>
> - Eine einfache Anbindung an einen "groesseren" Host/PC.
>   Vielleicht seriell + Massenspeicheremulation.
>
> - Ein einfaches Grafiksystem um Trends, Plots und Werte auszugeben.

und

Dr. Sommer schrieb:
> Praktischer (und realitätsnäher) als eine Erweiterbarkeit per EEPROM
> fände ich eine Möglichkeit Variablen und Funktionen zu definieren und
> dann beliebige Ausdrücke ausrechnen zu können. Man würde zB folgendes
> 1:1 eingeben und würde das entsprechende Ergebnis erhalten:
>
> a:=42;
> b:=23;
> f(x,y):=sin(a+b*π);
> f(a+b*11)

was letztlich eine Baugruppe mit BASIC-Interpreter sein könnte.
Unter mircomite findet man etwas, was sogar einen PIC als µC verwendet. 
Einen Ansatz mit STM32 hatte ich mangels Interesse verworfen.
Beitrag "PIC 32 schneller Basic Interpreter"

VOA schrieb:
> Allerdings könnte ich mir vorstellen, daß es sinnvoll (und schick!) wäre
> die Stellenzahl zu vergrößern, 12 oder 16...

Auf jeden Fall müssen es mehr als 8 Stellen sein.

von Michael P. (Firma: n.a.) (micha1102)


Lesenswert?

Hallo alle zusammen,

Danke erstmal für eure Meinungen.

Stefan U. schrieb:
> LED's soll man nicht parallel schalten. Die Widerstände gehören nach
> unten an die Leitungen a bis h.
...
> Warum manchst du eine Hälfte mit gemeinsamer Anode und die andere mit
> gemeinsamer Kathode?

Die LED der Anzeige sind alle antiparallel geschaltet.
Nur so ist es möglich, 8 Stellen mit 12 Leitungen zu treiben.

Dr. Sommer schrieb:
> Praktischer (und realitätsnäher) als eine Erweiterbarkeit per EEPROM
> fände ich eine Möglichkeit Variablen und Funktionen zu definieren und
> dann beliebige Ausdrücke ausrechnen zu können.

Genau das habe ich vor!

VOA schrieb:
> Allerdings könnte ich mir vorstellen, daß es sinnvoll (und schick!) wäre
> die Stellenzahl zu vergrößern, 12 oder 16...

Also mir reicht eine 5-stellige Mantisse. Gerade bei Messwerten wird bei 
großer Stellenanzahl oftmals eine trügerische Genauigkeit vorgegaukelt.

(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag 
#4932224:
> Ein Taschenrechner koennte auch heute noch ein sinnvolles Projekt
> fuer den Eigenbau sein, wenn er Eigenschaften hat die am Markt
> heute nicht verfuegbar sind: .......

Das wäre machbar, wenn ich den pinkompatiblen 16F1847 nehmen würde. Der 
hat ADC (leider auch nur 10bit) und mehr Speicher.

Der jetzt genutzte PIC hat nur noch einen Eingang frei. Ohne ADC kaum 
sinnvoll nutzbar.

Thomas E. schrieb:
> Etwas gruseln würde mir vor dem
> Multiplexen der EEPROM-Leitungen und Tasten auf denselben Leitungen

Mit gutem Timing sollte das machbar sein. Die Anzeige hängt jetzt auch 
im Multiplex an den Tastaturleitungen. Ohne jeglichen Probleme. Und es 
ist kein 8-Stellen-Multiplex, sondern ein echtes 64-Segment-Multiplex.

Stefan U. schrieb:
> Ich würde lieber einen größeren Controller nehmen

Ich habe gerade das alte Service-Manual vom TI58c runtergeladen und kurz 
überflogen. Ich vermute der 16F628 allein hat mehr "Power" als der ganze 
Chipsatz, der damals erfolgreich dort eingesetzt wurde.

Mehr zum Thema später

Beste Grüße

Micha

von Stefan F. (Gast)


Lesenswert?

> Die LED der Anzeige sind alle antiparallel geschaltet.

Achso, kappiert.

> In Java auf mega328 wartest du vermutlich 5 Minuten auf die fertig
> berechnete Quadratwurzel...:-)

Vertue dich da mal nicht. Lego Mindstorms Rboter laufen mit Java 
Interpreter auch prima. Der RCX Computer hatte einen 16Bit µC mit 16Mhz, 
der NXT einen 32Bit µC mit 32Mhz. Das ist nicht weit von ATmegas und 
PIC's entfernt.

> Ich vermute der 16F628 allein hat mehr "Power" als der ganze
> Chipsatz, der damals erfolgreich dort eingesetzt wurde.

Ja, warscheinlich. Er war dafür aber sicher auch viel anspruchsvoller zu 
programmieren, als die heute üblichen Chips.

von Michael P. (Firma: n.a.) (micha1102)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

Thomas E. schrieb:
> da könnte man durch Drücken von zwei Tasen gleichzeitig während das
> Programm läuft einen netten Programmabsturz provozieren.

Das ist ja tatsächlich ein echtes Problem.
Der Nutzer erwartet zu Recht, das eine Aktion bereits sofort beim Druck 
auf eine Taste startet und nicht erst beim Loslassen.

Das heisst hier, in der Regel würde der Zugriff auf das EEPROM starten 
wenn die auslösende Taste noch lange gedrückt ist.

Um das I2C-Protokoll nicht zu stören, könnte ich nun theoretisch im 
Programm die bestehenden Abtastlücken beim Tastenscan ermitteln und nur 
in dieser Zeit die Zugriffe aufs EEPROM zulassen.

Das Ergebnis wäre bei dieser Methode allerdings sicher 
niederschmetternd: Die Routine würde eine Ewigkeit dauern.

Da mache ich es lieber so:
Für die Zeit der Berechnung schalte ich einfach den gesamten Port B auf 
Eingang. Die Anzeige bleibt dann zwar solange dunkel, gedrückte Tasten 
können aber den Pegel an Port A (und somit die I2C-Kommunikation) nicht 
mehr beeinflussen. Das Lesen vom EEPROM erfolgt so mit maximaler 
Geschwindigkeit.

Ich halte das für die beste Lösung. Und auch bei vielen anderen 
Taschenrechnern bleibt die Anzeige während der (i.d.R. nur ms langen) 
Berechnungen dunkel.

Sollte der Nutzer wider Erwarten zufällig mal zeitgleich 2 untere Tasten 
in der selben Spalte drücken, schliesst er damit die Leitungen SDA und 
SCL kurz.
Ich finde mit dieser Ausnahme kann man leben. Um in diesem Fall die 
Pins A4 und A6 vor Überstrom zu schützen, würde es ausreichen, vor Pin 
A4 einfach einen Widerstand 270 Ohm einzufügen.

m.n. schrieb:
> Auf jeden Fall müssen es mehr als 8 Stellen sein.

Der verwendete PIC könnte mit dem vorliegenden Schaltungskonzept max. 16 
Stellen ansteuern. Für eine akzeptable Helligkeit müsste ich dann jedoch 
den Pulsstrom durch die LED stark erhöhen.
Und hier liegt das Problem: Erstens gibt ein Pin lt. Datenblatt nur 25 
mA her und zweitens: Sollte (z.B. beim Programmtest) das Multiplexing 
mal gestört sein und ein Segment statisch belastet werden, würde es 
bestimmt nicht lange überleben.

Um die Genauigkeit der Rechenergebnisse zu erhöhen, kann ich auch 
rechnerintern mit mehr Stellen arbeiten als angezeigt werden.
Aber es stimmt schon, schicker sieht es mit mehr als 8 Stellen aus.

Für die Nostalgiker unter euch:
Ich habe ein Bild von der TI-Platine mit dem alten Chipsatz angehängt. 
Da der TI58/59 noch immer eine Fan-Gemeinde hat, kann man ihn als 
Emulator unter Windows oder auch Android heute noch nutzen. Optisch, 
funktionell und auch akustisch (Tastencklick und sogar der Druckersound) 
dem Original perfekt nachempfunden.

Beste Grüße

Micha

von Jens G. (jensg)


Lesenswert?

Ich freue mich, das es noch andere gibt, die gerne einen Taschenrechner 
bauen wollen. In meinem Projekt werden auch 24 Tasten verwendet. Alles 
ist offen gelegt und darf gerne verwendet werden.

Beitrag "Taschenrechner: ATmega1284p - 15x 7-Segmentdisplay"

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.