Moin,
ich habe hier ein kleines Problem mit meinem mega88pa.
In meinem Programm nutze ich alle 3 Timer. Doch egal bei welchem und
egal ob Timer-Overflow oder Output-Compare, jedesmal wenn ein Interrupt
ausgelöst werden soll, startet der µC neu. Allerdings nur bei
Timer-Interrupts. Daher befürchte ich, habe ich dort nen Denkfehler
drinnen.
Ich hab meinen Code schon auf ein Minimum reduziert, um evtl.
Fehlerquellen auszuschließen. Vielleicht mag sich das einer von euch mal
ansehen:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "uart.h"
|
4 |
|
5 |
|
6 | ISR(TIMER2_OVF_vect) {
|
7 | TCCR2B = 0;
|
8 | sendData(1,1,1,0,0);
|
9 | }
|
10 |
|
11 | int main(void) {
|
12 | initUart(0);
|
13 | sei();
|
14 | sendData(0,0,0,0,0);
|
15 |
|
16 | TIMSK2 = (1<<TOIE2);
|
17 | TCCR2B = (1<<CS22) | (1<<CS20);
|
18 | while(1) {
|
19 | }
|
20 | return 0;
|
21 | }
|
sendData überträgt mir Daten über nen RS485-Bus an den PC. Die Funktion
arbeitet einwandfrei und kann als Fehlerquelle ausgeschlossen werden,
daher habe ich sie nicht extra mit aufgeführt. Wenn ich den Timer
deaktiviert lasse, werden die Daten des nach sei() kommenden sendData
genau einmal übertragen, wie erwartet.
Stelle ich jedoch den Timer so ein, das er ein Interrupt generiert,
bekomme ich die Daten im Takt des Interrupts. Das sendData in der ISR
hingegen wird nie erreicht. Folglich wird die ISR nie ausgeführt und der
µC resettet sich ständig.
Die Interrupt-Vektortabelle sieht für mich auch ok aus:
1 | 00001800 <__vectors>:
|
2 | 1800: 19 c0 rjmp .+50 ; 0x1834 <__ctors_end>
|
3 | 1802: 28 c0 rjmp .+80 ; 0x1854 <__bad_interrupt>
|
4 | 1804: 27 c0 rjmp .+78 ; 0x1854 <__bad_interrupt>
|
5 | 1806: 26 c0 rjmp .+76 ; 0x1854 <__bad_interrupt>
|
6 | 1808: 25 c0 rjmp .+74 ; 0x1854 <__bad_interrupt>
|
7 | 180a: 24 c0 rjmp .+72 ; 0x1854 <__bad_interrupt>
|
8 | 180c: 23 c0 rjmp .+70 ; 0x1854 <__bad_interrupt>
|
9 | 180e: 22 c0 rjmp .+68 ; 0x1854 <__bad_interrupt>
|
10 | 1810: 21 c0 rjmp .+66 ; 0x1854 <__bad_interrupt>
|
11 | 1812: 35 c0 rjmp .+106 ; 0x187e <__vector_9>
|
12 | 1814: 1f c0 rjmp .+62 ; 0x1854 <__bad_interrupt>
|
13 | 1816: 1e c0 rjmp .+60 ; 0x1854 <__bad_interrupt>
|
14 | 1818: 1d c0 rjmp .+58 ; 0x1854 <__bad_interrupt>
|
15 | 181a: 1c c0 rjmp .+56 ; 0x1854 <__bad_interrupt>
|
16 | 181c: 1b c0 rjmp .+54 ; 0x1854 <__bad_interrupt>
|
17 | 181e: 1a c0 rjmp .+52 ; 0x1854 <__bad_interrupt>
|
18 | 1820: 19 c0 rjmp .+50 ; 0x1854 <__bad_interrupt>
|
19 | 1822: 18 c0 rjmp .+48 ; 0x1854 <__bad_interrupt>
|
20 | 1824: 17 c0 rjmp .+46 ; 0x1854 <__bad_interrupt>
|
21 | 1826: 16 c0 rjmp .+44 ; 0x1854 <__bad_interrupt>
|
22 | 1828: 15 c0 rjmp .+42 ; 0x1854 <__bad_interrupt>
|
23 | 182a: 14 c0 rjmp .+40 ; 0x1854 <__bad_interrupt>
|
24 | 182c: 13 c0 rjmp .+38 ; 0x1854 <__bad_interrupt>
|
25 | 182e: 12 c0 rjmp .+36 ; 0x1854 <__bad_interrupt>
|
26 | 1830: 11 c0 rjmp .+34 ; 0x1854 <__bad_interrupt>
|
27 | 1832: 10 c0 rjmp .+32 ; 0x1854 <__bad_interrupt>
|
Hat jemand ne Idee, wo mein Fehler liegt?
Achja, mein Controller läuft mit 16Mhz auf 5V und im AvrStudio-Simulator
scheint der Code ohne Probleme zu laufen...