Forum: Mikrocontroller und Digitale Elektronik Watchdog mit dem Attiny 841


von Paul (Gast)


Lesenswert?

Hallo
Habe mir aus dem Datenblatt des Attiny 841 die Einstellungen für den 
Watchdog rausgesucht. Das Programm sieht so aus:
1
#define F_CPU 16000000UL    // Angabe der Frequenz, wichtig für die Zeit
2
#include <util/delay.h>      // Einbindung Datei Pause
3
#include <avr/io.h>        // Einbindung Datei Ausgänge
4
#include "avr/wdt.h"      // Einbindung Watchdog Bibliothek, vereinfacht WDT
5
#include "avr/interrupt.h"
6
7
void watchdogSetup()      // Einrichtung Watchdog
8
  {
9
  wdt_reset();        // führt Watchdog Reset durch vor Ablauf der Zeit
10
  WDTCSR |= (0<<WDP3)|(0<<WDP2)|(1<<WDP1)|(1<<WDP0);  // 0,125ms
11
  WDTCSR |= (1 <<WDIE)|(0<<WDE);    // Aktivierung Watchdog Interrups nicht Reset
12
  // WDTCSR - Register des Watchdog
13
  // WDIF - Watchdog Interuptflag
14
  // WDIE - Watchdog Interrupt Enable - ist Bit gesetzt dann löst Time-Out Interrupt aus mit Tabelle
15
  // WDE - ist Bit gesetzt dann löst Time-Out ein Reset aus mit Tabelle
16
  // WDP0, WDP1, WDP2, WDP3 Einstellung Zeit gemäss Tabelle
17
  }
18
  
19
ISR(WDT_vect)
20
  {
21
    PORTA ^= (1<<PINA5);    // toggelt LED 2
22
    WDTCSR |= (1<<WDIE);
23
  }
24
25
int main(void)
26
  {
27
  watchdogSetup();
28
  DDRA=0b00101001;      // DDR A auf Ausgang schalten
29
  PORTA=0b00101001;      // Port A auf aus
30
  while(1)          // Programmschleife
31
    {
32
    PORTA &=~(1<<PINA0);  // LED 3 ein
33
    _delay_ms(1500);      // Pause 
34
    
35
    PORTA |=(1<<PINA0);    // LED 3 aus
36
    _delay_ms(1500);      // Pause 
37
    }
38
  }
Mit der LED3 soll das blinken angezeigt werden.
Mit der LED2 soll der Watchdog angezeigt werden. Das macht er aber 
nicht. Auch wenn ich die Zeiten des Blinken grösser mache kommt keine 
Anzeige.
Hab ich da einen Denkfehler?

von Heiner (Gast)


Lesenswert?

Wie ist der Watchdog Timer eingestellt 😉

Blinkt die LED3?

von S. Landolt (Gast)


Lesenswert?

sei();

von Paul (Gast)


Lesenswert?

LED3 blinkt

von S. Landolt (Gast)


Lesenswert?

Und in der ISR ein 'wdt_reset();' statt des 'WDTCSR |= (1<<WDIE);'.
Stimmt eigentich der Name? Beim ATtiny84 lautet er (merkwürdigerweise) 
WATCHDOG_vect.

von Heiner (Gast)


Lesenswert?

S. Landolt schrieb:
> sei();

Das außerdem.

@Paul: was bewirkt sei()🤔

von Paul (Gast)


Lesenswert?

Cli(); schaltet interrups aus
sei(); schaltet interruts ein

Da mit geht es, danke für deine Hilfe

von Paul (Gast)


Lesenswert?

Habe ins DB geschaut. Dort steht Tabelle 9-1 Seite 49 WDT. Unterschiede 
sind manchmal da und keiner weiss warum.
1
ISR(WDT_vect)
2
  {
3
    PORTA ^= (1<<PINA5);    // toggelt LED 2
4
    WDTCSR |= (1<<WDIE);
5
  wdt_reset();
6
  }
Da gibt es aber ein komisches Verhalten. Egal welche Anweisung ich nehme 
schaltet die LED2 (Watchdog) nach ca. 5 bis 10 Blinlen der Zeitschleife 
ein (toggelt). Hatte die Blinkschleife auf 2 x 300ms und den Watchdog 
probeweise auf 2 s eingestellt.
Warum?

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Mangels ATtiny841 kann ich nicht so richtig mitreden; im Anhang ein 
Programm für der 84er, vielleicht hilft es. Eine LED blinkt flott, die 
andere gemächlich, beide aber schön gleichmäßig.

von S. Landolt (Gast)


Lesenswert?

PS:
Die Warnungen im Compiler ('-Wall') sind eingeschaltet?

von Paul (Gast)


Lesenswert?

S. Landolt schrieb:
> sei();

Du hattest sei(); empfohlen. Nach einfügen hat es funktioniert. In 
deinem Programm ist es aber nicht drin?

Paul schrieb:
> WDTCSR |= (1<<WDIE);
> wdt_reset();
Welche der beiden Anweisungen muss man nehmen. Von P.Da. stammt z.B. 
WDTCSR.... Es scheinen beide zu funktionieren aber was ist richtig?

von Egonwalter M. (heiner1234)


Lesenswert?

Paul schrieb:
> S. Landolt schrieb:
>> sei();
>
> Du hattest sei(); empfohlen. Nach einfügen hat es funktioniert. In
> deinem Programm ist es aber nicht drin?


Mein Gott Paul, Du kannst ja nicht mal richtig lesen!
Guck doch nochmal GENAU das Programm von S. Landolt durch, da findeste 
bestimmt irgendwo sei(), denn OHNE sei() fkt es nicht

Und Du willst programmieren...such Dir lieber ein anderes Hobby, so wird 
das nix!

SCNR

von S. Landolt (Gast)


Lesenswert?

> In deinem Programm ist es aber nicht drin?
Steht doch da?:
[c]
...
  PORTA=0b00101001;      // Port A auf aus
  sei();
  while(1)          // Programmschleife
...
[/c)

> ... WDTCSR ...
Das stimmt wohl; muss ich erst noch mal im Datenblatt nachlesen, ich 
nutze, zugegeben, den Watchdog eigentlich nie.

von S. Landolt (Gast)


Lesenswert?

PS:
Wobei er, mit seiner Stromaufnahme im einstelligen uA-Bereich, durchaus 
interessant sein kann.

von Paul (Gast)


Lesenswert?

Sorry, an der Stelle habe ich nicht geschaut.
Werde die Stromaufnahme auch noch messen und informieren.

von S. Landolt (Gast)


Lesenswert?

> Werde die Stromaufnahme auch noch messen und informieren.

Für den ATtiny841, wäre interessant.
Hier für den 84er, auf Grund einer anderen Diskussion gemessen:
 5V0: 6.1, 3V8: 4.8, 3V3: 4.4, 3V0: 4.2, 2V0: 3.7 uA.

von Peter D. (peda)


Lesenswert?

Paul schrieb:
> Paul schrieb:
>> WDTCSR |= (1<<WDIE);
>> wdt_reset();
> Welche der beiden Anweisungen muss man nehmen. Von P.Da. stammt z.B.
> WDTCSR.... Es scheinen beide zu funktionieren aber was ist richtig?

Das wdt_reset ist überflüssig, der Watchdog ist ja gerade übergelaufen 
d.h. zählt wieder von 0 an.

von Paul (Gast)


Lesenswert?

Peter D. schrieb:
> Das wdt_reset ist überflüssig, der Watchdog ist ja gerade übergelaufen
> d.h. zählt wieder von 0 an.

Danke Peter für die Info

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.