Forum: Mikrocontroller und Digitale Elektronik Zähler programmieren


von Sven Kindermann (Gast)


Lesenswert?

Hallo

Würde gern mit Bascom ein Programm schreiben. Ich weiß aber leider
nicht wie ich anfangen soll. und welchen Chip ich nehmen sollte.
Es sollen 3 Eingänge und 10 Ausgänge vorhanden sein.
Ein Eingang soll ein Reset Eingang sein der alle 10 Ausgänge wieder auf
0 setzt.
Ein Eingang soll zum "hochzählen" sein. Also einmal betätigen und
Ausgang 1 wird 1. Noch betätigen dann bleibt Ausgang 1 auf 1 und
zusätzlich wird Ausgang 2 auf 1 gesetzt usw bis Ausgang 10 "1" ist.
Der dritte Eingang ist zum runterzählen. Sind also z.B. die ersten 6
Eingänge 1 und es wird "runterzählen" aktiviert wird immer ein
Ausgang auf 0 gesetzt.

Kann mir jemand vielleicht eine Starthilfe geben?

von Sebastian Eckert (Gast)


Lesenswert?

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.

von Fred (Gast)


Lesenswert?

Hi,

ich möchte Dich ja jetzt nicht von der Idee eines eigenen Programms etc
abbringen, aber warum nimmst Du nicht ein vorgefertigtes IC? Mit würden
da spontan Dezimalzähler und Schieberegister einfallen, die exakt für
die gewünschte Anwendung entwickelt wurden. Ein Datenblatt habe ich
zwar grade nicht zur Hand, aber bei www.alldatasheet.com sollte sich
was finden. Oder googeln.
Gruß

Fred

von Hannes L. (hannes)


Lesenswert?

Das "selbst programmieren wollen" ist schon ok.

Jetzt muss die zu lösende Aufgabe in kleine, überschaubare Aufgaben
zerlegt werden.

Zuerst die Controllerwahl: Tiny2313 reicht für diesen Zweck.

Dann die Aufgaben des Programms:

- Taster einlesen und entprellen
  http://www.mikrocontroller.net/articles/Entprellung

- eine Zählvariable hoch/herunter zählen und dabei die Endwerte
  begrenzen

- zu jedem Zählerstand das Bitmuster für 2 Ports ermitteln und an die
  Ports ausgeben, ohne die unbenutzten Bits (also die Eingänge) zu
  beeinflussen.

Wenn ich das schreiben müsste (in ASM), würde ich in einem
Timer-Interrupt alle 10ms..20ms die Entprellroutine für 8 Taster von
Peter Dannegger ausführen.
Dann würde ich in der Mainloop die Tastenflags abfragen (und löschen),
den Zähler erhöhen/vermindern und auf die Grenzwerte (0..9) testen,
also verhindern, dass diese Werte unter- oder überschritten werden.
Diesen Zählerstand würde ich als Index für eine Lookup-Tabelle (im
Flash) nutzen, um mittels LPM die entsprechenden Bitmuster zu
ermitteln.
Wenn einer der Ports nur Ausgang ist (alle 8 Bits), dann genügt es, das
zugehörige Bitmuster mit OUT direkt auszugeben.
Ist der Port "gemischt" Eingang und Ausgang, so ist der Port mit IN
in ein Hilfsregister einzulesen, dann sind mit CBR die veränderbaren
Bits zu löschen und mit OR die benötigten Bits zu setzen. Danach wird
das Hilfsregister mit OUT an den Port zurück geschrieben. Somit werden
nur die gewollten Bits verändert, die anderen Bits bleiben erhalten.

Im Prinzip ist dieses Programm eine gute Übungsaufgabe auf dem Weg zu
einem Programm, das eine 7-Segment-Ziffernanzeige (auch mehrstellig
multiplex) ansteuern kann. Es ist also keinesfalls Unfug.

...

von Fred (Gast)


Lesenswert?

Hi,

ich wollte ja nicht sagen, dass es generell Mist wäre. Mir sind bloß
die oben genannten ICs in den Sinn gekommen, da die das ja von Haus aus
können. Allerdings fällt mir jetzt ein, dass bei der IC-Lösung ja auch
ein entprellen der Taster nötig wäre, welches dann natürlich in
Hardware realisiert werden sollte.
Als Übungsprojekt für den Umgang mit µP ist die Thematik aber auf alle
Fälle gut geeignet.
Gruß

Fred

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.