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

9

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 das eigentlich nötig? Oder kann ich sicher sein, dass dies beim Zurücksetzen automatisch erfolgt? Kann ich mich insbesondere darauf verlassen, dass alle Ports standardmäßig als Eingaben festgelegt sind, damit bei externen Abstimmungen kein Problem auftritt, wenn kein Code ausgeführt wird?

Stefan Paul Noack
quelle

Antworten:

6

Die E / A-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. Sie können sich also darauf verlassen, dass die Ports automatisch als Eingänge festgelegt werden.

Einige Auszüge aus dem ATmega16 zeigen genau das:

Geben Sie hier die Bildbeschreibung ein

Die Port C-Pins werden dreifach angegeben, wenn eine Rücksetzbedingung aktiv wird, auch wenn die Uhr nicht läuft.

m.Alin
quelle
1
Genau das habe ich gesucht :)
Stefan Paul Noack
Soweit ich mich erinnere, erhalten Sie, wenn Sie einen Eingang schweben lassen, zufälliges Rauschen, sodass der Anfangszustand Null sein kann. Das ist in Ordnung, kann aber nach dem ersten Taktzyklus ungleich Null werden.
Mäuse
@miceuz Es geht nicht darum, Ausgänge in einem unbekannten Zustand zu haben . Sie können eine unerwünschte Wirkung auf den externen Stromkreis haben, der an den Mikrocontroller angeschlossen ist
m.Alin
1
@miceuz Sie beziehen sich auf die Port-Eingangsregister, richtig? Diese haben N / A als Ausgangszustand (was sinnvoll ist, da sie nur das widerspiegeln, was auf den Pin 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 im Widerspruch zu den an den Pin angelegten Spannungen steht.
Stefan Paul Noack
Oh ja, wirklich, Entschuldigung für den Lärm ..
Mäuse
4
  • Die Portinitialisierung ist IMMER eine gute Idee, unabhängig davon, was im Datenblatt angegeben ist.

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


Sie müssen den Inhalt der Portdaten nur definieren, wenn Sie sich darum kümmern, was passiert, wenn Ihr Programm ausgeführt wird.

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

Wenn Hersteller in den Datenblättern ausdrücklich sagen, dass Portdatenbits gesetzt oder gelöscht sind, sind sie möglicherweise ABER es ist NOCH eine wirklich sehr gute Idee, sie trotzdem selbst zu initialisieren. Unter "Randbedingungen" gehen die meisten Dinge schief - z. B. Beginn einer Schleife, Ende einer Schleife, runder Pufferumlaufpunkt, .... 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 Ihres Programms verantwortlich zu sein. Die Portinitialisierung ist ein einfacher Teil davon.

Russell McMahon
quelle
Völlig einverstanden. Ich habe nur gedacht, dass anstelle eines Hardware-Resets ein Sprung zum Programmstart oder - was mir kürzlich passiert ist, als indirekte Sprünge fehlgeschlagen sind - der Programmzähler einfach überläuft und wieder 0x0000 erreicht. Wer weiß, in welchem ​​Zustand sich die Häfen danach befinden werden ...
Stefan Paul Noack
1

Weder Register noch SRAM werden beim Zurücksetzen initialisiert, nur einige der Peripherieregister. Sie sollten die von Ihnen verwendeten Elemente initialisieren.

Avakar
quelle
Wissen Sie oder haben Sie einen Link zu einem Verlust, für welche Peripherie-Register dies gilt? Ich habe 'Anfangswerte' für einige gefunden, wie UCSRCim Datenblatt. Was ist mit den E / A-Ports, insbesondere der Datenrichtung?
Stefan Paul Noack
2
E / A-Ports sind auf Eingabe eingestellt. Es ist alles im Datenblatt.
Leon Heller
@LeonHeller oh danke, jetzt sehe ich es. Genau dort in den Registerbeschreibungen. Ich habe das irgendwie verpasst ...
Stefan Paul Noack
@ noah1989, Leon ist korrekt, die Anfangswerte für Peripherieregister werden immer unter der Visualisierung des Registers angegeben (oder wie auch immer das Bild mit den Namen der einzelnen Bits genannt wird :)).
Avakar