Forum: Mikrocontroller und Digitale Elektronik externer Interrupt


von Andreas 2. (andreas2000)


Angehängte Dateien:

Lesenswert?

Hallo,
wie bringe ich dem externen Interrupt INT1 bei auf welchen Pin er
reagieren soll?
define?
aus dem AVR-GCC-Tutorial werde ich nicht schlau.
Ich benutze den Atmega8 mit dem AVR-Studio.
Ein kurzer Quelltext in C wäre nett.

Danke

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Gar nicht. Der ist in Hardware gegossen.

von Rolf Magnus (Gast)


Lesenswert?

> wie bringe ich dem externen Interrupt INT1 bei auf welchen Pin er
> reagieren soll?

Gar nicht. Der ist fest mit dem gleichnamigen Pin verdrahtet.

von Andreas 2. (andreas2000)


Lesenswert?

alles klar, habe ich übersehen!
danke!!

von christian (Gast)


Lesenswert?

/***************************************************
Tasterdruck an PD2 (INT0) --> LEDs gehen an
Tasterdruck an PD3 (INT1) --> LEDs gehen aus
***************************************************/

#include <avr/io.h>
#include <avr/interrupt.h>


SIGNAL (SIG_INTERRUPT0)
{
  PORTB = 0x00;
}

SIGNAL (SIG_INTERRUPT1)
{
  PORTB = 0xff;
}

int main (void)
{
  DDRB = 0xff;
  MCUCR = (1<<ISC11) | (1<<ISC01);
  GICR = (1<<INT1) | (1<<INT0);
  sei();
  while(1);

  return 0;  //wird nie erreicht
}

von inoffizieller WM-Rahul (Gast)


Lesenswert?

muaaa... Tastendrücke und daruaf triggernde Interrupts. Böse!
Als Beispiel vielleicht noch akzeptabel.

von Andreas 2. (andreas2000)


Lesenswert?

danke Christian,
so funktioniert das mit den Tasten!
Ich muß mal schauen wie zeitkritisch sich das ganze bei einer längeren
main verhält.

von christian (Gast)


Lesenswert?

Gar nicht. Dafür sind Interrupts ja da.
Das Main wird unterbrochen und der Interruptcode ausgeführt.
Danach geht's im Main an der unterbrochenen Stelle weiter.
Es sei denn, du verwendest noch weitere Interrupts. (Timer, Uart) in
denen übermäßig viel Code steht.


MfG

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Und wenn, wie es bei Tastern nun mal passiert, das Signal am Eingang
prellt, springt der Controller diverse Male aus der Main heraus.
Tasten wertet man aus, indem man sie per Timer in regelmässigen
Abständen (zig Millisekunden) abfragt (siehe Peter Danneggers
Tastenabfrage - Bulletproof).
Einen Interrupt benutzt man höchstens, wenn man den Controller wecken
will (Stromspar-Modus).
In ISR sollte nach Möglichkeit so wenig Code wie möglich stehen, ausser
wenn das Programm nur aus der ISR besteht.

von christian (Gast)


Lesenswert?

Selbst wenn die Tasten in diesem Beispiel prellen, ist das derast
unerheblich, dass sich der Mehraufwand im Code nicht lohnt.

Hier sind keine Impulse zu zählen noch Zeitabstände zu messen.

>Einen Interrupt benutzt man höchstens, wenn man den Controller wecken
>will (Stromspar-Modus).

Nein, dann bräuchte man wohl nicht so viel verschiedene
Interruptquellen.

Interrupts werden benutzt, wenn der µC sofort auf ein Ereignis
reagieren soll. Meistens werden in den ISR nur Flags gesetzt, die im
Main ausgewertet werden.

von Hannes L. (hannes)


Lesenswert?

Schade dass es immer wieder Unbelehrbare gibt, die solchen Schwachsinn
hier verbreiten müssen.

...

von johnny.m (Gast)


Lesenswert?

