¿Los registros y puertos AVR deben inicializarse a cero?

9

Durante la rutina de inicialización de mi código, uso para hacer cosas como:

clr    r0  ; will always stay zero

y:

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

¿Es esto realmente necesario? ¿O puedo estar seguro de que esto se hace automáticamente al reiniciar? Especialmente, ¿puedo confiar en que todos los puertos se configuren como entradas de manera predeterminada para que no haya problemas con las votaciones externas cuando no se ejecuta ningún código?

Stefan Paul Noack
fuente

Respuestas:

6

Los puertos de E / S de un AVR se configuran en INPUT / Tri-State / Hi-Z (DDRx = 0x00) al reiniciar. La mayoría de los microcontroladores (¿si no todos?) Tienen este comportamiento. Es el estado más seguro para un pin. Entonces sí, puede confiar en que los puertos se configuren automáticamente como entradas.

Algunos extractos y el ATmega16 muestran exactamente eso:

ingrese la descripción de la imagen aquí

Los pines del Puerto C tienen tres estados cuando se activa una condición de reinicio, incluso si el reloj no está funcionando.

m.Alin
fuente
1
Esto es exactamente lo que he estado buscando :)
Stefan Paul Noack
Por lo que recuerdo, si dejas una entrada flotante, obtienes ruido aleatorio, por lo que el estado inicial puede ser cero, eso está bien, pero podría volverse distinto de cero después del primer ciclo de reloj.
miceuz
@miceuz El punto es no tener salidas en un estado desconocido . Pueden tener un efecto indeseable en el circuito externo que está conectado al microcontrolador
m.
1
@miceuz te refieres a los registros de entrada del puerto, ¿verdad? estos tienen N / A como su estado inicial (lo cual tiene sentido, ya que solo reflejan lo que se aplica al pin). Pero me refería a los registros de dirección de datos. Solo quería estar seguro de que accidentalmente no tengo el puerto configurado como salida, posiblemente en conflicto con los voltajes aplicados al pin.
Stefan Paul Noack
oh sí, de verdad, perdón por el ruido ..
miceuz
4
  • La inicialización de puertos SIEMPRE es una buena idea, independientemente de lo que diga la hoja de datos.

  • Si la hoja de datos no dice nada, entonces es una idea completamente vital.


Solo necesita definir el contenido de los datos del puerto si le preocupa lo que sucederá cuando se ejecute su programa.

Si no le importa el resultado, no tiene que configurar los bits de datos del puerto :-).

Si los fabricantes dicen explícitamente en las hojas de datos que los bits de datos del puerto están configurados o borrados, entonces pueden ser PERO TODAVÍA es una muy buena idea inicializarlos usted mismo de todos modos. Las "condiciones de contorno" son donde la mayoría de las cosas salen mal, por ejemplo, el inicio de un bucle, el final de un bucle, el punto circular de envoltura del búfer circular, .... El inicio del procesador es un equivalente de hardware. En un mundo real con ruido, problemas técnicos y personas, estar a cargo del destino de sus programas tanto como sea posible es una muy buena idea. La inicialización de puertos es una parte fácil de esto.

Russell McMahon
fuente
Totalmente de acuerdo Me acabo de dar cuenta de que, en lugar de un reinicio de hardware, podría haber un salto al inicio del programa o, lo que me sucedió recientemente cuando saltaron indirectamente los saltos, el contador del programa simplemente se desbordó y alcanzó 0x0000 nuevamente. Quién sabe en qué estado estarán los puertos después de eso ...
Stefan Paul Noack
1

Ni los registros ni la SRAM se inicializan al reiniciar, solo algunos de los registros periféricos. Debes inicializar las cosas que usas.

avakar
fuente
¿Sabe o tiene un enlace a una pérdida de los registros periféricos a los que esto se aplica? Encontré 'valores iniciales' para algunos, como UCSRCen la hoja de datos. ¿Qué pasa con los puertos de E / S, especialmente la dirección de datos?
Stefan Paul Noack
2
Los puertos de E / S están configurados para entrada. Todo está en la hoja de datos.
Leon Heller
@LeonHeller oh gracias, ahora lo veo. Justo allí en las descripciones de registro. De alguna manera me perdí eso ...
Stefan Paul Noack
@ noah1989, Leon tiene razón, los valores iniciales para los registros periféricos siempre se especifican debajo de la visualización del registro (o como se llame esa imagen con nombres de bits individuales :)).
avakar