¿Cómo se deben configurar los pines de E / S no utilizados en ATMega328P para el menor consumo de energía?

15

Estoy tratando de reducir la potencia tanto como sea posible en una placa Arduino que he creado. ¿Cómo se deben configurar los pines de entrada no utilizados? Hay algunas respuestas ( aquí , aquí ) ya para esto, pero busco algo específico para el ATMega328P.

  1. Establezca la clavija en entrada, la clavija impulsora alta para activar el pull-up interno
  2. Establezca el pin en entrada, el pin de la unidad está bajo
  3. Establezca el pin en la entrada, tire hacia arriba
  4. Establezca el pin en la entrada, el menú desplegable externo
  5. Establezca el pin en salida baja
  6. Establezca el pin en salida alta
  7. Establezca el pin en salida baja, desplegable externo
pregunta geometrikal

3 respuestas

12

Después de excavar a través de hoja de datos , encontré esto:

  

14.2.6 Pines no conectados

     

Si algunos pines no están en uso, se recomienda asegurarse de que estos pines tengan un nivel definido. Aunque la mayoría de las entradas digitales están deshabilitadas en los modos de suspensión profunda como se describió anteriormente, deben evitarse las entradas flotantes para reducir el consumo de corriente en todos los demás modos donde las entradas digitales están habilitadas (Restablecer, Modo activo y Modo inactivo).

     

El método más simple para garantizar un nivel definido de un pin no utilizado, es habilitar el pull-up interno. En este caso, el pull-up se desactivará durante el reinicio. Si el bajo consumo de energía durante el reinicio es importante, se recomienda utilizar un pull-up o pull-down externo. No se recomienda conectar los pines no utilizados directamente a VCC o GND, ya que esto puede causar corrientes excesivas si el pin se configura accidentalmente como una salida.

actualización en relación con el comentario / pregunta:

Según la tabla 14-1, la resistencia de pull-up solo está activa cuando se cumplen las siguientes condiciones:

  1. El pin se establece como entrada (el bit DDxn tiene una lógica baja)
  2. PORTxn tiene una lógica alta
  3. PUD es lógica baja

La única forma de obtener una corriente significativa que fluye a través de la resistencia de pull-up es si el pin experimenta un nivel bajo con el pull-up habilitado. Esto significa que Atmel se desordenó mal (es poco probable) o tiene el pin configurado como entrada con el pull-up habilitado y el pin está conectado a tierra de alguna manera.

La sección 14.2.5 discute los modos de habilitación y suspensión de entrada digital. Para resumir, la entrada digital se fija a tierra en la entrada del disparador Schmitt para evitar un nivel flotante mientras está en modo de suspensión, a menos que el pin esté configurado como una interrupción externa. No puedo saber si la salida digital está deshabilitada en el modo de suspensión. No parece que esté deshabilitado según la cifra 14-2 , aunque no estaría muy sorprendido si lo estuviera. La mejor opción es usar una resistencia pull-up interna o externa.

    
respondido por el helloworld922
9
  1. Establezca la clavija en entrada, la clavija de impulsión alta para activar el pull-up interno : Creo que esto debería leerse: " haga una entrada alta al activar el pull-up interno ". (Yo usaría la palabra "unidad" solo si lo hace activamente, por medio de un FET a Vcc o tierra). Está claro que desea un nivel definido, y el pull-up se encarga de eso. Asegúrate de que habilitar el pull-up es una de las primeras cosas que haces después de reiniciar. Eso va para la inicialización de E / S en general. La única corriente será la corriente de fuga del NFET del par push-pull y la fuga de la compuerta del FET de entrada. Menos de 1 µA: OK.
  2. Establezca el pin en entrada, pin de unidad bajo : no es una buena idea. Si el software se vuelve loco y cambiaría el pin a salida alta, está cortocircuitando el pin, dañando el PFET del par complementario.
  3. Establezca el pin en entrada, pull up externo : es lo mismo que 1), solo que más caro. Pero tiene la ventaja de que el pull-up siempre estará allí; puede olvidarse de habilitar el pull-up interno (que está deshabilitado por defecto). Si la E / S cambia accidentalmente a una salida baja, tendrá un pequeño drenaje de corriente.
  4. Establezca el pin en entrada, desplegable externo : nuevamente, el costo de una resistencia (sí, sé que es barato, pero barato + innecesario = costoso). La misma corriente que en 3) si el pin iría a activo alto.
  5. Establezca el pin en salida baja : tiene una corriente de fuga más alta que cuando se configura como entrada, pero aún por debajo de 1 µA, por lo que no hay que preocuparse. Todavía habilitaría el pull-up interno. No estará activo con la E / S como salida, pero si se cambiara accidentalmente a la entrada, el pin no permanecería flotando.
  6. Establezca el pin en salida alta : igual que 5)
  7. Establezca el pin para una salida baja, desplegable externo : la resistencia desplegable es un costo innecesario: haría una salida baja, que ya es baja. Pero comparado con 5) tiene la ventaja de que está seguro de que el pin no flotará si se lo cambia accidentalmente a la entrada.

Iría por 1): entrada con pull-up interno; No se requieren piezas externas. En un FMEA 5) puede resultar mejor, pero eso depende de qué tan alto estimas el riesgo que olvidaste de habilitar el pull-up interno. Una revisión por pares de diseño de software debería darle un seguro.

    
respondido por el stevenvh
1

Los pines no suelen hacer una gran diferencia ellos mismos. Verá que cada pin también tiene una función específica: deshabilite la función del pin

volatile uint8_t timer2sum; // see interrupt handler

void Initialize()
{
    // configure pin for output
    DDR_LED |= LED;

    // set Power Reduction Register
    PRR = (1<<PRTWI)     // turn off TWI
        | (1<<PRTIM0)    // turn off Timer/Counter0
        | (1<<PRTIM1)    // turn off Timer/Counter1 (leave Timer/Counter2 on)
        | (1<<PRSPI)     // turn off SPI
        | (1<<PRUSART0)  // turn off USART (will turn on again when reset)
        | (1<<PRADC);    // turn off ADC

    // select POWER SAVE mode for sleeping, which allows Timer/Counter2 to wake us up
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);

    // configure Timer/Counter2 to wake us up as infrequently as possible
    TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); // clock at 14400 Hz
    TIMSK2 |= (1<<TOIE2);                        // interrupt on overflow, 56.25 Hz
    timer2sum = 0;                               // see interrupt handler
    sei();                                       // enable interrupts
}

tomado de enlace que también usa los mismos chips.

    
respondido por el exussum

Lea otras preguntas en las etiquetas