Hallo in die Runde,
wahrscheinlich habe ich etwas vor den Augen und übersehen - ich habe
folgenden Code und bin der Meinung, den Timer1 des ATMEGA 644 in den CTC
Mode mit Interrupt on Compare Match (A) gesetzt zu haben. Zum Test soll
in der ISR eine LED getoggelt werden. Hier der Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/wdt.h>
|
4 |
|
5 | #define CANIX_LED_YELLOW 1
|
6 | #define LED_PORT PORTA
|
7 | #define LED_PORT_DDR DDRA
|
8 |
|
9 | ISR(TIMER1_COMPA_vect) {
|
10 | LED_PORT ^= (1 << CANIX_LED_YELLOW);
|
11 | }
|
12 |
|
13 | void timer_init(void) {
|
14 | TCNT1 = 0;
|
15 |
|
16 | OCR1A = 200;
|
17 | TIMSK1 = (1 << OCIE1A); /* Enable interrupt on compare match */
|
18 | TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10); /* Prescaler */
|
19 |
|
20 | sei();
|
21 | }
|
22 |
|
23 | int main(void) {
|
24 |
|
25 | /* Enable watchdog with 2 secs timeout */
|
26 | //wdt_enable(WDTO_2S);
|
27 | //wdt_reset();
|
28 |
|
29 | /* Yellow LED */
|
30 | LED_PORT_DDR |= (1 << CANIX_LED_YELLOW);
|
31 | LED_PORT &= ~(1 << CANIX_LED_YELLOW);
|
32 |
|
33 | timer_init();
|
34 |
|
35 | /* test */
|
36 | while(1) {
|
37 | wdt_reset();
|
38 | }
|
39 |
|
40 | return 0;
|
41 | }
|
F_CPU ist 8MHz, Fuses sind E:FC, H:D2, L:E7, der Code wird an Stelle
7800hex als Bootloader geschrieben.
Ich sollte bei dem eingestellten Prescaler von 1024 doch ein gut
sichbares Blinken der LED erwarten können?!
Nach meinen Recherchen wird die ISR nicht ausgeführt. Der Zähler aber
läuft, denn wenn ich z.B. in der Hauptschleife den Zählerstand abfrage
und bei jeweils 0 bzw. 100 die LED an- und ausschalte habe ich mein
Blinken.
Der WD ist nur testweise im Code, der dürfte doch keinen Einfluss haben,
oder?
Irgendwelche Fallstricke? Etwas übersehen? Interrupts global noch aus
trotz sei()?
Viele Grüße Uli