You are on page 1of 55

Microelectrnica

Autor: Mauricio Galvez Legua


(mgalvez@uni.edu.pe)

Autor: Mauricio Galvez Legua

Programacin Assembler
El conjunto de instrucciones que tiene un
microprocesador da origen al denominado lenguaje
assembler o lenguaje ensamblador.
Es un lenguaje de programacin de bajo nivel para
los computadores, uP, uC y otros circuitos
integrados programables.

Autor: Mauricio Galvez Legua

Programacin Assembler
El lenguaje ensamblador fue usado principalmente
en los inicios del desarrollo de software, cuando
an no se contaba con potentes lenguajes de alto
nivel y los recursos eran limitados.
Actualmente se utiliza con frecuencia en ambientes
acadmicos y de investigacin, especialmente
cuando se requiere la manipulacin directa de
hardware, altos rendimientos, o un uso de recursos
controlado y reducido.

Autor: Mauricio Galvez Legua

Programacin Assembler
Elaborar programas mediante cdigo de operaciones
(byte code) resulta complicado y tedioso. Ejemplo:
Calcular las direcciones de salto para instrucciones
condicionales.

Es por ello que se crearon los programas


ensambladores, que trabajan directamente con los
nombres de las instrucciones (nemnicos) y utilizan
etiquetas para indicar las direcciones de los saltos.
Es el propio programa ensamblador quien se encarga
de:
Traducir los nemnicos en cdigos de operacin (byte code).
Convertir las etiquetas en direcciones.
Autor: Mauricio Galvez Legua

Programacin Assembler: Directivas


Las directivas son indicaciones que se le dan al
programa ensamblador para controlar algunos
aspectos del ensamblado del cdigo. Ejemplo:
Decirle al programa ensamblador donde inicia un
programa.
Definir constantes.
Indicar que posiciones de memoria estn reservadas
para almacenar datos en forma temporal (variable).
Llenar una porcin de memoria con un dato
especificado.

Autor: Mauricio Galvez Legua

Programacin Assembler: Directivas


Las directivas del ensamblador, tambin llamadas
los pseudo opcodes, pseudo-operaciones o pseudoops, son instrucciones que son ejecutadas por un
ensamblador en el tiempo de ensamblado, no por
el procesador en el tiempo de ejecucin.
Las Directivas no son instrucciones del procesador.

Autor: Mauricio Galvez Legua

Programacin Assembler: Directivas


Los tipos de directivas son:
Directivas de control permiten un ensamblado
condicional.
Directivas de datos permiten la manipulacin simblica
y el posicionamiento en memoria.
Directivas de listado permiten todo el control sobre el
formato, paginacin y listado del programa.
Directivas de macros permiten todas las gestiones de las
macros.
Directivas de ficheros objeto solo se utilizan para la
creacin de ficheros objeto.

Autor: Mauricio Galvez Legua

Programacin Assembler: Directivas


Las directivas bsicas que todo programa ensamblador debe
tener y que nos facilitan la programacin son:
ORG: Indica la direccin de memoria a partir de la cual debe ser
ubicado el programa, subrutina o datos.
EQU: Define una constante. Cada vez que el ensamblador
encuentre ese nombre lo debe sustituir por el valor
correspondiente.
DB o DEFB (Define Byte): Esta directiva sirve para definir variables.
Con una sola directiva DB se pueden definir varias variables en
formato decimal, hexadecimal o ASCII, para ello se deben separar
con comas. En el caso de ASCII estos deben estar definidos entre
comillas. DW o DEFW (Define Word): Permite definir variables del
tipo word (16 bits). Tener cuidado de la forma como se almacenan
estas variables (Llittle-endian o Big-endian).
DS: Reserva un espacio de memoria para ser usado por el
programa.
END: Sirve para indicar el fin del programa. Cualquier cdigo
ubicado despus de esta directiva ya no ser tomado en cuenta.
Autor: Mauricio Galvez Legua

