Forum: Mikrocontroller und Digitale Elektronik Watchdog mega32


von Markus C. (ljmarkus)


Lesenswert?

Hallo..

Ich habe durch die Suche nicht wirklich was gefunden.

Also:
Ich möchte beim Neustart des AVR rausfinden wieso er neu gestartet hat.

#include <avr/wdt.h>
...

int main (void)
{
  unsigned char c;

  c = MCUCSR;

  // Wegen Bootloader
  wdt_disable();
...

UDR = c;
....
}

leider bekomme ich immer 0x00 ausgegeben.
Ich möchte wissen ob, durch den Befehl "wdt_enable(0);" oder durch 
entfernen der Betriebsspannung der WD zugeschlagen hat.

Bitte um Hilfe.

Danke, Markus

von Sauger (Gast)


Lesenswert?

Moin,

in der main() ist es zu spät, versuche es mal mit:
1
/*************************************************************************
2
 *
3
 *  Name         : InitIO
4
 *
5
 *  Beschreibung : 
6
 *                 Wird direkt über dem Reset-Vektor aufgerufen, d.h.
7
 *                 der Stack-Pointer ist noch nicht initialisiert, also
8
 *                 nur direkte Zuweisungen benutzen. GCC geht davon aus
9
 *                 das R1 immer 0 ist!
10
 *
11
 *  Parameter    : keine
12
 *
13
 *  Rückgabe     : keine
14
 *
15
 *************************************************************************/
16
static uint8_t gMcuCsr;
17
18
void __attribute__ ((naked, section(".init0"))) InitIO (void)
19
{
20
 __asm ("eor r1, r1");                  // Register 1 löschen
21
22
 gMcuCsr = MCUCSR;
23
24
}
gMcuCsr kann dann in der main() ausgewertet werden.

MfG

von Markus C. (ljmarkus)


Lesenswert?

Hallo..

Habe es mal eingebunden, hoffe richtig.
Leider funktioniert es nicht. Bekomme auch immer 0x00.
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <avr/pgmspace.h>
5
#include <avr/interrupt.h>
6
#include <avr/eeprom.h>
7
#include <avr/wdt.h>
8
#include <compat/twi.h>
9
10
#include "portbits.h"
11
12
#define BAUDRATE 9600L
13
14
#include "main.h"
15
#include "lcd_ks0066_4bit_io.h"
16
17
18
19
#ifndef F_CPU
20
#error F_CPU unkown
21
#endif
22
23
static uint8_t gMcuCsr;
24
25
void __attribute__ ((naked, section(".init0"))) InitIO (void)
26
{
27
 __asm ("eor r1, r1");                  // Register 1 löschen
28
29
 gMcuCsr = MCUCSR;
30
31
}
32
33
//****************************************************************************
34
ISR(USART_RXC_vect)
35
{
36
  unsigned int c;
37
  c = UDR;
38
  
39
  if (c==0xFF) 
40
  {
41
    cli();
42
    wdt_enable(0);
43
    while(1) {};
44
  }
45
}
46
47
/*---------------------------------------------------------------------------------------------------------------------------------------------------
48
 * MAIN: main routine
49
 *---------------------------------------------------------------------------------------------------------------------------------------------------
50
 */
51
int main (void)
52
{
53
  
54
  // Wegen Bootloader
55
  wdt_disable();
56
57
  uart_init();        // initialize UART
58
59
  sei();              // enable interrupts  
60
61
  UDR = gMcuCsr;     // sende WDT Grund  
62
63
  
64
  for (;;)
65
  {
66
  
67
68
  }
69
}

Lg, markus

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.