Zahl mit einem Taster schreiben Wie geht das?

OP #2287740
Lesenswert?

Servus erst mal,

leider habe ich keinen Code gefunden und wollte nun fragen ob ihr eine 
Möglichkeit kennt über nur einen Input also mit einem Taster eine 
Binärzahl zu schreiben.
Mein Gedankengang war bislang dass wenn der Taster länger als eine 
Sekunde gedrückt wird, eine 1 geschrieben wird, und bei weniger als 
einer Sekunde eine Null geschrieben.
Dann muss er nur noch nach jedem Loslassen des Tasters einen Bit weiter 
rutschen.
Jetzt versteh ich nur noch nicht wie er zwischen der Drückzeit 
unterscheidet und die Bits weiterschiebt.

Vielen Dank schonmal, Gruß Markus
Gast #2287820
Lesenswert?

Der Striker schrieb:
> Servus erst mal,
>
> leider habe ich keinen Code gefunden und wollte nun fragen ob ihr eine
> Möglichkeit kennt über nur einen Input also mit einem Taster eine
> Binärzahl zu schreiben.
> Mein Gedankengang war bislang dass wenn der Taster länger als eine
> Sekunde gedrückt wird, eine 1 geschrieben wird, und bei weniger als
> einer Sekunde eine Null geschrieben.

Die Grenze wirst du auch kürzer machen können, damit die Eingabe etwas 
schneller möglich ist.  Man kann einen Tastendruck problemlos kürzer als 
500 ms oder auch 250 ms hinbekommen. Wenn du eine Taste kurz antippst, 
liegst du unter 100 ms (je nach Taster natürlich).

> Jetzt versteh ich nur noch nicht wie er zwischen der Drückzeit
> unterscheidet

Indem du sie mißt. Also Timer mitlaufen lassen, beim Drücken den Wert 
des Timers merken, beim Loslassen dann nochmal. Dann die Differenz 
bilden.

> und die Bits weiterschiebt.

Beim Loslassen halt einen Shift machen.
Gast #2287832
Lesenswert?

