Hallo alle zusammen, ich bin gerade dabei den Umgang mit dem ATmega zu erlernen :D Im Moment möchte ich ein kleines Codeschloss zusammenbauen. das Tastenfeld soll 12 Tasten (0-9, OK, ABBRECHEN) haben. Um die Tasteneingaben soll sich ein ATmega8 kümmern, und dann seriell die Daten einem ATmega32 übertragen. Da jedoch der ATmega8 nur 2 Interrupt-Pins besitzt, und die Tastenanschläge in einer Schleife zu prüfen mir recht unsicher vorkommt, da der Tastendruck auch gedrückt werden kann, während der Mikrocontroller gerade nicht am überprüfen ist, weil er zb irgend etwas anderes am machen ist, habe ich mir gedacht, dass ich einmal die Tasten an die Pins schließe und jeweils alle gemeinsam an einen Interrupt-Pin. Sobald dann ein Interrupt auftritt überprüft der Mikrocontroller, welcher der Pins auf HIGH ist und erkennt so dann, welche Taste gedrückt wurde. Mein Problem ist, dass mir mein Schaltplan etwas umständlich erscheint. Ich wollte es zuerst so aufbauen, wie im hochgeladetem Bild (Vereinfachte Darstellung mit 3 Tastern). Dann ist mir aufgefallen, dass die Pins noch mit einem Pull-Down-Widerstand verbunden werden müssen, da ansonsten ein undefiniertes Ergebnis herauskommt. Ich könnte jetzt entweder die Leitungen direkt über Pull-Down-Widerstand mit GND verbinden, was jedoch dazu führen würde, dass bei Knopfdruck ALLE Pins High sind (Total falsches Ergebnis), oder ich könnte wie am INT0-Pin die Pins alle über Dioden gegen Auswirkungen anderer Pins "schützen". Letzteres finde ich aber doof, da ich dann 24 Dioden auf meinem Steckbrett habe (2 für jede Taste) :P Hat jemand ein Vorschlag, wie ich das besser hinkriegen könnte? Grüße, Matthias
Mach es so, wie es sich tausendfach bewährt hat. Schalte gegen GND, nutze die internen Pull up Widerstände und frage die Taster per Polling ab. Entprellung nicht vergessen.
Oder alle Taster in Reihe mit je einem Widerstand parallel und ab durch
den ADC. Braucht 6 verschiedene Widerstandswerte und einen Pin am uC.
>während der Mikrocontroller gerade nicht am überprüfen ist,...
Egal mit welchem Hardwareaufbau: Timerinterrupt (z.B. alle 10ms) lässt
sich immer zum Auslösen der Abfrage verwenden.
viel Erfolg
Hauspapa
Ein Taster hat NICHTS aber auch überhaupt nichts an einem Interrupteingang zu suchen! Hier steht was zur Tasterentprellung. Und ja man fragt Taster periodisch ab. http://www.mikrocontroller.net/articles/Entprellung
Hauspapa schrieb: > Oder alle Taster in Reihe mit je einem Widerstand parallel und ab durch > den ADC. Braucht 6 verschiedene Widerstandswerte und einen Pin am uC. ..... > viel Erfolg > Hauspapa Oh, bei Peter abgeschaut ? (Danni)
:
Bearbeitet durch User
Matthias S. schrieb: > Im Moment möchte ich ein kleines Codeschloss zusammenbauen. das > Tastenfeld soll 12 Tasten (0-9, OK, ABBRECHEN) haben. Um die > Tasteneingaben soll sich ein ATmega8 kümmern, und dann seriell die Daten > einem ATmega32 übertragen. Versteh ich richtig: ein ATmega8 als Tastaturkontroler für ein Codeschloss mit ATmega32? MfG Klaus
>Oh, bei Peter abgeschaut ? (Danni)
Nein, aber auch nicht überrascht wenn das andere auch so machen.
schönen Abend
Hauspapa
>Ein Taster hat NICHTS aber auch überhaupt nichts an einem >Interrupteingang zu suchen! Die Aussage kann ich nicht unterstützen. Es kommt auf den Mikrocontroller, Aufgabenstellung etc an.
Wow, ich hab nicht erwartet, dass so schnell so viele Antworten kommen würde :D Das mit den internen Pull-Up-Widerständen hatte ich ja völlig vergessen. Das würde wirklich die Sache vereinfachen. Das mit dem ADC-Wandler. Wenn man mehrere Knöpfe drückt, entstehen doch dann andere Widerstände und man würde dann, wenn man mehrere Knöpfe drückt, seltsame Werte rauskriegen, oder sehe ich da etwas falsch? Stimmt, ich könnte auch mit einem Timerinterrupt die Zustände Prüfen, ohne dass der Hauptcode (Was auch immer da reinkommen wird :D) unterbrochen wird. An die Tastenentprellung habe ich garnicht gedacht, aber wenn man ja über Timerinterrupt die Pins überprüft, dann benötigt man keine Entprellung, oder? Ja, der ATmega8 dient als Controller für das Tastenfeld. Der ATmega32 dient als Hauptcontroller. Ich habe einen ATmega32 genommen, weil die ganze Schaltung nur zu Lernzwecken dient (Alles auf dem Steckbrett) und durch die vielen Pins kann ich allerlei Schnick-Schnack zum Ausprobieren noch anhängen. Danke euch Allen, Ich werde es wahrscheinlich die Taster mit GND und den Pins verbinden, die Pullup-Widerstände einschalten und dann mit einem Timer-Interrupt die Zustände immer abfragen. Ich werde es morgen dann mal ausprobieren, wenn etwas nicht klappt, nerve ich weiter :D Grüße, Matthias
Stephan Henning schrieb: > Hauspapa schrieb: >> Oder alle Taster in Reihe mit je einem Widerstand parallel und ab durch >> den ADC. Braucht 6 verschiedene Widerstandswerte und einen Pin am uC. > ..... > >> viel Erfolg >> Hauspapa > > Oh, bei Peter abgeschaut ? (Danni) Ich denk mal eher, er hat ne Senseo aufgeschraubt ;-)
Stephan Henning schrieb: > Oh, bei Peter abgeschaut ? (Danni) Wieso muss man sich sowas abschauen? Den 'Trick', dass man mit geschalteten Widerständen unterschiedliche Ströme fliessen lässt, mit denen man auf der 'anderen Seite' unterschiedliche Aktionen auslösen kann habe ich mir schon als Kind 'einfallen' lassen. Das war in den 70ern. Ich weiß: Heutzutage würde man dafür ein Patent beantragen ... Dirk schrieb: > Die Aussage kann ich nicht unterstützen. Es kommt auf den > Mikrocontroller, Aufgabenstellung etc an. Nein, prellende Taster gehören NIE an einen Interupt. Das ist schon vom Design her Murks. Matthias S. schrieb: > Das mit dem ADC-Wandler. Wenn man mehrere Knöpfe drückt, entstehen doch > dann andere Widerstände und man würde dann, wenn man mehrere Knöpfe > drückt, seltsame Werte rauskriegen, oder sehe ich da etwas falsch? Nö, siehst Du nicht falsch. Die Frage ist aber, ob Du mit der korrekten Kombination Dein Codeschloss öffnen möchtest oder ob Du wild Tasten drücken möchtest. Im ersten Fall drückst Du immer nur eine Taste. Matthias S. schrieb: > An die Tastenentprellung habe ich garnicht gedacht, aber wenn man ja > über Timerinterrupt die Pins überprüft, dann benötigt man keine > Entprellung, oder? Doch. Man vergleicht einfach die Tastenzustände mit den Tastenzuständen vom vorherigen Durchlauf. Sind die identisch, wird das Ergebniss in die Ausgangsvariable übernommen. Matthias S. schrieb: > Ja, der ATmega8 dient als Controller für das Tastenfeld. Der ATmega32 > dient als Hauptcontroller. Ich habe einen ATmega32 genommen, weil die > ganze Schaltung nur zu Lernzwecken dient (Alles auf dem Steckbrett) und > durch die vielen Pins kann ich allerlei Schnick-Schnack zum Ausprobieren > noch anhängen. Gut, um Kommunikation zwischen Controllern zu spielen okay. Aber für ein Codeschloss ist ein ATmega8 schon unterfordert. Die Herausforderung liegt auch nicht darin, für jede Funktion einen Controller zu nehmen, sondern darin alle Funktionen in einen Controller zu bekommen. Beispiel: An einen ATmega8(48,88,...) werden folgende Komponenten angeschlossen: Quarz, LC-Display (HD44780), 15 Taster, Optokoppler als Eingang mit IRQ, 2 Transistoren werden angesteuert, die serielle Schnittstelle wird benutzt, 2 ADC-Eingänge und 2 16-Bit PWM Ausgänge, sowie der I²C-Anschluss werden benötigt. Der Controller ist ausserdem in der Schaltung via ISP programmierbar. Haben gerade 2 meiner Lehrlinge aufgebaut, kannst Du Dich ja evtl. auch mal dran versuchen. Ist bei uns die Ansteuerung für ein Netzteil. Aber wir haben festgestellt, dass sich die Platine super zum lernen eignet. Gruß Jobst
Matthias S. schrieb: > An die Tastenentprellung habe ich garnicht gedacht, aber wenn man ja > über Timerinterrupt die Pins überprüft, dann benötigt man keine > Entprellung, oder? Doch, natürlich. Sie muß bloß völlig anders arbeiten als bei der Lösung mit timerbasiertem Pollen.
Matthias S. schrieb: > Hallo alle zusammen, > der ATmega8 nur 2 Interrupt-Pins besitzt, und die > Tastenanschläge in einer Schleife zu prüfen mir recht unsicher vorkommt, > da der Tastendruck auch gedrückt werden kann, während der > Mikrocontroller gerade nicht am überprüfen ist, weil er zb irgend etwas > anderes am machen ist, habe ich mir gedacht, dass ich einmal die Tasten > an die Pins schließe und jeweils alle gemeinsam an einen Interrupt-Pin. Du musst Dir übrigens wg der Geschwindigkeit bzw Reaktionszeit des Controllers überhaupt keine Sorgen machen: Ein Tastendruck mit dem Finger dauert mindestens Millisekunden, eher 100stel. Der Prozessor hat z.B. internen Takt von 8 MHz, kann aber auch mit 20 MHz laufen, das sind Zehntel Mikrosekunden. Während Du versuchst den kürzesten Tastendruck der Welt mit der Hand zu schaffen, lass das mal eine Millisekunde sein, führt der Controller 10.000 Befehle aus. Zum Prüfen aller Tasten wird er vielleicht ein paar Hundert brauchen, sagen wir mal ganz grosszügug 1000, wenn es nicht gut programmiert ist. Dann braucht der Controller also nur max. 10% seiner Rechenleistung für die Abfrage aller Tasten. Wenn Du also per Timer jede Millisekunde nach den Tasten schaust und es dauert 1000 Taktzyklen, dann hat das Hauptprogramm 9.000 Taktzyklen für etwas anderes. Demnach brauchst Du auch die Tastenerkennung nicht auf den Atmega8 auslagern, das kann einer schon alles. Sonst wäre das so als würdest Du einen Einkauf von 5 Tüten mit zwei 7,5 Tonnern nach Hause fahren, obwohl einer schon 100erte Tüten kann... Und wenn es doch gute Gründe zum Auslagern gibt dann lieber mit einem Attiny10. Vg, Conny
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.