Watchdog mit dem Attiny 841

Gast #6978733
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?
Gast #6978872
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?
#6979323
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
Gast #6979328
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.
Gast #6979407
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.

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