"Software Reset" des AVR

Gast #227133
Lesenswert?

Hallo,

ich steh gerade vor der Aufgabe ein Software Reset zu realisieren und
suche nach der günstigsten Methode.

zur Situation:
Ein übergeordneter Microcontroller (Master) ist mit vielen
untergeordneten Mikrocontrollern(Slaves -> Avr´s) über eine
Rs232-Schnittstelle verbunden. Der Master hat nun die Aufgabe den
Slaves ein neues Update zu verpassen. Dazu muss der AVR resetet werden
und danach innerhalb eines Zeitfensters eine bestimmte Sequenz erkennen
um den Bootloader zu starten.
Der Reset Befehl kann nur vom Master kommen!!

Welche Möglichkeiten der Realisierung kennt Ihr oder würdet Ihr
favorisieren?
("Brown Out" und "Watch Dog")


Danke für eure Hilfe
Gast #227134
Lesenswert?

Also du könntest doch einfach die Resetleitung auf LOW ziehn, dan hast
du doch nen richtigen Reset...
Ansosnten Watchdog gige bestimmt auch
Brown out ginge ja nur wenn du dem COntroller den Strom wegnimmst ;)
Gast #227135
Lesenswert?

Hi Läubi

"Also du könntest doch einfach die Resetleitung auf LOW ziehn, dan
hast"
die hab ich ja nicht!!: (

"Brown out ginge ja nur wenn du dem COntroller den Strom wegnimmst"
ja, so ist´s, da wäre eine externe zusätzliche Beschaltung nötig, die
zwar unschön wäre, aber noch machbar ist. :(
Gast #227136
Lesenswert?

"Also du könntest doch einfach die Resetleitung auf LOW ziehn, dan
hast"
oder meinst Du mit irgend einem Portpin den Resetpin auf Masse zu
ziehen?
Das wär ja toll und so einfach!!:)

Gruß und Dank
Gast #227138
Lesenswert?

das reicht nicht unbedingt, das ist kein echter Hardwarereset.
Einfacher: Watchdog starten, das Programm in eine Endlosschleife
schicken (die dann durch den watchdog-reset keine Endlosschleife
bleibt).
Gast #227139
Lesenswert?

oh ja, noch einfacher, aber alle Registerinhalte sind dann nicht auf
gesicherten Default Werten!! Könnte Probleme geben, auch mit den
Interrupts. Muss ich mir nochmal überlegen,aber vielen Dank, gute Idee

Gruß
Gast #227140
Lesenswert?

crazy horse

da wars´te schneller.

Genau dies war meine erste Überlegung, aber der watchdog sollte
eigentlich für solche Dinge nicht misbraucht werden, deshalb suche ich
nach noch einer anderen einfachen möglichkeit.

Gruß
Gast #227141
Lesenswert?

was heisst denn hier missbrauchen? Da sehe ich keinen Missbrauch, du
kannst ihn sogar ganz normal im Programm benutzen. Und nur, wenn ein
reset ausgeführt werden soll, schickst du den MC in eine Schleife, kein
Problem.
Gast #227145
Lesenswert?

Weil es z.B. (unabhängig von AVR) in manchen Prozessorarchitekturen
Write-once-Register gibt, die aus Sicherheitsgründen nur einmal
beschrieben werden dürfen und im laufenden Betrieb dann nicht mehr.
Erst nach einem Reset darf wieder schreibend zugegriffen werden.

Zudem herrschen nach einem Reset definierte Zustände in allen Registern
und auch im RAM nach Durchlauf des Startupcodes.

Watchdog-Reset ist die saubere Lösung.

----, (QuadDash).
Gast #227147
Lesenswert?

Mach doch ´nen PullUp 33k an den Reset-Pin und verbinde einen Portpin
(den Du nicht brauchst) über 4,7k mit dem Reset-Pin. Somit hast Du noch
ISP-Funktionalität. Setze nach dem Anfahren des Programms den
ensprechenden PortPin High, danach das entsprechende DDRx-Bit auch auf
High. Willst Du nun einen Reset auslösen, schreibst Du ein Low auf den
PortPin und alles andere erklärt sich von selbst. Fazit: Minimaler
Hard- und Software-Aufwand; absoluter Hardware-Reset, ohne interne
Features zu behindern.
Gast #227149
Lesenswert?

>>Willst Du nun einen Reset auslösen, schreibst Du ein Low auf den
PortPin und alles andere erklärt sich von selbst.

Zum Auslösen des Hardware-Reset muss aber lt. Datenblatt der Resetpin
eine definierte Zeit auf low sein. Wenn Du das über einen Portpin
machst, der ja dann hochohmig wird, kannst Du die Minimalzeit nicht
garantieren.

>>Fazit: Minimaler Hard- und Software-Aufwand; absoluter
Hardware-Reset

Was ist daran minimal? Du brauchst einen extra Pin, zusätzliche
Beschaltung, damit auch ISP funktioniert und eine zusätzliche Routine
dafür.

Da ist die Watchdog-Variante doch wesentlich sauberer, und ein Watchdog
in eiem Slave empfiehlt sich sowieso, damit ein "aufgehangener" Slave
nicht im schlimmsten Fall den Bus blockiert.

Sven
Gast #227150
Lesenswert?

> Zum Auslösen des Hardware-Reset muss aber lt. Datenblatt der
> Resetpin eine definierte Zeit auf low sein. Wenn Du das über einen
> Portpin machst, der ja dann hochohmig wird, kannst Du die
> Minimalzeit nicht garantieren.
Ja? Ist das so? Ich hätte gedacht, daß der Portpin genauso lange low
getrieben wird, bis ein Reset ausgelöst (angefangen) wird. Das
ResetSignal wird doch erst durch den Reset selbst zurückgenommen, wie
kann dann dieser zu kurz sein?

Ich dachte ein zu kurzes Resetsignal läuft nicht sicher einen Reset aus
- aber hier?!

----, (QuadDash).
Gast #227151
Lesenswert?

Klar geht der PortPin erst in den Tristate-Mode, wenn der Reset bereits
läuft. Was war zuerst da, Huhn oder Ei?!? Probier doch mal, dann siehst
Du, ob´s funktioniert. Ist doch eh´ alles graue Theorie, bis man´s
selber erlebt.
Gast #227152
Lesenswert?

Ich weiß zwar nicght was die Landwirtschaft da jezt zu schaffen hat,
aber wie (QuadDash) gesagt hat, wenn ich den Pin LOW lege geht er doch
erst wieder in Tristate wenn der Reset ausgeführt wird...
Warum sollte der Reset auf einmal "Abbrechen"?
Gast #227154
Lesenswert?

Das ist doch kein Missbrauch, sondern einer der 2
Standard-Verwendungszwecke eines Watchdog - einerseits Schutz vor
Absturz und bei einem absichtlichen echten Reset, geht man einfach in
eine Endlosschleife!

while(1);

Besser, einfacher und sicherer geht es nicht!

jörn
Gast #227155
Lesenswert?

"Das ist doch kein Missbrauch"

ja, ich geb Euch ja recht reumütig
Ihr habt mich überzeugt, dass der Watchdog die einfachste und beste
Wahl ist die zu realisieren!!

Gruß und vielen Dank nochmals für diese interesanten Vorschläge, die,
so denke ich, nicht nur mir weitergeholfen haben wieder etwas weiter in
diese Materie einzutauchen.
Gast #227157
Lesenswert?

> Zudem herrschen nach einem Reset definierte Zustände in allen
> Registern und auch im RAM nach Durchlauf des Startupcodes.

Das wage ich echt zu bezweifeln! Manchmal ist es von stepping zu
stepping unterschiedlich auf welche Werte die Register liegen, und die
RAM Inhalte sind meiste je nach Reset - Art mit zufälligen Werten
belegt.
Außer man schreibt sich den startupcode selbst, dann ist ein jmp auf
den Reset Vector aber auch ausreichend
Gast #227158
Lesenswert?

Wenn das von stepping zu stepping unterschiedlich ist, dann liegt ein
Problem des Prozessorherstellers vor. ;-)

