Umstieg von Arduino IDE auf AVR -- scheitert an IRQs

#6674195
Lesenswert?

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 ?
Gast #6674213
Lesenswert?

1
#include <ctype.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5

6
#define F_CPU  16000000
7

8
int main(void)
9
{
10
  cli();                // disable IRQs
11

12
  // WatchDogTimer Setup
13
  asm("WDR");    // Watchdog Reset to zero
14
  WDTCSR |= 24;  // WatchDog CHANGE ENABLE
15
  WDTCSR = 70;   // time-out in 1 second & WDT_irq active (0100 0110)
16
  sei();         // re-activate Interrupts
17

18
  DDRB = 0;
19
  DDRB |= (1<<PB5);  // PB5: Std LED Arduino = SCK
20
  DDRB |= (1<<PB4);  // PB4: extra LED (next to PB5)  = MISO
21

22
  while (1)
23
  {
24
    PORTB = PORTB ^ (1<<PB5);
25
    _delay_ms(500);
26
  }
27
}
28

29
ISR (WDT_vect)
30
{
31
  PORTB = PORTB ^ (1<<PB4);
32
}
Habe das mal schnell auf einem Arduino Uno verifiziert. So
funktioniert es. Unter anderem gibt es "ohne Arduino" kein
delay(..) und die LED ist die des Uno.

Wenn du deine gewünschten Port-Pins einträgst sollte es
bei dir auch blinken.
#6674217
Lesenswert?

Vielen Dank. Es war das
1
 delay()
 das zwar keine Fehlermeldung auslöst, aber nicht (mehr) funktioniert.

So:
1
#include <stdint.h>
2
#include <ctype.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5

6
int main(void)  {
7
  cli();                // disable IRQs
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
  DDRC |= 40;           // PC 3 and PC 5 are Output
14

15
  while (1) {
16
    PINC |= 8;
17
    _delay_ms(500);
18
  }
19
}
20

21
ISR (WDT_vect) {
22
  PINC |= 32;
23
}
blinkt alles und braucht nur noch 204 Bytes (0%).
(mit dem Spence Konde Core kompiliert).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren