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