AT90USB646 USB/Interrupt problem

Gast #2447319
Lesenswert?

Hallo allerseits,


Ich bin im Besitz des AT90USB646 und habe ein Problem, dass ich mir 
nicht erklären kann. Ich nutze AVR Studio + FLIP zum flashen.

Sobald ich Interrupts in mein Pogramm aufnehme und damit den µC über USB 
flashe werden alle Befehle bis zum ersten auftauchen von sei() 
ausgeführt, der Rest wird nicht ausgeführt (respektive der Interrupts). 
Ein hardware Reset bewirkt auch nichts.

Da ich keinerlei Fehlerquellen in meinem noch simplen Code erkennen 
konnte, hab ich den geflashten µC testweise vom USB getrennt und 
anschließend wieder verbunden. Und siehe da, nun läuft das Programm 
korrekt und vollständig.
Interruptfreier Code wird dagegen korrekt und ohne kurzzeitige Trennung 
des USB/STromversorgung ausgeführt.
Im Datenblatt wird auf diesen Fehler nicht eingegangen.

Hat jemand eine Idee, woran das liegen könnte?


Viele Grüße,

Philipp
Gast #2447350
Lesenswert?

xxAlexx schrieb:
> Sobald ich Interrupts in mein Pogramm aufnehme und damit den µC über USB
> flashe werden alle Befehle bis zum ersten auftauchen von sei()
> ausgeführt, der Rest wird nicht ausgeführt (respektive der Interrupts).

Hast du ISRs für alle auftretenden bzw. aktivierten Interrupts 
definiert?

> Da ich keinerlei Fehlerquellen in meinem noch simplen Code erkennen
> konnte,

Zeig mal.
Gast #2447360
Lesenswert?

Denke schon. Habe lediglich den OVF Interrupt in Timer1 aktiviert und 
die ISR auch definiert.
1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
#include <inttypes.h>
4

5
 
6

7
volatile uint8_t iflag = 0;
8

9

10
ISR(TIMER1_OVF_vect) {
11
  
12
  iflag = 1;
13

14
}
15

16

17

18
int main(void) {
19

20

21

22
  // PORTB als Ausgang
23
  
24
  DDRB = 0xFF;
25
      
26
  // initialisiere Timer1, clk/8
27
  TCCR1B |= ( (1<<CS11) );
28

29
  // enable interrupt on overflow in timer1
30

31
  TIMSK1 |= (1<<TOIE1);
32

33
  // Einschalten des Global interrupt flag
34

35
  sei();
36

37
         // Toggle LED bei Overflow
38

39
  while(1) {  
40

41
      if(iflag == 1) {
42

43
      PORTB ^= (1<<PB0);
44

45
      iflag = 0;
46

47
  
48
    }
49
    
50
  }
51

52
}

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