18 votos

¿Cómo puedo leer la entrada digital en ATmega16?

¿Qué tengo que hacer para leer una entrada digital (pulsador) en ATmega16 ? ¿Tengo que habilitar las resistencias de tracción o puedo usar una de 10 kohm? ¿Qué sería un código simple? Sólo un simple "Enciende el LED cuando se presiona la cosa".

¿Hay un tutorial para principiantes? He intentado buscar en Google y Fenómenos de AVR pero todo se convierte en una lucha 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 AVR microcontrolador...

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?

25voto

¡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.

*/

3 votos

No te animo a dar tu correo electrónico porque la correspondencia por correo electrónico hace que la comunicación sea privada. Así que nadie más puede beneficiarse. Pero si realmente quieres proporcionar tu correo electrónico para comunicaciones privadas, el mejor lugar para hacerlo es en tu perfil.

0 votos

¿No es al revés, el #3 apaga el led y el #4 lo enciende?

3voto

letronje Puntos 128

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}

0 votos

Gracias a @joby Taffey por el enlace proporcionado. Estaba buscando las funciones de la EEPROM y me ayudó mucho el : mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Muchas gracias.

2voto

0voto

jwalkerjr Puntos 828

Bueno, esto es para el AT90Usb1287, un ATMega, pero lo básico de los botones debería ser más o menos lo mismo. Sólo cambiar los nombres de IO.

0voto

Techboy Puntos 986

Otra cosa que hay que tener en cuenta cuando se trata de una entrada digital de un interruptor mecánico es que los contactos rebotan, cambiando lo que debería ser una sola pulsación de botón en lo que parecen múltiples pulsaciones.

Para algo como el encendido de un LED cuando se mantiene pulsado el botón, probablemente no hay que preocuparse por la desbordamiento. Para algo un poco más complicado (como alternar el LED al pulsar el botón), el debouncing es una necesidad.

Jack Ganssle tiene una buena Guía para la desvinculación

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X