Ein ATTiny2313 eignet sich gut für diesen Zweck, denke ich. Er ist
außerdem preisgünstig und leicht erhältlich.
Das eigentliche Zählen erfolgt ja, wenn ich das richtig verstanden
habe, nicht so, wie ein Binärzähler arbeiten würde, sondern eher im
Sinne einer binären Verschiebeoperation, mit dem Unterschied, daß alle
niederwertigen Bits eingeschaltet bleiben.
Das könnte man mathematisch ganz einfach lösen: Das Hochzählen
entspricht der Rechenvorschrift "neuer_wert=alter_wert*2+1". Das
klappt auch, wenn der alte Wert Null ist (kein Ausgang eingeschaltet).
Dann wird nämlich durch das Addieren von 1 die erste LED eingeschaltet.
Im nächsten Schritt ergibt sich dann aus 1*2+1=3, also binär 11, damit
zwei eingeschaltete LEDs, und so weiter.
Zum Rückwärtszählen ist ganz analog dazu die umgekehrte Funktion
verwendbar, also "neuer_wert=(alter_wert-1)/2". neuer_wert und
alter_wert stehen hier natürlich nur als beliebige Platzhalter für die
wirklich verwendete Variable, abhängig von der Programmiersprache
könnte man natürlich den vorhandenen Wert überschreiben, ohne eine
zweite Variable zu benutzen, also "zahl=zahl*2-1" bzw.
"zahl=(zahl-1)/2". Es soll hier nicht ganz unerwähnt bleiben, daß die
Multiplikation mit, bzw. Division durch 2 ebenso durch binäres Links-
oder Rechtsschieben um 1 erreicht werden kann.
Beim Zurücksetzen des Zählers muß die Zählvariable einfach auf Null
gesetzt werden.
Eine kleine Tücke der ganzen Sache liegt darin, daß 10 Zählausgänge
verwendet werden sollen. Damit überschreitet das Ganze 8 Bit, oder den
Umfang eines Ports. Somit müßte man intern möglichst einen 16
Bit-Datentyp verwenden, das High- und Low-Byte trennen und die unteren
8, bzw. die oberen 2 Bits auf getrennten Ports ausgeben.
Übrigens muß man zum Erfassen der Zählimpulse, wenn man korrekt
vorgehen will, gegebenenfalls steigende und fallende Flanken, also die
Änderung des Zähleinganges von 0 auf 1 oder von 1 auf 0
berücksichtigen.
Das Programm müßte also beispielsweise folgendes tun:
Am Anfang Zählvariable auf 0 setzen.
Portleitungen konfigurieren, z.B. PB0-PB7 und PD0-PD1 als Ausgänge,
PD2-PD4 als Eingänge.
Auf Änderung des Zustandes der 3 Eingangsleitungen warten.
Je nach erfolgtem Ereignis Zustand der Zählvariable ändern, ggf. auf
Überlauf prüfen, Low- und die ersten 2 Bits des High-Bytes auf
Portleitungen ausgeben. Die nicht benötigten Bits des High-Bytes können
mit logischen Und- bzw. Oder-Operationen maskiert werden, falls nötig.
Übrigens kann bei Tastern an den Eingängen eine softwaremäßige
Entprellung nötig sein.
Leider bin ich kein Experte, und kenne mich mit BASIC so gut wie gar
nicht aus. Ich könnte bei Bedarf höchstens ein paar Zeilen C-Code (für
avr-gcc/WinAVR) als Beispiel angeben.