PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Externer Interrupt mit INT0



Mr Bean
12.01.2008, 14:35
Hallo

Wollte mich gerade mal an die Sache mit Interrupts heranwagen. Und gleich sind mehrere Fragen/Probleme aufgetaucht :-( . Ich hab mir das eigentlich so vorgestellt dass ich an INT0 weiterhin den internen Pull up verwenden kann. Jetzt hab ich aber im Datenblatt gelesen dass ich um den Externen Interrupt zu verwenden, den Pin INT0 als Ausgang definieren muss. Ich habe hier einen Taster angeschlossen der den Port dann auf "0" zieht (Taster geöffnet >> Pin "hängt in der Luft"). kann ich so dann überhaupt einen Interrupt auslösen? Oder muss ich dem Taster einen externen Pull Up gönnen damit ich eine Flanke bekommen?
Außerdem wollte ich fragen ob es möglich ist dass eine Interruptroutine von einer anderen unterbrochen wird um etwas anderes zu tun. Ich kenne das vom 8051, da konnte man den einzelnen Interrupts verschiedene Prioritäten geben. Das war manchmal recht geschickt...

Grüße!!

Bean

McJenso
12.01.2008, 15:08
Hallo,



Jetzt hab ich aber im Datenblatt gelesen dass ich um den Externen Interrupt zu verwenden, den Pin INT0 als Ausgang definieren muss.

Wenn du dich da mal nicht verlesen hast. Bei den AVR's die ich kenne, funktioniert der Interrupt _auch_ , wenn der PIN ein Ausgang ist.


Ich habe hier einen Taster angeschlossen der den Port dann auf "0" zieht (Taster geöffnet >> Pin "hängt in der Luft"). kann ich so dann überhaupt einen Interrupt auslösen?

Du schließt den Ausgang mit einem Taster kurz? :shock:
Für die Interruptpins gelten die gleichen Regeln, wie für alle anderen Eingänge, also nicht offen lassen, Pullup oder Pulldown.
Über die passenden Register stellst du dann ein, ob und auf welche Flanke der Interrupt reagiert. Dann brauchst du halt noch die passende ISR.



Außerdem wollte ich fragen ob es möglich ist dass eine Interruptroutine von einer anderen unterbrochen wird um etwas anderes zu tun.

Ja das geht, ist aber nicht zu empfehlen.
klick mich (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts)

Gruß

Jens

Mr Bean
12.01.2008, 15:20
Also ich schließe denke ich nichts kurz, da sonst bestimmt schon der eine oder andere AVR abgeraucht wäre... ;-) Normalerweise verwende ich den internen PullUp. Dann fließt wenn ich den Pin auf Masse ziehe ein Strom durch den internen PullUp... etc. ;-)


...wenn der PIN ein Ausgang ist

Meintest Du Eingang?

Hier mal der Auszug aus dem Datenblatt

...the interrupts will trigger even if the INT0..1 pins are configured as outputs.

Kann auch sein dass mich mein Englisch im Stich gelassen hat... 8-[

Grüße!

Bean

McJenso
12.01.2008, 15:31
Das heißt, dass der Interrupt sogar dann funktioniert, wenn INT0..1 als Ausgang konfiguriert ist. Damit kann man wunderschön via Software einen Interrupt auslösen.
In den meisten Fällen wird er aber wohl als Eingang benutzt, um eine Aktion bei einem externen Signalwechsel auszuführen.

Gruß

Jens

Mr Bean
12.01.2008, 15:45
Puhh da hab ich aber Glück gehabt... ;-) Danke... naja funktionieren tut es leider trotzdem noch nicht. Ich hab jetzt mal gemessen, wenn ich den interne PullUp einschalte hab ich an dem Pin INT0 4,9V Wenn ich den Taster drücke 0. Also wie erwartet. Ich hab die Interrupts mit sei() freigegeben. Wie kann ich noch einstellen dass auf eine fallende Flanke reagiert wird? Entprellen wollte ich dann in der ISR machen...

Grüße!!

Bean

oberallgeier
12.01.2008, 16:02
Hallo, Mister,

... Auszug aus dem Datenblatt ... the interrupts will trigger even if the INT0..1 pins are configured as outputs... Englisch im Stich gelassen ...Dein Englisch ist schon ok. Aber Du müsstest das ganze Datenblatt durchlesen :( - hatte ich auch nicht :). Es ist einfach so, dass Du aufregend viel Strom brauchst um gegen den als Output konfigurierten Pin anzugehen, das hatte ich da (klick mich) mal selber (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=336805#336805) gemessen. Und wenn Du bedenkst, dass Dein Groundpin auch nur eine beschränkte Ableitfähigkeit hast - siehe Datenblatt - dann bist Du rasch am Ende. Also - wenn Du den Pin als extINT0 benutzen willst, dann mach es wie ich: konfiguriert als Eingang, externer Pull up mit 10k - und es geht wirklich s..ehr gut. Ich habe eine streichholzkopfgrosse Lichtschranke dran - die bei 1,5 kHz noch prächtig erkannt wird. Weitere Daten im genannten posting.

oberallgeier
12.01.2008, 16:09
N alter Mann ist doch kein D-Zug, soo schnell bin ich nicht wie meine µC´s. Daher :

... Wie kann ich noch einstellen dass auf eine fallende Flanke reagiert wird? ...Einfach das doc lesen :)
void XTI01_init( void )
{ //Initialisiere beide Interrupts auf rising edge
// d.h. EICRA ISC00,01,10+11 auf 1 (doc,S68)
EICRA |= (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00);
EIMSK |= (1<<INT1)|(1<<INT0); // und erlaube diese I´s in EIMSK
}... für die fallende Flanke sind die ~11 und ~10 glaube ich 1-0 statt wie hier 1-1.

Die Diskussion wär effektiver, wenn Du den Controller nennen würdest.