Tutorial de ensamblador AVR 2 (3 / 4 paso)

Paso 3: Análisis de línea por línea el código de

Saltarán las líneas que son simplemente comentarios que su propósito es evidente.

 .nolist .include "./m328Pdef.inc" .list 

Estas tres líneas incluyen el archivo que contiene las definiciones de registro y Bit para el ATmega328P que estamos programación. El comando .nolist indica el ensamblador no para incluir este archivo en el archivo pushbutton.lst que produce cuando se monta. Desactiva la opción de listado. Después de incluir el archivo vuelva a encender la opción de listado con el comando .list. La razón para ello es porque el archivo m328Pdef.inc es muy largo y no necesitamos ver en el archivo de la lista. Nuestro ensamblador, avra, no genera automáticamente un archivo de lista y si queremos uno, montamos usando el siguiente comando:

 avra -l pushbutton.lst pushbutton.asm 

Si haces esto generará un archivo llamado pushbutton.lst y si examinas este archivo que usted encontrará que muestra el código de su programa junto con información adicional. Si nos fijamos en la información adicional que usted verá que las líneas comienzan con un C: seguido de la dirección relativa en hex de donde se coloca el código en la memoria. Básicamente comienza en 000000 con el primer comando y aumenta a partir de ahí con cada comando posterior. La segunda columna después del lugar relativo en la memoria es el código hexadecimal para el comando seguido por el código hexadecimal para el argumento del comando. Vamos a discutir más archivos en futuros tutoriales.

 .def temp = r16 ; designate working register r16 as temp 

En esta línea utilizamos la Directiva ".def" ensamblador para definir a la variable "temp" como igual al r16 "trabajo registro." Utilizamos registro r16 como el que almacena los números que queremos copiar en varios puertos y registros (que no pueden escribirse directamente).

Ejercicio 1: Tratar de copiar un número binario directamente en un puerto o un registro especial como DDRB y ver lo que sucede cuando intenta montar el código.

Un registro contiene un byte (8 bits) de información. Esencialmente es generalmente una colección de SR-cierres cada uno es un "poco" y contiene un 1 o un 0. Podemos discutir esto (e incluso construir uno!) más adelante en esta serie. Usted se estará preguntando qué es un "registro de trabajo" y por qué elegimos r16. Discutimos en un tutorial futuro cuando buceamos hacia abajo en el lodazal de los componentes internos de la viruta. Por ahora quiero aprender a hacer cosas como escribir código y programa hardware físico. Entonces usted tendrá un marco de referencia de la experiencia que hace la memoria y registro de propiedades del microcontrolador más fácil de entender. Me doy cuenta de que más los libros de texto introductorios y discusiones hacen al revés pero he encontrado jugar con videojuegos durante primero y dicking alrededor para obtener una perspectiva global y luego leer el manual de instrucciones para obtener mejor es mucho más fácil que leer el manual primero.

 rjmp Init ; first line executed 

Esta línea es un "salto relativo" a la etiqueta "Inicio" y no es realmente necesaria aquí puesto que ya está el siguiente comando en Inicio pero se incluye para su uso futuro.

 Init: ser temp ; set all bits in temp to 1's. 

Después de la etiqueta de inicio ejecutamos un comando "set registro". Esto establece todos los 8 bits en el registro "temp" (que recuerdo es r16) de 1. Por lo tanto temp contiene ahora 0b11111111.

 out DDRB,temp ; setting a bit as 1 on the Data Direction I/O register ; for PortB, which is DDRB, sets that pin as output ; a 0 would set that pin as input ; so here, all PortB pins are outputs (set to 1) 

