ATmega32u4 Softwarereset

Gast #4495791
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
#4495795
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?
Gast #4495803
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
}
Gast #4495823
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
#4495869
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.
Gast #4495873
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.
Gast #4495880
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).

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