Forum: Mikrocontroller und Digitale Elektronik Arduino: Unterschied Reset-Taster und "Jmp 0"


von Marco (Gast)


Lesenswert?

Guten Morgen,

Ich erkenne am Verhalten einen Unterschied zwischen dem Reset-Taster auf 
der Platine und einem Software-Reboot via "asm volatile ("  jmp 0");"

Wodurch ist der Unterschied begründet?

Wichtiger: Wie lässt sich der Reset-Taster softwaremäßig simulieren, um 
genau DEN REBOOT auszulösen, den der Taster auch bewirkt?

Danke für Tipps.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Marco schrieb:
> Wodurch ist der Unterschied begründet?

Der "echte" Reset setzt alle Prozessorregister und die komplette 
Peripherie in einen definierten Ausgangszustand zurück und führt dann 
den Code ab Adresse 0 aus.

Dein "Softwarereset" lässt Prozessorregister und Peripherie so, wie sie 
waren, und führt den Code ab Adresse 0 aus.

von Marco (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Der "echte" Reset setzt alle Prozessorregister und die komplette
> Peripherie in einen definierten Ausgangszustand zurück und führt dann
> den Code ab Adresse 0 aus.

Danke Rufus. Lässt sich der "echte Reset" mit vertretbarem Aufwand 
softwaremäßig simulieren?

von da1l6 (Gast)


Lesenswert?

Hallo,

Watchdog timer auf minimales Intervall stellen und dann in eine 
Endlosschleife gehen.

da1l6

von georg (Gast)


Lesenswert?

Marco schrieb:
> Wie lässt sich der Reset-Taster softwaremäßig simulieren

Wie Rufus schon erklärt hat, setzt ein Hardwarereset Register, genaueres 
steht im Manual. Es gibt einige Krücken, einen Hardwarereset auszulösen, 
wie mit absichtlich ablaufendem Watchdog oder Anschluss des 
Reseteingangs an einen I/O-Pin, aber meiner Meinung nach ist es 
sauberer, im Programm ab Adresse 0 alles so zu initialisieren, wie man 
es braucht - dann ist es egal, ob Hard oder Soft (JMP).

Es gibt aber hier im Forum einige Programmierer, die das Initialisieren 
per Programm strikt ablehnen.

Georg

von Marco (Gast)


Lesenswert?

georg schrieb:
> aber meiner Meinung nach ist es
> sauberer, im Programm ab Adresse 0 alles so zu initialisieren, wie man
> es braucht

?? Wie lässt das "ab Adresse 0 ... " bewerkstelligen?

von georg (Gast)


Lesenswert?

Marco schrieb:
> ?? Wie lässt das "ab Adresse 0 ... " bewerkstelligen?

Mit Befehlen, die einen Wert in ein Register schreiben - oder was soll 
die Frage bedeuten?

Georg

von Theor (Gast)


Lesenswert?

Marco schrieb:
> Guten Morgen,
>
> Ich erkenne am Verhalten einen Unterschied zwischen dem Reset-Taster auf
> der Platine und einem Software-Reboot via "asm volatile ("  jmp 0");"
>
> Wodurch ist der Unterschied begründet?
>
> Wichtiger: Wie lässt sich der Reset-Taster softwaremäßig simulieren, um
> genau DEN REBOOT auszulösen, den der Taster auch bewirkt?
>
> Danke für Tipps.

Hm. Mal anders herum gefragt: Warum benutzt Du nicht den Reset-Taster, 
wenn Du den Effekt des Reset-Tasters haben willst?

Verstehe mich recht: Ich will gar nicht generell bestreiten, dass es 
plausible Gründe dafür gibt. Allerdings ist Arduino eben genau für die 
Benutzergruppe gedacht, die eher nicht unter die "Haube" schauen müssen 
soll und ein Haufen Gründe, die ich mir so denken kann, treffen eher auf 
Menschen zu, die genau das tun müssen.

Anders ausgedrückt: Falls Du an dem Punkt stehst, wo Du ins Datenblatt 
schauen solltest, bist Du dem Arduino eigentlich entwachsen bzw. 
solltest Dich auch darum kümmern, was bei Arduino unter der Oberfläche 
abläuft.
Dabei wird gerade Dein Fall etwas klarer.

Die Arduino Firmware setzt eben nicht alle Register auf den Wert, den 
sie nach dem Reset haben. Die Gründe dafür dürften denen entsprechen, 
die georg erwähnt hat. Dazu gibt es hier eine Reihe Diskussionen.

Falls Du Dich entscheidest, den Code dafür der Arduino-Firmware 
hinzuzufügen wirst Du auch an den Punkt kommen, tiefer in deren Interna 
einzusteigen. Also wieder ein Grund, so langsam den Übergang zum 
"freihändigen" Programmieren zu suchen.

von Einer K. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> und führt dann den Code ab Adresse 0 aus.
Nöö, bei einem Arduino eher nicht.
In der Regel wird der Bootloader angesprungen, da so in den Fuses 
verankert.

Das macht natürlich einen Unterschied im Verhalten.
Aber ob der hier gemeint ist, ka...



Marco schrieb:
> Wichtiger: Wie lässt sich der Reset-Taster softwaremäßig simulieren, um
> genau DEN REBOOT auszulösen, den der Taster auch bewirkt?
Warum willst du das?

Im Grunde ist diese Anforderung "Software Reset" völlig neben der Spur.
Du musst also gute Grüne dafür haben, wenn du das dennoch machen willst.
Würdest du mir diese Gründe bitte nennen?
Denn vermutlich gibt es Alternativen.

von Peter D. (peda)


Lesenswert?

georg schrieb:
> Es gibt aber hier im Forum einige Programmierer, die das Initialisieren
> per Programm strikt ablehnen.

Eine dem Reset identische Initialisierung kann sehr komplex und damit 
fehleranfällig werden.
Z.B. versuche mal, ohne Reset das Bit UDRE0 im Register UCSR0A zu 
setzen.

von Marco (Gast)


Lesenswert?

Theor schrieb:
> Hm. Mal anders herum gefragt: Warum benutzt Du nicht den Reset-Taster,
> wenn Du den Effekt des Reset-Tasters haben willst?
Die Platine wird später nicht zugänglich sein, nur zwei Taster.

> Verstehe mich recht: Ich will gar nicht generell bestreiten, dass es
> plausible Gründe dafür gibt. Allerdings ist Arduino eben genau für die
> Benutzergruppe gedacht, die eher nicht unter die "Haube" schauen müssen
> soll und ein Haufen Gründe, die ich mir so denken kann, treffen eher auf
> Menschen zu, die genau das tun müssen.
>
> Anders ausgedrückt: Falls Du an dem Punkt stehst, wo Du ins Datenblatt
> schauen solltest, bist Du dem Arduino eigentlich entwachsen bzw.
> solltest Dich auch darum kümmern, was bei Arduino unter der Oberfläche
> abläuft.
> Dabei wird gerade Dein Fall etwas klarer.
>
> Die Arduino Firmware setzt eben nicht alle Register auf den Wert, den
> sie nach dem Reset haben. Die Gründe dafür dürften denen entsprechen,
> die georg erwähnt hat. Dazu gibt es hier eine Reihe Diskussionen.
>
> Falls Du Dich entscheidest, den Code dafür der Arduino-Firmware
> hinzuzufügen wirst Du auch an den Punkt kommen, tiefer in deren Interna
> einzusteigen. Also wieder ein Grund, so langsam den Übergang zum
> "freihändigen" Programmieren zu suchen.

Ich verstehe dich. Aus bestimmten Gründen, rein praktischer Natur, habe 
ich (leiner) zu wenig Zeit, mich in ein "profesionelles System" 
einzuarbeiten. Der Arduino tut es in meinem Fall schon. Das sich den 
Unterschied zwischen Hard-. u. Software-Reset bemerkt habe, schreibe dem 
Zufall zu.

von Marco (Gast)


Lesenswert?

Peter D. schrieb:
> Eine dem Reset identische Initialisierung kann sehr komplex und damit
> fehleranfällig werden.

Ich dachte mir, als Workarround, weil der Reset-Taster auch ein 
"normaler Taster" ist, muss er "irgendwo" mit einem Port und dort mit 
einem Bit verbunden sein. Wenn man dieses Bit nun per Software togglen 
könnte, würde dann nicht dasselbe ablaufen wie nach dem Drücken des 
Tasters? Ginge das nicht? Nur mal rein pragmatisch gedacht.

von Einer K. (Gast)


Lesenswert?

Marco schrieb:
> Wenn man dieses Bit nun per Software togglen
> könnte, würde dann nicht dasselbe ablaufen wie nach dem Drücken des
> Tasters? Ginge das nicht? Nur mal rein pragmatisch gedacht.

Du kannst den Reset Pin zu einem (fast) normalen IO Pin machen.
Dann ist allerdings kein Reset über den Pin mehr möglich.

Tipp:
Im Datenblatt sind alle möglichen Resetquellen aufgeführt und 
ausreichend beschrieben. Bitte lese es.

Marco schrieb:
> Ich dachte mir, als Workarround,
Ein Workaround, für was?

Ich wiederhole meine Frage nochmal:
Wozu soll das dienen?

von Florian P. (ol1cr0n)


Lesenswert?

Kenne mich mit den Arduinos nicht aus, aber kannst du nicht einfach 
einen IO-Pin mit dem Reset-Pin verbinden? Ist zwar nicht schön, aber...

Gruß

von spess53 (Gast)


Lesenswert?

Hi

Bei neueren ATTinys gibt es auch einen Software Reset: Register SWRR Bit 
SWRE.

MfG Spess

von Theor (Gast)


Lesenswert?

Marco schrieb:
> Theor schrieb:
>> Hm. Mal anders herum gefragt: Warum benutzt Du nicht den Reset-Taster,
>> wenn Du den Effekt des Reset-Tasters haben willst?
> Die Platine wird später nicht zugänglich sein, nur zwei Taster.

Was ja nicht zwangsweise immer so bleiben muss. Löte einen Taster an 
Reset, bohre ein drittes Loch ins Gehäuse und schon ist er zugänglich.

>> [...]
>
> Ich verstehe dich. Aus bestimmten Gründen, rein praktischer Natur, habe
> ich (leiner) zu wenig Zeit, mich in ein "profesionelles System"
> einzuarbeiten. Der Arduino tut es in meinem Fall schon. Das sich den
> Unterschied zwischen Hard-. u. Software-Reset bemerkt habe, schreibe dem
> Zufall zu.

Es kommt ja darauf an, ob der Reset auf diesem oder jenem Weg eine 
sinnvolle Funktion in Deinem Fall erfüllt. Und über diese Frage könnten 
wir mal diskutieren. Nur weil Du da einen Unterschied entdeckt hast, 
folgt ja daraus nicht, dass Du nun einen Software-Reset implementieren 
musst.

Wie auch immer und wie Peter es auch sieht, erfordert das umfangreiche 
Kenntnisse wenn man es korrekt machen will.

Z.B. sind gewisse Bits überhaupt nur lesbar, die beim Reset auf Null 
gesetzt werden. Du kannst sie gar nicht direkt setzen.
Darunter sind solche, deren Wert vom Status eines Peripherieeinheit 
abhängen.
Dann solche die Du nur durch lesen eines anderen Registers löschen 
kannst.
Andere, wie das erwähnte UDRE kannst Du überhaupt nicht direkt selbst 
beeinflussen, sondern musst den Abschluss einer Operation der 
Peripherieeinheit abwarten. Etcpp.

Ich will Dich nicht entmutigen, aber da gibt es so über den Daumen 
bestimmt 10 Varianten, wie Du bestimmte Bits behandeln musst um den 
Reset-Zustand zu erreichen, einschliesslich dem Einhalten bestimmter 
Reihenfolgen.
Das ist möglich und kein Hexenwerk, erfordert aber intensive 
Beschäftigung mit dem Datenblatt und dem Prozessor.

Also, wenn Du ohnehin wenig Zeit hast, schliesse einen Reset-Taster an 
oder besser überlege Dir vorher ob und wozu Du den brauchst. Egal wie 
herum Du es machst: Die Zeit wird so oder so benötigt; wobei, zugegeben, 
die Zeit für die Überlegung ob oder ob nicht, vermutlich am kürzesten 
ist.

von Marco (Gast)


Lesenswert?

Florian K. schrieb:
> Kenne mich mit den Arduinos nicht aus, aber kannst du nicht einfach
> einen IO-Pin mit dem Reset-Pin verbinden? Ist zwar nicht schön, aber...

hähä :) Das ging mir (spaßeshalber) auch schon durch den Kopf. Wenn das 
per SW ginge, wären alle Spatzen gefangen :)

