Müssen AVR-Register und -Ports auf Null initialisiert werden?

Während der Initialisierungsroutine meines Codes mache ich folgende Dinge:

clr    r0  ; will always stay zero

und:

out    PORTA, r0; initialize ports
out    DDRA, r0
out    PORTB, r0
...

Ist dies tatsächlich notwendig? Oder kann ich sicher sein, dass dies beim Zurücksetzen automatisch erfolgt? Kann ich mich insbesondere darauf verlassen, dass alle Ports standardmäßig als Eingänge festgelegt sind, sodass es keine Probleme mit externen Votages gibt, wenn kein Code ausgeführt wird?

Antworten (3)

Die I/O-Ports eines AVR werden beim Zurücksetzen auf INPUT / Tri-State / Hi-Z (DDRx = 0x00) gesetzt. Die meisten Mikrocontroller (wenn nicht alle?) haben dieses Verhalten. Dies ist der sicherste Zustand für einen Pin. Ja, Sie können sich also darauf verlassen, dass die Ports automatisch als Eingänge festgelegt werden.

Einige Ausschnitte am ATmega16 zeigen genau das:

Geben Sie hier die Bildbeschreibung ein

Die Port-C-Pins haben drei Zustände, wenn eine Reset-Bedingung aktiv wird, selbst wenn die Uhr nicht läuft.

Das ist genau das, wonach ich gesucht habe :)
Soweit ich mich erinnere, erhalten Sie zufälliges Rauschen, wenn Sie einen Eingang schwebend lassen. Der Anfangszustand kann also Null sein, das ist in Ordnung, aber er kann nach dem ersten Taktzyklus ungleich Null werden.
@miceuz Der Punkt ist, keine Ausgänge in einem unbekannten Zustand zu haben . Sie können unerwünschte Auswirkungen auf den externen Schaltkreis haben, der mit dem Mikrocontroller verbunden ist
@miceuz du beziehst dich auf die Port-Eingangsregister, richtig? diese haben N/A als Anfangszustand (was sinnvoll ist, da sie nur das widerspiegeln, was auf den Stift angewendet wird). Aber ich bezog mich auf die Datenrichtungsregister. Ich wollte nur sichergehen, dass ich den Port nicht versehentlich als Ausgang eingestellt habe, was möglicherweise mit an den Pin angelegten Spannungen in Konflikt steht.
Oh ja, wirklich, sorry für den Lärm..
  • Port-Initialisierung ist IMMER eine gute Idee, egal was im Datenblatt steht.

  • Wenn das Datenblatt nichts sagt, dann ist es eine äußerst wichtige Idee.


Sie müssen den Inhalt der Portdaten nur dann definieren, wenn es Ihnen wichtig ist, was passiert, wenn Ihr Programm läuft.

Wenn Ihnen das Ergebnis egal ist, müssen Sie die Portdatenbits nicht setzen :-).

Wenn Hersteller in den Datenblättern ausdrücklich angeben, dass Port-Datenbits gesetzt oder gelöscht werden, dann können sie das sein, ABER es ist TROTZDEM eine wirklich sehr gute Idee, sie selbst zu initialisieren. "Randbedingungen" sind dort, wo die meisten Dinge schief gehen - z. B. Beginn einer Schleife, Ende einer Schleife, Umbruchpunkt des Ringpuffers, ... . Der Prozessorstart ist ein Hardware-Äquivalent. In einer realen Welt mit Lärm und Störungen und Menschen darin ist es eine wirklich gute Idee, so viel wie möglich für das Schicksal Ihrer Programme verantwortlich zu sein. Die Port-Initialisierung ist ein einfacher Teil davon.

Völlig einverstanden. Ich dachte nur, dass statt eines Hardware-Resets ein Sprung zum Programmstart erfolgen könnte oder - was mir kürzlich passiert ist, als indirekte Sprünge schief gingen - der Programmzähler einfach überläuft und wieder 0x0000 erreicht. Wer weiß, in welchem ​​Zustand die Häfen danach sein werden...

Weder Register noch SRAM werden beim Zurücksetzen initialisiert, nur einige der peripheren Register. Sie sollten Dinge initialisieren, die Sie verwenden.

Kennen Sie oder haben Sie einen Link zu einem Verlust, für welche peripheren Register dies gilt? Ich habe 'Anfangswerte' für einige wie UCSRCim Datenblatt gefunden. Was ist mit den I/O-Ports, insbesondere der Datenrichtung?
E/A-Ports sind auf Eingang eingestellt. Steht alles im Datenblatt.
@LeonHeller oh danke, jetzt sehe ich es. Genau dort in den Registerbeschreibungen. das ist mir irgendwie entgangen...
@ noah1989, Leon hat Recht, die Anfangswerte für periphere Register werden immer unter der Visualisierung des Registers angegeben (oder wie auch immer dieses Bild mit Namen einzelner Bits heißt :)).