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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.