El registro DDRB (dirección registro de datos para PortB) dice que los pernos en el PortB (PB0 es decir, a través de PB7) se señalan como entrada y que se señalan como salida. Ya que tenemos el pin que pb0 conectado a nuestro LED y el resto no conectado a nada establecemos todos los bits a 1 lo que significa que son todas las salidas.

 ldi temp,0b11111110 ; load the `immediate' number to the temp register ; if it were just ld then the second argument would ; have to be a memory location 

Esta línea carga el 0b11111110 número binario en el registro temp.

 out DDRD,temp ; mv temp to DDRD, result is that PD0 is input and ; the rest are outputs 

Ahora hemos creado el registro de dirección de datos de PortD de temp, desde temp contiene 0b11111110 que vemos que PD0 será designado como un pin de entrada (ya que hay un 0 en el terreno de la extrema derecha) y el resto se consideran salidas ya que en esos lugares hay de 1.

 clr temp ; all bits in temp are set to 0's out PortB,temp ; set all the bits (i.e. pins) in PortB to 0V 

Primero nos "limpia" el registro temp que significa ajuste de todos los bits a cero. Luego copiamos el registro PortB que 0V en todos los pernos. Un cero en un bit del PortB significa que el procesador mantenga eso perno en 0V, en un poco hará que ese perno fijar a 5V.

Ejercicio 2: Utilizar un multímetro para comprobar si todos los pines de PortB son realmente cero. ¿Es algo raro pasa con PB1? ¿Cualquier idea por que puede ser? (similar al ejercicio 4 a continuación siga el código...)
Ejercicio 3: Eliminar las dos líneas por encima tu código. ¿El programa todavía funciona correctamente? ¿Por qué?

 ldi temp,0b00000001 ; load immediate number to temp out PortD,temp ; move temp to PortD. PD0 is at 5V (has a pullup resistor) ; since it has a 1 in that bit the rest are 0V. 

Ejercicio 4: Eliminar las dos líneas por encima tu código. ¿El programa todavía funciona correctamente? ¿Por qué? (Esto es diferente del ejercicio 3 anterior. Ver el diagrama de pines. ¿Cuál es la configuración predeterminada DDRD PD0? (Ver página 90 de la hoja de datos)

En primer lugar «carga inmediata» el número 0b00000001 a temp. La parte «inmediata» está allí desde que nos estamos cargando una escalera número a temp en lugar de un puntero a una ubicación de memoria que contiene el número a cargar. En ese caso simplemente utilizaríamos "ld" en lugar de "IBP". Entonces enviamos este número a PortD que PD0 a 5V y el resto a 0V.

Ahora nos hemos propuesto los pines como entrada o salida y hemos puesto en marcha sus Estados iniciales como 0V o 5V (baja o alta) y así que ahora entramos en nuestro programa "lazo".

 Main: in temp,PinD ; PinD holds the state of PortD, copy this to temp ; if the button is connected to PD0 then this will be ; a 0 when the button is pushed, 1 otherwise since ; PD0 has a pull up resistor it is normally at 5V 

El registro PinD contiene el estado actual de los pines del PortD. Por ejemplo, si usted coloca un cable de 5V PD3, entonces en el reloj siguiente ciclo (que sucede a 16 millones de veces por segundo ya que tenemos el microcontrolador conectado a una señal de reloj de 16MHz) el bit PinD3 (desde el estado actual de PD3) se convertiría en un 1 en lugar de un 0. Así que en esta línea nos copiar el estado actual de las clavijas de temp.

 out PortB,temp ; sends the 0's and 1's read above to PortB ; this means we want the LED connected to PB0, so ; when PD0 is LOW, it will set PB0 to LOW and turn ; on the LED (the other side of the LED is connected ; to 5V and this will set PB0 to 0V so current flows) 

Ahora enviamos el estado de los pines en PinD a la salida de PortB. Efectivamente, esto significa que PD0 enviará un 1 a PortD0 a menos que se pulse el botón. En ese caso ya que el botón está conectado a tierra eso Perno será 0V y enviará un 0 al PortB0. Ahora, si miramos el diagrama del circuito, 0V en PB0 significa que el LED brillará desde el otro lado de él está en 5V. Si no estamos presionando el botón, para que un 1 se envía a PB0, que significaría que tenemos 5V en PB0 y 5V en el otro lado del LED y hay no hay diferencia de potencial y ninguna corriente fluirá y así el LED no se iluminará (en este caso es un LED es un diodo y tan actual sólo fluye una dirección cueste lo que cueste pero lo que sea).

 rjmp Main ; loops back to Start 

Este salto relativo nos coloca a nuestro principal: etiqueta y marcamos PinD otra vez y así sucesivamente. Comprobar cada 16 millonésima de un segundo si el boton y configuración en consecuencia PB0.

Ejercicio 5: Modificar el código para que el LED está conectado a PB3 en vez de PB0 y ver que funciona.

Ejercicio 6: Enchufe su LED en tierra en vez de 5V y modifique el código en consecuencia.

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