Saludos brasileños!
En primer lugar, gracias Joby por tu ejemplo. En segundo lugar, su ejemplo tiene solo un pequeño error. El número 0x20 no es correcto. Debería ser 0x04. Además, solo como sugerencia, no usaría números hexadecimales como 0xFB, 0x20 o 0x04 en el código. Sugeriría usar las definiciones de puerto PIN que se encuentran en io.h y otras a las que hace referencia el archivo de encabezado. He reescrito el ejemplo de Joby a continuación, con algunos comentarios para los principiantes.
# include <avr/io.h>
int main (void)
{
// set all pins on PORTB for output
DDRB = 0xFF;
// set port pin PORTD2 as input and leave the others pins
// in their originally state (inputs or outputs, it doesn't matter)
DDRD &= ~(1 << PD2); // see comment #1
while (1)
{
if (PIND & (1<<PD2)) // see comment #2
PORTB |= (1<<PB2); // see comment #3
else
PORTB &= ~(1<<PB2); // see comment #4
}
return 0;
}
/ *
comentarios para principiantes
comentario # 1: (1 << PD2) genera el binario 00000100. La operación "~" invierte todos los dígitos, es decir, el binario ahora es 11111011. Finalmente, el & = aplica la lógica "Y" entre DDRD y 11111011 y el resultado se coloca nuevamente en memoria DDRD. Nota: Lo que hace el operador "Y" es para cada bit en la memoria DDRD, se compara con el número binario anterior. Si el bit en DDRD es 0 y el bit en el binario en la misma posición de mordida es 1, entonces el bit resultante es 0, si el DDRD es 1 y el bit en el binario es 1, el bit resultante es 1, y si el bit en el DDRD es 1 o 0 y el bit en el binario es 0, entonces el bit resultante es siempre 0. En resumen, el comando DDRD & = ~ (1 << PD2) cambia solo el bit PD2 a cero y deja los otros (ceros o unos) intactos. Parece un poco complicado, pero una vez que te acostumbras, es la mejor manera de cambiar un poco sin cambiar los otros bits.
comentario # 2 : (1 << PD2) genera el 00000100 binario. Usando la misma lógica "Y" descrita en el comentario # 1, el comando "PIND & 0000100" verifica solo si el PIND2 (nuestro pin de entrada donde está conectado el botón pulsador a) se establece en alto o no. Todos los demás pines serán FALSOS ya que los bits binarios están configurados en 0, y dado que el bit binario n. ° 2 está configurado en 1, la instrucción IF será VERDADERA solo si la entrada PD2 está configurada en alta o FALSA si la entrada PD2 es puesto a bajo.
comentario # 3 : Siguiendo la lógica explicada en el comentario # 1, este comando establece el pin de salida PINB2 en el puerto PORTB a alto voltaje. Si su LED está conectado correctamente a este puerto de pin con una resistencia de ~ 300 ohmios, y esa resistencia está conectada a tierra, el LED debería encenderse.
comentario # 4 : El LED debe apagarse por las mismas razones explicadas en los comentarios anteriores.
Consideraciones finales:
a) Para evitar la oscilación de voltaje en el pin de entrada PD2 cuando no se presiona el botón (circuito abierto), recomiendo encarecidamente colocar una resistencia desplegable (1 kOhm o más), de modo que el LED no se encienda accidentalmente debido a esta oscilación de voltaje aleatorio.
b) Una nota de renuncia: las ideas descritas aquí deben usarse solo con fines educativos y NO deben usarse en ningún sistema real antes de consultar a un experto en electrónica.
* /