Moin!
Mein Problem ist, dass der ATmega162 mit angefügtem Code anscheinend
nicht in die ISR SIG_OVERFLOW0 springt.
Ich will mittels der definierten Makros TGLEDX() LEDs an- bzw.
ausschalten um zu überprüfen, ob meine Timerverlängerung (timerscaler)
richtig funktioniert.
Leider leuchten die LEDs nur ständig oder gar nicht. Das ist einerseits
im STK500, andererseits in meinem Board so.
Fuses: JTAGEN, CKDIV8, ATmega161, OCDEN und Watch-Dog sind aus.
Das Problem besteht sowohl, bei externem Quarz(11,0592 MHz) als auch bei
internem Oszillator.
Die Register sind wie folgt gesetzt:
1 | DDRA = ALL8; //set Portpins as Output
|
2 | DDRB = ALL8;
|
3 | DDRC = ALL8;
|
4 | TCCR0 |= (_BV(CS02)) | (_BV(WGM01)) | (_BV(WGM01)) | (_BV(COM01));
|
5 | //activation of 256-Timer0-Prescaler & FAST-PWM
|
6 | TIMSK |= (_BV(OCIE0)) | (_BV(TOIE0));
|
7 | //activate Timer0 Compare-Match & Overflow-Interrupt
|
Macros:
1 | #define LED0 PC0
|
2 | ...
|
3 | #define LED7 PC7
|
4 |
|
5 | #define TGLED0() PORTC ^= _BV(LED0)
|
6 | ...
|
7 | #define TGLED7() PORTC ^= _BV(LED7)
|
ISRs:
1 | void Zehntelrun(void){
|
2 | TGLED0();
|
3 | TGLED6();
|
4 | TGLED7();
|
5 | }
|
6 |
|
7 | ISR(SIG_OVERFLOW0){
|
8 | sei();//reenable interrupts
|
9 | if (timerscaler) timerscaler--;
|
10 | else {
|
11 | timer++;
|
12 | Zehntelrun();//zehntelrun(); is executed every Millisecondcalc
|
13 | timerscaler = F_CPU/256/256/10 - 1;// should be 17 @11MHz (12 @8MHz)
|
14 | }
|
15 | }
|
16 | //else branch is executed every 0.1s
|
Eigentlich total simpel, aber es treibt mich in den Wahnsinn.
Vielen Danke für Eure Hilfe!
P.S.: Wollte eigentlich im GCC-Forum posten, aber irgendwas ist da
schiefgelaufen. Sollte ich einen Doppelpost riskieren?