Forum: Mikrocontroller und Digitale Elektronik Interrupt mit AVR Atmega 16


von André R. (andr_r23)


Lesenswert?

Hallo,

bin gerade dabei von Grund auf die uCs von AVR mal ein bischen 
kennenzulernen. Meine C Kenntnisse sind auch noch sehr schlecht.

Ich habe vor mir ein STK500 liegen und möchte nun über einen Interrupt 
einen Taster abfragen. Wie genau mache ich das?

Der Taster 2 ist ja über das STK500 mit PD2 verbunden (INT0). Aber wie 
genau benutze ich den Interrupt nun genau? Hat da jemand ein Beispiel da 
in C das so kurz wie möglich ist?

Taster in der Hauptschleife die dauernd läuft abzufragen oder in 
bestimmten Programmteilen ist kein Problem aber halt nicht als Interrupt 
:-).

Danke
von Uwe (de0508)


Lesenswert?

Rene,

lies bitte diesen Thread und benutze eine andere Lösung:

Beitrag "ATmega8 und Tastenentprellung"

Taster prellen und lösen dadurch sehr viele Interrupts aus !
von Ballermann (Gast)


Lesenswert?

von André R. (andr_r23)


Lesenswert?

Also nur

ISR(INT0_vect)
{
  PORTA = 0xFF;
  long_delay(2000);
}

Rest macht er dann ja scheinbar automatisch. Danke.
von Ballermann (Gast)


Lesenswert?

Lese Dir mal die Register vom INT0 durch bzw. das Tutorial hier von 
oben.
Da musst Du nur einstellen auf was für Flanken (positive Flanke/negative 
Flanke oder positiver/negativer Pegel) reagieren soll. Dann wird mit 
einem Bit glaub ich noch der INT0 freigegeben.

Mit sei() wird der globale Interrupt freigegeben.

Und dann halt noch der "Funktionsaufruf" für den Interrupt mit
ISR(Speicheradresse).

Headerdatei nicht vergessen.

Grüße
von rofl (Gast)


Lesenswert?

André R. schrieb:
> ISR(INT0_vect)
> {
>   PORTA = 0xFF;
>   long_delay(2000);
> }

DAS tut schon weh ...  :(

das delay in einer ISR ist quasi der todesstoß
von André R. (andr_r23)


Lesenswert?

Das ist eh nur das kopierte Beispiel. In der ISR werde ich keine 
Warteschleifen laufen lassen. Es ging mir hier nur um den genauen Aufruf 
der ISR und das ist halt einfacher als ich dachte. Trotzalledem verstehe 
ich allerdings nicht genau warum Warteschleifen der "Todesstoß" sind.

Ich würde da mal vermuten, das es dadrum geht das wenn der Interrupt 
nochmals innerhalb der Wartezeit kommt das ganze eine sehr unschöne und 
ungeeignete Lösung ist. Aber naja wenn man nen Taster betätigen will und 
den halt in ein paar Sekunden nur einmal drückt ...
von SNR (Gast)


Lesenswert?

Normalerweise setzt man im Interrupt ein Flag und fragt das in der Main 
ab.
Todes Stoß, weil der Interrupt ja gerade für Zeitkritische Dinge gedacht 
ist, die schnell abgearbeitet werden sollen.Durch das warten macht man 
dies alles wieder zunichte...
von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:
> Trotzalledem verstehe
> ich allerdings nicht genau warum Warteschleifen der "Todesstoß" sind.

Weil Interrupts dazu gedacht sind, die schnellstmögliche 
Programm-Reaktion zu bekommen. Während eine ISR läuft, sind Interrupts 
gesperrt, d.h. dein Programm kann auf nichts anderes reagieren.

Das ganze ist ein bischen so, wie wenn du einen Nachtwächter wo sitzen 
hast, damit du möglichst schnell auf ein Ereigniss reagieren kannst, und 
dann erlaubst du ihm erst mal die Zeitung fertig zu lesen.

Nota Bene: Für Tasten braucht man keinen externen Interrupt. Kein Mensch 
kann eine Taste schnell genug drücken, so dass ein regelmässiger 
Timerinterrupt das nicht mitkriegen würde. Es reicht völlig alle paar 
Millisekunden nachzusehen ob die Taste gedrückt ist. Ein paar 
Millisekunden sind aber für einen µC eine lange Zeit, in der er ein paar 
hunderttausend Befehle abarbeitet.
Mit einem externen Interrupt an einer Taste handelt man sich auf der 
anderen Seite so einige Probleme ein.

ALs Testsystem, mit dem du die Technik eines externern Interrupts 
studierst und dazu einen Auslöser brauchst ist das ok. Aber wenn das 
Augenmerk auf einer Tastenabfrage liegt, ist ein externer Interrupt 
nicht die beste Lösung (auch wenn es Umstände gibt, die einen Anschluss 
an einen externen Interrupt erzwingen. Aber soweit bist du noch nicht.)
von rofl (Gast)


Lesenswert?

außer wieder im sleep

da kann man schon die ISR nutzen um den aufzuwecken
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.