Forum: Mikrocontroller und Digitale Elektronik ATxmega ISR wird nicht ausgelöst obwohl Init & HW korrekt


von rob (Gast)


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

von Coder (Gast)


Lesenswert?

Was führt while(1);  aus.

von rob (Gast)


Lesenswert?

Coder schrieb:
> Was führt while(1);  aus.

Ja eben nichts, das ist ja das komische daran...

while(1);

ist gleich

while(1)
{

}

sozusagen endlos nichts machen.

von Karl H. (kbuchegg)


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.

von Cyblord -. (cyblord)


Lesenswert?

Wenn die main ans Ende läuft dann werden alle Interrupts abgeschaltet. 
Darum geht das nur mit while(1);. Die Func() hat damit nichts zu tun.

von rob (Gast)


Lesenswert?

rob schrieb:
> Die Funktion "func()" ist eine noreturn-Funktion und befindet sich in
> einem Unterodner (läuft auch sauber).

Wie oben erwähnt wird die func() NIE verlassen. Darin steckt ein Round 
Robin Scheduler.

von Stefan (Gast)


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

von Stefan (Gast)


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

von rob (Gast)


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
}

von rob (Gast)


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)

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
Noch kein Account? Hier anmelden.