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
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.
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 | }
|
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.