von Marco (Gast)


Lesenswert?

Theor schrieb:
> Was ja nicht zwangsweise immer so bleiben muss. Löte einen Taster an
> Reset, bohre ein drittes Loch ins Gehäuse und schon ist er zugänglich.

Ja. Das ist aber so - "ungeil". Habe doch schon zwei Taster im Tableau. 
Wenn ich den einen 5 Sek. drücke, so Idee, soll Platine neu booten.

> Wie auch immer und wie Peter es auch sieht, erfordert das umfangreiche
> Kenntnisse wenn man es korrekt machen will.
Das war ja gerade der Workarround: Den Port ansteuern, mit dem der 
Reset-Taster verbunden ist. Sagt doch mal was dazu, ob das geht. Sonst 
muss ich in der Tat im Datenblatt lesen, an welchem Port Reset hängt, 
und es tun. Kann ich tun. Nur weiß ich nicht, ob ich dann hier noch 
schreibe. Wenn wir das hier besprechen, hat jeder was davon oder?...

von Einer K. (Gast)


Lesenswert?

Marco schrieb:
> Wenn ich den einen 5 Sek. drücke, so Idee, soll Platine neu booten.

Wie kommst du auf die absurde Idee, dass in dem Fall, wo ein Reset 
(scheinbar) nötig wird, noch dein Taster abgefragt wird?
Aus meiner Sicht völlig absurd.


