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?
Ja aber cli und sei unterbrechen doch alle interrupts oder liege ich da flasch
ja, aber da du nur 2 hast wird doch genau der 2. geblockt... ist eigentlich standard in der int routine die ints auszuschalten
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...
@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.
@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.
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
Eine Andere Frage Kann man die Priorität des USART Empfangsinterrupt höher stellen als den Timer interrupt
1. Befehl im Timer Interrupt: SREG |= 128; Damit ist der Timer-Interrupt vom UART-Interrupt unterbrechbar. Michael
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
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
Erreicht man damit nicht das gleiche wie mit einem einfachen SEI am Beginn der ISR? Nur dass es etwas länger dauert?
das dachte ich mir auch... sei kostet nur einen takt ;) und man(n) kann das ret-IEH- auf ret umändern g dave
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.
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.