Herramientas de Programacin
Para desarrollar programas en assembler de PIC, la
empresa Microchip proporciona un conjunto de
herramientas de programacin.
MPLABX: Es un editor IDE gratuito, destinado a
microcontroladores de la marca Microchip. Este editor
es modular, permite seleccionar los distintos
microcontroladores soportados, adems de permitir la
grabacin de estos circuitos integrados directamente al
programador.
MPLABX es ejecutable en Windows, MacOS y Linux.
MPLABX trae incorporado un compilador para asembler
de PIC denominado MPASM.

Autor: Mauricio Galvez Legua

Herramientas de Programacin

Autor: Mauricio Galvez Legua

10

Herramientas de Programacin: MPASM


Nos permite escribir cdigo assembler y
ensamblarlo para producir como salida un fichero
.HEX que luego grabaremos en el PIC o que nos
servir para utilizarlo con un simulador que trae el
MPLABX o utilizar otro simulador como PROTEUS.

Autor: Mauricio Galvez Legua

11

Elaborando Programas ASM


Para realizar programas en assembler debemos
tener presente lo siguiente:
Campos de un programa: En un programa en assembler,
cada lnea del archivo fuente puede contener cuatro
tipos de informacin:

Etiquetas
Operacin, nemnicos (instrucciones), Directivas y Macros
Operandos
Comentarios

Autor: Mauricio Galvez Legua

12

Elaborando Programas ASM


Convencin de notacin:

Autor: Mauricio Galvez Legua

13

Elaborando Programas ASM: Requisitos


Para elaborar programas en lenguaje ensamblador
requerimos tener instalado:
MPLABX
Proteus

Autor: Mauricio Galvez Legua

14

PIC16F877A: Primer programa


Para desarrollar nuestro primer programa en
PIC16F877A primero debemos hacer unas
configuraciones iniciales.
Todo programa debe empezar con esta
configuracin:
LIST P=16f877A
;Indica el tipo de procesador a programar
INCLUDE "P16F877A.INC" ;Incluye en el programa el fichero de
definiciones del uC seleccionado
__CONFIG _CP_OFF& _DEBUG_OFF& _WRT_OFF& _CPD_OFF&
_LVP_OFF& _BODEN_OFF& _PWRTE_ON& _WDT_OFF& _XT_OSC
;Selecciona el estado de los bits de configuracin

Autor: Mauricio Galvez Legua

15

PIC16F877A: Primer programa


Todo microcontrolador de la empresa Microchip
tiene un Archivo de Definiciones, en donde se
indica cuales son los nombres correctos para cada
registro, cada bit y que posicin de memoria
ocupan.
Dicho archivo se encuentra en el siguiente
directorio (Windows 7):

Autor: Mauricio Galvez Legua

16

PIC16F877A: Primer programa


El archivo puede ser
visualizado mediante el
block de notas:

Autor: Mauricio Galvez Legua

17

PIC16F877A: Primer programa


Nuestro primer programa enviar el byte:
10101010 al puerto D.
En Proteus configure el PIC16F877A a una
frecuencia de trabajo igual a 4Mhz.

Autor: Mauricio Galvez Legua

18

PIC16F877A: Primer programa


El programa en ensamblador es:

Autor: Mauricio Galvez Legua

19

PIC16F877A: Primer programa


Recordar el registro STATUS para la seleccin del
banco:

Autor: Mauricio Galvez Legua

20

PIC16F877A: Primer programa


Finalmente lo compilamos y lo probamos en el
circuito diseado en Proteus:

Autor: Mauricio Galvez Legua

21

PIC16F877A: Primer programa


Compilar significa pasar
nuestro programa que
est elaborado en
nemnicos, a byte code.
En el MPLAB existe una
opcin que nos permite
visualizar el contenido
que est almacenado en
la memoria de programa
del PIC:
Windows PIC Memory
Views
Autor: Mauricio Galvez Legua

22

PIC16F877A: Primer programa


