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
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 !
Allgemein: AVR-GCC-Tutorial: Programmieren mit Interrupts Interrupt AVR-Tutorial: Interrupts INT0 genau: Beitrag "Interrupt - Beispielcode für ATMega 8 erbeten" Oder einfach mal nach INT0 suchen. Grüße
Also nur
ISR(INT0_vect)
{
PORTA = 0xFF;
long_delay(2000);
}
Rest macht er dann ja scheinbar automatisch. Danke.
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
André R. schrieb: > ISR(INT0_vect) > { > PORTA = 0xFF; > long_delay(2000); > } DAS tut schon weh ... :( das delay in einer ISR ist quasi der todesstoß
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 ...
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...
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.)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.