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
> wie bringe ich dem externen Interrupt INT1 bei auf welchen Pin er > reagieren soll? Gar nicht. Der ist fest mit dem gleichnamigen Pin verdrahtet.
/*************************************************** 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 }
muaaa... Tastendrücke und daruaf triggernde Interrupts. Böse! Als Beispiel vielleicht noch akzeptabel.
danke Christian, so funktioniert das mit den Tasten! Ich muß mal schauen wie zeitkritisch sich das ganze bei einer längeren main verhält.
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
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.
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.
Schade dass es immer wieder Unbelehrbare gibt, die solchen Schwachsinn hier verbreiten müssen. ...
@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!
>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.
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?
> 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. ;-) ...
"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! :-)
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.