Les registres et ports AVR doivent-ils être initialisés à zéro?

9

Pendant la routine d'initialisation de mon code, j'utilise pour faire des choses comme:

clr    r0  ; will always stay zero

et:

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

Est-ce réellement nécessaire? Ou puis-je être sûr que cela se fait automatiquement lors de la réinitialisation? Surtout, puis-je compter sur tous les ports à définir comme entrées par défaut, donc il n'y a pas de problème avec les votes externes quand aucun code n'est exécuté?

Stefan Paul Noack
la source

Réponses:

6

Les ports d'E / S d'un AVR sont définis sur INPUT / Tri-State / Hi-Z (DDRx = 0x00) lors de la réinitialisation. La plupart des microcontrôleurs (sinon tous?) Ont ce comportement. C'est l'état le plus sûr pour une broche. Donc, oui, vous pouvez compter sur les ports pour qu'ils soient définis automatiquement comme entrées.

Certains extraits de l'ATmega16 montrent exactement cela:

entrez la description de l'image ici

Les broches du port C sont tri-déclarées lorsqu'une condition de réinitialisation devient active, même si l'horloge ne fonctionne pas.

m.Alin
la source
1
C'est exactement ce que je cherchais :)
Stefan Paul Noack
pour autant que je m'en souvienne, si vous laissez une entrée flottante, vous obtenez un bruit aléatoire, donc l'état initial peut être nul, c'est correct, mais il peut devenir non nul après le premier cycle d'horloge.
miceuz
@miceuz Le point n'est pas d'avoir des sorties dans un état inconnu . Ils peuvent avoir un effet indésirable sur le circuit externe connecté au microcontrôleur
m.Alin
1
@miceuz vous faites référence aux registres d'entrée de port, non? ceux-ci ont N / A comme état initial (ce qui est logique, car ils reflètent simplement tout ce qui est appliqué à la broche). Mais je faisais référence aux registres de direction des données. Je voulais juste être sûr de ne pas avoir accidentellement le port défini comme sortie, ce qui pourrait entrer en conflit avec les tensions appliquées à la broche.
Stefan Paul Noack
oh ouais, vraiment, désolé pour le bruit ..
miceuz
4
  • L'initialisation du port est TOUJOURS une bonne idée, indépendamment de ce que dit la fiche technique.

  • Si la fiche technique ne dit rien, c'est une idée absolument vitale.


Vous devez uniquement définir le contenu des données de port si vous vous souciez de ce qui se passera lorsque votre programme s'exécutera.

Si vous ne vous souciez pas du résultat, vous n'avez pas à définir les bits de données du port :-).

Si les fabricants indiquent explicitement dans les fiches techniques que les bits de données de port sont définis ou effacés, ils peuvent être MAIS c'est quand même une très bonne idée de les initialiser vous-même de toute façon. Les "conditions aux limites" sont celles où la plupart des choses tournent mal - par exemple, le début d'une boucle, la fin d'une boucle, le bouclage circulaire d'un tampon, .... Le démarrage du processeur est un équivalent matériel. Dans un monde réel avec du bruit et des pépins et des gens, être en charge du destin de vos programmes autant que vous le pouvez est une très bonne idée. L'initialisation du port est une partie facile de cela.

Russell McMahon
la source
Entièrement d'accord. Je viens de penser qu'au lieu d'une réinitialisation matérielle, il pourrait y avoir un saut au démarrage du programme ou - ce qui m'est arrivé récemment lorsque les sauts indirects ont mal tourné - le compteur de programme a juste débordé et atteint à nouveau 0x0000. Qui sait dans quel état seront les ports après cela ...
Stefan Paul Noack
1

Ni les registres ni la SRAM ne sont initialisés lors de la réinitialisation, seuls certains des registres périphériques. Vous devez initialiser les choses que vous utilisez.

avakar
la source
Connaissez-vous ou avez-vous un lien vers une perte des registres périphériques auxquels cela s'applique? J'ai trouvé des «valeurs initiales» pour certains, comme UCSRCdans la fiche technique. Qu'en est-il des ports d'E / S, en particulier de la direction des données?
Stefan Paul Noack
2
Les ports d'E / S sont définis pour l'entrée. Tout est dans la fiche technique.
Leon Heller
@LeonHeller oh merci, maintenant je le vois. Juste là dans les descriptions des registres. J'ai en quelque sorte manqué ça ...
Stefan Paul Noack
@ noah1989, Leon a raison, les valeurs initiales pour les registres périphériques sont toujours spécifiées sous la visualisation du registre (ou quoi que cette image avec des noms de bits individuels s'appelle :)).
avakar