Forum: Mikrocontroller und Digitale Elektronik ATmega32u4 Softwarereset


von Stephen (Gast)


Lesenswert?

Hallo Ihr Nachtaktiven,

hat jemand zufällig eine fertige Funktion für ein Reset des ATmega32u4 
über eine C-Programmierung?

Oder eine Idee wie ich meinen µC per Software Routine resetten kann?

bevor die Frage aufkommt was ich vorhabe:

Ich habe ein ATMega32U4, möchte das der µC sich alle immer dann Resettet 
wenn eine Variable ein bestimmten Wert erreicht.

Danke schon mal im Voraus

von Cyblord -. (cyblord)


Lesenswert?

Stephen schrieb:
> Hallo Ihr Nachtaktiven,
>
> hat jemand zufällig eine fertige Funktion für ein Reset des ATmega32u4
> über eine C-Programmierung?
Nein.
>
> Oder eine Idee wie ich meinen µC per Software Routine resetten kann?
Watchdog. Ist an sich die einzige Möglichkeit einen echten Reset in SW 
zu machen.
Also Watchdog einschalten und ins Timeout laufen lassen -> Reset.

> Ich habe ein ATMega32U4, möchte das der µC sich alle immer dann Resettet
> wenn eine Variable ein bestimmten Wert erreicht.
Toll. Aber WARUM nur?

von Stephen (Gast)


Lesenswert?

Cyblord -. schrieb:
>> Ich habe ein ATMega32U4, möchte das der µC sich alle immer dann Resettet
>> wenn eine Variable ein bestimmten Wert erreicht.
> Toll. Aber WARUM nur?

Ja das ist eine Gute Frage, Ich versuche damit eventuelle Störungen zu 
beheben.


also da ich mich mit dem Watchdog nicht so wirklich auskenne habe ich 
mal versucht ein kleines Programm dazu zuschreiben, aber es funktioniert 
nicht xD
1
#include <avr/io.h>
2
#include <stdio.h>          // Einbinden der Standard I/O Ports
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5
#include <avr/wdt.h>
6
7
int i = 0;
8
9
int main(void)
10
{
11
  for(i = 0; i < 10; i++)
12
  {
13
    
14
  }
15
  wdt_reset();
16
  wdt_enable(WDTO_2S);
17
}

von Cyblord -. (cyblord)


Lesenswert?

Wenn du den Reset auslösen willst, darfst grade NICHT wdt_reset 
ausführen. Bitte lese dir das Kapitel über den Watchdog im Datenblatt 
durch versuche zu verstehen was der eigentlich tut.

: Bearbeitet durch User
von Stephen (Gast)


Lesenswert?

Ja das habe ich auch schon gesehen ich resete den Watchdog einmal beim 
starten und dann nicht mehr.
aber wenn ich das so mache

#include <avr/io.h>
#include <stdio.h>          // Einbinden der Standard I/O Ports
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>   // INCLUDE DER WATCHDOG DATEI

int i = 0;

int main(void)
{
  wdt_reset(); // RESETEN DES TIMERS DES WATCHDOGS
  while(1)
  {
    for(i = 0; i < 10; i++);
    wdt_enable(WDTO_2S); //TIMER AKTIVIEREN MIT EINER BESTIMMTEN PERIODE
  }
}

dann resetet er nicht den kompletten µC

von Cyblord -. (cyblord)


Lesenswert?

Ja sorry ich hatte den reset in der schleife gesehen.

Stephen schrieb:

> dann resetet er nicht den kompletten µC
Wie prüfst du ob der reset stattgefunden hat?

: Bearbeitet durch User
von Draco (Gast)


Lesenswert?

Kann man nicht einfach einen Puls auf den Resetpin geben? Von einem AVR 
Pin aus?

von Cyblord -. (cyblord)


Lesenswert?

Draco schrieb:
> Kann man nicht einfach einen Puls auf den Resetpin geben? Von einem AVR
> Pin aus?

1.) Ist das dann keine reine SW Lösung, wie gefordert
2.) Geht das nicht, da alle Pins beim Ziehen von Reset hochohmig werden, 
und zwar BEVOR die Mindest-LO-Zeit am Reset Pin für einen Reset erreicht 
ist.

Mithilfe weiterer Hardware (Zeitglied) ist das aber auf jeden Fall 
möglich.

Nur ist das ganze einfach meist gar nicht nötig. Und auch hier wird es 
einfach nicht nötig sein überhaupt einen Reset auszulösen.

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Klar Draco,

über einen Monoflop (NE555) solltest Du das Signal, als open collector 
Ausgang dem Restpin zuführen, noch etwa verlängern.

Aber lieber das Programm richt und stabil schreib, als diese Holzhammer 
Methode.

Der WDT ist sonst dein Freund, zyklisch den WDT resetten und wenn das 
Programm mal hängt, wird der µC per WDT neu gestartet.

von Karl M. (Gast)


Lesenswert?

Cyblord du warst schneller.

von Draco (Gast)


Lesenswert?

Das ein Reset des AVRs nicht zu bevorzugen ist, ist mir durchaus bewusst 
- mir fiele da übrigens auch kein Awendungsfall ein, welch solch ein 
Verhalten nötig macht :D

Aber interessant Cyblord, das verhalten der IO während Reset gezogen 
wird, das wusste ich noch nicht (Hab mich damit auch, zugegebenermaßen, 
noch nie beschäftigt).

von Stephen (Gast)


Lesenswert?

So hab mich jetzt mit dem Datenblatt mal inruhe auseinander gesetzt und 
der Reset funktioniert erstmal soweit wie ich das möchte.

Danke für eure Hilfe

von Robert S. (bimbo385)


Lesenswert?

Da so gehts:

cli();            // disable interrupts 
wdt_enable(WDTO_15MS);  // reset via watchdog 
_delay_ms(100);    // wait until reset occurs


Benutze ich z.B. um aus dem Laufendem Programm (z.B. nach Empfang eines 
Strings) raus wieder in den Bootloader zu kommen.


Mfg Bimbo385

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.