Interrupt priorität

Gast #130712
Hallo zusammen


Ich habe ein ATmega8515 auf meiner Platine der zwei interrupts auslöst.
Ein Timer0 interrupt der 5 LED'S ansteuert und ein USART
Empfangsinterrupt, die ausgelöst wird wennn Daten vom PC gesendet
werden.(Ich sende 255 Byte (Datenpacket)an Daten an den µC).
Mein Problem ist wenn ich Daten vom PC aus sende stört mein Timer
Interrupt den USART Interrupt und ich kann die Daten nicht richtig
empfangen!?!?!. (Liegt wohl daran das der Timer INT höhere Priorität
hat und ziemlich schnell durch läuft).
Meine Frage:
Kann ich den TImerInterrupt solange aussetzten bis mein Empfang zu Ende
ist?
Gast
Du kannst auch genau den einen Timerinterrupt über sein EnableBit im
entsprechenden Steuerregister abschalten, wenn dir CLI und SEI nicht
passen. Du verlierst damit halt aber die entsprechenden Aufrufe...
Gast
@tobi
"ist eigentlich standard in der int routine die ints auszuschalten"
????
Was soll das denn? Allenfalls schaltet man sie gelegentlich an, um
anderen Ints zu ermöglichen, die gerade laufende ISR ebenfalls zu
unterbrechen.
Bei Annahme eines Int wird von der Hardware das i-flag von der Hardware
gelöscht, damit können erstmal andere Ints nicht dazwischen babbeln. Bei
reti wird es wieder gesetzt.
Gast
@Thomas: auch das ist nicht ganz korrekt. Wird das TOIE0 gelöscht, wird
erstmal kein Timer0-Int mehr ausgeführt, bei Überlauf des Timers aber
schon das T0OV-Bit gesetzt. Wird TOIE0 wieder gesetzt, wird sofort der
noch anhängige Timer0-Int ausgeführt. Verlieren wird man erst was, wenn
eine neuer Int auftritt, bevor der alte bearbeitet wurde - der ist dann
wirklich futsch. Klingt alles haarspalterisch, ist es aber nicht.
Gast
hmmmmmmm!?!?!


Habe gerade das Datenblatt vom ATmega8515 angeschaut!!!!

gibt es da überhaupt speziell für den Timer Interupt ein Enable
bit???die man zurücksetzen kann?

hab leider nix gefunden
Gast
während einer interrupt-routine ist das i-flag im sreg gelöscht, d.h.
niemand kann während dieser routine dazwischenfunken.. deswegen gibt es
auch den befehl "reti", weil der den interrupt wieder setzt..

bei 2 interrupts kannste die recieve-routine einfach lassen und bei der
timer-routine einfach am anfang ein "sei" reinhauen, dann könnte der
recieve den timer unterbrechen.. damit wäre die priorität schon einmal
erhöht (entsprechend kann der timer NICHT den recieve unterbrechen)

eine richtige irq-hierarchie gibts ja nischt, oder erzähl ich
scheibenkleister?

dave
Gast
Eine recht einfache Methode ist, deie Interruptroutine so schnell wie
möglich zu verlassen und den eigentlich zur Interruptroutine gehörigen
Programmteil als call weiterlaufen zu lasse.
Zu beachten ist dabei, das die abzuarbeitende Routine nicht zu lange
dauert.

Also etwa so

einsprung_von_interruptabelle:
  ldi temp1,low(interrutservice)
  push temp1
  ldi temp1,high(interruptservice)
  push temp1
  reti    ;Interruptfreigabe, alle einkommenden Interrupt werden
akzeptiert
interruptservice:
  nop    ;die eigentliche Interruptroutine
  nop
  ret
Gast
Reti auf Ret umändern?? - Das wird wohl nix. Jedenfalls nicht dann, wenn
man zu Beginn der ISR das SREG (mit gesetztem I-Flag) gesichert hat und
es vor dem RET(I) wiederherstellt. Dann ist das I-Flag nämlich wieder
gesetzt und erfordert RETI... 8-D

Aber zwischendurch haben andere (möglichst kurze) ISRs Vorrang. Diese
sollten das SREG allerdings separat sichern.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.