Forum: Mikrocontroller und Digitale Elektronik AT90USB646 USB/Interrupt problem


von xxAlexx (Gast)


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

von Helfer (Gast)


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.

von xxAlexx (Gast)


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
}

von Helfer (Gast)


Lesenswert?

Mir springt da nix ins Auge... Wenn dein MC mit 16 MHz rennt, gibt's 30 
IRQs pro Sekunde (16M / 2^16 / 8). Wie beobachtest du PB0?

von xxAlexx (Gast)


Lesenswert?

Habe ne LED draufgesteckt, die auch im richtigen Tempo blinkt. aber eben 
nur wenn ich USB nach flashen ab ziehe und wieder verbinde.

Wenn ich dann nochmal hardware reset drücke bricht das programm wieder 
ab.

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.