Forum: Mikrocontroller und Digitale Elektronik "Software Reset" des AVR


von Quacks (Gast)


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

von Läubi (Gast)


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

von Quacks (Gast)


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

von Quacks (Gast)


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

von unbekannt (Gast)


Lesenswert?

Schicke dem Slave eine bestimmte Bytefolge worauf hin der Slave zur
Adresse 0x0000 stringt.

von crazy horse (Gast)


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

von Quacks (Gast)


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ß

von Quacks (Gast)


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ß

von crazy horse (Gast)


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.

von unbekannt (Gast)


Lesenswert?

Hardware Reset ist doch auch nicht nötig. Es kommt doch nur darauf an,
das der Bootloader gestartet wird. Dazu muss eh alles (RS232 usw.)
softwaremäßig initialisiert werden.

von Winfried (Gast)


Lesenswert?

Sehe ich auch kein Problem, den Watchdog zu benutzen.

von Werner B. (Gast)


Lesenswert?

Warum springst Du den Bootloader nicht direkt an?

von ---- (Gast)


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

von Läubi (Gast)


Lesenswert?

Ja ich meinte mit einem Portpin den Resetpin auf LOW ziehn, ich weiss
alerdings nicht ob der AVR sich slesbt resetten kann oder ob es da noch
nen Kondesator oder so braucht.

von TravelRec. (Gast)


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.

von Quacks (Gast)


Lesenswert?

Hallo,

ich danke Euch allen, ich denke die Reset-Pin oder die Watchdog
Variante werden zum Einsatz kommen. Ich werds mal ausprobieren!!

Grüße

von Sven (Gast)


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

von ---- (Gast)


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

von TravelRec. (Gast)


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.

von Läubi (Gast)


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"?

von Andi K. (Gast)


Lesenswert?

@Quacks: Schreibe doch einfach in Deiner "Reset"-Routine 0b11000 oder
0x18 oder 24 in das Register "WDTCR" und gut ist.
Binnen 16 mS kommt dann automatisch ein Reset.

MfG
Andi

von Jörn G. aus H. (Gast)


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

von Quacks (Gast)


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.

von TravelRec. (Gast)


Lesenswert?

Okay, ich werd´ mir zukünftig auch die 2 Widerstände und den PortPin
sparen - man lernt ja nie aus...

von Struberg (Gast)


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

von ---- (Gast)


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

von Bastian Göricke (Gast)


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.

von Jan M. (Gast)


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.

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.