Interrupt



Interrupt bedeutet Unterbrechung.
Unterbrochen wird der normale Programmablauf.

Wozu ist das nützlich?

Das kannst Du hier nachlesen.



Ein Tastendruck soll ein laufendes Programm sofort unterbrechen.

Wir benutzen unser Experimentierboard oder stecken folgende Schaltung auf einem Steckbrett auf:

(Zum Vergrößern anklicken!)


Die Taste S1 ist an ein Anlußbeinchen des Attiny2313 angeschlossen, das nicht nur mit PD2, sondern auch mit INT0 beschriftet ist.

Unser Programm macht nun folgendes:

  • ein Lauflicht läuft und läuft und läuft
  • wenn man S1 drückt, wird das Laufen schlagartig stoppen, denn nun wird die Interruptserviceroutine abgearbeitet
  • nach einer gewissen Zeit läuft das Lauflicht weiter

Hier das Programm:

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

#include <avr/interrupt.h>
 
#define F_CPU 8000000UL      // 8 MHz (fuer delay.h)
#include <util/delay.h>
 
#include "boarddefs.h" //stellt die Befehle led on/off zur Verfuegung
 
//********************************************************************

// Interruptserviceroutine
ISR (INT0_vect) {
    _delay_ms(250); //einfach mal eine Weile nix machen    
}
 
//********************************************************************
 
int main(void){
 
    DDRB = 255; DDRD = 120;                    // Ausgänge / LEDs
    DDRD &= ~_BV(PD2);PORTD |= _BV(PD2);       // PD2 ist Eingang mit Pull Up                         
    PCMSK |= (1<<PIND2); GIMSK  |= (1<<INT0);  // Ext. Interrupt an INT0
    MCUCR |=(0<<ISC01) | (0<<ISC00);           // Interrupt wenn INT0 = GND
    sei();                                     // Interrupts erlauben

      
    while (1){
       
        // Lauflicht:
        led1on;  _delay_ms(12); led1off;
        led2on;  _delay_ms(11); led2off;
        led3on;  _delay_ms(10); led3off;
        led4on;  _delay_ms(9); led4off;
        led5on;  _delay_ms(8); led5off;
        led6on;  _delay_ms(7); led6off;
        led7on;  _delay_ms(6); led7off;
        led8on;  _delay_ms(5); led8off;
        led9on;  _delay_ms(4); led9off;
        led10on; _delay_ms(3); led10off;
        led11on; _delay_ms(2); led11off;
        led12on; _delay_ms(1); led12off;
    }

 
    return 0;
}
 
//********************************************************************


Hier gibt es den Code-Ordner zum Programmieren des AtTiny2313.




Ein paar Anmerkungen dazu:

ISR steht für Interrupt Service Routine. Hier springt die Abarbeitung des Programmes hin, wenn der Interrupt "geworfen" wurde.

INT0
_vect steht für die Ursache, den ISR abzuarbeiten.

Näheres wie immer im Datenblatt.