Umstieg von Arduino IDE auf AVR -- scheitert an IRQs

OP #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.
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.