Paso 1: Operaciones binarias y bit a bit
Antes de profundizar en hojas de datos que necesitamos comprender algunos conceptos de bajo niveles que va a utilizar cada vez que quieres hacer algo interesante con un micro.
Deja comienzo a lo más básico, la broca.
Un bit es la unidad más pequeña de datos a un ordenador, es un '1' o un '0'.
En otras palabras es ya sea encendido o apagado.
Para hacer algo útil en una computadora, un poco solo no es suficiente, por lo que se combinan en bytes.
Un byte es 8 bits juntos, y usando un byte de conteo binario puede o bien almacenar 0-255 (256 números) o -128 a 127 (gracias a Joel en los comentarios para darse cuenta del error).
Por ejemplo:
00000000 = 0
00000001 = 1
00000010 = 2
00000011 = 3
00000100 = 4
Al igual que cuando se cuenta en decimal (base 10, como en los 10 dedos!), cuando vas más allá de 9, te ponen un 1 en el frente y el segundo dígito como 0.
Es lo mismo con binarios, excepto como hay sólo 0 o 1, cuando vas más allá de '1' le puesto un 1 en el frente y un '0' como el segundo dígito.
Las características de un microcontrolador son controladas por los registros. En el caso de un AVR de 8 bits son 8 o 16 pedacitos de largo.
En lugar de todo lo que representa un número sin embargo cada bit determina si cierta característica está activada o desactivada.
Se mira un montón de diferentes registros más adelante, pero por ahora vamos a hacer encima de una imaginaria para que podamos ver cómo manipularlos.
Imaginar que se encuentra un registro en la hoja de datos que conecta con 8 LED ' s llamados LEDREG.
Cada bit en el registro es un 1 o un 0, el LED está en o está apagado.
Podríamos encender el primer LED como tal:
LEDREG = 1; 00000001
2 º LED
LEDREG = 2; 00000010
Pero ¿qué pasa con el LED 3?
Si hicimos esto:
LEDREG = 3; 00000011
No tenemos el LED 3, obtendríamos LED 1 y 2 encendidos para arriba en su lugar!
Con registros no es la cantidad que importa, pero parecen que los bits subyacentes.
3 LED look sería como esto:
LEDREG = 4; 00000100
Si usted deseó dar vuelta a patrones diferentes de LEDs podría trabajar todos 256 combinaciones, pero que sería tedioso.
Hay una mejor manera!
Lógica boleana
Computadoras en el trabajo de nivel más bajo con algo llaman lógica boleana.
Utilizan puertas lógicas para combinar números binarios.
Por ejemplo una puerta y sólo generará un 1 si ambas entradas son 1.
Una puerta OR generará un 1 si cualquiera de sus entradas son 1.
Echa un vistazo aquí:
http://www.Electronics-tutorials.ws/Boolean/bool_6.html
Muestra las 'tablas de verdad' para puertas lógicas comunes.
Así que, ¿para qué sirve todo esto para nosotros?
Podemos hacer uso de estas puertas lógicas utilizando directamente los operadores bit a bit
Operaciones bit a bit
Permite decir que ya tenemos lo 3 LED en:
LEDREG = 4; 00000100
¿Cómo podemos encender el primer LED?
Podríamos poner en el valor de 5 (00000101) pero no queremos tener que averiguar qué combinación cada vez.
En su lugar podemos utilizar un operador o como tal:
LEDREG = LEDREG | 1;
Lo que esto significa es esto
00000100 o
00000001
--------------
00000101
El operador OR se alinea cada poco y si está encendido en cualquiera de los dos bytes, será el en la salida.
Una manera más rápida de escribir "LEDREG = LEDREG | 1;"es:
LEDREG | = 1;
También puede cadena sus operadores como:
LEDREG | = 1 | 2;
Esto va a venir bien cuando nos enteramos de los operadores de cambio.
¿Qué pasa si desea seleccionar todos los LEDs?
Se puede utilizar un operador no:
LEDREG = ~ LEDREG;
Un operador no invierte todos los bits, por lo que se:
00000101 no
--------------
11111010
A continuación veamos un operador AND.
Y se utiliza para enmascarar un valor.
Es decir, se utiliza en blanco hacia fuera secciones de un byte, pero mantener el valor de la sección desenmascarado, así:
11111010 y
00001111
-------------
00001010
Puede utilizar una y apagar toda una serie de LEDs sin cambiar el estado del resto.
En el ejemplo anterior se utilizaría como:
LEDREG & = 15; 00001111
Un operador más útil antes de continuar es el XOR.
XOR es exclusiva o.
Es similar a una puerta OR, sin embargo si ambos bits son en, entonces se apaga.
Por ejemplo:
LEDREG ^ = 15;
00001010 XOR
00001111
-------------
00000101
Ahora, por sí mismos los operadores son limitados, usted todavía necesita convertir de binario el número decimal equivalente.
Aquí es donde los operadores de cambio
Operadores de desplazamiento
Un operador de cambio simplemente cambia todos los dígitos a la izquierda o derecho.
Por ejemplo un cambio izquierdo de 1:
x = 5 << 1;
le da x == 10
en binario es:
00000101 <<
-------------
00001010
Una cambio derecha simplemente mueve los bits hacia la derecha:
00001010 >>
--------------
00000101
Cualquier bit en los extremos está simplemente perdida (o almacenado en un registro de llevar, pero permite que ignorar por ahora!)
Un operador de turno puede utilizarse como una muy rápida multiplicación y división, siempre y cuando usted es feliz con sólo multiplicar / dividir por potencias de 2, por ejemplo:
x << 1 == x * 2
x << 2 == x * 4
x << 3 == x * 8
Cambios se utilizan mucho en los registros de configuración.
Permite volver a nuestro ejemplo de LED.
Si queremos establecer el bit 6, en lugar de trabajar qué número sería y luego o con el registro, podemos utilizar una cambio izquierda como así:
LEDREG | = (1 << 5);
Nota: Es '5', no '6' como sólo tenemos que mover el '1' 5 veces.
En binario sería así:
00000001 <<
-------------
00100000
Que es ORed con el registro como sigue:
00000101 O
00100000
-------------
00100101
En hojas de datos, la posición de un determinado bit generalmente se asigna un nombre como "RXEN" que se utiliza para activar el recibe el modo en el periférico serial y "TXEN" para transmitir.
Juntos vería algo como esto:
UCSRB | = (1 <
Esto debería ser suficiente para empezar, deja pasar algunos ejemplos reales!