Observamos los byte code de cada instruccin y su
ubicacin en la memoria de programa:

Autor: Mauricio Galvez Legua

23

PIC16F877A:
Las instrucciones son
codificadas de la
siguiente manera:

Autor: Mauricio Galvez Legua

24

PIC16F877A:

Autor: Mauricio Galvez Legua

25

PIC16F877A:

Autor: Mauricio Galvez Legua

26

PIC16F877A: Variables
Una variable es una posicin de memoria
(definicin ms elemental), en donde se almacena
el valor de dicha variable y es modificable en
cualquier momento.
Para definir una variable podemos emplear la
directiva EQU:
tiempo1
tiempo2
rotar
cuenta

EQU
EQU
EQU
EQU

0x20
0x21
0x22
0x23

Observar que estamos haciendo uso de las


direcciones GPR del PIC.
Autor: Mauricio Galvez Legua

27

PIC16F877A: Variables
Otra forma de hacerlo sin tener que especificar la
direccin para cada variable es mediante la
directiva CBLOCK. Ejemplo:
CBLOCK 0x20
tiempo1
tiempo2
rotar
cuenta
ENDC

Tambin es posible escribir las variables en una


solo lnea, pero separado por comas.
Autor: Mauricio Galvez Legua

28

PIC16F877A: Subrutinas
Se le llama subrutina a un segmento de cdigo
separado del bloque principal y que puede ser
invocado en cualquier momento desde este o
desde otra subrutina.
Una subrutina al ser llamada dentro de un
programa hace que el cdigo principal se detenga y
se dirija a ejecutar el cdigo de la subrutina. Una
vez terminado de ejecutar la subrutina, vuelve al
programa principal y contina donde se quedo.

Autor: Mauricio Galvez Legua

29

PIC16F877A: Subrutinas

Autor: Mauricio Galvez Legua

30

PIC16F877A: Subrutinas
El como recuerda donde se qued es porque
previamente antes de ir a la subrutina guarda la
siguiente direccin del programa principal en
la Zona de Stack.

Autor: Mauricio Galvez Legua

31

PIC16F877A: Subrutinas (P01)


Ahora vamos a realizar una subrutina de retardo
que nos permita poder generar cambios visibles
por el ojo humano en los leds. Para ello haremos un
loop dentro de otro loop:

Autor: Mauricio Galvez Legua

32

PIC16F877A: Subrutinas (P01)


La subrutina utiliza dos variables: TIEMPO1 y
TIEMPO2, las cuales deben ser definidas al inicio
del programa de la siguiente manera:

Si se requiere ms tiempo de retardo se debe


adicionar ms instrucciones NOP.

Autor: Mauricio Galvez Legua

33

PIC16F877A: Subrutinas (P01)


Modificamos el programa anterior para hacer que los leds
del puerto D "parpadeen". Para ello luego de enviar el dato
al puerto D (y finalizando el retardo), negamos el contenido
del puerto D (instruccin COMF) y nuevamente llamamos a
la subrutina de retardo. Esto se repite indefinidamente.
Las variables se reservan en el espacio de memoria
denominado GPR (Registros de Propsitos Generales).
La configuracin del registro TRISD se realiza con una sola
instruccin denominada CLRF.
La llamada a la subrutina se hace con la instruccin CALL. La
subrutina tiene al final una instruccin RETURN, que
asegure el retorno al programa principal.
La instruccin GOTO salta incondicionalmente a la direccin
especificada por la etiqueta.
Autor: Mauricio Galvez Legua

34

PIC16F877A: Subrutinas (P01)

Autor: Mauricio Galvez Legua

35

PIC16F877A: Ejemplo P01A


El siguiente programa rotar a la derecha un nico
led encendido Para ello requerimos saber como
funcionan las instrucciones de rotacin:

Autor: Mauricio Galvez Legua

36

PIC16F877A: Ejemplo P01A

Observar que las dos instrucciones de rotacin utilizan al


