Problem: beim z.B. bei der guten alten MCS-48-Familie (wird noch
verkauft hie und da per Versand)gibt es nur einen externen Inter-
rupt und einen dazugehörigen Interrupt-Pin; wie kann ich trotzdem
bei Auslösung dieses Interrupts mehr als eine Routine anspringen?
Beim 80C35 z.B. wird der externe Interrupt ausgelöst und der
Befehlszähler macht einen Sprung zur Programmspeicher-Adresse 3;
um von dort zu verschiedenen Routinen springen zu können, müssen
noch Zusatzinformationen vorliegen und ausgewertet werden; dies
kann ich mit zwei oder mehreren 2-fach - Tastern bewerkstelligen,
die einerseits jeder für sich den INT-Pin so schalten, daß der
Interrupt ausgelöst wird und gleichzeitig einen Port-Pin an Masse
ziehen, jede Taste einen anderen natürlich.
In der Interrupt-Routine wird der Port abgefragt, festgestellt, welcher
Pin zusätzlich an Masse gezogen ist (vielleicht noch eine Pause davor,
falls der zweite mechanische Kontakt verzögert durchschaltet)und in die
entsprechende Routine verzweigt. Wenn mehr als eine Taste gedrückt wird,
kann man auch die Kombinationen auswerten!
Ich habe es mit einem MCS-48-Baustein ausprobiert, den ich von einer
alten Festplatte abezogen hatte - und es funktioniert. Das
Schema sollte auch bei anderen Controllern funktionieren.
Der Standard 8051-Baustein hat ja auch nur zwei externe Interrupts
und zwei dazugehörige Pins (EX0 und EX1), was nicht immer ausreicht.
Nachteil: man braucht Taster, die zwei mal zwei Kontakte unabhängig
voneinander überbrücken.
Hat man diese, werden zwei Kontaktreihen hergestellt und eine mit
einem Interrupt-Pin (besser mit einem gemeinsamen Schutzwiderstand
davor)und die andere mit Masse verbunden. Eine dritte Kontaktreihe wird
hergestellt und direkt mit Masse verbunden; die übrigen Kontakte werden
mit Schutzwiderständen (4k7)an die jeweiligen Portpins angeschlossen.
Die Kontaktreihen verbinden gleiche Kontakte der 2-fach Taster (diese
haben 4 unabhängige Kontakte).
Ich habe Deine Antwort zur Kenntnis genommen Herr Retro bzw. Herr mit
dem Pseudonym Retro und habe darüber nachgedacht.
Leider kann ich Deinen Schaltungsvorschlag nicht mit meiner Schaltung
vereinbaren. Ich habe selber keinen Schaltplan angegeben, was ich jetzt
nachholen werde - nebst Angabe des Assembler-Source-Codes zum
Demonstrieren.
Die Aufgabe ist die, daß der Pin INT (Low-aktiv) an Masse gezogen
werden muß, um einen externen Interrupt auslösen zu können und jeder
Taster mit einem Kontakt an Masse liegt, mit dem anderen Kontakt am
INT-Pin, so daß jede Taste den INT-Pin an Masse ziehen
kann; wenn ich deinen Vorschlag realisiere, müsste von dem INT-Pin
bzw. den Kontakten der Taster, die damit verbunden sind, jeweils
eine Diode zu jeweils einem Portpin gehen, und damit wird bei Betätigung
einer beliebigen Taste jeder Portpin gleichbehandelt,
d.h. an Masse gezogen. Es ist schwer, solche Sachverhalte zu er-
läutern ohne Schaltplan, man selber versteht es natürlich...
Vielleicht ist mein Schaltplan (mit ASCII-Zeichen im Textmodus
erstellt), aufschlußreicher.
Die Schaltung ist gedacht als Alternative zum Abfragen der Tasten
einer Tastatur in zeitlicher Reihenfolge, wie das der Tastaturpro-
zessor der PC-Tastatur z.B. macht.
Der Vorteil ist die sofortige Reaktion auf ein Key-press. Es gibt
sicher auch andere Möglichkeiten, eine Tastatur abzufragen, aber u.
Umständen muß das jederzeit möglich sein. Dann ist eine
Interrupt-Auslösung keine schlechte Wahl.
Hallo Thomas,
was verstehst Du unter denn unter "sofortige Reaktion auf ein Key-press"
?
Üblicher Weise braucht ein Mensch um auf irgendwas zu reagieren mehr als
300ms. Da ist es doch völlig uninteressant, ob dann noch 10µs oder 10ms
hinzukommen.
Meistens ist es auch wichtig, ob eine Taste einmal oder mehrmals
betätigt wird. Um das zu erkennen ist ein Entprellen der Tasten
notwendig und dazu nimmt man dann einen Timerinterrupt z.B. alle 10ms.
Die meisten Leute sagen sich dann aber, wenn ich sowieso einen
Timerinterrupt brauche, dann kann der doch auch gleich die Tasten
abfragen.
Meistens ist sowieso schon ein Timerinterrupt am laufen, z.B. um die
interne Uhr weiter zu zählen oder eine LED-Anzeige zu multiplexen. Dann
noch ein paar mehr Befehle mit reinzupacken ist kein Problem.
Und der Interrupt ist dann frei für wirklich eilige Sachen, z.B. für die
Motorsteuerung oder den Airbag in einem KFZ.
Peter
hatte mir mal eine Schaltung ausgedacht um mit 1 Interrupt und 3
Port-Pins 8 einpolige Taster abfragen zu können. Dafür habe ich einen
74HC148(8 zu 3 Encoder)und einen 74HC123 als Verzögerung zur Entprellung
benutzt.die 3 Ausgänge A0-A3 vom HC148 auf 3 Port-Pins und den Ausgang
EO vom HC148 über den Monoflop HC123 auf den Interrupt-Pin.Sollte
eigentlich für alle Microcontroller funktionieren.
Hallo Dieter,
also mein Mikrokontroller ist ein richtiges Arbeitstier.
Der würde es mir höllisch übelnehmen, wenn ich ihm die Arbeit wegnehme,
die er problemlos selber ausführen kann, indem ich noch nen Haufen
anderer ICs einsetze.
Er ist eben ein Einzelkämpfer und duldet nur ICs neben sich, die das
machen was er nicht kann z.B. MP3 dekodieren oder D-A wandeln.
Er unterhält sich aber gerne mit seinesgleichen, wenn die etwas weiter
weg sind. In einem Gerät habe ich z.B. 13 Module, wo auf jedem ein
Kontroller sitzt und die dann über den CAN-Bus prima zusammenarbeiten.
Hoffentlich verzeiht Ihr mir die Abschweifung in die Psychologie eines
Mikrokontrollers :-)
Ich bin eben so ein Typ, wenn auch nur ein Widerstand durch 10 Zeile
Kode ersetzt werden kann, dann fällt der raus, gnadenlos.
Peter
Bitte meine Schaltung zu entschuldigen, Dioden sind um 180° gedreht...
Fakt ist das diese Schaltung gute Arbeit an meinem ATMEGA103 tut, nur
mit dem Unterschied dass die Taster dort Optokoppler sind und das
Programm in C geschrieben wurde.
Und wieso erst das "Deine" aber dannach "Herr", im weiteren denke ich
dass Pseudonyme im Internet kein Problem darstellen. Einmal den
Mauszeiger auf meinem Namen positioniert und man kann meinen richtigen
Namen schon sehr gut erahnen...
Hallo, Dieter
Dein Vorschlag mit den externen IC's aus der Standard-Logik-Serie
könnte für meinen Schaltungsvorschlag interessant sein. Einpolige
Taster würden reichen und mit drei Pins kann man ja bekanntlich
2 hoch 3 = 8 Zahlen abfragen (acht Taster über den 8 zu 3 - Encoder);
die Chips sind preiswert und "überall" erhältlich.
Klar, wenn man den Mikrocontroller und keine Chips oder nur zwei
bis drei zusätzliche Chips daneben duldet, ist dein Vorschlag na-
türlich nicht so gut. Letzlich ist das Geschmackssache.