bin nach dem Beitrag Umstieg von Arduino auf AVR vorgegangen und es
entsteht tatsächlich kleinerer Code. Sobald das Programm jedoch IRQs
enthält, funktioniert am Ende nur noch die IRQ-Routine.
Beispiel (Arduino):
1 |
|
2 | void setup() {
|
3 |
|
4 | cli(); // disable IRQs
|
5 |
|
6 | // WatchDogTimer Setup
|
7 | asm("WDR"); // Watchdog Reset to zero
|
8 | WDTCSR |= 24; // WatchDog CHANGE ENABLE
|
9 | WDTCSR = 70; // time-out in 1 second & WDT_irq active (0100 0110)
|
10 | sei(); // re-activate Interrupts
|
11 |
|
12 | DDRC |= 40;
|
13 | }
|
14 |
|
15 | void loop() {
|
16 | PORTC = PORTC ^ 8;
|
17 | delay(500);
|
18 | }
|
19 |
|
20 | ISR (WDT_vect) {
|
21 | PORTC = PORTC ^ 32;
|
22 | }
|
bringt beide LED zum Blinken.
In der "NoDuino-"Form:
1 |
|
2 | #include <stdint.h>
|
3 |
|
4 | int main(void) {
|
5 |
|
6 | cli(); // disable IRQs
|
7 |
|
8 | // WatchDogTimer Setup
|
9 | asm("WDR"); // Watchdog Reset to zero
|
10 | WDTCSR |= 24; // WatchDog CHANGE ENABLE
|
11 | WDTCSR = 70; // time-out in 1 second & WDT_irq active (0100 0110)
|
12 | sei(); // re-activate Interrupts
|
13 |
|
14 | DDRC |= 40; // PC 3 and PC 5 are Output
|
15 |
|
16 | while (1) {
|
17 | PORTC = PORTC ^ 8;
|
18 | delay(500);
|
19 | }
|
20 | }
|
21 |
|
22 | ISR (WDT_vect) {
|
23 | PORTC = PORTC ^ 32;
|
24 | }
|
blinkt nur noch die LED, die von der Watchdog-Timer Routine aufgerufen
wird.
Habt Ihr eine Erklärung für dieses Verhalten ?