¡Saludos brasileños!
En primer lugar, gracias Joby por tu ejemplo. En segundo lugar, su ejemplo tiene un pequeño error. El número 0x20 no es correcto. Debería ser 0x04. También, sólo como sugerencia, yo no usaría números hexadecimales como 0xFB, 0x20, o 0x04 en el código. Sugeriría usar las definiciones de los puertos PIN que se encuentran en el archivo io.h y otros referenciados por la cabecera. 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. Por último, la operación &= aplica la lógica "AND" entre DDRD y 11111011 y el resultado se coloca de nuevo en la memoria DDRD. Nota: Lo que hace el operador "AND" es que 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 la memoria 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 sólo el bit PD2 a cero y deja los demás (ceros o unos) sin tocar. Parece un poco un poco complicado, pero después de acostumbrarse a él, es es la mejor manera de cambiar un bit en un bocado sin cambiar los otros bits.
comentario #2 (1 << PD2) genera el binario 00000100. Utilizando la misma lógica "AND" descrita en comentario #1, el comando "PIND & 0000100" comprueba sólo si el PIND2 (nuestro pin de entrada al que está conectado el pulsador está conectado) se pone en alto o no. Todos los demás pines serán FALSE ya que los bits binarios se ponen a 0, y como el bit binario #2 está puesto a 1, la sentencia IF será TRUE sólo si la entrada PD2 se pone en alto o FALSE si la entrada PD2 es baja.
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á correctamente conectado a este pin puerto 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 la tensión en el pin de entrada PD2 cuando el pulsador no está presionado (circuito abierto), recomiendo encarecidamente colocar una resistencia pull-down (1 kOhm o superior), para que el LED no se encienda accidentalmente debido a esta oscilación aleatoria de aleatoria.
b) Una nota de descargo de responsabilidad: Las ideas descritas aquí son para ser utilizadas como educativas y NO deben ser utilizadas en ningún sistema real antes de consultar a un experto en electrónica.
*/
4 votos
Esto se contestaría en casi cualquier tutorial para principiantes, y me temo que una respuesta completa aquí socavaría tu comprensión más que ayudarte. ¿Qué esfuerzo previo has hecho para aprender?
0 votos
No estoy seguro de si has visto mi post o eres capaz de verlo (lo siento todavía un poco confundido acerca de este sitio ...) Pero sé que el código, digamos que mi pregunta es: ¿me acaba de conectar un pin a GND y su baja?
2 votos
¿Por qué no editas tu post para reflejar esto con mayor precisión e incluyes también el post de abajo en el post original?
0 votos
Pruebe el tutorial de AVR desde cero en este Página de AVR Freaks. Allí encontrarás muchas más cosas.