¿Cómo habilitar el pin de salida a alto de forma predeterminada en Arduino Uno?

3

En Arduino Uno, noté que cuando configuro un PIN para dar salida, el estado inicial predeterminado es bajo. ¿Hay alguna manera de establecer el estado de salida inicial en alto?

La documentación de modo pinmode solo admite input, input_pullup y output. Deseo que haya una opción para output_pullup. Si coloco una resistencia de activación externa de 10k Ohm alrededor del PIN de salida, ayuda un poco empujar el estado inicial hacia lo alto.

Aun así, si hay una solución basada en software (es decir, actualizar el arduino uno a la salida predeterminada a alta), eso sería muy apreciado.

Gracias por leer

    
pregunta Antony

3 respuestas

3

No hay nada que le impida escribir los registros de salida (PORTx) antes de escribir los registros de dirección (DDRx). Desafortunadamente, las funciones de la biblioteca Arduino ( pinMode y digitalWrite ) tienen una serie de efectos secundarios y pueden o no funcionar. (Tal vez alguien más familiar que yo con las bibliotecas de Arduino pueda recomendar si un digitalWrite seguido de un pinMode funcionará.

Por lo tanto, la manipulación directa del registro puede lograr lo que usted desea, si la solución de @ Tom es insuficiente (la solución de Tom debería funcionar en casi todos los casos). Primero, consulte la página 77 de Hoja de datos ATmega328 y tabla de notas 14-1.

Suponiendo que un pin comienza con los bits DDR y PORT borrados: es un pin de entrada Hi-z. Establezca el bit PORT, el pin es ahora una entrada con un pullup. Ahora, cuando establece el bit DDR, el pin pasa de una entrada con pullup directamente a una salida alta.

Editar: tratando de comprender mejor lo que sucedería con el siguiente código leyendo a través de wiring_digital.c :

// where p is an Arduino pin, x is the corresponding port,
// and n is the corresponding bit
// pin starts with DDRxn == 0, PORTxn == 0
digitalWrite(PINp, HIGH);
// PORTx |= 1<<n, from line 159
// PORTxn == 1, DDRxn == 0: input pullup
pinMode(PINp, OUTPUT)
// DDRx |= 1<<n, from line 56
// PORTxn == 1, DDRxn == 1: output high

Por lo tanto, parece que llamar a digitalWrite antes de pinMode hará exactamente lo que quieres. Ignora el desorden sobre la manipulación del registro directo anterior.

    
respondido por el uint128_t
0

No puedes cambiar el valor predeterminado del hardware. Hay un código que se ejecuta al inicio que no controla (hay al menos algo de código de inicio en la ROM dentro del procesador, y también puede haber un cargador de arranque que se puede cambiar pero que es difícil de modificar para usted). A veces, este código puede alternar los pines de manera inesperada al buscar dispositivos de inicio alternativos o lo que sea. Esto me ha causado muchos problemas en varias ocasiones en mi carrera, porque no siempre está bien documentado por los proveedores de silicio (proveedores de bajo nivel de bajo costo).

De su pregunta, no está claro si el pin que está utilizando está siendo impulsado activamente por el procesador, o si solo tiene un pulldown débil. Si es solo un desplome débil, puedes vencerlo con un pullup de 1k. Además, puedes probar las ideas mencionadas anteriormente. Básicamente, debe asegurarse de alguna manera de asegurarse de que los datos estén configurados en un nivel alto ANTES de que la dirección esté configurada para emitir en el código sobre el que tiene control. No sé mucho acerca de arduino, pero he tratado este tipo de cosas en varios microprocesadores y normalmente es posible configurar los datos antes de establecer la dirección de un pin IO. A veces, el mismo bit que habilita el pullup interno también establece los datos en 1 para la salida.

Si el código no está habilitado para modificar el pin de manera activa, un pullup no solucionará el problema. Pero es posible que pueda consultar la documentación (o experimentar) y encontrar otro pin que no se agote después de restablecer.

Buena suerte.

    
respondido por el mkeith
0

Si bien no es exactamente lo que estaba buscando, agregar un código adicional a setup() debería funcionar:

void setup() {
    pinMode(PINx, OUTPUT); // replace PINx with the pin number
    digitalWrite(PINx, HIGH); //makes PINx high almost immediately (few uS)
    // rest of code
}

No hay problemas para realizar escrituras digitales o lecturas digitales en void setup (), puedes hacer cualquier cosa en setup() , pero solo se ejecuta una vez. A menos que te refieras a 'ir alto el poder instantáneo se aplica' porque aparte de una resistencia de pull-up, creo que puede que no tengas suerte

    
respondido por el Sam

Lea otras preguntas en las etiquetas

Comentarios Recientes

¡Esta historia es apoyada por el consorcio de computadoras de placa única !. ¡Estamos orgullosos de asociarnos con ellos! ¡Consulte la lista de contactos o encuentre más información en la Lista de productos de + Circuitos! ¡Volver a los diseños más altos / planos! <| Endoftext |> Cómo personalizar un mapa de tren para que se ajuste a un diseño ideal Por supuesto, no sería un mapa si estuviera destinado a intercambiar cualquier proveedor de tren con cualquier otro proveedor de servicios al menos una de las... Lees verder