Forum: Compiler & IDEs Taster einlesen und entprellen


von Robert S. (robert_s)


Lesenswert?

Hallo an alle!!

So, ich hab da einmal eine Frage. Ich muss für eine Menüsteuerung 4
Tasten einlesen.

Entweder ich mach es mit externen Interrupts oder ich frage alle zb
10ms die Taster ab.
Was ist da besser geeignet??

Wenn ich das ganze mit dem Timer mach lassse ich den 8 Bit Timer im
Output Compare Modus laufen. Dabei zähle ich von 0 - 99. So treten bei
16MHz Taktfrequens und einem Prescaler von 64 25 Interrupts pro 10ms
auf, oder??

Dann erhöhe ich in der Interruptroutine eine Zählervariabele und prüfe
ob sie größergleich 25 ist. Wenn ja, setze ich die Variable auf 0 und
frage die Taster ab.

Aber die Taster prellen doch meistens mehr als 10ms oder? Also muss ich
das ganze noch Softwaretechnisch entprellen. Oder besser von der
Hardwareseite??

Ich könnte doch zB 10x prüfen ib der Taster gedrückt ist, oder?? Doch
wie mache ich das am besten?? Ich hab eine Variable die mit 10
initialisiert wird. Dazu habe ich noch eine Statusvariable. In der
steht ob der TAster gedrückt war. Wenn in der 0 steht, dann prüfe ich
ob der TAster gedrückt ist. Wenn ja, dann schreibe ich eine 1 in die
Variable. Wenn in der Variable eine 1 steht, dann prüfe ich den Taster,
wenn ja, veringere ich die Zählervariable (die am Anfang auf 10 stehet).
Wenn eine 1 in der Variable steht und der TAster nicht gedrückt ist,
dann schreibe ich wieder eine 0 in die Statusvariable und in die
Zählervariable schreibe ich wieder eine 10.

Kann ich das so machen?? Sind 10 Prüfungen zu wenig?? Das wären 100ms.

Kann ich das noch anderes lösen??

Dank eim Voraus

Gruß Robert

von johnny.m (Gast)


Lesenswert?


von Otto Richter (Gast)


Lesenswert?

Hallo Robert,

ich arbeite seit einiger Zeit (als absoluter Anfänger) an einem
Projekt, in dem es 16 Tasten gibt. Mir war von Anfang an klar, dass man
so 'was nur seriös mit Interrupts macht. Es gibt eine Applikation von
ATMEL, heißt irgendwas mit "..4x4-keypad.." (atmel.com). Da siehst
Du, wie der Interrupt erzeugt wird und wie man mit 8 IOs bis zu 16
Tasten abfragt. Es ist doch beknackt, wenn der AVR alle 10ms
nachschauen soll, ob eine Taste gedrückt wurde.

Entprellen habe ich mit einem delay gemacht: es kommt also ein oder
mehrere Interrupts, der AVR verzweigt bereits bei 1. in die ISR, wartet
dann etwas und das Programm schaut dann nach, ob die Taste noch gedrückt
ist.

Ist auch nicht 100% elegant, weil das delay den Prozessor aufhält und
in der Zeit nur max. 1 weitere Interrupt  (nach dem delay) abgearbeitet
werden kann. Wenn mehr als 1 Interrupt kommt, sind die anderen
verloren.

Im Tutorial ist ein Beispiel für eine Entprellung, das ich aber noch
nicht genauer angesehen habe, weil ich es zu spät gefunden habe. Das
scheint sehr eklegant zu sein, weil es mit Timern arbeitet und eine
Repeat-Funktion hat.

Wenn Du willst, kann ich Dir auch meinen gcc-code schicken, ich muss
ihn nur "freischneiden". Mail mich an !

otto-richter@versanet.de

(endlich kann ich 'mal einen einigermaßen fundierten Beitrag zum Forum
schreiben).

Otto

von Peter D. (peda)


Lesenswert?

@Otto

"Es ist doch beknackt, wenn der AVR alle 10ms nachschauen soll, ob
eine Taste gedrückt wurde."


Warum sollte das beknackt sein ?

10ms sind 160.000 Zyklen bei 16Mhz.
Angenommen die Abfrageroutine dauert 100 Zyklen, dann sind das ja
wahnsinnige

100/160.000 = 0,06% CPU-Last

