www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software Reset AVR


Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich möchte den AVR resetten wenn ich ein bestimmtes Zeichen über den 
USART empfange...

Nur irgendwie macht der dann Resets ohne Ende....

Hier mal ein bißchen Code...
void reset(void)
{
  wdt_enable(WDTO_250MS);
  while(1);  //warten das der Watchdog den AVR resettet
}
ISR(USART0_RX_vect)
{
  uint8_t temp=UDR0;

  if(temp=='R')
      reset();
}

Muss ich im main() noch was erledigen?

AVR: ATMega644p
Compiler: AVR-GCC

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nix Nix wrote:

> Muss ich im main() noch was erledigen?

Den Watchdog wieder abschalten?

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also
wdt_disable();

vorne im main() oder wie...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das beantwortet aber nicht die Frage ob das wdt_disable() reicht...

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm anscheined nicht...

weil
int main (void)
{
  //Wenn Reset per Uart Watchdog ausschalten
  wdt_disable();

hilft nicht...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das beantwortet aber nicht die Frage ob das wdt_disable() reicht..

Häh? In dem Link steht doch, dass wdt_disable(); nur der zweite Hälfte 
vom Weg ist. Die erste Hälfte ist das WDRF-Bit im MCUSR Register zu 
löschen.

Und das als erstes in main() zu machen, kann ggf. schon zu spät sein.

Hier steht es nochmal:
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm ein
void reset_wdt(void) __attribute__((naked)) __attribute__((section(".init3")));

...

void reset_wdt(void)
{
  MCUSR &= (1<<WDRF);
  wdt_disable();
}

hilft auch nicht...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nix Nix wrote:
>   MCUSR &=  (1<<WDRF);
             ^

Wie geht's mit:

    MCUSR &= ~(1<<WDRF);

Beim AVR löscht man manche Bits durch Setzen/Verodern. Ob das beim WDRF 
auch so ist, steht im Datenblatt. Das hat bestimmt technische Gründe, 
aber beim Lesen solcher Dinge, stelle ich mir Gelächter der Atmel-Ings. 
in der Bar vor, wo sie sich diesen Joke ausgedacht haben.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan "stefb" B. wrote:

> aber beim Lesen solcher Dinge, stelle ich mir Gelächter der Atmel-Ings.
> in der Bar vor, wo sie sich diesen Joke ausgedacht haben.

Das hat recht handfeste Gründe.

http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

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.