Reset nach ISR (INT0_vect)??

Gast #2428947
Lesenswert?

Atmega16
AVR Studio 5
AVR Dragon


Hallo zusammen,

ich habe folgendes Problem:

Ich habe in C ein Progrämmchen geschrieben, das mir ein Lauflicht in 
einer bestimmten Frequenz erzeugen soll. Soweit so gut. Ich habe die 
Funktionalität des Codes so weit reduziert, dass ich nur die Register 
setze und dann im loop (while(1)) nach Betätigung eines Schalters an 
INT0 eine LED an PORTA rotieren lassen will.
Ich debugge über JTAG OnChip. Wenn ich Einzelschritte beim debuggen 
ausführe, springt der Code nach betätigen des Schalters in die 
Interruptroutine, die erste LED leuchtet auf und danach steht der gelbe 
Ausführungspfeil wieder vor
1
int main(void){...

Sieht mir nach nem Reset aus, aber warum???

Wenn ich ohne debugging den Chip einfach laufen lasse, blitzt beim 
betätigen des Schalters die erste LED kurz auf, dann Reset.

Jemand ne Idee???

Code:
1
#define F_CPU 1000000UL
2

3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6
#include <stdlib.h>
7

8
//####################### Variablen ################################
9

10
struct Timer
11
{
12
    volatile uint16_t NeededOverflows;
13
    volatile uint16_t OverflowCount;
14
    volatile uint8_t Frequencies[6];
15
    volatile uint8_t TimerIndex;
16
    volatile uint8_t Lauflicht;
17
};
18

19
struct Timer T0 = {.NeededOverflows=0,.OverflowCount=0,.Frequencies={4,7,6,2,9,7},.TimerIndex=0,.Lauflicht=1};
20
struct Timer T1 = {.NeededOverflows=0,.OverflowCount=0,.Frequencies={7,9,3,5,11,8},.TimerIndex=1,.Lauflicht=1};
21
    
22
//############################# Funktionen ##################################
23
  
24
void SetConfigureRegisters(void)
25
{  
26
      
27
  GICR   = (1<<INT0);        //|(1<<INT1);
28
  MCUCR  = (1<<ISC01);      //Falling edge sense of INT0
29
  TCCR0  = (1<<CS00);        //kein Prescale
30
  TCCR1B = (1<<CS10)|(1<<ICNC1);  //|(0<<ICES1); // Noise Canceller aktiv, kein PreScale
31
  TIMSK  = (1<<OCIE0)|(OCIE1A);  //|(1<<TICIE1); // Interrupts akivieren, Capture
32

33
}
34

35
void SetPortDirectionRegisters(void)
36
{
37
  DDRA = 0xFF;
38
  //DDRB = 0x02;
39
  //DDRC = 0x00;
40
  //DDRD = 0xFF;
41
}
42

43
void SetAllPortsToValue(int Value)
44
{
45
  PORTA = Value;
46
  //PORTB = Value;
47
  //PORTC = Value;
48
  //PORTD = Value;
49
}
50

51
void SetPortA(void) {
52
        
53
              PORTA = ~T1.Lauflicht;                   // Untere 8 Bit auf PORT B ausgegeben
54
              T1.Lauflicht = T1.Lauflicht<<1;                   // Lauflicht um 1 Bit nach links weiterschieben
55
              if (T1.Lauflicht == 0)                     // Wenn Lauflicht durchgelaufen ist, dann wieder am Anfang beginnen
56
                  T1.Lauflicht = 1;
57
}
58
  
59
//####################### Interrupts ###############################
60

61

62
ISR(INT0_vect) {
63
  
64
  SetPortA();
65
}
66

67
//############################## Main-Funktion ####################################
68

69
int main(void) {
70

71
  SetPortDirectionRegisters();
72
  SetAllPortsToValue(~0);
73
  SetConfigureRegisters();    //Initialisierung T1+0
74
  
75
  sei();
76
  
77
  while(1) {
78
    
79
  }
80

81
return 0;
82

83
}

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