Merke:
Entweder ist der µC "abgeschmiert", dann hilft auch kein Taster mehr.
Oder er ist nicht "abgeschmiert", dann braucht es auch keinen Reset.

Marco schrieb:
> Nur weiß ich nicht, ob ich dann hier noch schreibe.
Wenn das ein Erpressungsversuch ist, dann geht er ins Leere.

Marco schrieb:
> Wenn wir das hier besprechen, hat jeder was davon oder?...
Wieso...?
Da das höchstvermutlich ein Irrweg ist, halte ich nichts davon auch 
andere in die Irre zu schicken.

von Theor (Gast)


Lesenswert?

Marco schrieb:
> Theor schrieb:
>> Was ja nicht zwangsweise immer so bleiben muss. Löte einen Taster an
>> Reset, bohre ein drittes Loch ins Gehäuse und schon ist er zugänglich.
>
> Ja. Das ist aber so - "ungeil". Habe doch schon zwei Taster im Tableau.
> Wenn ich den einen 5 Sek. drücke, so Idee, soll Platine neu booten.
>

Es geht hier nicht um Schönheit sondern Funktion. Falls die erfüllt ist, 
dann kann man über Schönheit nachdenken.

Und es ist immer noch offen, wozu Du das brauchst.

>> Wie auch immer und wie Peter es auch sieht, erfordert das umfangreiche
>> Kenntnisse wenn man es korrekt machen will.
> Das war ja gerade der Workarround:

Es gibt zwei gegensätzliche Meinungen dazu: Beide von Spezis. Jörg 
Wunsch hat mal in AVRFreaks behauptet, dass das geht. Atmel selbst hat 
davon abgeraten. Der Konflikt besteht darüber ob die Reset-Schaltung 
selbst nicht das Reset-Signal unterbricht, sobald sie wirksam wird.

> Sonst muss ich in der Tat im Datenblatt lesen, ...

Das sage ich ja die ganze Zeit.
Nur das da leider nichts steht, was diese Möglichkeit direkt verneint. 
Vielmehr wird in einer App-Note, soweit ich mich erinnere, die 
Watchdog-Methode vorgeschlagen oder externe Hardware.

