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.