Forum: Compiler & IDEs Umstieg von Arduino IDE auf AVR -- scheitert an IRQs


von Thomas S. (zeilentrafo)


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 ?

: Bearbeitet durch User
von JensMa (Gast)


Lesenswert?

Sitzt das DDRC Register nicht richtig?
Wird das beim Arduino Starteup anders gesetzt als nach dem Reset?

von JensMa (Gast)


Lesenswert?

Sorry hab die 40 als Hex (und damit nur als 1 Bit) betrachtet.

von ardu test (Gast)


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.

von Thomas S. (zeilentrafo)


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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.