> ... an welchem Port Reset hängt, und es tun. Kann ich tun. Nur weiß
> ich nicht, ob ich dann hier noch schreibe.
> Wenn wir das hier besprechen, hat jeder was davon oder?...
Das ist hier schon gefühlte Zehntausendmal in aller Tiefe und Breite 
abgehandelt worden. Einfach mal suchen.

Die Spezis neigen eher zu der Watchdog-Lösung, denke ich, oder zu 
externer Hardware. Die Bastler halten, wenn ich das etwas böse 
formulieren darf, alles für möglich, aber man hört nie wieder was davon.

von Marco (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wenn das ein Erpressungsversuch ist, dann geht er ins Leere.

Ein "Erpressungsversuch " ? Welches Problem hast du gerade? Ich weiß 
doch gar nicht, wie lange ich im Datenblatt lese und ob ich was finde 
und ob ich dann online bin und dran denke und und und. Habe es so 
geschrieben, wie es gemeint war: dass dann jeder was davon hat.

von Marco (Gast)


Lesenswert?

Theor schrieb:
> Es geht hier nicht um Schönheit sondern Funktion. Falls die erfüllt ist,
> dann kann man über Schönheit nachdenken.

Hast ja recht. Da man die Platine eh nicht sieht, ginge das sogar. Nur 
der dritte Taster, der stört mich vorne. Das Tableau soll ja "schön" 
sein :)

> Und es ist immer noch offen, wozu Du das brauchst.
Nee steht doch oben. Oder habe ich die Frage falsch verstanden?

> Es gibt zwei gegensätzliche Meinungen dazu: Beide von Spezis. Jörg
> Wunsch hat mal in AVRFreaks behauptet, dass das geht. Atmel selbst hat
> davon abgeraten. Der Konflikt besteht darüber ob die Reset-Schaltung
> selbst nicht das Reset-Signal unterbricht, sobald sie wirksam wird.
Was meinst du jetzt? Den Portpin des Tasters ansteuern, per Patch, oder 
was? Stehe gerade auf der Leitung.

> Das ist hier schon gefühlte Zehntausendmal in aller Tiefe und Breite
> abgehandelt worden. Einfach mal suchen.
OK, dann werde ich mal auf die Suche gehen.

Danke an alle :)

von Theor (Gast)


Lesenswert?

Naja. Ein gewisses "Gschmäckle" hat der Satz: "Nur weiß ich
> nicht, ob ich dann hier noch schreibe." schon. Aber lassen wir das. War 
vielleicht unbeabsichtigt.

Schnapp Dir Dein Oszilloskop und miss einfach nach, ob der Reset-Eingang 
mit Deiner Methode lange genug (Datenblatt) aktiv gehalten wird.

von Einer K. (Gast)


Lesenswert?

Natürlich darfst du meine Ansagen in den falschen Hals bekommen.

Und für mich hörte sich deine Ansage fast wie ein Drohung an.
Wenn dem nicht so ist, dann schön...

Aber dennoch solltest du lieber die Frage nach dem "Warum?" beantworten, 
als deine Beiträge mit Gefühlen und Emotionen zu fluten.

Marco schrieb:
> dass dann jeder was davon hat.
Das bezweifle ich ganz stark.

Erst wenn du einsiehst einen Irrweg betreten zu haben, dann... 
vielleicht, macht es Sinn für andere.

von Theor (Gast)


Lesenswert?

Marco schrieb:
> Theor schrieb:
>> Es geht hier nicht um Schönheit sondern Funktion. Falls die erfüllt ist,
>> dann kann man über Schönheit nachdenken.
>
> Hast ja recht. Da man die Platine eh nicht sieht, ginge das sogar. Nur
> der dritte Taster, der stört mich vorne. Das Tableau soll ja "schön"
> sein :)
>
>> Und es ist immer noch offen, wozu Du das brauchst.
> Nee steht doch oben. Oder habe ich die Frage falsch verstanden?

Die Frage ist: Was ist in Deinem Fall der rationale Grund dafür, einen 
Reset auszulösen. Was ist wenn Du das nicht tust? Welchen Zweck hat das?

>> Es gibt zwei gegensätzliche Meinungen dazu: Beide von Spezis. Jörg
>> Wunsch hat mal in AVRFreaks behauptet, dass das geht. Atmel selbst hat
>> davon abgeraten. Der Konflikt besteht darüber ob die Reset-Schaltung
>> selbst nicht das Reset-Signal unterbricht, sobald sie wirksam wird.
> Was meinst du jetzt? Den Portpin des Tasters ansteuern, per Patch, oder
> was? Stehe gerade auf der Leitung.

Das geht aus dem darüber stehenden Teilzitat hervor. Du fängst an mit:
> Das war ja gerade der Workarround:
Es geht also um die Variante der Ansteuerung intern.

>> Das ist hier schon gefühlte Zehntausendmal in aller Tiefe und Breite
>> abgehandelt worden. Einfach mal suchen.
> OK, dann werde ich mal auf die Suche gehen.
>
> Danke an alle :)

Viel Erfolg.

von Karl K. (karl2go)


Lesenswert?

Marco schrieb:
> auch schon durch den Kopf. Wenn das
> per SW ginge, wären alle Spatzen gefangen

Ist eine beschissene Idee. Der auslösende Pin wird in dem Moment 
inaktiv, wenn der Reset auslöst. Und Moment heisst hier im ns-Bereich. 
Der Resetpuls muss aber eine gewisse Zeit anliegen, siehe Datenblatt.

Marco schrieb:
> so Idee, soll Platine neu booten

