Os registros e portas do AVR precisam ser inicializados para zero?

9

Durante a rotina de inicialização do meu código, eu uso para fazer coisas como:

clr    r0  ; will always stay zero

e:

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

Isso é realmente necessário? Ou posso ter certeza de que isso é feito automaticamente após a redefinição? Especialmente, posso confiar em todas as portas para serem definidas como entradas por padrão, para que não haja problemas com votações externas quando nenhum código for executado?

Stefan Paul Noack
fonte

Respostas:

6

As portas de E / S de um AVR são definidas como INPUT / Tri-State / Hi-Z (DDRx = 0x00) após a redefinição. A maioria dos microcontroladores (se não todos?) Tem esse comportamento. É o estado mais seguro para um pino estar. Então, sim, você pode confiar nas portas para serem definidas automaticamente como entradas.

Alguns trechos do ATmega16 mostram exatamente isso:

insira a descrição da imagem aqui

Os pinos da porta C são tri-declarados quando uma condição de redefinição se torna ativa, mesmo que o relógio não esteja funcionando.

m.Alin
fonte
11
Este é exatamente o que eu estava procurando :)
Stefan Paul Noack
Tanto quanto me lembro, se você deixar uma entrada flutuando, você recebe um ruído aleatório, então o estado inicial pode ser zero, tudo bem, mas pode se tornar diferente de zero após o primeiro ciclo do relógio.
miceuz
@miceuz O ponto é não ter saídas em um estado desconhecido . Eles podem ter um efeito indesejável sobre o circuito externo, que está ligado ao microcontrolador
m.Alin
11
@ miceuz você está se referindo aos registros de entrada de porta, certo? estes têm N / A como seu estado inicial (o que faz sentido, pois apenas refletem o que é aplicado ao pino). Mas eu estava me referindo aos registros de direção de dados. Eu só queria ter certeza de que não tenho acidentalmente a porta definida como saída, possivelmente entrando em conflito com as tensões aplicadas ao pino.
precisa
oh sim, realmente, desculpe para o ruído ..
miceuz
4
  • A inicialização da porta é SEMPRE uma boa idéia, independentemente do que diz a folha de dados.

  • Se a folha de dados não diz nada, é uma ideia absolutamente vital.


Você só precisa definir o conteúdo dos dados da porta se se preocupa com o que acontecerá quando o programa for executado.

Se você não se importa com o resultado, não precisa definir os bits de dados da porta :-).

Se os fabricantes disserem explicitamente nas folhas de dados que os bits de dados da porta estão configurados ou limpos, eles podem ser, mas ainda é realmente uma boa idéia inicializá-los de qualquer maneira. "Condições de contorno" são onde a maioria das coisas dá errado - por exemplo, início de um loop, final de um loop, ponto redondo de quebra circular do buffer, .... A inicialização do processador é um equivalente de hardware. Em um mundo real com ruídos, falhas e pessoas nele, estar no comando do destino de seus programas o máximo que puder é uma boa idéia. A inicialização da porta é uma parte fácil disso.

Russell McMahon
fonte
Totalmente de acordo. Imaginei que, em vez de uma redefinição de hardware, poderia haver um salto no início do programa ou - o que recentemente aconteceu comigo quando os saltos indiretos deram errado - o contador de programas transbordou e atingiu 0x0000 novamente. Quem sabe o estado dos portos será depois disso ...
Stefan Paul Noack
1

Nem os registros nem a SRAM são inicializados após a redefinição, apenas alguns dos registros periféricos. Você deve inicializar as coisas que usa.

avakar
fonte
Você conhece ou tem um link para uma perda de quais registros periféricos isso se aplica? Encontrei 'valores iniciais' para alguns, como UCSRCna folha de dados. E as portas de E / S, especialmente a direção dos dados?
precisa
2
As portas de E / S estão definidas para entrada. Está tudo na folha de dados.
Leon Heller
@LeonHeller oh obrigado, agora eu vejo isso. Bem ali nas descrições do registro. De alguma maneira eu perdi isso ...
Stefan Paul Noack
@ noah1989, Leon está correto, os valores iniciais para registros periféricos sempre são especificados abaixo da visualização do registro (ou seja lá o que a imagem com nomes de bits individuais é chamada :)).
avakar