Paso 4: Hello.asm-línea línea
Para terminar este tutorial introductorio que pasaremos por el hello.asm programa línea por línea para ver cómo funciona.
Todo después de un punto y coma es ignorado por el ensamblador y por lo tanto, estas dos primeras líneas son simplemente "Comentarios" explicando lo que hace el programa.
Esta línea indica el ensamblador para incluir el archivo m328Pdef.inc que descargaste. Usted puede poner esto en un directorio de similares incluyen archivos y cambiar la línea anterior para señalar que hay.
LDI significa "carga inmediata" y dice el ensamblador y llevar un registro de trabajo, r16 en este caso, cargar un número binario en él, 0b00100000 en este caso. La 0b en el frente dice que el número está en binario. Si quisiéramos nos podríamos han elegido otra base, como hexadecimal. En ese caso nuestro número hubiera sido de 0 x 20 que es hexadecimal de 0b00100000. O podríamos haber utilizado 32 que es base 10 decimal para el mismo número.
Ejercicio 1: Intente cambiar el número en la línea superior a hexadecimal y luego a decimal en el código y comprobar si todavía funciona en cada caso.
Uso binario es más simple aunque debido a los puertos de forma y registros de trabajo. Hablaremos de los puertos y registros de la atmega328p en más detallan en el futuro tutoriales pero por ahora voy solo indicar que estamos utilizando r16 como nuestro sentido de "registro de trabajo" que sólo vamos a utilizarlo como una variable que nos guarde números en. Un "registro" es un conjunto de 8 bits. Es decir 8 puntos que pueden ser 0 o 1 ('off' o 'en'). Cuando carga el 0b00100000 número binario en el registro usando la línea de arriba simplemente hemos almacenado ese número en el registro r16.
Esta línea indica al compilador que copie el contenido de la r16 de registro en el registro DDRB. DDRB significa "Datos dirección registro B" y configura los "pins" en PortB. En el mapa de pinout para el 328p que se puede ver que hay 8 pines etiquetados PB7 PB0, PB1,.... Estos pernos representan los "pedacitos" de "PortB" y cuando carga el número binario 00100000 en el registro DDRB que estamos diciendo que queremos establecer PB0, PB1, PB2, PB3, PB4, PB6 y PB7 como pines de entrada ya que tienen 0's en ellos, y PB5 está configurado como un pin de salida ya que ponemos un 1 en ese lugar.
Ahora que hemos fijado las direcciones de las patillas ahora podemos establecer las tensiones sobre ellos. La línea de arriba copia el mismo número binario de nuestro almacenamiento registro r16 a PortB. Esto establece todas las clavijas de 0 voltios excepto pin PB5 alta que es de 5 volts.
Ejercicio 2: Tomar un enchufe digital multímetro, el cable negro a tierra (GND) y luego probar cada uno de los pasadores PB0 a través PB7 con el cable rojo. ¿Son los voltajes en cada uno de los pernos exactamente los correspondientes a poner 0b00100000 en PortB? Si hay alguno que no, ¿por qué crees que es? (ver el pin en el mapa)
Finalmente, la primera línea es una "etiqueta" que un lugar en el código de etiquetas. En este caso etiquetado ese lugar como "Inicio". La segunda línea dice "salto relativo a la etiqueta Inicio." El resultado neto es que el equipo se coloca en un bucle infinito que sólo mantiene ciclismo vuelta a empezar. Necesitamos esto porque no podemos tener el programa a terminar, o caerse de un acantilado, el programa tiene que seguir corriendo solo en fin de que la luz permanezca encendida.
Ejercicio 3: Eliminar las dos líneas anteriores su código para que el programa se cae de un acantilado. ¿Qué pasa? Debe ver algo que parece el tradicional programa de "parpadear" utilizado por Arduino como su "¡ Hola mundo!". ¿Por qué crees que actúa de esta manera? (Pensar sobre lo que debe suceder cuando el programa se cae de un acantilado...)