Professional Documents
Culture Documents
A pesar que mucho le escapan a este lenguaje, hay otros que nos sentimos cómodos con el .
--------------------------------------------------------------------------
Lo primero que hay que saber para este lenguaje, es que cada línea de código, es una
instrucción que realiza el CP o un paso que realiza el CP. A diferencia de otros lenguajes, como
por ejemplo el C, una línea de instrucción, puede llevar uno o mas pasos que el CP debe
realizar. Más adelante entenderán el porqué.
A esto último dicho, nos explica el porqué de un programa escrito en ASM (assembler) lleva
menos línea de instrucción que el mismo programa realizado en otro lenguaje. Esto se traduce
que, cuanto menos líneas de código, menor consumo de la memoria de programa.
Nota: Entendemos por el mismo código, al realizar un software para realizar una dicha tarea.
Una tarea que debe realizar nuestro microcontrolador, puede ser escrito en diferentes
lenguajes, y es el programa que se utilizó quien lo traduce a formato hex (1 y 0).
Para dar un ejemplo un poco más claro, digamos que el CP, es una persona. Esta persona se le
da un papel que tiene diferentes tareas a realizar. Estas tareas, están una debajo de la otra y
lee línea por línea y hace lo que le dice esa línea. Cada línea, posee una instrucción que se
debe hacer. Cuando terminó de hacer esa instrucción, continúa con la línea de abajo.
El CP, hará esas tareas sin negarse y lo hará fielmente a lo que está escrito. Por lo que, si hace
una tarea mal, es porque le pusimos una o más instrucciones mal.
Si bien, el CP hará lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas.
Leon_Elec Página 1
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Estas cosas, dependerán de cada microcontrolador y que debemos saber para poder
programar en forma correcta al PIC.
* La primera columna se llama ETIQUETA y sirve para darle el nombre a una posición de la
memoria del programa al que se necesita apuntar. Los que no se den cuenta, ya lo harán.
Si no sirve para el PIC, ¿Para qué complicarla más? Todo lo contrario, es para ayudar al
programador de que no se olvide que intentó hacer.
Todos los lenguajes, desde los más básicos, hasta los más avanzados, tienen esta
características ya que en el, pondremos que es lo que queremos hacer o explicar el programa.
;OBSERVACIONES
;OBSERVACIONES
;OBSERVACIONES (y la cantidad que necesitemos)
Leon_Elec Página 2
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Los registros, son posiciones de memoria el cual se utilizan para ir configurando el pic mientras
se corre el programa, cambiar de bancos para acceder a otras partes de memorias, son
banderas que nos van diciendo que está pasando con distintas operaciones, son habilitaciones
o deshabilitaciones para módulos que trae el PIC. Por ejemplo, conversor Analógico/Digital,
PWM.
Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit y 32 bit.
Excepto la palabra configuración y que la veremos mas adelante.
Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizar para lo
descripto anteriormente (habilitar/deshabilitar, etc).
A continuación, ver el archivo adjunto. Es la posición de la RAM y sus 4 bancos. Este, es del
PIC16F877
Como notarán, en las cuatro columnas, hay nombres. Estos nombres son todos los registros
que posee este PIC. Verán que hay registros que se repiten. No quiere decir que están
duplicados, triplicados o cuatriplicados, si no que se puede acceder a ellos no importa en que
banco estemos trabajando. (Ya lo entenderán, no se preocupen).
Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debe
acceder al banco que esté dicho nombre. Es por eso, que esta tabla es muy importante a la
hora de trabajar.
Aprovechando que subí esta tabla del pic, cuando de ejemplo de programación, será sobre
este pic.
Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Por lo que si no
tienen este datasheet, descárguenlo de la página de Microchip. Cuando empezamos a
programar, lo necesitarán.
Leon_Elec Página 3
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Leon_Elec Página 4
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza para mover un
dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda de la ALU puede
hacer operaciones matemáticas.
Observen con atención el diagrama de bloque dónde se encuentra W que está adjuntado.
Está en la posición 00h y dice indirect addr. Esto es, porque el registro W, no es una posición
de memoria física. Hay otros registros que están igual. Pero no nos desviemos, el registro W,
es muy usado y recuerden, se utiliza para mover datos, o cargar datos en distintas posiciones
de la RAM y EEPROM.
* Memoria de Programa
Es la ubicación física dónde se guarda el firmware que hemos creado, o sea, nuestro programa.
Y tiene un ciclo de 1.000 de lectura y/o escrituras antes de estropearse y es del tipo FLASH
(pero este es flaco :mrgreen: Es un chiste).
El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o sea que cada
posición de memoria tiene 14 bit (B'11111111111111', o H'3FFF') Cada línea de instrucción
ocupa una posición en la memoria de programa, así que, podemos poner hasta 8.000
instrucciones.
La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8 bit (B'11111111', o
H'FF'). Esto quiere decir, que tenemos 368 posiciones para nuestro uso.
La EEPROM trae 256 bytes con un ancho de 8 bits. Tenemos 256 posiciones para nuestro uso.
Leon_Elec Página 5
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Leon_Elec Página 6
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Ahora, vamos a estudiar el registro STATUS y luego continuaremos con las instrucciones.
Registro STATUS
Si entendieron hasta acá, se acordará que los registros poseen un ancho de 8 bit. Cada bit,
puede contener un 1 o 0.
Este registro, tiene 3 Bit dedicado para las operaciones matemáticas, 3 bit dedicado al cambio
de banco de memoria y 2 bit dedicado para saber que o quién produjo un Power Up (despertar
del micro). Y se puede leer y escribir en él (cambiar datos).
Los analizamos desde el más significativo (MSB) hasta el menos significativo (LSB).
BIT 7:
Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de memoria.
1 = Banco 2 y 3
0 = Banco 0 y 1
BIT 6 y BIT 5
Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para cambiar de
banco de memoria.
00 = Banco 0
01 = Banco 1
10 = Banco 2
11 = banco 3
BIT 4
Se llama TO (neg). Este bit se utiliza para saber quién despertó al PIC.
1 = Después que despierta (power up) o por las instrucciones CLRWDT o SLEEP, se pone a 1
este bit.
0 = Se pone a 0 cuando el wachtdog o en castellano perro guardián (WDT) despierta al PIC.
BIT 3
Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.
Leon_Elec Página 7
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
BIT 2
Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el resultado de
una operación aritmética y lógica.
BIT 1
Se llama DC. Digit carry/borrow (dígito llevar/prestar). Es afectado por las instrucciones
ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la polaridad es inversa).
BIT 0
Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al bit DC.
1 = Hubo un acareo del bit más significativo (Bit 7) o sea cuando se excede de H'FF'
0 = No hubo acareo del bit más significativo
Leon_Elec Página 8
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Leon_Elec Página 9
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Cada instrucción tiene una ancho de 14 Bits, es por eso que la memoria de programa
tiene el mismo ancho. Justamente para poder alojar cada instrucción.
OPCODE (Código)
DESTINATION (Destino)
FILE REGISTER ADDRESS (Dirección del archivo de registro)
La constante que nos indica esto es la letra d. Si esta letra es 0, la operación se guardará
en el registro W. EN cambio si vale 1, la operación se guardará en el registro o posición
de memoria que estemos trabajando al momento de usar una instrucción.
Hay instrucciones, como veremos más adelante, que no es necesario indicar dónde
queremos guardar la operación, ya que se hace en forma automática. Y hay otras
instrucciones que si no se indica el destino, nos puede dar un error al compilar o el
compilador lo elegirá el y por ende, nos puede ejecutar mal el programa.
Y por último, tenemos el FILE REGISTER ADDRESS que se carga con la dirección
del registro a ser guardado. Está formada por los bit 6 al 0. La constante que nos indica
esto, es la letra f
OPCODE (Código)
Leon_Elec Página 10
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
OPCODE es igual al primer grupo. Está formado por los bits 13 al 10.
El BIT ADDRESS, se utiliza para direccionar la operación. Está formado por los bits 9
al 7. Como pueden observar, se sacrificó bit del opcode para dárselo al bit address. La
constante que nos indica esto es la letra b
Y por último tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Está
formado por los bit 6 al 0. Igual que en el primer grupo. La constante que nos indica
esto es la letra f.
OPCODE
LITERAL
OPCODE es igual que en el primer grupo. Está compuesta por los bits 13 al 8. Excepto
para las instrucciones CALL y GOTO que está compuesta por los bit 13 al 11 (prestar
mucha atención a esto, cuando veamos estas dos instrucciones entenderán la
importancia).
Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para cargar
al registro W, en fin, un número decimal, binario o hexadecimal. O puede ser una valor
de dirección a dónde apuntar para las instrucciones CALL y GOTO.
Está compuesta por los bits 7 al 0. Excepto para las instrucciones CALL y GOTO que
está compuesta por los bit 10 al 0 (prestar mucha atención a esto, cuando veamos estas
dos instrucciones entenderán la importancia).
Leon_Elec Página 11
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Leon_Elec Página 12
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Las instrucciones
Les voy a arruinar el momento de alegría. Las instrucciones hay que estudiarlas de memoria. Si,
leyeron bien, de memoria. Lo que tienen que saber sobre las instrucciones, es como se
escriben, que hace cada instrucción y lo más importante que bit del REGISTRO afecta.
Vamos a ir viéndolo por orden alfabético. Y otra cosita más, como es de esperarce, están en
INGLES o son abreviaturas pero en INGLES.
ADDLW
Ejemplo
ADDLW .128
Si W tenía cargado un valor = .5, después de la instrucción W tiene cargado el valor .133
Afecta a:
Z Se pone a 1 si la operación es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'
ADDWF
Suma el valor del registro W con el valor de un registro cualquiera. El destino de esta suma, lo
elige el programador.
Ejemplo:
ADDWF TEMP,W
Si W tenía guardado .133 y la pocición de la RAM llamada TEMP tenía el valor cargado con .2,
W vale .135 y TEMP continúa valiendo .2
Leon_Elec Página 13
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
NOTA: Para indicar la dirección de dónde se guarda, también se puede poner 0 o 1 en vez de W
o F. 0, corresponder guardarlo en el registro W y 1 en el registro TEMP (para este caso).
Afecta a:
Z Se pone a 1 si la operación es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'
ANDWF
Ejemplo:
ANDWF TEMP,F
Afecta a:
Z Se pone a 1 si la operación es 0
Leon_Elec Página 14
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Leon_Elec Página 15
[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008
Leon_Elec Página 16