Forum: Mikrocontroller und Digitale Elektronik INT0 "dauernutzung"


von Hannes (Gast)


Lesenswert?

hallo zusammen,
ich programmiere gerade nen atmega8-16 und habe mich mit dem thema 
interrupt näher befasst. leider konnte ich nicht herausfinden, ob eine 
dauernutzung möglich ist. ich wollte es so einstellen, dass bei 
low-pegel ausgelöst wird. dann beginnt das unterprogramm und schaltet 
einen port auf eins, wärend der interrupt abgearbeitet wird kann ja nich 
nochmal ausgelöst werden. wichtig wäre, das nach dem reti-befehl also 
dem ende des unterprogramms immer wieder das interrupt ausgelöst wird so 
lange INT0 den low-pegel hat.

kann man die interrupts überhaupt auf diese weise nutzen? und würde dann 
auch immer wieder ausgelöst wenn INT0 auf low ist?

mfg hannes

von (prx) A. K. (prx)


Lesenswert?

Ebendies nennt sich "pegelgetriggerter Interrupt" (level triggered). Im 
Unterschied zum flankengetriggerten Interrupt (edge triggered).

von LuXXuS 9. (aichn)


Lesenswert?

Du kannst doch nach dem Aufruf in ner Schleife verbleiben, die den Pin 
pollt und das IFG erst löschen, wenn der Pin high ist.

Gedacht ist der Interrupt dafür nicht, aber kannste doch machen, klar, 
wieso nicht.

von Hannes (Gast)


Lesenswert?

also ist es kein problem das so zu machen? ^^

von Markus J. (markusj)


Lesenswert?

Datenblatt schrieb:
>When the external interrupt is enabled and is configured as level triggered,
>the interrupt will trigger as long as the pin is held low.

Ist doch eindeutig, oder? Der Interrupt wird solange aufgerufen, wie der 
Pegel Low ist.

mfG
Markus

von LuXXuS 9. (aichn)


Lesenswert?

Exht? Sowas gibts bei meinen MSP430ern nicht, glaub ich...zumindest noch 
nicht gesehen im Datenblatt.

von Hannes (Gast)


Lesenswert?

die sache ist das der controller die ganze zeit mit auswerten 
beschäftigt ist und das unterprogramm ohne umweg und so lange INT0 low 
ist ausgeführt werden soll. halt etwas zeitkritisch ^^

von Hannes (Gast)


Lesenswert?

ah ok, danke markus ^^
ich glaube deine antwort trifft genau auf mein problem zu

von LuXXuS 9. (aichn)


Lesenswert?

Naja, wenn der uC am Ende kurz nachguckt, ob der Pin immernohc low 
ist...damit verliert der nicht viel Zeit. Aber wenn es den 
pegelgetriggerten Interrupt gibt, ist der zweifelsfrei die bessere Wahl, 
klar!

von Markus J. (markusj)


Lesenswert?

Dennis E. schrieb:
> Exht? Sowas gibts bei meinen MSP430ern nicht, glaub ich...zumindest noch
> nicht gesehen im Datenblatt.

Daher gehts ja hier auch um nen ATMega8 ...

@Hannes: Vermutlich bekommst du eine höhere Bearbeitungsfrequenz, wenn 
du innerhalb der ISR eine Schleife baust, die den Pin manuell auswertet. 
Eine ISR bringt einen u.U. beachtlichen Overhead mit sich und verbrät 
locker acht oder mehr Zyklen ohne eine Zeile "echten" Code ausgeführt zu 
haben.
Ein einfacher Test auf ein gesetztes Bit sollte da deutlich 
effektiver/schneller sein.

mfG
Markus

von Hannes (Gast)


Lesenswert?

also wäre so schneller:

INT0_handler:

loop:    sbic PIND, 2

         rjmp ende

         sbi PORTB, 0

         rjmp loop

ende:    cbi PORTB, 0

         reti

danke nochmal ^^

von Karl H. (kbuchegg)


Lesenswert?

Hannes schrieb:
> also wäre so schneller:

Was weißt du?
Du weißt, dass bei Betreten der ISR die Leitung auf Low ist. Das muss so 
sein, sonst wäre die ISR nie betreten worden

D.h. du kannst auf jeden Fall deine Kontrolleitung ebenfalls auf low 
ziehen.

und dann warten bis der Eingang wieder auf High geht

von Markus J. (markusj)


Lesenswert?

Ich würde die Reihenfolge etwas ändern, aber prinzipiell: Ja.

Eine Fußschleife macht imho mehr Sinn als die Prüfung auf das gesetzte 
Bit beim Interrupt-Eintritt.
(Hochsprachen-Äquivalent: statt while {foo} ein do {foo} while)

mfG
Markus

von LuXXuS 9. (aichn)


Lesenswert?

Markus J. schrieb:
> Daher gehts ja hier auch um nen ATMega8 ...

Man darf hier auch nichts mal so einwerfen, kann das sein?!

von Hannes (Gast)


Lesenswert?

stimmt so is einfacher, danke ^^

INT0_handler:

loop:    sbi PORTB, 0

         sbic PIND, 2

         rjmp loop

         cbi PORTB, 0

         reti

von Hannes (Gast)


Lesenswert?

ah, muss dann natürlich "sbis PIND, 2" heißen

von Karl H. (kbuchegg)


Lesenswert?

Hannes schrieb:
> stimmt so is einfacher, danke ^^
>
> INT0_handler:
>
> loop:    sbi PORTB, 0
>
>          sbic PIND, 2
>
>          rjmp loop
>
>          cbi PORTB, 0
>
>          reti

Es reicht völlig, wenn du den Pin nur einmal auf 1 stellst

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.