Noch eine beschissene Idee.

Ein Reset wird benöätigt, wenn man den µC neu programmieren will, oder 
wenn sich das Programm aufgehängt hat, z.B. in einer Schleife hängt.

Willst Du, dass das Programm auf Tastendruck für den Nutzer "von vorn" 
beginnt, dann bau eine Schleife drum. Einen Reset hierfür zu mißbrauchen 
ist kein guter Stil.

Marco schrieb:
> muss er "irgendwo" mit einem Port und dort mit
> einem Bit verbunden sein. Wenn man dieses Bit nun per Software togglen
> könnte

Nein, das geht nicht. Der Pin kann entweder IO oder Reset sein. Und wenn 
Du ihn auf IO setzt, funktioniert der Reset darüber nicht mehr.

von Peter D. (peda)


Lesenswert?

Theor schrieb:
> Die Spezis neigen eher zu der Watchdog-Lösung

Das ist auch meine Variante, die 16ms Wartezeit sind zu verschmerzen.
Über Remote lasse ich oft sogar 500ms Zeit, damit noch eine Antwort 
rausgeschickt werden kann.

von Theor (Gast)


Lesenswert?

Karl K. schrieb:
> Marco schrieb:
>> auch schon durch den Kopf. Wenn das
>> per SW ginge, wären alle Spatzen gefangen
>
> Ist eine beschissene Idee. Der auslösende Pin wird in dem Moment
> inaktiv, wenn der Reset auslöst. Und Moment heisst hier im ns-Bereich.
> Der Resetpuls muss aber eine gewisse Zeit anliegen, siehe Datenblatt.

Wenn ich ergänzend bemerken darf: Genau das ist strittig. Jörg Wunsch 
ist der Ansicht es geht, weil der Reset lang genug ist. Atmel hingegen 
rät davon ab, weil er nicht lang genug ist. 
https://www.avrfreaks.net/forum/software-reset-6

> Nein, das geht nicht. Der Pin kann entweder IO oder Reset sein. Und wenn
> Du ihn auf IO setzt, funktioniert der Reset darüber nicht mehr.

So ist das nicht gemeint, denke ich.
Vielmehr soll der Pin wohl als Reset konfiguriert bleiben und ähnlich 
wie das bei der Methode mit dem Software-Interrupt geht, in das 
Ausgangsregister geschrieben werden.
Diese Methode wird ja für den Interrupt von Atmel selbst beschrieben.
Für den Reset allerdings nicht; wofür es vermutlich Gründe gibt, aber 
ausdrücklich wird nicht gesagt, dass es nicht geht. Nur das, soweit ich 
weiss, das noch nie jemand versucht und darüber berichtet hat.
Es steht nur da, dass je nach Konfiguration der Pin mit dem 
Reset-Schaltkreis verbunden ist oder nicht.

von W.S. (Gast)


Lesenswert?

Marco schrieb:
> Ich erkenne am Verhalten einen Unterschied zwischen dem Reset-Taster auf
> der Platine und einem Software-Reboot via "asm volatile ("  jmp 0");"

Ich habe da schwere Bedenken gegen so etwas wie JMP 0. Der Grund ist, 
daß so etwas nur auf manchen Hardware-Architekturen funktioniert und 
woanders das Startverhalten völlig anders ist. Bei Fujitsu z.B. startet 
der µC bei 0xFFFFFC und beim Arm-Cortex stehen auf den Adressen 0 und 4 
die Werte für SP und PC.

Wenn man also sich nicht solche Besonderheiten angewöhnen will, dann 
sollte man von so etwas glatt absehen. Stattdessen wäre ein Beenden von 
main angesagt - UND natürlich ein dazu passendes Verhalten des 
Startupcodes, der dann selbstverständlich damit rechnen muß, daß main 
zurückkehrt und der dann den SP neu lädt und main neu startet. Bei so 
etwas muß man natürlich alles selbst neu aufsetzen und darf sich nicht 
darauf verlassen, daß im RAM oder dn HW-Registern etwas bestimmtes 
drinsteht.

W.S.

von Dieter F. (Gast)


Lesenswert?

Theor schrieb:
> Jörg Wunsch
> ist der Ansicht es geht, weil der Reset lang genug ist. Atmel hingegen
> rät davon ab, weil er nicht lang genug ist.
> https://www.avrfreaks.net/forum/software-reset-6

Lesen hilft manchmal - Jörg bezieht sich in o.g. Link auf den atXmega 
...

"The standard AVR has no method for this. You can abuse the watchdog
reset.
IIRC the Xmega has an option for a software reset."

Auszug aus dem Manual (13.4.5):

Software reset
The software reset makes it possible to issue a system reset from 
software by writing to the software reset bit in the reset
control register.The reset will be issued within two CPU clock cycles 
after writing the bit. It is not possible to execute any
instruction from when a software reset is requested until it is issued.

von Karl K. (karl2go)


Lesenswert?

Theor schrieb:
> Atmel hingegen
> rät davon ab, weil er nicht lang genug ist.

"Reset pulses longer than the minimum pulse
width (see ”System and Reset Characteristics” on page 305) will generate 
a reset, even if the clock is not
running. Shorter pulses are not guaranteed to generate a reset."

"t RST Minimum pulse width on RESET Pin 2.5 µs"

Wenn ein Portpin den Reset runterzieht und mit beginnendem Reset wieder 
released, liegt das im oberen ns Bereich. Man kann jetzt hoffen, dass 
der Reset Timeout den Puls ausreichend verlängert, um den Reset sauber 
durchzuziehen. Aber Hoffnung ist nichts, worauf ich meine Programme 
aufbauen wöllte.

