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?
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.
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
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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.