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
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
@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
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
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
@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
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!?
@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
> 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...
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 :-)
DTL? Ja, vielleicht finde ich noch paar KME3-Bausteine in der Kiste.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.