Forum: Mikrocontroller und Digitale Elektronik Schaltplan, vereinfachen?


von Matthias S. (matstorm)


Angehängte Dateien:

Lesenswert?

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

von Joe S. (bubblejoe)


Lesenswert?

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.

von Hauspapa (Gast)


Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

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
von Klaus (Gast)


Lesenswert?

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

von Hauspapa (Gast)


Lesenswert?

>Oh, bei Peter abgeschaut ? (Danni)

Nein, aber auch nicht überrascht wenn das andere auch so machen.

schönen Abend
Hauspapa

von Dirk (Gast)


Lesenswert?

>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.

von Matthias S. (matstorm)


Lesenswert?

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

von Hannes J. (Firma: eHaJo.de) (joggl) Benutzerseite Flattr this


Lesenswert?

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

von Jobst M. (jobstens-de)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Conny G. (conny_g)


Lesenswert?

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
Noch kein Account? Hier anmelden.