Paso 3: Análisis SREG y Bitwise lógica
Como recordaréis (de la página 11 en la hoja de datos) del registro del estado de AVR, llamado SREG, almacena información acerca de lo que está sucediendo en la cpu. Qué vamos a hacer en este paso es simplemente analizar este registro y ver lo que está allí y sus cambios al realizar unas pruebas.
La primera prueba que queremos realizar es simple. Vamos a probar la señal de cero, que es de tipo bit 1 de SREG
main: ldi temp,1 cpi temp,1 in r20,SREG rcall analyze rjmp main
Primero carga el número 1 en temp, luego que "en comparación con" lo que está en el temp con el número 1. Recordar lo que realmente está haciendo "IPC". Si usted echa un vistazo a la tabla de Resumen conjunto de instrucciones, verá que IPC realmente resta los dos números y si el resultado es cero establece la señal de cero en SREG. Así que si la bandera de cero se establece después de esta instrucción sabemos que los dos chicos son iguales. Luego copie SREG en r20 y analizar el contenido de la r20. Para ejecutar el programa anterior y usted debe encontrar que número de bits 1 (es decir, un número de LED) enciende lo que significa que se establece el cero indicador de SREG. ¡ Excelente! Ahora busque otra vez en la línea de instrucción sumaria "IPC". En la columna de "banderas", verá que esta instrucción se ocupa realmente con un montón de las banderas en SREG. Dice "Z, N, V, C, H" y busca en la página 11, vemos que estos son la señal de cero, el indicador negativo, los dos complemento desbordamiento bandera, la bandera de acarreo y la mitad llevan bandera.
Vamos a ver si podemos convertir en unos indicadores más. Vamos a probar esto:
main: ldi temp,1 cpi temp,2 in r20,SREG rcall analyze rjmp main
Esto es lo mismo que la última sólo este tiempo cpi debe subract 2 de 1. Tenemos 1-2 = - 1 y por lo que no tenemos la señal de cero, pero debemos conseguir la bandera negativo, Pruébalo ahora.
Wow. Tenemos un montón de banderas. Tenemos C, N, S y H. En la página 11 junto al bit 0, la bandera de acarreo, se dice que indica un acarreo en una operación de arthmetic o lógica. Luego dice que recurrir a la descripción de set de instrucciones para más detalles. Así que vamos a hacer eso. Si usted abre el manual del conjunto de instrucciones que sugerí que descargar en el tutorial pasado
En la página 63 de la instrucción set manual discute la instrucción de la cpi. Veamos lo que dice. Nos dice que la operación realizada es realmente resta. Luego enumera los indicadores y el cálculo que realiza para decidir que banderas para establecer. Bajo la "C", o llevar la bandera, dice que se encuentra si el valor absoluto de K (que es 2 en nuestro caso) es mayor que el valor de absolue de Rd, que es R20 en nuestro caso igual a 1. Puesto que 2 es mayor que 1, debe establecerse la bandera Carry--que es exactamente lo que encontramos. ¿Qué cosas de la ecuación matemática que tienen allí? ¿Qué significa eso? Vamos a hacer el cálculo. Aquí está un resumen de cómo bitwise las operaciones se realizan http://en.wikipedia.org/wiki/Bitwise_operation no tiene los símbolos para escribir exactamente lo mismo, así que vamos a utilizar un * para denotar un punto (que significa "y lógica"), y un subrayado, para denotar un overline, aquí está la ecuación dan junto a la bandera de acarreo:
C: Rd7 * K7 + K7 * R7 + R7 * Rd7
En nuestro caso Rd es R20 que tiene el número 1 en él. Esto significa R20 = 0b00000001. También en nuestro caso K = 2 que significa que K = 0b00000010. "R" significa también el "resultado". Así que en nuestro caso el resultado de restar 2 de 1 es -1.
¿Qué es "-1" en binario? Bueno aquí es donde las cosas se ponen interesantes. Si usted echa un vistazo en la página de Wikipedia aquí: http://en.wikipedia.org/wiki/Signed_number_repres... encontrarás una discusión acerca de las diferentes formas de representar números negativos en binario. Hay tres posibilidades principales. ¿En primer lugar, tal vez poco 7 denota el signo? Ello significa que -1 = 0b10000001 otra posibilidad es llamada "el piropo" que significa que la negativa de cualquier número es simplemente el complemento de ese número. Así que en este caso -1 = 0b11111110. La tercera posibilidad es "de dos" representación. En complemento de dos, se encuentra la negativa de un número por invertir todos los bits y luego sumando 1 al resultado. Así -1 0b11111110 + 1 = 0b11111111.
¿Cómo calculamos que uno utiliza el atmega328p? Bien podemos fácilmente encontrar en la hoja de datos, pero en su lugar, vamos a tratar como un misterio detectivesco y figura "experimental", es decir, realizar los cálculos de cada indicador en SREG y ver qué representación da la respuesta que hemos encendido para arriba en nuestro analizador de la placa.
Aquí es lo que tenemos para la ecuación antedicha para la bandera de Carry: Rd7 es un 0 el bit 7 en R20 es un cero en nuestro caso y K7 0 también es desde el bit 7 de K es cero. R7 significa que el bit 7 del "resultado" y en nuestro caso, el resultado de 1-2 -1. Así son nuestros tres posibilidades:
-1 = 0b10000001 (firme representación de bit)
-1 = 0b11111110 (el complemento representación)
-1 = 0b11111111 (dos complemento representación)
Así que vamos a intentarlo con cada uno:
Un overline significa "complemento" que significa que cambiar de 0 a 1 y todo el 1 a ceros. Así Rd = 0b11111110 y por lo tanto Rd7 = 1. K7 = 0, y R7 es un 1 en todas las representaciones de tres! Así que aquí está lo que tenemos:
C: 1 * 0 + 0 * 1 + 1 * 1
La forma que * o "Y" obras son si ambos son 1 obtienes un 1, de lo contrario obtendrá un 0. En nuestro caso tenemos
C: 0 + 0 + 1 = 1
Así que nuestro resultado para la bandera de "Llevar" es 1. Por lo tanto, debe estar el bit C SREG. Que es lo que encontramos.
Sin embargo, en el cálculo de la bandera de acarreo, todas las tres representaciones de números negativos dieron el mismo resultado ya que R7 es un 1 en los tres casos. Así que echemos un vistazo a los otros. ¿H? Su dice que H es la bandera de "llevar la mitad" y dice que es un 1 si nos "prestado de bit 3". ¿Cómo nos figura? La instrucción set manual da como el cálculo de los siguientes:
H: Rd3* K3 + K3 * R3 + R3 *Rd3
En nuestro caso tenemos Rd3 = 1, K3 = 0, pero R3 es un 0 en la primera representación y un 1 en los otros dos. Si utilizamos la representación del bit de signo obtenemos:
H: 1 * 0 + 0 * 0 + 0 * 1 = 0
Pero nuestra placa dice que debe estar encendida! Por lo tanto el atmega328p es no usando la representación de "bit de signo". Vamos a probar con los dos donde ambos dicen R3 = 1. Entonces nuestro cálculo da:
H: 1 * 0 + 0 * 1 + 1 * 1 = 1
Buena! Así que sabemos que debe ser una de esas dos representaciones. Vamos a tratar la bandera N. El cálculo dice que es es un 1 si el MSB (más importante de bits, es decir, bit 7) en el resultado es conjunto y 0 en caso contrario. Bien el resultado es -1 y en todas las representaciones de tres el mayoría del pedacito significativo es un 1. Por lo tanto N = 1 y esta bandera no va a ayudarnos. Así que pasamos junto a la bandera de S que es la última tenemos ha encendido un LED en nuestro analizador de. Esto se llama "el bit de signo" y el cálculo es un recto para arriba "exclusiva o" que es lo que significa el signo de más con un círculo alrededor de él. Una "exclusiva o", o XOR, significa que si ambos bits son 1 que 0, si ambos bits son 0 obtiene 0, pero si uno de ellos es un 1 y el otro es un 0 se obtiene 1 como respuesta. En otras palabras si el primero "o" el segundo es un 1, pero no ambos. El cálculo es:
S: N XOR V
y en nuestro caso N = 1 (desde el bit 2 LED está encendido) y V = 0 (desde el bit 3 LED está apagado) por lo tanto, la respuesta es 1 XOR 0 = 1. Que significa en todas las tres representaciones de la bandera S será.
Por lo que aún no hemos decidido experimentalmente si el atmega328p utiliza "su complemento" o "de dos complemento" para representar números negativos! Así que echemos un vistazo a otro poco de SREG. Vamos a probar el bit V. Que se llama el "de dos complemento desbordamiento mordido" que algo nos dice que nuestra respuesta va a ser ¿no? Bueno, vamos a continuar tratar de comprobarlo. El cálculo es:
V: Rd7 *K7*R7 + Rd7* K7 * R7
Tenemos Rd7 = 0, K7 = 1, R7 = 1 y R7 = 0 en tanto de uno y de dos complemento. Por lo tanto, esta bandera no va a distinguir entre los dos. Esto es lo que obtenemos:
V: 0 * 1 * 0 + 1 * 0 * 1 = 0
Queda sólo una bandera en SREG que podemos probar! La señal de cero Z. Nuestro LED decir que este indicador está apagado. El cálculo es
Z: R7*R6*R5*R4*R3*R2*R1*R0
Se trata de una serie de operaciones y. Esto significa que Z = 1 si todos los bits de R 1 y cero en caso contrario. Pero esto significa que todos los bits en R deben ser de 0 (puesto que resulta un complemento R tiene todos 1). Tenemos
R = -1 = 0b11111110 (el complemento representación)
R =-1 = 0b11111111 (dos complemento representación)
Así en "el elogio" obtenemos Z = 0 y en "el elogio de dos" también obtenemos Z = 0.
Bueno, eso es una mierda. Hemos probado todos ellos y todavía no hemos probado qué representación binaria de números negativos utiliza el atmega328p. Sin embargo, hemos verificado que nuestro LED nos está dando una lectura exacta del registro SREG.
Bien vamos a terminar con esto una vez por todas. W saber que el número de-127 en cada representación es dada por
0b10000000 =-127 (de elogio)
0b10000001 =-127 (de dos complemento)
Así el mismo número negativo es igual a un número binario diferente en cada representación. Así que un simple experimento decidirá!
main: ldi r20, -127 rcall analyze rjmp main
Ahí lo tienen! Pruébelo usted mismo. ¿Qué representación binaria es en r20 cuando usted analiza esto en tu tablero? Ya sabes la respuesta.
El punto de este paso no era sólo para mostrar cómo probar el contenido de registros, sino también para mostrar cómo entender el funcionamiento de las banderas en SREG, entender cómo calcular operaciones lógicas bit a bit en binario y por lo tanto entender como leer la instrucción set. Cada una de las operaciones en el conjunto de instrucciones tiene una "operación" que realiza que se muestra en la columna de operación de la tabla de resumen. Ahora sabes cómo se calculan estos y por qué ellos y claro varias banderas en SREG. Ahora también sabes que representación binaria de números negativos utiliza el Atmega328p.
Ejercicio 1: recordarán cuando discutimos el TCNT0 temporizador/contador y utilizado en el pasado dos tutoriales había varios bits que sea necesario establecer para que el contador de tiempo y las interrupciones lo que queríamos. Hacer una comprobación rápida con nuestro analizador y ver lo que está en el TCCR0A, TCCR0B, TIFR0 y TIMSK registros (no se olvide que TIMSK0 no está en el rango de registro de la entrada-salida entonces usted tiene que utilizar un comando más caro que "in" para cargar su contenido en un registro).