¿Qué debo hacer para leer una entrada digital (botón) en ATmega16 ? ¿Tengo que habilitar las resistencias pullup o puedo usar una de 10 kohm? ¿Cuál sería un código simple? Solo un simple 'Enciende el LED cuando se presiona'.
¿Hay un tutorial para principiantes? He intentado buscar en Google y AVR Freaks , pero todo se convierte en una pelea allí y no obtengo mi respuesta. Realmente no he encontrado ningún tutorial sobre estas cosas. Toneladas de cosas específicas pero nada simple sobre mi microcontrolador AVR ...
Respuestas:
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.
/ *
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.
* /
fuente
https://www.mainframe.cx/~ckuethe/avr-c-tutorial/
https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in
fuente
Hackaday tuvo una excelente redacción para la programación AVR, tiene mucha información excelente que podría ayudarlo
http://hackaday.com/2010/11/19/avr-programming-04-writing-code-etc/
http://hackaday.com/2010/11/05/avr-programming-03-reading-and-compiling-code/
http://hackaday.com/2010/10/25/avr-programming-02-the-hardware/
http://hackaday.com/2010/10/23/avr-programming-introduction/
fuente
Bueno, esto es para el AT90Usb1287, un ATMega, pero el botón básico debería ser más o menos lo mismo. Simplemente cambie los nombres de IO.
fuente
Algo más a tener en cuenta cuando se trata de una entrada digital de un interruptor mecánico es el rebote de los contactos: cambiar lo que debería ser un solo botón en lo que parece ser un impulso múltiple.
Para algo como encender un LED cuando se mantiene presionado el botón, probablemente no tenga que preocuparse por el rebote. Para algo un poco más complicado (como alternar el LED al presionar el botón), es necesario eliminar el rebote.
Jack Ganssle tiene una buena guía para el rebote
fuente