¿Es necesario inicializar a cero los registros y puertos del AVR?

Durante la rutina de inicialización de mi código, suelo 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 forma predeterminada para que no haya problemas con los votos externos cuando no se ejecuta ningún código?

Respuestas (3)

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. Así que sí, puede confiar en que los puertos se configurarán automáticamente como entradas.

Algunos extractos del 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.

Esto es exactamente lo que he estado buscando :)
Por lo que recuerdo, si deja una entrada flotante, obtiene un ruido aleatorio, por lo que el estado inicial puede ser cero, está bien, pero puede convertirse en distinto de cero después del primer ciclo de reloj.
@miceuz El punto es no tener salidas en un estado desconocido . Pueden tener un efecto no deseado en el circuito externo que está conectado al microcontrolador.
@miceuz te refieres a los registros de entrada del puerto, ¿verdad? estos tienen N/A como su estado inicial (lo que 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 asegurarme de no tener accidentalmente el puerto configurado como salida, posiblemente en conflicto con los voltajes aplicados al pin.
oh sí, de verdad, lo siento por el ruido..
  • La inicialización del puerto 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 absolutamente vital.


Solo necesita definir el contenido de los datos del puerto si le importa 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 estarlo, 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 van mal, por ejemplo, el comienzo de un bucle, el final de un bucle, el punto de redondeo del búfer circular, ... . El inicio del procesador es un equivalente de hardware. En un mundo real con ruido y fallas y gente en él, estar a cargo del destino de tus programas tanto como puedas es una muy buena idea. La inicialización del puerto es una parte fácil de esto.

Totalmente de acuerdo. Simplemente pensé que, en lugar de un reinicio de hardware, podría haber un salto al inicio del programa o, lo que me sucedió recientemente cuando los saltos indirectos salieron mal, el contador del programa simplemente se desbordó y llegó a 0x0000 nuevamente. Quién sabe en qué estado estarán los puertos después de eso...

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

¿Conoce o tiene un enlace a una pérdida de los registros periféricos a los que se aplica esto? 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?
Los puertos de E/S están configurados para entrada. Todo está en la hoja de datos.
@LeonHeller oh gracias, ahora lo veo. Justo ahí en las descripciones del registro. De alguna manera me perdí eso...
@ 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 :)).