von Theor (Gast)


Lesenswert?

Karl K. schrieb:
> Theor schrieb:
>> Atmel hingegen
>> rät davon ab, weil er nicht lang genug ist.
>
> "Reset pulses longer than the minimum pulse
> width (see ”System and Reset Characteristics” on page 305) will generate
> a reset, even if the clock is not
> running. Shorter pulses are not guaranteed to generate a reset."
>
> "t RST Minimum pulse width on RESET Pin 2.5 µs"
>
> Wenn ein Portpin den Reset runterzieht und mit beginnendem Reset wieder
> released, liegt das im oberen ns Bereich. Man kann jetzt hoffen, dass
> der Reset Timeout den Puls ausreichend verlängert, um den Reset sauber
> durchzuziehen. Aber Hoffnung ist nichts, worauf ich meine Programme
> aufbauen wöllte.

Ich habe, weil ich es für richtig hielt, geschrieben, dass die Methode 
umstritten ist. Ich habe weder für die eine, noch für die andere Meinung 
Partei ergriffen. Es ist also unnötig mich zu überzeugen, falls das 
Deine Absicht ist. :-)
Wenn Jörg Wunsch sagt, das geht, dann glaube ich ihm das. Wenn Atmel 
sagt, sie empfehlen das nicht (oder es geht nicht - ich kenne den 
Wortlaut nicht), dann glaube ich ihnen das. Wenn Du sagst, der Puls 
ist auf diese Weise zu kurz, glaube ich das.
Nur das ich in diesem Zusammenhang ggf. nicht nach meinem Glauben 
handeln würde, sondern Versuche unternehmen würde. Ich will allerdings 
einräumen, das ich skeptisch bin, das das funktioniert.

Umstritten ist die Aussage nach dieser Betrachtung - und ohne weitere 
Fakten oder Versuchsergebnisse - immer noch. Und ich halte es für 
richtig, eine umstrittene Ansicht auch mitzuteilen, sogar falls ich aus 
irgendwelchen Gründen anderer Meinung wäre, damit der Leser sich eine 
Meinung selbst bilden kann.

von georg (Gast)


Lesenswert?

Karl K. schrieb:
> Man kann jetzt hoffen, dass
> der Reset Timeout den Puls ausreichend verlängert, um den Reset sauber
> durchzuziehen

Muss er ja, solange kein Reset ausgelöst wird, liegt ja das 
programmierte Resetsignal weiter an. Selbst wenn die Verzögerung 
Sekunden betragen würde und nicht ns.

Wenn Atmel abrät, kann das nur an einem schweren Designfehler der 
Hardware liegen - dass ein zu kurzer Impuls zwar einen Reset auslöst, 
aber nicht alles zurücksetzt. Das darf es eigentlich nicht geben. 
Entweder Reset oder nicht. Aber wenn die das sagen...

Eine ganz andere Frage ist, ob ein so erzeugter Resetimpuls auch für 
andere Teile der Schaltung ausreicht, wenn er an andere ICs 
angeschlossen ist.

Georg

von Ralf D. (doeblitz)


Lesenswert?

Marco schrieb:
> Hast ja recht. Da man die Platine eh nicht sieht, ginge das sogar. Nur
> der dritte Taster, der stört mich vorne. Das Tableau soll ja "schön"
> sein :)

Dann mach es wie in der meisten Consumer-Hardware: kleines Loch (1-2mm) 
im Gehäuse, dahinter den Reset-Taster und im Bedarfsfall dann mit 
Büroklammer o.ä. durch das Loch den Taster betätigen.

von Εrnst B. (ernst)


Lesenswert?

Marco schrieb:
> Ja. Das ist aber so - "ungeil". Habe doch schon zwei Taster im Tableau.
> Wenn ich den einen 5 Sek. drücke, so Idee, soll Platine neu booten.

Und das soll vermutlich auch gehen, wenn sich dein Programm in einer 
Endlosschleife gefangen hat, nicht mehr auf Tastendrücke reagiert, und 
folglich auch keinen IO-Pin mit Reset-Verbindung mehr togglen kann, 
oder?


Nimm den Watchdog. Stell den auf 5 Sekunden (oder 8, oder was die 
Register eben in Nähe deiner gewünschten Zeitspanne hergeben). In der 
"loop()" machst du den Watchdog-Reset nur, wenn der Taster nicht 
gedrückt ist.
Fertig.

Hilft gegen Programmierfehler und erlaubt einen Reset durch langes 
Tastendrücken.

von avr (Gast)


Lesenswert?

georg schrieb:
> Wenn Atmel abrät, kann das nur an einem schweren Designfehler der
> Hardware liegen - dass ein zu kurzer Impuls zwar einen Reset auslöst,
> aber nicht alles zurücksetzt.

Da irrst du. Man verletzt die Spezifikation und diese einzuhalten ist 
Aufgabe des Entwicklers. Es ist zudem nicht spezifiziert wie sich der 
Controller verhält wenn der Reset Pin Low ist. Du kannst genauso keinem 
fpga Hersteller ein schlechtes Design vorwerfen wenn du Setup und hold 
Zeiten nicht einhälst und irgendwelche glitches produzierst.

von Alex G. (dragongamer)


Lesenswert?

@Marco
Denke mal du willst also das realisieren was viele Geräte mit 
integrierten Akku haben: Sehr langer Tastendruck sorgt für Reset für den 
Fall dass das Programm unwiderbringlich fest steckt.

