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
Ebendies nennt sich "pegelgetriggerter Interrupt" (level triggered). Im Unterschied zum flankengetriggerten Interrupt (edge triggered).
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
Exht? Sowas gibts bei meinen MSP430ern nicht, glaub ich...zumindest noch nicht gesehen im Datenblatt.
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 ^^
ah ok, danke markus ^^ ich glaube deine antwort trifft genau auf mein problem zu
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
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 ^^
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
Markus J. schrieb:
> Daher gehts ja hier auch um nen ATMega8 ...
Man darf hier auch nichts mal so einwerfen, kann das sein?!
stimmt so is einfacher, danke ^^ INT0_handler: loop: sbi PORTB, 0 sbic PIND, 2 rjmp loop cbi PORTB, 0 reti
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.