Tutorial de ensamblador AVR 5 (3 / 8 paso)

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

Artículos Relacionados

Tutorial de ensamblador AVR 11

Tutorial de ensamblador AVR 11

Bienvenido a Tutorial 11!En este breve tutorial, finalmente vamos a construir la primera parte de nuestro proyecto final.Lo primero que debes hacer es ir al último paso de este tutorial y ver el video. Luego vienen aquí. [pausa mientras haces eso...]
Tutorial de ensamblador AVR 1

Tutorial de ensamblador AVR 1

He decidido escribir una serie de tutoriales sobre cómo escribir programas del lenguaje ensamblador para el Atmega328p que es el microcontrolador utilizado en el Arduino. Si la gente sigue interesada voy a seguir poner a uno una semana o así hasta qu
Tutorial de ensamblador AVR 6

Tutorial de ensamblador AVR 6

Bienvenido a Tutorial 6!Tutorial de hoy será corto donde desarrollamos un método sencillo para comunicar datos entre uno atmega328p y otro con dos puertos conectan. Luego tomar los dados rodillo del Tutorial 4 y el analizador de registro de 5 Tutoria
Tutorial de ensamblador AVR 8

Tutorial de ensamblador AVR 8

Bienvenido a Tutorial 8!En este breve tutorial vamos a tomar un poco de diversión de introducir nuevos aspectos de la programación de lenguaje ensamblador para mostrar cómo mover nuestros componentes prototipos a un separado "" del circuito impr
Tutorial de ensamblador AVR 9

Tutorial de ensamblador AVR 9

Bienvenido a Tutorial 9.Hoy nos muestra cómo controlar un display de 7 segmentos y un display de 4 dígitos utilizando nuestro código de lenguaje ensamblador ATmega328P y AVR. En el curso de hacer esto que tendremos que hacer desvíos cómo utilizar la
Tutorial de ensamblador AVR 7

Tutorial de ensamblador AVR 7

Bienvenido a Tutorial 7!Hoy vamos a ver primero cómo limpiar un teclado y luego se muestra cómo utilizar los puertos de entrada analógicos para comunicarse con el teclado.Esto lo haremos utilizando como entrada de interrupciones y un solo cable. Se a
Tutorial de ensamblador AVR 10

Tutorial de ensamblador AVR 10

Bienvenido al Tutorial de 10!Lo siento que tomó tanto tiempo para salir esta próxima entrega, pero esta es una época bastante ajetreada del año. En cualquier caso, aquí está!Hemos recorrido un largo camino y probablemente ya eres lo suficientemente c
Tutorial de ensamblador AVR 4

Tutorial de ensamblador AVR 4

Bienvenido a tutorial número 4!En este tutorial vamos construir un circuito que simulará el balanceo de dos dados. Entonces vamos primero a escribir un programa de fuerza bruta que hace el trabajo. A continuación simplificamos ese programa de varias
Tutorial de ensamblador AVR 2

Tutorial de ensamblador AVR 2

Este tutorial es una continuación de "AVR Assembler Tutorial 1"Si no has ido por 1 Tutorial debe parar ahora y hacer que uno primero.En este tutorial vamos a continuar nuestro estudio de programación del lenguaje ensamblador de la atmega328p en
Tutorial de ensamblador AVR 3

Tutorial de ensamblador AVR 3

Bienvenido a tutorial número 3!Antes de empezar quiero hacer un punto filosófico. No tenga miedo de experimentar con los circuitos y el código que estamos construyendo en estos tutoriales. Cambiar los cables alrededor de añadir nuevos componentes, sa
Un enfoque avanzado de programación de Arduino y AVR

Un enfoque avanzado de programación de Arduino y AVR

Este instructable es obligada lectura para todo aquel que esté familiarizado con núcleo AVR virutas y Arduino.Bien, para ser más específicos, al leer el instructivo, usted será capaz de:1) saber la diferencia correcta entre el AVR y Arduino.2) progra
Placa de desarrollo para microcontrolador Attiny84

Placa de desarrollo para microcontrolador Attiny84

Se trata de una placa de desarrollo para microcontrolador Attiny84. Tha Attiny84 chip tiene 11 pines direccionables con el IDE de Arduino, 8k de memoria flash para el almacenamiento de programa y 512 bytes de RAM disponible para las variables de pila
La tortura de Raven, aguda

La tortura de Raven, aguda

este es un pequeño dispositivo que diseñé para el sencillo propósito de ser discretamente molesta. Espera una cantidad predeterminada de tiempo, y luego empieza a emitir pitidos agudos. Yo he programado mina para tomar ventaja de una propiedad intere
Cariño, encogi lo Arduino: pasar de Arduino a ATtiny y escribir el código en C de AVR puro

Cariño, encogi lo Arduino: pasar de Arduino a ATtiny y escribir el código en C de AVR puro

Arduino es una plataforma de software y de gran dura - pero con todas sus características también está un poco hinchado y a menudo necesita sólo una pequeña parte de todas las funciones. A veces el proyecto requiere dispositivos más pequeños y más ba