Kein Mensch auf der Welt kann merken, wenn die CPU um 0,06% langsamer
läuft.


Peter

von Otto Richter (Gast)


Lesenswert?

Hi Peter

wenn Dein chip nichts weiter zu tun hat, kein echtes Problem. Im
Übrigen ist das Ganze möglicherweise wirklich nur Kosmetik. Aber der
Interrupt wurde erfunden, um ausglöst zu werden und um der
Echtzeitfähigkeit näher zu kommen.

Außerdem bin ich stolz mit meinen 57 Jahren auf dem Buckel und einem
halben Jahr C-Erfahrung so 'was 'hingekriegt zu haben ( smilie ) ;

Otto

von chris (Gast)


Lesenswert?

Hallo,

bin auch noch C Anfänger, aber habe auch schnell gemerkt das INT´s oft
besser sind. Ich baue bis dato eigentlich immer Module mit Battarien
auf und ein INT kann den µC schon aus dem powerdown ziehen. Das spart
irre viel Strom.

cu

von Peter D. (peda)


Lesenswert?

@Otto

"wenn Dein chip nichts weiter zu tun hat, kein echtes Problem."


Lies Dir nochmal die genannte Zahl durch:

0,06% !!!

D.h. auch wenn er zu 99,93% beschäftigt wäre, schafft ers noch.

In der Regel können MCs nur von sehr erfahrenen Programmierern zu >=50%
ausgelastet werden
Die meisten Programme nutzen aber nur 1% .. 20% und verbummeln den Rest
in Warteschleifen.



"Aber der Interrupt wurde erfunden, um ausglöst zu werden und um der
Echtzeitfähigkeit näher zu kommen."


Nein, er wurde erfunden, um Echtzeitfähigkeit zu garantieren, was heißt
innerhalb der geforderten Zeit zu reagieren.
Anforderungen müssen immer eingehalten werden, näherkommen ist
ungenügend.


Aber da eh kein Mensch 10ms Verzögerung warnehmen kann, ist auch eine
Tastenentprellung mit nem 10ms Timerinterrupt absolut echtzeitig.

Die externen Interrupts sind dagegen Sachen vorbehalten, die wirklich
schnell sein müssen (wenige µs Latenzzeit), z.B. Interrupt des
Ethernetchips, Überlastabschaltung eines Schaltreglers usw.


Peter

von Der Albi (Gast)


Lesenswert?

Warum macht man sich den ganzen Stress, wenn man das doch Hardwaremäßig
entprellen kann?? Ist natürlich eine Frage der Taster.. aber könntest
du nicht einfach kleine Kondensatoren  parallel schalten, die geladen
werden, wenn die Taste gedrükt ist und somit die Prell-Fehler
ausgleichen? Wenn du die Taste Loslässt, musst du sie natürlich wieder
entladen also kurzschließen. D.h. du brauchst Taster, die nicht nur
einen Staturs haben können.
Wäre das nicht einfacher!?

von Peter D. (peda)


Lesenswert?

@Albi,

"Warum macht man sich den ganzen Stress, wenn man das doch
Hardwaremäßig entprellen kann??"


http://www.mikrocontroller.net/forum/read-4-310276.html#new

Wo siehst Du da Streß ?

Ich sehe nur Einfachheit und Komfort.

Entprellen ist nur so nebenbei, Gedrückt-Erkennung,
lang-/kurz-Erkennung, Wiederholfunktion braucht man doch auch oft.


Extra Hardware muß man jedesmal einlöten.
Die Software entwickelt man einmal und dann vergißt man sie und wendet
sie nur noch an.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Warum macht man sich den ganzen Stress, wenn man das doch
> Hardwaremäßig entprellen kann?

Genau.  Wofür den Stress mit den blöden Controllern, man kann
das auch alles in Hardware machen.

Jörg, schnell seine 74xxx-Kiste wieder ausgrabend...

von Karl heinz B. (kbucheg)


Lesenswert?

74xxx ?
Neumodisches Klumpert.
Sowas kann man auch mit NOR-Gattern alleine machen.
Was gut genug für Apollo war, wird doch wohl noch
gut genug für dich sein :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

DTL?  Ja, vielleicht finde ich noch paar KME3-Bausteine in der
Kiste.

von AxelR. (Gast)


Lesenswert?

und dazu das passende ELJABU, in welchem die Dinger beschrieben sind
:-))

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.