Das wird in Hardware gelöst!

Der Knopf lädt neben seiner Hauptfunktion, einen kondensator über einen 
hochohmigen Widerstand auf.
Gleichzeitig hängt ein Schmittrigger eienrseits an dem Kondensator und 
andererseits am Reset Ausgang.

Der Trigger triggert also sobald ein bestimmtes Spannungslevel 
überschritten wurde und löst dann den Reset des uC aus.

: Bearbeitet durch User
von jemand (Gast)


Lesenswert?

Lustig. Einen Haufen Blabla und Waffwaff, inklusive Drohungen und 
Erpressungen. Und das, wobei die Lösung schon genannt wurde. Ich 
zitiere:

da1l6 schrieb:
> Hallo,
>
> Watchdog timer auf minimales Intervall stellen und dann in eine
> Endlosschleife gehen.
>
> da1l6


Genau so wird es gemacht ;-)

von spess53 (Gast)


Lesenswert?

Hi

>Genau so wird es gemacht ;-)

Und wann und wie sagst du das dem Controller?

MfG Spess

von Theor (Gast)


Lesenswert?

jemand schrieb:
> Lustig. [...]

Schön. Und Du begreifst mal wieder gar nichts und machst Deine genial 
irrelevanten Bemerkungen.

Wenn wir das jedes Mal kommentieren wollten und das auf jedes Deiner 
zahlreichen Alias hin, dann würde hier nichts anderes mehr laufen.

von npn (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Genau so wird es gemacht ;-)
>
> Und wann und wie sagst du das dem Controller?
>
> MfG Spess

Richtig. Wenn der Reset nötig wäre, also wenn der µC abgestürzt ist, 
kann man ihm schlecht sagen, daß er die entsprechenden Befehle ausführen 
soll um sich selbst zu resetten.

von pragmatiker (Gast)


Lesenswert?

verbinde den normalen button noch über einen widerstand mit einem 
kondensator, der dadurch bei längerem drücken geladen oder entladen 
wird, dahinter einen schmitt trigger und dessen ausgang dann an den 
reset pin. dann hst du deine "5 sek drücken zum reset"-funktion komplett 
softwareunabhängig.

sorry, grossbuchstaben war mir dieser thread nich mehr wert...

von Dr. Sommer (Gast)


Lesenswert?

Auf dem Arduino Due (Cortex-M3) kann man durch Aufruf folgender Funktion 
den Controller komplett neu starten:
1
void reset () __attribute__ ((naked));
2
3
void reset () {
4
  __asm__ volatile (  "cpsid i \n"
5
            "dsb\n"
6
            "mov r0, #0x4\n"
7
            "movt r0, #0x05FA\n"
8
            "mov r1, #0xE000E000\n"
9
            "str r0, [r1, #0xD0C]\n"
10
            "dsb.w\n"
11
            "b .-4\n" );
12
  __builtin_unreachable ();
13
}

von jemand (Gast)


Lesenswert?

spess53 schrieb:
>>Genau so wird es gemacht ;-)
>
> Und wann und wie sagst du das dem Controller?

Kann man hier nachlesen:
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Watchdog

Ich zitiere:
"Ein Sonderfall ist die Anwendung des WDT zum bewussten Reset (s. Tipps 
& Tricks)."
Details kannst du im Abschnitt
"WDT gezielt zum Reset verwenden" nachlesen.

Wie man das mit der Arduino-IDE hinbekommt, weiß ich nicht, mit der kenn 
ich mich nicht aus. Aber der AVR kann es, es ist ein Standardverfahren 
(ich kenne es aus diversen Appnotes anderer Controllerfamilien).
Ich denke, auch mit der Ardiono-IDE sollte das gehen.

von jemand (Gast)


Lesenswert?

npn schrieb:
> Richtig. Wenn der Reset nötig wäre, also wenn der µC abgestürzt ist,
> kann man ihm schlecht sagen, daß er die entsprechenden Befehle ausführen
> soll um sich selbst zu resetten.

Dann informier dich mal, was ein Watchdog tut.
GENAU dazu ist er da.

von Linux T. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Auf dem Arduino Due (Cortex-M3) kann man durch Aufruf folgender Funktion
> den Controller komplett neu starten:
>
>
1
void reset () __attribute__ ((naked));
2
> 
3
> void reset () {
4
>   __asm__ volatile (  "cpsid i \n"
5
>             "dsb\n"
6
>             "mov r0, #0x4\n"
7
>             "movt r0, #0x05FA\n"
8
>             "mov r1, #0xE000E000\n"
9
>             "str r0, [r1, #0xD0C]\n"
10
>             "dsb.w\n"
11
>             "b .-4\n" );
12
>   __builtin_unreachable ();
13
> }


Und das Ganze in lesbar:
1
/**
2
  \brief   System Reset
3
  \details Initiates a system reset request to reset the MCU.
4
 */
5
__STATIC_INLINE void NVIC_SystemReset(void)
6
{
7
  __DSB();                                                          /* Ensure all outstanding memory accesses included
8
                                                                       buffered write are completed before reset */
9
  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
10
                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
11
                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */
12
  __DSB();                                                          /* Ensure completion of memory access */
13
14
  for(;;)                                                           /* wait until reset */
15
  {
16
    __NOP();
17
  }
18
}

aus der CMSIS core_mc3/4 whatever.

von Dr. Sommer (Gast)


Lesenswert?

