mikrocontroller.net

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


Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :(

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: unbekannt (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: unbekannt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Winfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehe ich auch kein Problem, den Watchdog zu benutzen.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum springst Du den Bootloader nicht direkt an?

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörn G. aus H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TravelRec. (Gast)
Datum:

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

Autor: Struberg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Bastian Göricke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.