Forum: Mikrocontroller und Digitale Elektronik Zahl mit einem Taster schreiben Wie geht das?


von Der S. (striker89)


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

: Verschoben durch Moderator
von Rolf Magnus (Gast)


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.

von Draco (Gast)


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 (-;

von Rolf Magnus (Gast)


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.

von Der S. (striker89)


Lesenswert?

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.

Gruß, Markus

von Karl H. (kbuchegg)


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.

von Peter (Gast)


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

von Der S. (striker89)


Lesenswert?

Herzlichen Dank für eure Antworten, ich habs jetzt geschafft, zumindest 
die 8-Bit Zahlen. Aber 16 ist ja auch nicht mehr schwer.

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

Gruß, Markus

von Rolf Magnus (Gast)


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.

von Hannes L. (hannes)


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.

...

von Michael (Gast)


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.

von Oldmax (Gast)


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

von Peter D. (peda)


Lesenswert?


von Der S. (striker89)


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

von Bitschieber (Gast)


Lesenswert?

Also offensichtlich ein Troll.
Menschen, die einen ADC in Betrieb nehmen können, aber keine Bits 
verschieben können gibt es nicht.

von Peter D. (peda)


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

von Der S. (striker89)


Lesenswert?

Peter Dannegger schrieb:

> 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

Danke für den Tipp mit dem Flag, dass macht das ganze noch etwas 
übersichtlicher.

von Utah (Gast)


Lesenswert?

Mann nennt das auch morsen ;-).

Dafür gibt es Beuspielcode zu Hauf !

von MarioT (Gast)


Lesenswert?

Bitschieber schrieb:
> Also offensichtlich ein Troll.
> Menschen, die einen ADC in Betrieb nehmen können, aber keine Bits
> verschieben können gibt es nicht.

Doch!
Es kommt nur darauf an, welches Tutorial man gerade liest.

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.