ATxmega ISR wird nicht ausgelöst obwohl Init & HW korrekt

Gast #2860448
Lesenswert?
• ▲
▼
Hallo,

uP: ATxmega32A4 @8MHz (external)
Debugger: JTAGICE3 on PDI @1MHz
Entwicklungsumgebung: AVR Studio 5.1

Meine UART RX ISR wird nicht ausgelöst wenn ich das Programm wie folgt 
laufen lasse:
1
#include <avr/io.h>
2
#include "Initialisation/SysInit.h"
3
#include <avr/interrupt.h>
4
#include "Ordner/Func.h"
5

6
ISR(USARTE0_RXC_vect)
7
{
8
  asm("nop");
9
}
10

11
int main(void)
12
{
13
  SysInit(); //Enthält Clock, UART, Interrupt usw
14
    
15
  func();
16
  
17
}

wenn ich jedoch das Programm um eine Endlosschleife (while(1);) VOR der 
func() ergänze wird die ISR ausgeführt:
1
#include <avr/io.h>
2
#include "Initialisation/SysInit.h"
3
#include <avr/interrupt.h>
4
#include "Ordner/Func.h"
5

6
ISR(USARTE0_RXC_vect)
7
{
8
  asm("nop");
9
}
10

11
int main(void)
12
{
13
  SysInit(); //Enthält Clock, UART, Interrupt usw
14
  while(1);
15
  func();
16
  
17
}

Die Funktion "func()" ist eine noreturn-Funktion und befindet sich in 
einem Unterodner (läuft auch sauber).
Selbst wenn ich die ISR in das File der func()-Funktion stecke passiert 
nichts, bis ich irgendwo eine Endlosschleife einbaue...

Was ist das Problem?

Freundliche Grüsse

Rob
#2860463
Lesenswert?
• ▲
▼
rob schrieb:
> Coder schrieb:
>> Was führt while(1);  aus.
>
> Ja eben nichts, das ist ja das komische daran...

Irgendwo muss es aber eine Endlosschleife geben, aus der der µC nicht 
mehr rauskommt.

Was genau macht func()?


Dein Programm darf niemals soweit durchlaufen, dass es aus der main() 
wieder rauskommt. Denn dann übernimmt wieder die C-Runtime Library. Und 
die macht - Überraschung - als erstes: alle Interrupts sperren.
Gast #2860471
Lesenswert?
• ▲
▼
>> int main(void)
>> {
>>  SysInit(); //Enthält Clock, UART, Interrupt usw
>>  func();
>> }

>> Was ist das Problem?


Du initialisierst ,funcst und dann ... ist das Programm zu Ende ...
Mit while() läuft es halt weiter auch wenn es in main() nix mehr tut.

Stefan
Gast #2860480
Lesenswert?
• ▲
▼
>> Wie oben erwähnt wird die func() NIE verlassen. Darin steckt ein Round
>> Robin Scheduler.

>> ... bis ich irgendwo eine Endlosschleife einbaue...

Entweder läuft Dein scheduler in einer Endlosschleife was das zweite 
Zitat
irgendwie unverständlich macht. Oder er tut es nicht ... zurück auf 
Anfang ... wir raten weiter.

Stefan
Gast #2860481
Lesenswert?
• ▲
▼
Selbst wenn ich das Programm folgendermassen umschreibe gehts nicht:
1
#include <avr/io.h>
2
#include "Initialisation/SysInit.h"
3
#include <avr/interrupt.h>
4
#include "Ordner/Func.h"
5

6
ISR(USARTE0_RXC_vect)
7
{
8
  asm("nop");
9
}
10

11
int main(void)
12
{
13
  SysInit(); //Enthält Clock, UART, Interrupt usw
14
  while(1)
15
  {
16
     SetGreenLED(1);
17
     SetRedLED(1);
18
     SetGreenLED(0);
19
     //Irgend welche Funktionen halt
20
  }
21
  
22
}

aber mit folgendem Code wird die ISR wieder ausgelöst:
1
#include <avr/io.h>
2
#include "Initialisation/SysInit.h"
3
#include <avr/interrupt.h>
4
#include "Ordner/Func.h"
5

6
ISR(USARTE0_RXC_vect)
7
{
8
  asm("nop");
9
}
10

11
int main(void)
12
{
13
  SysInit(); //Enthält Clock, UART, Interrupt usw
14
  while(1);
15
  while(1)
16
  {
17
     SetGreenLED(1);
18
     SetRedLED(1);
19
     SetGreenLED(0);
20
     //Irgend welche Funktionen halt
21
  }
22
  
23
}
Gast #2860501
Lesenswert?
• ▲
▼
Hab den Fehler gefunden (/Schäm):
In einer der Funktionen wird mit einem Timer gearbeitet der ein und 
ausgeschaltet wird, jetzt hab ich ausversehen beim Timer ausschalten 
alle Interrupt-Levels ausgeschaltet anstatt nur den des Timers. Oh man!

Trotzdem danke und freundliche Grüsse

rob

(Kann geschlossen werden)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.