Linux T. schrieb:
> aus der CMSIS core_mc3/4 whatever.

Und die ist bei Arduino Due-Projekten eingebunden?

von Einer K. (Gast)


Lesenswert?

jemand schrieb:
> Ich denke, auch mit der Ardiono-IDE sollte das gehen.

Natürlich.

Das Arduino Framework kümmert sich nicht um den WDT.
Es stehen allerdings die betreffenden Funktionen/Macros der AVR-LibC 
vollumfänglich zur Verfügung.

Also:
No Problemeo!

(solange der Bootloader das abhandeln kann, und das kann er bei allen 
moderneren Arduinos)

von Linux T. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Linux T. schrieb:
>> aus der CMSIS core_mc3/4 whatever.
>
> Und die ist bei Arduino Due-Projekten eingebunden?


Keine Ahnung, aber was hat das mit "lesbar" zu tun?

von Dr. Sommer (Gast)


Lesenswert?

Linux T. schrieb:
> Keine Ahnung, aber was hat das mit "lesbar" zu tun?

Eine lesbare Funktion bringt nichts, wenn sie nicht nutzbar weil nicht 
eingebunden ist.

von Linux T. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Linux T. schrieb:
>> Keine Ahnung, aber was hat das mit "lesbar" zu tun?
>
> Eine lesbare Funktion bringt nichts, wenn sie nicht nutzbar weil nicht
> eingebunden ist.


Du Scherzkeks. Ich hatte das gepostet, damit jeder hier sofort erkennen 
kann, wie der System-Reset funktioniert...

von Dr. Sommer (Gast)


Lesenswert?

Linux T. schrieb:
> Du Scherzkeks. Ich hatte das gepostet, damit jeder hier sofort erkennen
> kann, wie der System-Reset funktioniert...

Achso. Das kann man ggf. auch im ARMv7M Architecture Reference Manual 
nachlesen.

von Εrnst B. (ernst)


Lesenswert?

Wie kommt ihr jetzt auf den "Due"?
Marko wollte ein

>> asm volatile ("  jmp 0");

verwenden, das wäre am ARM doch eher ein "B 0".
würde deshalb erstmal vom AVR ausgehen.

Arduino-kompatible Lösung, ganz ohne Zusatz-Hardware:
1
#include <avr/wdt.h>
2
3
4
void setup() {
5
  wdt_enable(WDTO_8S); // oder WDTO_4S
6
7
  // .... normaler setup
8
}
9
10
11
void loop() {
12
  // ... normaler loop
13
14
  if (digitalRead(1)) wdt_reset();
15
}
Statt "1" die GPIO-Nummer deines Buttons angeben.
Negieren, falls der Button nicht gegen GND sondern gegen VCC schaltet.

Voilà, drei Zeilen hinzugefügt, langer Knopfdruck (4 oder 8 Sekunden) 
löst einen Reset aus.

von Dr. Sommer (Gast)


Lesenswert?

Εrnst B. schrieb:
> verwenden, das wäre am ARM doch eher ein "B 0".
> würde deshalb erstmal vom AVR ausgehen.

Kann ja sein dass er vielleicht auch einen Due nutzt. Es war nicht 
explizit und ausschließlich AVR gefordert. Vielleicht interessiert es ja 
auch einen anderen Leser, wie es beim Due oder anderen Cortex-M3 geht. 
Außerdem wollte ich mit meinen Assembler-Skillz angeben.

von Εrnst B. (ernst)


Lesenswert?

Dr. Sommer schrieb:
> Außerdem wollte ich mit meinen Assembler-Skillz angeben.

das ist mir misslungen :)

"B 0" wäre ein relativer branch... absolute jump am arm wäre wohl eher 
ein "LDR PC,0" oder sowas...

von Dr. Sommer (Gast)


Lesenswert?

Εrnst B. schrieb:
> "B 0" wäre ein relativer branch...

Der Assembler macht aus "B 0" schon einen Sprung an Adresse 0 indem er 
das relative Offset zur aktuellen Position berechnet, wenn es denn im 
erlaubten Bereich ist. Relative Sprünge ohne Berechnung durch den 
Assembler werden mit "B .+42" o.ä. notiert, aber am Besten natürlich 
sowieso über Labels, a la "B Reset_Handler".
"B 0" wäre auf manchen Cortex-A richtig für einen "Software-Neustart", 
da sich an Adresse 0 die erste Reset-Anweisung befindet (typischerweise 
Sprung zum Reset_Handler, ähnlich zum AVR). Ist aber eine hakelige Sache 
dank ROM-Codes, Bootloadern, Remapping (SCTLR.V, VBAR), virtuellem 
Speicher (MMU), und RAM-Initialisierung...
Auf Cortex-M befindet sich bei 0 entweder gar nichts oder der initiale 
Stack-Pointer; für einen Software-Neustart muss man die Reset-Adresse 
von (FlashAnfang+)0x4 laden, à la:
1
mov r0, #0x4 ; Alternativ __isr_vector+4 o.ä. einsetzen
2
ldr pc, [r0]
Wenn erreichbar, geht auch
1
ldr pc, #(__isr_vector+4)

Εrnst B. schrieb:
> absolute jump am arm wäre wohl eher
> ein "LDR PC,0" oder sowas...
Ich glaube ein direkter absoluter Sprung ist gar nicht möglich, es geht 
nur über ein Register:
1
mov r0, #0
2
bx r0

Es ginge auch
1
ldr pc, =#0
wobei aber das 0 erstmal geladen werden muss... Hmm, etwas OT.

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.