Hallo, wie programmiert man, dass wenn man 3 Sekunden lang Button1 drückt sich ein Board (mit nem STM32F103ZE) resettet? Der Resetknop, welcher auch vorhanden ist, resettet ja sofort. Das will ich ja nicht. Habt ihr eine IDee? EXTI auf den Button und in der Interrupt routine dann einen Timer laufen lassen? Wert des Timers nach loslassen >3000 dann reset? => geht das so ? Wie lautet denn die Funktion für den reset? Gruß Sven
Dann schau mal im Datenblatt nach dem Reset-Vector ...
Ist ein 2-schneidiges Schwert. Denn: Warum willst du denn als Benutzer den µC resetten? Antwort: Weil sich was aufgehängt hat. Nur: wie soll denn ein Programm welches sich aufgehängt hat einen Button abfragen und 3 Sekunden später den µC resetten? IMHO sind derartige Reset-Sachen immer eine Hardware-Sache, weil sie auch dann noch funktionieren müssen, wenn im Programm gar nichts mehr geht.
Hi ! Ich würd dann mit einem Taster über einen Widerstand einen Kondensator laden und das Signal dann über einen Transistor an den Reset durchschalten. LadeZeiten bzw. Spannungen am KO kann man berechnen. 3Sek dürften so kein Problem sein :-)
Karl Heinz Buchegger schrieb: > Ist ein 2-schneidiges Schwert. > Denn: Warum willst du denn als Benutzer den µC resetten? > Antwort: Weil sich was aufgehängt hat. Muß nicht sein, er kann ja auch eine Art Bootloader/Programmwechsler o.ä. umsetzen wollen, also Startadresse verbiegen und nach dem Reset läuft das neue Programm. Ansonsten ist ein aktivierter Watchdog sicherlich die geeignetere Art :-)
Karl Heinz Buchegger schrieb: > IMHO sind derartige Reset-Sachen immer eine Hardware-Sache Für Reset richtig, aber die Frage stellt sich auch für andere Funktionen: z.B. soll die Tastatur normal funktionieren, aber die "Speicher"-Taste muss man länger drücken. Allerdings ist das Hochzählen eines Registers in jedem Time Interrupt, in dem die Taste gedrückt ist (und Nullstellen nicht vergessen, wenn nicht!!) so trivial dass auch ein Anfänger danach nicht fragen müsste. Gruss Reinhard
Ja aber da passiert bei mir nichts, hab die aktuelle CMSIS. Meine funktion in der EXT schaut so aus:
1 | void ResetButton( void ) |
2 | |
3 | {
|
4 | int dauer = 0; |
5 | |
6 | init_timer2(); //initialisiern des timers |
7 | start_timer2(); //starte timer mit 10msec |
8 | |
9 | while (buttonstate == 1) //solange button gedrückt tue nichts |
10 | {}
|
11 | |
12 | //button losgelassen
|
13 | |
14 | dauer = ak_timer2(); //schreibe aktuellen wert des timers in dauer |
15 | |
16 | if (dauer <= 300) //wenn dauer größer/gleich 300*10msec = 3sec = dann reset |
17 | {
|
18 | cleareeprom(); //hard-reset parameter im eeprom in grundeinstellung |
19 | NVIC_SystemReset(); |
20 | |
21 | }
|
22 | |
23 | |
24 | }
|
> Antwort: Weil sich was aufgehängt hat.
nene sondern um die daten in den einstellungen zu resetten.
Der normale reset ist ja auch noch da falls sich das system aufgehängt
hat oder nen hardfault irgendwo entstanden ist.
Reinhard Schopf schrieb: > Hi ! > > Ich würd dann mit einem Taster über einen Widerstand einen Kondensator > laden und das Signal dann über einen Transistor an den Reset > durchschalten. > LadeZeiten bzw. Spannungen am KO kann man berechnen. 3Sek dürften so > kein Problem sein :-) genial :D danke! mach ich beim nächsten board wo ich das noch implementieren kann :) nach der while schleife fehlt das
1 | stop_timer2(); |
das hab ich im programm. Aktuell steckt das stoppen in
1 | ak_timer2() |
Sven S. schrieb: >> Antwort: Weil sich was aufgehängt hat. > > nene sondern um die daten in den einstellungen zu resetten. Ja, ok. Aber das scheint er ja nicht vor zu haben. Er will anscheinend ja wirklich und wahrhaftig einen totalen Systemreset machen. Ich würde da durchaus unterscheiden. Denn nicht alles was jemand als "Reset" bezeichnet ist auch tatsächlich einer.
Sven S. schrieb: > if (dauer <= 300) //wenn dauer größer/gleich 300*10msec = 3sec = dann Wenn du größer willst, dann musst du auch größer schreiben. > { > cleareeprom(); //hard-reset parameter im eeprom in grundeinstellung > NVIC_SystemReset(); hast du schon mal probiert, ob diese beiden Calls das gewünschte erledigen? Wenn das soweit passt, dann lass dir halt mal den Wert in dauer ausgeben. Das Tastenprellen ist soweit ja hoffentlich schon extern erledigt worden. Nicht dass dir ein prellender Taster hier while (buttonstate == 1) einen Strich durch die Rechnung macht. Wie ändert eigentlich buttonstate seinen Wert?
Krass auf dem zweiten board von mir geht das ! Ist der Controller defekt?
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.