Man könnte mit 1x drücken = 0 und 2x schnell hintereinander drücken = 1 
arbeiten, dann ist man nicht so vom Timing abhängig.
Du kannst Dir auch spaßhalber mal einen Morsedecoder anschauen um 
Inspiration zu finden (-;
Gast #2287837
Lesenswert?

Draco schrieb:
> Man könnte mit 1x drücken = 0 und 2x schnell hintereinander drücken = 1
> arbeiten, dann ist man nicht so vom Timing abhängig.

Du verlagerst die Abhängigkeit nur von der Drückdauer auf die 
Pausendauer und mußt erkennen, wie oft hintereinander mit kurzer Pause 
gedrückt wurde.
#2288550
Lesenswert?

Der Striker schrieb:
> Rolf Magnus schrieb:
>
>>
>> Beim Loslassen halt einen Shift machen.
>
> Jetzt müsste ich nur noch wissen wie der Shift funktioniert.
> Meine Idee war bislang den Taster mit allen 8 Pins zu verbinden und dann
> jeweils nur den Pin als eingang zu schalten der benötigt wird.
>

Bitmanipulation

sowie jedes C-Buch.

Ach komm, das sind doch alles Grundlagen.
Gast #2288566
Lesenswert?

ich gehe mal davon aus dass du die Serielle Schnittstelle benutzt. Dann 
musst du nur den Pin mit einer Zeitschleife abfragen. In Visual Basic 
gibt es keine Bitmanipulation, an welcher Stelle hakt es denn genau?


Pete
Gast #2288821
Lesenswert?

Der Striker schrieb:
> Sorry dass ich mich etwas doof anstelle, bin leider noch blutiger
> Anfänger und habe mein Board erst seit ein paar Tagen.

Das bedeutet aber nicht, daß du deshalb gleich essenzielle Informationen 
weglassen mußt, wie z.B. was für einen µC du eigentlich programmieren 
willst und vor allem, welche Programmiersprache du dir dafür ausgesucht 
hast.
#2289120
Lesenswert?

Peter schrieb:
> In Visual Basic
> gibt es keine Bitmanipulation,

Bist Du sicher???
Haben die Bytes in VB keine Bits??
Gibt es kein AND, OR, NOT, EOR??

Bitmanipulation ist kein kryptischer Befehl, sondern die 
Verfahrensweise, wie man einzelne Bits setzt, löscht oder kippt, ohne 
die anderen Bits dabei zu beeinflussen. Das ist in jeder (ernsthaften) 
Programmiersprache möglich, kann aber in jeder Sprache ein kleines 
bissel anders aussehen.

...
Gast #2289138
Lesenswert?

Draco schrieb:
> Man könnte mit 1x drücken = 0 und 2x schnell hintereinander drücken = 1
> arbeiten, dann ist man nicht so vom Timing abhängig.

Naja, statt die Dauer des Tastendrucks auszuwerten, muß man dann halt 
die Dauer der Pausen ausmessen. SO riesig ist der Unterschied nicht.
Gast #2289444
Lesenswert?

Hi
Ich weiß nicht, warum unbedingt unterschiedliche Betätigung eines 
Tasters in Frage kommt. Warum nicht die steigende oder fallende Flanke 
bei Tastendruck erkennen und ein Byte hochzählen lassen.Bestenfalls eine 
Pase zum detektieren vom Weiterschalten einer Dekade oder zum Resetten 
des Zählers für Neuanfang. Viele Bauteile mit abgespekter Bedienebene 
arbeiten so. Es ist auch viel einfacher, da man hier ganz normal die 
Prellzeit abwarten kann und nicht in "Bedienstreß" verfällt. 1 sekunde 
kein Tastersignal, dann halt nächster Zähler....
Ne Flankenauswertung ist auch kein Problem...
Old_Wert exclusiv-Oder Neuwert -- Gesetzte Bits sind "Änderungen"
neu_Wert verundet  mit Änderung -- Signalwechsel von "0" nach "1"
Old_Wert verundet mit Änderung  -- Signalwechsel von "1" nach "0"
Flankenbit abfragen, wenn gesetzt, dann zählen und Flankenbit löschen, 
oder geht es wirklich darum, einzelne Bits zu setzen ? Nun auch das 
geht, ist aber zugegebenermaßen nicht lustig, eine 8-Bitzahl von 255 zu 
erreichen....
Gruß oldmax
OP #2293852
Lesenswert?

Rolf Magnus schrieb:

> Das bedeutet aber nicht, daß du deshalb gleich essenzielle Informationen
> weglassen mußt, wie z.B. was für einen µC du eigentlich programmieren
> willst und vor allem, welche Programmiersprache du dir dafür ausgesucht
> hast.

Sorry dass ich das weggelassen habe. Ich verwende einen Mega16 und 
programmiere in C.
Für den, den es interessiert, habe ich das Problem mit der 
Unterscheidung der Zeit nun so gewandelt dass ich keine Zeit oder Flanke 
messe sondern einfach den Analog-Eingang verwende und vor diesen einen 
Folienkondensator geschaltet habe der über einen 10MOhm Widerstand 
geladen wird. Dann brauchte ich nur eine Fallunterscheidung einbauen ob 
die Spannung größer oder kleiner ist.
Das ganze schien mir einfacher und ich habe noch mehr Pins frei falls 
nochmal mehr angeschlossen wird.

Gruß, Markus
#2293890
Lesenswert?

Der Striker schrieb:
> den Analog-Eingang verwende und vor diesen einen
> Folienkondensator geschaltet habe der über einen 10MOhm Widerstand
> geladen wird.


Höchste Zeit, mal ins Datenblatt zu schauen. Da gibt es nämlich sone 
ulkigen Dinger, die nennen sich Timer.
Und die machen genau das, nämlich einen fortlaufenden Wert zu liefern, 
der proportional zur Auslesezeit ist.

Um zu wissen, ob eine bestimmte Zeit vergangen ist, muß man sie nichtmal 
auslesen. Man setzt einfach eines der Compareregister auf die gewünschte 
Zeit und testet dann das Compareflag.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren