www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Watchdog mega32


Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

in der main() ist es zu spät, versuche es mal mit:
/*************************************************************************
 *
 *  Name         : InitIO
 *
 *  Beschreibung : 
 *                 Wird direkt über dem Reset-Vektor aufgerufen, d.h.
 *                 der Stack-Pointer ist noch nicht initialisiert, also
 *                 nur direkte Zuweisungen benutzen. GCC geht davon aus
 *                 das R1 immer 0 ist!
 *
 *  Parameter    : keine
 *
 *  Rückgabe     : keine
 *
 *************************************************************************/
static uint8_t gMcuCsr;

void __attribute__ ((naked, section(".init0"))) InitIO (void)
{
 __asm ("eor r1, r1");                  // Register 1 löschen

 gMcuCsr = MCUCSR;

}

gMcuCsr kann dann in der main() ausgewertet werden.

MfG

Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo..

Habe es mal eingebunden, hoffe richtig.
Leider funktioniert es nicht. Bekomme auch immer 0x00.
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <avr/wdt.h>
#include <compat/twi.h>

#include "portbits.h"

#define BAUDRATE 9600L

#include "main.h"
#include "lcd_ks0066_4bit_io.h"



#ifndef F_CPU
#error F_CPU unkown
#endif

static uint8_t gMcuCsr;

void __attribute__ ((naked, section(".init0"))) InitIO (void)
{
 __asm ("eor r1, r1");                  // Register 1 löschen

 gMcuCsr = MCUCSR;

}

//****************************************************************************
ISR(USART_RXC_vect)
{
  unsigned int c;
  c = UDR;
  
  if (c==0xFF) 
  {
    cli();
    wdt_enable(0);
    while(1) {};
  }
}

/*---------------------------------------------------------------------------------------------------------------------------------------------------
 * MAIN: main routine
 *---------------------------------------------------------------------------------------------------------------------------------------------------
 */
int main (void)
{
  
  // Wegen Bootloader
  wdt_disable();

  uart_init();        // initialize UART

  sei();              // enable interrupts  

  UDR = gMcuCsr;     // sende WDT Grund  

  
  for (;;)
  {
  

  }
}

Lg, markus

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.
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.

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