Forum: Mikrocontroller und Digitale Elektronik Taster 3sek gedrückt -> reset wie macht ihr das?


von Ersi (cell85)


Lesenswert?

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

von scherzkeks (Gast)


Lesenswert?

Dann schau mal im Datenblatt nach dem Reset-Vector ...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Reinhard S. (schopfi)


Lesenswert?

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 :-)

von scherzkeks (Gast)


Lesenswert?

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 
:-)

von Reinhard Kern (Gast)


Lesenswert?

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

von Ersi (cell85)


Lesenswert?

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
}

von Ersi (cell85)


Lesenswert?

> 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.

von Ersi (cell85)


Lesenswert?

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()

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Ersi (cell85)


Lesenswert?

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
Noch kein Account? Hier anmelden.