Paso 9: Blinky dos – el significado de las declaraciones
La idea general del programa Blinky dos: en primer lugar, establecer B0 como una salida y B1 (y el resto) como entrada. B0 impulsa el LED y B1 es una entrada para el interruptor. Queremos que el LED parpadee, que significa que B0 debe constantemente cambiar Estados cuando la entrada B1 está en la lógica 0 (es decir, polos a tierra). Para el LED parpadea, necesitamos escribir alternativamente 0 y 1 en exactamente uno de los pines, es decir B0 sin afectar cualquier otro pin. Hacemos esto mediante el uso de operaciones bit a bit de manera que se afectan sólo B0. Para determinar si la entrada B1 es lógica 0, utilizamos una máscara (y una operación bit a bit) para singularizar el bit B1 y comprobar si es cero, lo que corresponde al LED en modo intermitente. Normalmente, uno no utilizaría ese arreglo complicado a menos que no había otra opción. El interruptor sería probablemente colocarse en otro puerto disponible aparte de lo LED.
Para algunos de la discusión a continuación, puede imprimir dos Blinky codificación para comparar fácilmente la codificación con la explicación.
El #include, #include y #define F_CPU 8000000UL no han cambiado del Blinky, ni tiene las declaraciones DDRB = 0b00000001, while(1) y las declaraciones de _delay_ms.
Aviso que DDRB = 0b00000001 establece B0 como salida mientras que todos los otros B física los pines son entradas a la MCU. En particular, B1 es una entrada. B0 impulsa el LED y B1 detecta el interruptor.
PORTB = 0b00000010: aquí, puesto que B0 es una salida, la mano derecha 0 en esta asignación de PORTB fija pin B0 a cero voltios (LED 'off'). A continuación, puesto que B1 es una entrada, el 1 en la asignación de PORTB escribe un 1 en una entrada (B1) que activa la resistencia de pull-up de B1.
uint8_t: entero sin signo de 8 bits, que generalmente se llama un 'byte'. Este tipo de variable mantenga números consisten en 8 bits. Esta variable puede variar de 0 a 11111111 255 (o 0 a 0xFF). El uint8_t es carácter definido y no es nativo de C y C++ aunque esas lenguas tienen 'carácter' y 'unsigned char'. Nota que un byte 'firmado' por ejemplo int8_t también tendría un valor de 0 a 0xFF pero el pedacito más significativo (es decir, la z en 0bzxxxxxxx) es 1 para negativos y 0 para números positivos.
Máscara de uint8_t = 0b00000010: define una variable de 8 bits máscara que se le da el valor de 0b00000010. La máscara se utilizará para eliminar los bits 0 y 2-7 de consideración.
Uint8_t MaskL = 0b00000001: define un 8 bit masking MaskL variable con un valor de 0b00000001. El L MaskL sirve como un recordatorio de que se aplica a lo LED. MaskL servirá para quitar los B1 a B7 de consideración y sólo afecta al bit B0.
Prueba de uint8_t = 1: una variable de 8 bits el valor inicial de 0b00000001. En este caso, el valor inicial no importa puesto que la variable prueba le dará un valor antes de comprobar su valor. La parte '= 1' podría haber quedado sin embargo, el punto y coma sigue siendo necesario.
Prueba = PINB & máscara: declaración del PINB leerá los bits en el registro que representa los bits B7 a B0. El '&' representa un poco a poco lógico (ver cuadro 2). Sólo broca #1 en la variable de prueba (es decir, el bit correspondiente a B1) conserva el valor original de PINB después el enmascaramiento (es decir, & máscara) [16]. Por lo tanto según la tabla 2, la variable para que prueba tendrá todos los ceros excepto posiblemente bit B1 que puede ser 0 o 1.
Cuando el extremo del cable se conecta en el riel de 0v, pin B1 será de cero y así máscara & PINB producirá cero para todos los bits y prueba por lo tanto, tendrá el valor de 0. El MCU luego conducirá el LED 'encendido'. Si se quita el extremo del alambre, la resistencia de pull-up colocará Vcc en el pin B1 para que el valor de la máscara & PINB tendrá el valor 0b00000010. El MCU ver un valor distinto de cero para la prueba y desactiva el LED.
if(x): un control de flujo que ejecuta sentencias entre las dos siguientes llaves {} cuando la declaración x es cierto. En este caso, la declaración de x tiene la forma de prueba == 0. El doble signo de igual '==' le pregunta si la variable 'prueba' es igual a 'cero' (es decir, 0 x 00). En C y C++, el lógico 'false' es equivalente al valor '0', pero la lógica 'true' es cualquier cosa no '0' como '1' o 5' y así sucesivamente. Para Blinky dos, la variable 'Test' es cero cuando el interruptor está cerrado y que ha cuando queremos que parpadee el LED. Para que usar la declaración "si (prueba == 0)'.
PORTB | = MaskL: generalmente, la línea vertical | significa bit a bit o [16]. La declaración es un atajo para
PORTB = PORTB | MaskL
La mano derecha PORTB lee el valor anterior a portB. La mano izquierda PORTB después escribe los resultados de la bit a bit o a portB. El enmascaramiento utiliza MaskL = 0b00000001 con 1 sólo en la posición #0 (correspondiente a B0), que controla el LED. O será entonces sólo afectan bit B0 estableciendo en lógica 1 (pin 12 será Vcc) como se analizó en conjunto con la tabla 3. Los otros bits en la escritura del portB será el mismo cuando se lee primero. Así cuando PORTB está escrito, ninguna de las resistencias de pull-up será activada o desactivada! 1 que luego coloque 5v en el pin B0 físico y que activará el LED, se escribirá sólo el bit menos significativo (por ejemplo, B0).
PORTB & = ~ MaskL: esta declaración es el atajo para PORTB = PORTB & ~ MaskL donde y es la operación bit a bit (véase tabla 4). La mano derecha PORTB Lee los valores anteriormente escritos a portB. La mano izquierda PORTB escribe el resultado de la y de vuelta a portB. Dado que MaskL = 0b00000001 entonces ~ MaskL = 11111110. El y establezca el bit #0 de PORTB a lógica 0. Los bits restantes del PORTB no serán afectados y los valores originales se escribe de nuevo a portB. Por lo tanto no se afectará la conectividad de las resistencias de pull-up. El pin B0, que conduce el LED, se pondrá a cero y el LED estará 'off'.