flag de CARRY. Dicho flag esta ubicado en el registro STATUS.

Autor: Mauricio Galvez Legua

37

PIC16F877A: Ejemplo P01A

Autor: Mauricio Galvez Legua

38

PIC16F877A: Ejemplo P01B


Vamos a realizar una variante al programa anterior,
para que en vez de displayar un led "prendido a la
vez", el cual esta rotando, displaye lo contrario
(todo los leds prendidos y el que rota es un led
apagado).
Nuestro programa es:

Autor: Mauricio Galvez Legua

39

PIC16F877A: Ejemplo P01B

Autor: Mauricio Galvez Legua

40

PIC16F877A: Ejercicio P01C


Realizar un programa que muestre un led
encendido, rotando a la derecha por los puertos
PORTD y PORTC. Siempre debe mostrarse un led
encendido.

Autor: Mauricio Galvez Legua

41

PIC16F877A: Ejercicio P01D


Realizar un programa que
realice la siguiente
secuencia en el PORTD y
PORTC:

Autor: Mauricio Galvez Legua

42

PIC17F877A: Ejercicio P01D

Autor: Mauricio Galvez Legua

43

PIC17F877A: Ejercicio P01E


Elaborar un programa que realice la siguiente
secuencia en el PORTD y PORTC:

Autor: Mauricio Galvez Legua

44

PIC17F877A: Ejercicio P01E

Autor: Mauricio Galvez Legua

45

PIC17F877A: Ejemplo P03


Vamos a realizar un programa que visualice en un
display los nmeros del 0 al 9. Existe una gran
variedad de display como podemos observar en el
siguiente grfico:

Nosotros vamos emplear el display de 7 segmentos.

Autor: Mauricio Galvez Legua

46

PIC17F877A: Ejemplo P03


Para realizarlo vamos hacer uso de variables y
subrutinas:

Recuerde que las posiciones de memoria 0x20 y


0x21 estn ubicadas en la zona denominada GPR
(Registros de Propsitos Generales).

Autor: Mauricio Galvez Legua

47

PIC17F877A: Ejemplo P03


Ahora debemos de obtener los valores debemos
enviar al display para que se visualicen cada uno de
los nmeros del 0 al 9 solicitados. El display es de
ctodo comn:

Autor: Mauricio Galvez Legua

48

PIC17F877A: Ejemplo P03


Proteus: P03.DSN
Programa: P03.asm

Autor: Mauricio Galvez Legua

49

PIC17F877A: Ejemplo P04


Elaborar un programa que permita displayar en una matriz
de dos display, el nmero 0 en el primer display y el nmero
1 en el segundo display (utilizar 7SEG-MPX2-CC-BLUE). Se
debe emplear la tcnica de multiplexado para habilitar cada
uno de los display.
Proteus: P04.DSN
Programa: P04.asm

Autor: Mauricio Galvez Legua

50

PIC17F877A: Ejercicio P04B


Modificar el programa para que funcione sin los inversores.

Autor: Mauricio Galvez Legua

51

PIC17F877A: Ejemplo P05


Programa que permite displayar el mensaje FIEE en cuatro
display de ctodo comn. Se esta empleando tcnica de
multiplexado para habilitar cada uno de los display.

Proteus: P05.DSN
Programa: P05.asm
Autor: Mauricio Galvez Legua

52

PIC17F877A: Ejercicio P05B


Modificar el programa para que trabaje con un decoder
74139 en la parte del multiplexado.

Proteus: P05B.DSN
Autor: Mauricio Galvez Legua

53

PIC17F877A: Ejercicio P05C


Modificar nuevamente el programa para que trabaje con un
display 7SEG-MPX8-CC-BLUE y con un decoder 74138. Debe
displayar: FIEE-UNI

Proteus: P05C.DSN
Autor: Mauricio Galvez Legua

54

Fin
Autor: Mauricio Galvez Legua
(mgalvez@uni.edu.pe)

Autor: Mauricio Galvez Legua

55

You might also like