Guten Tag,
ich möchte mit jedem Taster einen Kanal Einschalten, wenn der jeweilige
Kanal gewählt wird soll der zuletzt gewählte Kanal ausgeschaltet werden,
das heisst es darf kein anderer eingeschaltet werden, wie kann ich hier
am besten vorgehen um die fünf Taster gegenseitig zu verriegeln ??
vielleicht kann mir bitte jemand weiterhelfen ??
Michael H. schrieb:> um die fünf Taster gegenseitig zu verriegeln ??
indem du nur definiert 1 Bit in PORTC setzt...
Umständlicher kann man es machen, wenn man beim Setzen eines Bits
gezielt die anderen Bits rücksetzt.
Erstmal ist es natürlich ganz einfache: wird eine Taste erkannt wird das
entsprechende Bitmuster auf den Port geschrieben, was nur eine 1 hat.
Interessanter werden dann die Randbedingen. Was passiert wenn mehrere
Tasten "gleichzeitig" gedrückt werden? Gar nichts? Die zuerst gedrückte
gewinnt? oder die zuletzt losgelassene? Schöner ist es, wenn direkt beim
Drücken was passiert und nicht erst beim loslassen. Also muss in der
Zeit, in der eine Taste noch gedrückt ist, die weitere
Abfrage/Auswertung unterbleiben. Neu geht erst wieder, wenn alle
losgelassen wurden.
npn schrieb:> Michael H. schrieb:>> um die fünf Taster gegenseitig zu verriegeln ??>> indem du nur definiert 1 Bit in PORTC setzt...
das ist das, was ich ausprobieren möchte, nur kann ich mir gerade
überhaupt nicht vorstellen wie das aussehen soll, kann mir bitte hier
jemand einen Ansatz zeigen
Hallo,
Wichtiger ist noch, dass man alle Taster sauber abfragt (entprellt) und
auch die Ereignisse, Taster wurde gedrückt oder losgelassen, reagieren
kann.
Es fehlt also noch eine Timer basierenede Tasterentprellung.
Dann würde ich ein Ausgang-Bit-Variable <bit_output> definieren, die die
realen Ausgangszustände abbildet.
Dann kann man doch einfach die neue gedrückte Taste in der zugehörigen
Bitposition der Variable <bit_output> setzen und der Ausgabefunktion
übergeben.
Diese setzt oder löscht dann anhand einer "0" oder "1" an einer
Bitposition das zugeordnete Bit am Ausgang.
Karl M. schrieb:> Hallo,>> Wichtiger ist noch, dass man alle Taster sauber abfragt (entprellt) und> auch die Ereignisse, Taster wurde gedrückt oder losgelassen, reagieren> kann.>> Es fehlt also noch eine Timer basierenede Tasterentprellung.
also die Entprellung soll anders stattfinden und zwar indem ich einen
invertierenden Schmitttriger zwischen Taster und I/O schalte.
Dann würde ich ein Ausgang-Bit-Variable <bit_output> definieren, die die
realen Ausgangszustände abbildet.
Dann kann man doch einfach die neue gedrückte Taste in der zugehörigen
Bitposition der Variable <bit_output> setzen und der Ausgabefunktion
übergeben.
Diese setzt oder löscht dann anhand einer "0" oder "1" an einer
Bitposition das zugeordnete Bit am Ausgang.
das kapier ich irgendwie nicht, gibt es da irgendwo ein Beispiel oder
ähnliches wo ich mir das mal abschauen kann ?
Hallo,
ich habe die Aufgabenstellung mal in LunaAVR herunter programmiert,
vielleicht findest Du Anregungen.
Die Syntax zu Verstehen, sollte nicht so schwer sein.
Bitte beachte die Modularisierung der verschiedenen Abschnitte des
Programms.
https://avr.myluna.de/doku.php?id=de:download
Version Main Release 2018 R2
Michael H. schrieb:> das heisst es darf kein anderer eingeschaltet werden
Dann ist es auch überflüssig, 5 x int für die Taster zu speichern, es
reicht einer, der die Nummer des Tasters enthält, das macht den Zustand
von vornherein eindeutig. Ein Tastendruck setzt den Zustand auf die
zugehörige Nummer, und es wird das zur Nummer gehörende Bitmuster
ausgegeben. Oder ist das zu kompliziert?
Georg
Karl M. schrieb:> Es fehlt also noch eine Timer basierenede Tasterentprellung.
Die Entprellung in diesem Spezialfall hier entbehrlich, weil es nur
darum geht, zu erkennen, dass ein Taster min. 1x gedrueckt wurde. Ob das
1x oder 100x erkannt wird, aendert nichts.
wendelsberg
Karl M. schrieb:> Wichtiger ist noch, dass man alle Taster sauber abfragt (entprellt)
Spielt bei dieser Anwendung keine Rolle.
Das Problem hier ist die Aufgabenstellung. Die entspricht nämlich NICHT
einem Tastenaggregat.
Michael H. schrieb:> ich möchte mit jedem Taster einen Kanal Einschalten, wenn der jeweilige> Kanal gewählt wird soll der zuletzt gewählte Kanal ausgeschaltet werden,> das heisst es darf kein anderer eingeschaltet werden
sondern einem dead lock, bricked: Wenn EIN Mal ein Kanal durch
Tastendruck gewählt wurde (wer zuerst kommt mahlt zuerst) kannn NIE MEHR
ein anderer gewählt werden, denn die sind ja nun verriegelt und kann
nicht mehr eingeschaltet werden.
Da er aber von "der zuletzt gewählte ausgeschaltet" redet, meint er wohl
nicht, was er hier als Blödsinn hingeschrieben hat. Er soll sich erst
mal lklar werden, welche Logik er wirklich will, dann kann man die auch
implementieren. Denn Unlogik macht ein Prozessor nicht mit.
Eventuell sind die anderen Kanäle nur so lange verriegelt, bis der
zuerst gedrückte Taster wieder lisgelassen wird. Wenn dann aber mehrere
andere Taster immer noch gedrückt gehalten wurden, wäre die Frage,
welchen man seinen Ausgang einschalten lässt. Oder erst denjenigen, den
man erneut niederdrückt. Viele Interpretationsmöglichkeiten der
halbgaren Aufgabe.
Michael H. schrieb:>> indem du nur definiert 1 Bit in PORTC setzt...> das ist das, was ich ausprobieren möchte, nur kann ich mir gerade> überhaupt nicht vorstellen wie das aussehen soll, kann mir bitte hier> jemand einen Ansatz zeigen
Gerne
(PORTC & ~AlleKanaele) setzt alle Kanäle auf Low und lässt die übrigen
Bits unverändert.
| Kanal1 setzt den gewünschten Kanal auf High.
Beides zusammen löscht also alle Kanäle und setzt den einen gewünschten
Kanal. Dieser Lösungsansatz setzt voraus, dass alle Kanäle im selben
Port sind.
wendelsberg schrieb:> Die Entprellung in diesem Spezialfall hier entbehrlich, weil es nur> darum geht, zu erkennen, dass ein Taster min. 1x gedrueckt wurde. Ob das> 1x oder 100x erkannt wird, aendert nichts.
Wie auch immer...
Ich kann dir ein Arduino Beispiel liefern, wie sowas aussehen könnte.
Habe ich aus einem anderen Projekt raus geschnitten, und so eben auf
dein Problem angepasst.
Die betreffenden Pins/Ports sind anders konfiguriert, um es testen zu
können.
Da ist also Anpassungsarbeit nötig.
Findet sich aber alles schön übersichtlich in einem Array.
Leider kann ich gerade kein C testen, darum C++ Code.
Allerdings ist der Code sehr C artig.
Sollte also umformbar sein.
Für C müssten die Daten Typen und die Schleifen umgebaut werden.
wendelsberg schrieb:> Die Entprellung in diesem Spezialfall hier entbehrlich
Jain.
Eine Entprellung schützt auch gegen "zufälliges" Umschalten durch
Störimpulse. Tasten werden erst dann als gedrückt gemeldet, wenn der
Pegel einige ms stabil anliegt.
Die Verriegelung macht man am einfachsten mit je einem Encoder/Decoder.
Michael H. schrieb:> ich möchte mit jedem Taster einen Kanal Einschalten, wenn der jeweilige> Kanal gewählt wird soll der zuletzt gewählte Kanal ausgeschaltet werden,> das heisst es darf kein anderer eingeschaltet werden, wie kann ich hier> am besten vorgehen um die fünf Taster gegenseitig zu verriegeln ??
Hallo, ich kann zwar kein "C" oder so was...aber ich denke, wenn dein
Programm mit Initialisieren fertig ist, dann ist jeder Kanal inaktiv und
du wartest auf eine Eingabe. Das erste Eingabe-Low, das du pollst, setzt
den Eingang und setzt alle anderen zurück. Wenn nun jemand schlau
"Klavier spielt", dann gewinnt immer Einer...und alle anderen sind raus.
Wie du nun die zeitlichen Zuordnungen zwischen den Signalen legst, ist
allein dein Gustus. Viel kann man da nicht falsch machen! Es sei denn du
hast Menschen, die Eingaben im Bereich des Prozessortakts tätigen
können.
Gruß Rainer