mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt priorität


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau mal nach cli und sei

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber cli und sei
unterbrechen doch alle interrupts oder liege ich da flasch

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, aber da du nur 2 hast wird doch genau der 2. geblockt...
ist eigentlich standard in der int routine die ints auszuschalten

Autor: Thomas Burkhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cool danke muss ich gleich mal ausprobieren

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@crazy horse
ops, erst denken, dann schreiben :)

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TIMSK.TOIE0
Seite 92 und 123 (falls wir das gleiche Datenblatt haben)

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Andere Frage
Kann man die Priorität des USART Empfangsinterrupt höher stellen als
den Timer interrupt

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Befehl im Timer Interrupt: SREG |= 128; Damit ist der Timer-Interrupt
vom UART-Interrupt unterbrechbar.
Michael

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: wb1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erreicht man damit nicht das gleiche wie mit einem einfachen SEI am
Beginn der ISR? Nur dass es etwas länger dauert?

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das dachte ich mir auch...

sei kostet nur einen takt ;) und man(n) kann das ret-IEH- auf ret
umändern g

dave

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.