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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren