Forum: Mikrocontroller und Digitale Elektronik Reset nach ISR (INT0_vect)??


von Andy (Gast)


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
}

von Floh (Gast)


Lesenswert?

Andy schrieb:
> TIMSK  = (1<<OCIE0)|(OCIE1A);  //|(1<<TICIE1); // Interrupts akivieren, Capture

Wo sind die Interrupthandler dazu?

von Andy (Gast)


Lesenswert?

Oha, da ist was dran. Ich probiers mal die Interrupts aus zu schalten.

von Andy (Gast)


Lesenswert?

Sorry, dass ich eure Zeit verschwendet habe.....

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.