Tutorial de ensamblador AVR 9 (5 / 7 paso)

Paso 5: Presione ' n Pop

Hay sólo unos pocos "General propósito registros" que tenemos a nuestra disposición y que son utilizados son no más. Por lo que es buena programación práctica para utilizarlos sólo para dos variables que se utilizan como almacenamiento temporal que necesita para leer de y escribir a los puertos y SRAM con, o bien los que va necesitando en subrutinas en todas partes y así ponerles nombre. Así que lo que he hecho, ahora que ha inicializado y están aprendiendo a usar la pila, es ir a través del código y buscar los registros de propósito general nombrado que se utilizan sólo dentro de una subrutina simple o interrupción y en ninguna otra cosa en el código y reemplace con uno de nuestros registros de temperatura y un push y pop a la pila. De hecho, si nos fijamos en el código escrito para microcontroladores más pequeños, o si nos remontamos en el tiempo a cuando todas las virutas eran más pequeñas, ves sólo un par de registros de propósito general que tuvo que ser utilizada para todo, así no sólo almacenar un valor en allí y dejarlo solo porque estabas seguro que ese registro que necesite para otras cosas. Tal ves empujando a y un Poppin ' todo sobre el lugar en el código. Tal vez debo han nombrado a nuestros registros de temperatura de propósito general AX y BX como una respetuosa Felicitaciones a esos tiempos pasados.

Un ejemplo ayudará a hacer esto más claro.

Aviso de que en nuestra conversión analógico a Digital completa interrupción ADC_int utilizamos un propósito general registro que hemos nombrado buttonH que usamos para cargar el valor de ADCH y comparar con la tabla de búsqueda de análogo a las conversiones de prensa botón. Sólo utilizamos este registro buttonH dentro de la subrutina ADC_int y en ninguna otra parte. Tan en su lugar usaremos nuestro temp2 variable que utilizamos como una variable temporal que podemos utilizar dentro de cualquier subrutina dado y su valor no afectará nada fuera de esa subrutina (es decir, el valor que le damos en ADC_int no utilizarse en cualquier otra).

Otro ejemplo es en el macro de la demora. Tenemos un registro que hemos nombrado "milisegundos" que contiene nuestro tiempo de retardo en milisegundos. En este caso está en una macro y recordamos que el trabajo de la macro de manera es que el ensamblador coloca el código de macro todo en el lugar del programa donde se llama. En este caso nos gustaría deshacernos de la variable "milisegundos" y sustituirla con una de nuestras variables temporales. En este caso lo haré un poco diferente para mostrar cómo incluso si el valor de la variable va a ser necesario en otros lugares podemos aún la utilizamos mediante el uso de la pila. Así que en lugar de milisegundos que utilizamos "temp" y para que no enrosque encima de otras cosas que también utilizan el valor de la temperatura simplemente empezamos la macro de "retraso" por "empujando" la temperatura en la pila, luego la usamos en lugar de milisegundos, y luego al final de la macro "pop" su valor anterior de la pila.

El resultado neto es que hemos "pedido prestado" temp y temp2 para uso temporal y luego restaurados a sus valores anteriores cuando haya terminado.

Esta es la rutina de interrupción de ADC_int después de hacer este cambio:

 ADC_int: push temp ; save temp since we modify it here push temp2 ; save temp2 lds temp2,ADCH ; load keypress ldi ZH,high(2*numbers) ldi ZL,low(2*numbers) cpi temp2,0 breq return ; if noise triggers don't change 7segnumber setkey: lpm temp,Z+ ; load from table and post increment clc cp temp2,temp ; compare keypress with the table brlo PC+4 ; if ADCH is lower, try again lpm 7segnumber,Z ; otherwise load keyvalue table inc digit ; increment the digit number rjmp return ; and return adiw ZH:ZL,1 ; increment Z rjmp setkey ; and go back to top return: pop temp2 ; restore temp2 pop temp ; restore temp reti 

Observe que el funcionamiento de la pila es que el primero es el último apagado. Al igual que una pila de papeles. Ves que en nuestros primeros dos líneas nos empuje el valor de la temperatura en la pila, luego empujamos temp2 en la pila, luego que utilizarlos en la subrutina para otras cosas, y finalmente nos restaure a sus valores anteriores otra vez por primero apareciendo temp2 (ya que era la última de ellas en está en la cima de la pila y será el primero que pop retroceden) y luego hacer estallar a la temperatura.

Así que de ahora en adelante siempre usamos este método. La única vez que realmente designará un registro de algo que no sea una variable temp es cuando vamos a necesitar en todo el mundo. Por ejemplo, el registro llamado "desbordamientos" es uno que utilizamos en varios lugares diferentes en el programa y por lo tanto queremos darle un nombre. Por supuesto podríamos todavía usamos lo que hemos hecho con temp y temp2 puesto que restauraría su valor después de que terminamos. Pero cosas spaghettify demasiado. Reciben este nombre por una razón y tenemos temp y temp2 ya designado para ese trabajo.

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 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 5

Tutorial de ensamblador AVR 5

Hoy vamos a tomar un vistazo a los distintos lugares de la memoria en el microcontrolador Atmega328p y ver si podemos comprender mejor cómo se almacenan las cosas, donde se almacenan y cómo funcionan los punteros y tablas de búsqueda.El tutorial se s
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