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