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
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?
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 | }
|
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
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
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
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
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.
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).
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.