@christian:
Du scheinst nicht ganz nachvollziehen zu können, dass es bei einem
Taster überhaupt nicht darauf ankommt, sofort (im µC-Sinn, d.h. in
wenigen µs) zu reagieren! In den meisten Anwendungen ist es
Verschwendung, Taster mit einem Interrupt abzufragen. Wenn man die Pins
natürlich eh frei hat, dann kann man tun was man will, aber wenn Du
einen Taster betätigst, ist Dir als menschlicher Bediener völlig
schnurz, ob der Tastendruck erst 10 ms später bearbeitet wird. Es gibt
u.U. wichtigere Ereignisse, für die es sich lohnt, einen Interrupt zu
spendieren. Außerdem ist eine Entprellung bei einer Abfrage über eine
Timer-ISR viel einfacher, weil im Prinzip schon drin! Interrupts sind
genaugenommen für Taster zu schnell!

Das was der inoffizielle oben über das Aufwecken geschrieben hat,
bezieht sich darauf, dass es eigentlich nur einen wirklichen
Anwendungsfall für einen externen Interrupt in Zusammenhang mit einem
Taster gibt, und das ist eben der, wenn man den µC per Tastendruck aus
dem Schlaf holen will!

von johnny.m (Gast)


Lesenswert?

@Hannes:
Wie recht Du wieder mal hast...

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Einen Interrupt benutzt man höchstens, wenn man den Controller wecken
>will (Stromspar-Modus).

In Zusammenhang mit Tasten (und anderen langsamen, mechanischen
Bauteilen, die nachschwingen), sollte man die Verwendung von Intertupts
vermeiden.

Wenn du dafür aber unbedingt Interrupts verwenden willst, soll es mir
egal sein. Ich mache es nicht.

von christian (Gast)


Lesenswert?

gäääähn

Thema lesen und nicht künstlich aufregen.

Es ging hier allgemein um die Funktionsweise der externen
Interrupt-Pins.
Wie und wozu er die PINs (INT0 , INT1)nutzt, ist jedem selbst
überlassen.

...noch was?

von Hannes L. (hannes)


Lesenswert?

> und das ist eben der, wenn man den µC per Tastendruck aus
> dem Schlaf holen will!

Richtig!
Und dann schaltet man in dieser ISR nur den Ext. Low-Level-Interrupt
aus, dann den Power-Down-Mode ab (Umschalten in IDLE-Mode), worauf die
Timer wieder laufen und die timergestützte Tastenentprellung die Taster
auswertet und dabei feststellt, ob es wirklich ein Tastendruck war oder
vielleicht nur ein Störimpuls. War es nur ein Störimpuls, so kann der
Programmteil, der für den Bedienungs-Timeout zuständig ist, den AVR ja
wieder in den Power-Down-Mode schicken.

Die Dannegger-Entprellung von bis zu 8 Tasten braucht alle 20ms ganze
11 Controllertakte in der Timer-ISR, die nebenbei noch andere Dinge
erledigen kann. Das ist bei 1MHz weniger als 0,1% der verfügbaren
Rechenleistung. Sie stellt dabei dem Hauptprogramm neben dem
entprellten Tastenstatus auch Flags zur Verfügung, die das erneute
Drücken einer Taste signalisieren (auch falls diese Taste bereits
wieder losgelassen wurde), auch bei mehreren Tasten gleichzeitig.
Wer diese Routine verschmäht, dem ist eigentlich nicht zu helfen, dem
kann man nur raten, dass 'Malen nach Zahlen' auch ein schönes
kreatives Hobby ist. ;-)

...

von Juergen Schuhmacher (Gast)


Lesenswert?

"Hier sind keine Impulse zu zählen noch Zeitabstände zu messen."
Ja, einen Interrupt baucht man hier höchstens, wenn man das Prellen
mitzählen will, z.B. bei einem Teststand für Schaltertests. :-)

"In ISR sollte nach Möglichkeit so wenig Code wie möglich stehen"
Richtig

"wenn das Programm nur aus der ISR besteht."
Was ist denn das für ein Programm ;-(  Wehe, wenn ich den Prof
erwische, der den Studenten die Idee eingeflößt hat, man könne alles
nur mit ISRs lösen , die sich gegenseitig unterbrechen, um Multitasking
und Realtime-Aufgaben zu lösen ...

"Interrupts werden benutzt, wenn der µC sofort auf ein Ereignis
reagieren soll. Meistens werden in den ISR nur Flags gesetzt, die im
Main ausgewertet werden."
Brav! :-)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Studenten

Hast du was gegen Studenten?

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.