> und die RAM Inhalte sind meiste je nach Reset - Art mit zufälligen
> Werten belegt.
Nein, ein Reset verändert keine RAM-Zellen. Diese ändern ihren Wert nur
durch Absenken der Versorgungsspannung (bei Unterschreiten der "data
retention voltage"). Aber ich schrieb deshalb: "auch im RAM nach
Durchlauf des Startupcodes.". Die Betonung liegt auf _Durchlauf des
Startupcodes_. Hier muß der Compiler dafür sorgen, daß nach Durchlauf
des Startupcodes, die verwendeten Variablen auf definierten Startwerten
liegen.

> Außer man schreibt sich den startupcode selbst, dann ist ein jmp auf
> den Reset Vector aber auch ausreichend
Ok, ich dachte an C-Code. Hier gibt der Startupcode des Compilers vor,
daß die RAM-Zellen zu initialisieren sind. Und nein, ein jump auf den
Resetvektor reicht nicht. Aber wir drehen uns im Kreis...

----, (QuadDash).
Gast #227159
Lesenswert?

Hallo,

ich hab auch nochmal eine Frage zum Watchdog. Ich benötige ebenfalls
einen Software-Reset. Es wurde ja etwas von einer while(1) schleife
geschrieben. Wie ist das genau gemeint?
Ich programmiere mit CodeVision in C. Da kriege ich leider so keinen
Reset mit dem Watchdog hin.
Gast #227160
Lesenswert?

while(1);
ist so gemeint, wie es der C-Standard vorsieht: Eine Schleife, bis der
Ausdruck in der Klammer false wird, hier also endlos. Hier hilft ein
C-Buch deiner Wahl.
Zu einem Reset führt das nur, wenn der watchdog auch aktiviert ist.
Hier hilft das Datenblatt zu deinem Controller weiter.

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