Ha escrito el primer programa, que enciende un LED. sí, eso fue espectacular! Bueno, no realmente, pero vamos a introducir un poco de locura para el LED. Le daremos una personalidad "bipolar" por lo que es blink. Luego paso a otro nivel y hacer parpadear muy rápido. El programa es sorprendentemente concisa y fácil de implementar.
Compruébelo usted mismo:
#include <avr/io.h>#include <util/delay.h> int main(void){DDRB | = 1 << PINB0;
mientras (1)
{
PORTB ^ = 1 << PINB0;
_delay_ms(100);
}
01001011 &10001101equals00001001
¡ HOLA! Cuáles son esos símbolos loco!! Loco parece ser un tema común aquí. Bueno, voy a explicar. Pero te prometo, es bastante fácil. Basta con memorizar algunas cosas. Me meteré en un poco de detalle, pero si no entiendes, no te preocupes, solo memorizar lo que logra la declaración entera y va a estar bien. Le dará un toque en el camino. Aquí viene el detalle de operaciones bit a bit:
Hay operadores lógicos llamados y, o, no y XOR que nosotros estamos en este momento. Que realmente quieren decir lo que dicen. Esto es todo por el bien de comparación de dos bits, "1" y "0". ¿Ver? Cómo puede simplemente comparar dos números ser difícil! "1" y "1" es verdadero o "1". Y sí, adivinaron, "0" y "0" es falso o "0". Pero ¿qué es "0" y "1" y viceversa? Bueno, falso o "0", obviamente. Esos tipos son diferentes, así que, realmente, son falsas.
Ejemplo operación número binario (el "&" se utiliza en programación para C y):
01001011 |10001101equals11001111
Fácil, ¿verdad? Así, o es aún más fácil! "1" o "1" es "1", obviamente. "0" o "0" también es "0". Está empezando a ser muy similar a y, pero aquí está la diferencia. Si los dos números son distintos, esto resultará en "1". Así, "1" o "0" es "1".
Vamos a usar el mismo número binario por ejemplo (ese personaje gracioso "|" es el o, a veces se encuentra por encima de la "\" en el teclado):
01001011 ^10001101equals11000110
Hmm, que enciende todos los lugares donde allí faltaban unos! Esto es donde la magia sucede. Sí, mantuvo en el primer número y donde se encuentran en el segundo número binario, pero no el primero, cambió a los. Muy simple. NO simplemente toma todos los bits y les flipa. Por ejemplo, para este número binario: 01001101 se convertirá en 10110010. Se convirtió el 0 en 1 en 0 y 1, pero no se confunda esta con el XOR.
XOR es similar a la OR pero el "1" XOR "1" es "0". Sólo te voy a mostrar el ejemplo y usted puede averiguar qué happenes.
#include <util/delay.h>
Sí, lo has adivinado, el "^" sobre el "6" es el símbolo de la XOR. Hmmm... El "|" y el "^" en el programa. Enfriar. Bien, ya que somos el programa de pensamiento, vamos a disect las cosas no sabemos aún!
DDRB = 0b00000001;
Ya sabes lo que hace el < avr/io.h >, así que no pierdas tu tiempo con eso, pero hay una nueva declaración #include. El delay.h nos ofrecerá un par de métodos convenientes para usar. Como su nombre lo indica, el delay.h nos proporcionará una manera de crear retrasos en nuestro programa.
Pasando por alto la "principal" ya que sabemos ya, vemos el DDRB cambió. No te asustes! Aquí está el proceso desde donde fuimos a donde nos encontramos:
Esto es lo que teníamos antes. Esto no es una buena forma de minipulating las clavijas ya que acaba de cambiar todos los pernos de 1 a 7 como entrada, pero "Qué pasa si" hemos tenido un programa más grande que usa los pernos para otras cosas, como por ejemplo, pin 2 control de la presión del freno de la allpies para el sistema de frenos antibloqueo. Usted no querría establecer sólo arbitrariamente como entrada. Haría que sus frenos inútil (que serían realmente malos).
DDRB = DDRB | 0b00000001;
Necesitamos una forma sólo afectan un poco, el pin bit 0. Bueno, si te fijas arriba en la "o", esto lo podemos hacer con una máscara (no la máscara de carnaval que está pensando, pero una máscara binaria.
DDRB |= 0b00000001;
Este se toma su auto antiguo y "O" a una máscara. La máscara es: 0b00000001. Si esto parece el número binario real, pero si el anterior DDRB fue, digamos, 0b01001010, luego hacer un OR para que con nuestra máscara sería: 0b01001010 | 0b00000001 = 0b01001011. Qué es diferente en el resultado. Así es, sólo el pin 0 bit se cambia!
Este statememt puede ser más comprimido en C++:
PORTB |= 1 << PINB0;_delay_ms(100);PORTB &= ~(1 << PINB0);_delay_ms(100);
Pero no lo es en el programa. Aunque esto es perfectamente válido, por qué no aprovechamos algunas de las definiciones en el fichero de cabecera io.h. Quiero decir, es que para nuestra comodidad, ¿no? Cuenta mi uso de contracciones! Esto es lo mismo en C++: «es» es realmente «es», como «DDRB | = 0b00000001 "es lo mismo que" DDRB = DDRB | 0b00000001 ". Me hundo en mi silla, con esa mala analogía. Whataver, ayuda!
¿Por qué "DDRB | = 1 << PINB0"?
1 << PINB0 es el acto de crear la máscara. El "1" representa lo que se inserta en la máscara, el << es un operador de cambio izquierda. Hace exactamente lo que dice, y PINB0 es un número de posiciones que el "1" puede cambiar de posición izquierda. En esencia, PINB0 es exactamente igual a 0. Así, se empieza con un 0b00000000 y agregar un "1" para hacer 0b00000001 y luego usted cambia de puesto posiciones 0 a la izquierda. Así te queda 0b00000001, el mismo número de arriba. Entonces, ¿qué pasa si fue PINB4? La Declaración sería: 1 << PINB4. El "1" se trasladaría izquierda 4 veces dando como resultado: 0b00010000. Recuerde, estamos utilizando un índice de cero, así que hay cuatro 0s después de la 1.
Vamos a pasar en el tiempo del lazo. Tienes razón, no tenemos nada en el "bucle infinito" antes. Bien, ahora tenemos el microcontrolador mostrar alguna acción. Esto sólo es posible dentro del bucle. El lazo es donde la acción se repite una y otra vez. Si la acción se encontraba antes del bucle, entonces la acción sólo pasaría una vez, como establecer la dirección del perno, que es apropiado para este programa. Pero para crear siempre parpadeando, necesitamos hacer la PINB0 y dentro del bucle. Aquí es también donde los retrasos. Si no tuviéramos retrasos, no veríamos el LED parpadeando en todo, le parece que es justo, ya que el parpadeo se produciría más rápido que el ojo podía percibir, por lo que necesitamos ralentizarlo.
Sabemos cómo establecer un bit específico del número binario, pero no sabemos cómo hacer algo específico "0" Si todavía es un "1". El siguiente código lo hace solo, pero te darás cuenta que es no lo que muestra el programa. El primer par de líneas se convierte los bits a "1" (5 voltios, claros) y hace una pausa de 100 milisegundos (por cierto, usted puede utilizar microsegundos cambiando las "ms" a "nosotros"). El segundo dos líneas activa el bit PINB0 en "0" (0 voltios, no luz). No, la comparación y no puede hacer un "0" de la broca, pero si usted no "~" la máscara del número binario, se convertirá todo el 0s a 1s y todo el 1s a 0s. Esto permitirá que sólo afectan la broca PINB0 y convertirlo en un "0". He añadido el paréntesis justo para contener la operación de enmascaramiento tan no podría no maks enteros y no sólo el "1" antes de la cambio izquierda "<<".
PORTB ^= 1 << PINB0;_delay_ms(100);
Si el retraso va a ser el mismo para encendido y apagado, podemos acortar las líneas anteriores de cuatro a sólo dos y tomar ventaja de la operación XOR. Recuerde, la XOR convertirá nuestro pin específico para un 1 si es 0 y viceversa. Esta instrucción solo afectará a la PINB0. Cada vez que se ejecuta la instrucción, moverá de un tirón la broca al contrario.
Eso es todo. Ver que no fue doloroso en absoluto.