Beruflich Dokumente
Kultur Dokumente
Unidad II.
PROGRAMACIÓN DEL
MICROCONTROLADOR EN LENGUAJE
ENSAMBLADOR.
ESTRUCTURA DE DATOS
BIT: Unidad mínima de
información
x
x x x x x x x x
BYTE: Grupo de 8 bits
Repaso…. 2
ALGUNOS TIPS PARA REPASAR Y RECORDAR
Repaso…. 3
SISTEMAS DE NUMERACIÓN
Decimal Hexadecimal Binario
(Formato 4 bits BCD)
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
Repaso…. 4
FORMATO DE SISTEMAS DE NUMERACIÓN
ADMITIDOS POR EL MICROCONTROLADOR
Tipo de Sistema Formato Sigla Significado
Registro. Puede ser
Decimal D’126’ cualquiera que el
f (File)
.126 programador desee dentro
del rango permitido.
Repaso…. 5
REGISTROS Y BANCOS
Repaso…. 6
MEMORIA RAM
DE REGISTROS
Repaso…. 7
2.1. PROGRAMACIÓN EN LENGUAJE ENSAMBLADOR.
8
2.1.1. MODOS DE DIRECCIONAMIENTO.
9
2.1.1. MODOS DE DIRECCIONAMIENTO.
c) Directo
La memoria interna se direcciona de forma directa por medio de los
8 bits "f" contenidos en las instrucciones que operan sobre los
registros. De esta manera se puede direccionar cualquier posición
desde la 00 a la FF.
En los microcontroladores que tengan más de un banco, antes de
acceder a alguna variable que se encuentre en la zona de los bancos
de registros, el programador deberá asegurarse de haber
programado los bits de selección de banco en el registro OPTION.
Este es el modo más utilizado, ya que, la memoria RAM está
dividida en registros específicos y en un conjunto de registros de
propósito general. Este modo consiste en codificar el nombre del
registro en cuestión directamente en la instrucción. Ejemplo:
Operando de tipo byte:
◦ MOVWF 0x0C Carga en el Registro 0Ch el valor de W
10
2.1.1. MODOS DE DIRECCIONAMIENTO.
d) Indirecto
Utiliza al registro INDF (0x01) para indicar que se trata de un acceso
indirecto y al registro FSR (0x04) como apuntador.
Es el registro para direccionamiento indirecto de datos, a pesar de no
ser un registro disponible físicamente; utiliza el contenido del registro
FSR, para seleccionar indirectamente la memoria de datos o RAM. Si la
dirección a la que apunta el FSR se copia en INDF, una instrucción
aplicada a INDF, determinará lo que se debe hacer con el registro al que
apunta.
11
2.1.1. MODOS DE DIRECCIONAMIENTO.
12
2.1.1. MODOS DE DIRECCIONAMIENTO.
13
2.1.2. CONJUNTO DE INSTRUCCIONES.
14
2.1.2. CONJUNTO DE INSTRUCCIONES.
15
2.1.2. CONJUNTO DE INSTRUCCIONES.
16
2.1.2. CONJUNTO DE INSTRUCCIONES.
17
2.1.2. CONJUNTO DE INSTRUCCIONES.
INSTRUCCIONES DE CARGA
Las instrucciones de trnasferencia de datos son típicas de todos los
procesadores y su misión es transferir el contenido de un registro
fuente (F) a un registro destino (d) o bien cargar el destino con una
constante. En los microcontroladores PIC todos los datos residen en
posiciones de la memoria de datos y en el registro de trabajo W.
18
2.1.2. CONJUNTO DE INSTRUCCIONES.
19
2.1.2. CONJUNTO DE INSTRUCCIONES.
y (W) = 0x4F
movwf f Carga el contenido del registro W al registro ‘f’.
20
2.1.2. CONJUNTO DE INSTRUCCIONES.
INSTRUCCIONES DE BIT
Estas instrucciones ponen a nivel lógico “0” o “1” un determinado bit
de un registro de la memoria de datos.
bcf f,b Pone a cero el bit ‘b’ del registro f
◦ Ejemplo: bcf FlagReg,7
Antes de la instrucción: (FlagReg) = b’1100 0111’
Después de la instrucción: (FlagReg) = b’0100 0111’
21
2.1.2. CONJUNTO DE INSTRUCCIONES.
INSTRUCCIÓN “GOTO K”
Es un salto incondicional que produce un salto a la dirección del
programa indicado por “k”. La constante literal “k” es la dirección de
destino del salto, es decir, la nueva dirección de memoria de
programa a partir de la cual comenzarán a leerse las instrucciones
después de ejecutar la instrucción goto.
22
Diferencias y uso de “call” y “goto”
Ambas instrucciones rompen con la secuencia normal del programa, al
alterar el contenido del contador de programa (PC).
“goto” carga en el PC, la dirección de la nueva instrucción. “call” antes
de cargar el PC con la dirección de la instrucción a saltar, salva la
dirección de donde parte, guardándola en la cima de pila (stack), el valor
actual del PC. Luego de ejecutar la subrutina, se saca del stack la
dirección de donde partió.
Si no están en la subrutina llamada por “call”, las instrucciones “return”
o “retlw k”, se puede presentar un error de lógica en la ejecución del
programa, algo similar a no dejar migajas de pan para recordar el camino
de retorno.
Nota: Recuerde que los PIC’s poseen un valor limitado de pila (stack). En el PIC 16F84, este es de
8. Esto significa que en un programa no puede haber más de 8 subrutinas anidadas. (Subrutinas
dentro de subrutinas).
23
2.1.2.1. INSTRUCCIONES ARITMÉTICAS.
24
2.1.2.1. INSTRUCCIONES ARITMÉTICAS.
Ejemplos:
25
2.1.2.1. INSTRUCCIONES ARITMÉTICAS.
26
2.1.2.1. INSTRUCCIONES ARITMÉTICAS.
27
2.1.2.1. INSTRUCCIONES ARITMÉTICAS.
28
2.1.2.2. INSTRUCCIONES LÓGICAS.
30
2.1.2.2. INSTRUCCIONES LÓGICAS.
31
2.1.2.2. INSTRUCCIONES LÓGICAS.
32
2.1.2.2. INSTRUCCIONES LÓGICAS.
swapf f,d Los cuatro bits de más peso del registro ‘f’ se
intercambian con los 4 bits de menos peso del mismo registro ‘f’.
Almacena el resultado en W si ‘d’=0 y en el registro ‘f’ si ‘d’=1.
◦ Ejemplo: swapf Reg1,0
Antes de la instrucción: (Reg1) = 0xA5
Después de la instrucción: (Reg1) = 0xA5, W = 0x5A
33
2.1.2.2. INSTRUCCIONES LÓGICAS.
34
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
35
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
36
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
37
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
39
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
COMPARACIÓN DE REGISTROS.
Para saber si un registro vale 0 hay que cargar el registro sobre
si mismo mediante la instrucción “movf”, con lo cual se logra
posicionar el flag Z sin variar su contenido.
Ejemplo: movf Registro, F
btfss STATUS,Z
goto NoEsCero
EsCero: ---
---
NoEsCero: ---
40
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
41
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
42
2.1.2.3. INSTRUCCIONES DE CONTROL DE
PROGRAMA.
43
INSTRUCCIONES ORIENTADAS A REGISTROS
MNEMÓNICO DESCRIPCIÓN FLAGS AFECTADOS
addwf f,d (W)+(f) a (destino) C, DC, Z
andwf f,d (W) AND (f) a (destino) Z
clrf f 00 a (f) (borrar registro F) Z
clrw 00 a (W) (borrar W) Z
comf f,d Complemento de f [(f) a (destino)] Z
decf f,d (f)-1 a destino (decrementa f) Z
decfsz f,d (f)-1 a destino y si resultado es 0 salta (decrementa F, Ninguno
salta si zero)
incf f,d (f)+1 a destino (incrementa f) Z
incfsz f,d (f)+1 a destino y si resultado es 0 salta Ninguno
iorwf f,d (W) or (f) a destino Z
movf f,d mover f a destino Z
movwf f (W) a (f) mover W a destino F Ninguno
nop No operación Ninguno
rlf f,d Rota f a la izquierda a través del carry a destino C
rrf f,d Rota f a la derecha a través del carry a destino C
subwf f,d (f)–(W) a (destino) C,DC,Z
swapf f,d Intercambia los nibbles de f a destino Ninguno
xorwf f,d (W) XOR (f) a (destino) Z
44
INSTRUCCIONES ORIENTADAS A BIT
MNEMÓNICO DESCRIPCIÓN FLAGS AFECTADOS
bcf f,b Coloca a 0 el bit b del registro f Ninguno
bsf f,b Coloca a 1 el bit b del registro f Ninguno
btfsc f,b Salta si el bit b del reg. f es 0 Ninguno
btfss f,b Salta si el bit b del reg. f es 1 Ninguno
INSTRUCCIONES CON LITERALES Y DE CONTROL
addlw k (W)+ K a (W) C,DC,Z
andlw k (W) AND K a (W) Z
call k Llamada a subrutina Ninguno
clrwdt Limpia temporizador Watch Dog Z
goto k Go To dirección (ir a dirección) Ninguno
iorlw k (W) OR K a (W) Ninguno
movlw k K a (W) Ninguno
retfie Retorno de una interrupción Ninguno
retlw k Retorno con un literal en W Ninguno
return Retorno de una subrutina C,DC,Z
sleep Modo Stand by Z
sublw k K – (W) a W C, DC, Z
xorlw k (W) XOR K a (W) Z
45
2.2. AMBIENTE INTEGRADO DE DESARROLLO (IDE)
PARA MICROCONTROLADORES.
46
2.2. AMBIENTE INTEGRADO DE DESARROLLO (IDE)
PARA MICROCONTROLADORES.
47
2.2.1. ENSAMBLADOR Y COMPILADOR.
El conjunto de instrucciones de los microcontroladores PIC es en esencia la base del
lenguaje ensamblador soportado por este software.
Directivas de uso frecuente:
Son instrucciones para el compilador.
#DEFINE
Ejemplo. #define <nombre> [<valor a remplazar>]
explicación: declara una cadena de texto como substituto de otra
END
Ejemplo. end
explicación: indica fin de programa
EQU
Ejemplo. status equ 05
explicación: define una constante de ensamble
INCLUDE
Ejemplo. include <PIC16F84.h>
explicación: incluye en el programa un archivo con código fuente
ORG
Ejemplo. org 0x100
explicación: ensambla a partir de la dirección especificada
48
2.2.2. SIMULADOR, DEBUGGER Y EMULADOR.
Simulación:
1. Reset del procesador (menú Debug...Run...Reset) ó con F6 ó con el ícono
correspondiente en la barra de herramientas.
2. Crear una nueva ventana donde se incluyan las variables que queremos
tener en cuenta (Window...New Watch Window)
3. Empezar a correr paso a paso el programa haciendo el seguimiento
detallado de todos y cada uno de los pasos (menú Debug...Run...Step) ó con
la tecla F7 ó con el ícono correspondiente en la barra de herramientas.
El proceso de simulación nos permite detectar y corregir problemas de
lógica, problemas de situaciones que no hayamos tenido en cuenta que son
errores que no pueden ser detectados en el momento del ensamble del
programa.
49
2.2.3. EQUIPOS PROGRAMADORES DE
MICROCONTROLADORES.
50
2.2.3. EQUIPOS PROGRAMADORES DE
MICROCONTROLADORES.
51
2.3. PROGRAMACIÓN DEL MICROCONTROLADOR EN
LENGUAJE ENSAMBLADOR.
DIRECTIVA EQU
La directiva EQU permite asignar a un registro o constante, un nombre
asociado que facilita su entendimiento.
Ejemplo:
DATOX EQU 20H
F EQU 01H
INCLUDE .INC
El uso del INCLUDE permite incluir en el proyecto, una plantilla
que ahorra el trabajo de declarar todos los registros de Funciones
Especiales (SFR) de la memoria RAM de registros.
Es importante destacar, que en esta plantilla, todos los registros
están declarados en mayúscula. Por lo que durante la elaboración de un
programa, se debe respetar este formato.
Ejemplo:
INCLUDE <P16F84.INC> ó INCLUDE P16F84.INC
52
2.3. PROGRAMACIÓN DEL MICROCONTROLADOR
EN LENGUAJE ENSAMBLADOR.
ESTRUCTURA DE UN PROGRAMA
En general un programa está
Encabezado estructurado en tres grandes partes:
a) Encabezado: Define el tipo de PIC
con que se está trabajando, Bloque de
Configuración, declaraciones de variables y
Declaración de constantes,
Registros,
b) Configuración de registros
Datos, especiales: Registro OPTION,
Constantes. INTCON, TMR0, puertos A y B,
org EECON, STATUS.
53
2.3. PROGRAMACIÓN BÁSICA.
ESTRUCTURA DE UN PROGRAMA
1. En todo programa se debe incluir cual es el tipo de PIC que se empleará, incluir
librerías y configurarlo:
List P= 16F84A ; Tipo de PIC a utilizar
include <16F84A.inc> ; Librería asociada al PIC que se utilizará
_config_RC_OSC_&_WDT_OFF ; Se seleccionan los bits de configuración
2. Al escribir un programa se realizan y organizan las instrucciones en columnas:
1ra Columna: nombrar variables o colocar etiquetas.
2da Columna: aplicar la instrucción.
3ra Columna: contiene los datos necesarios para que pueda ejecutarse dicha
instrucción.
4ta Columna: contiene comentarios, no tomados en cuenta por el microcontrolador.
Ejemplo: Defina a la variable M en la posición de memoria expresada en 15H
1raC 2daC 3raC 4taC
M equ 15H ; Define a la variable M en la posición 15H
3. Se emplean signos para efectuar determinadas consideraciones, por ejemplo: (;) que
se emplea para colocar comentarios. El programa no toma en cuenta todo lo que está
en una línea luego de dicho símbolo.
54
2.3. PROGRAMACIÓN BÁSICA.
ESTRUCTURA DE UN PROGRAMA
55
STATUS
7 (L/E) 6 (L/E) 5 (L/E) 4 (L) 3 (L) 2 (L/E) 1 (L/E) 0 (L/E)
56
CONFIGURANDO UN PUERTO
La configuración de puertos es muy fácil:
1. Se selecciona el banco 1
• Aquí se encuentran los registros que manipulan mediante software
a los circuitos triestados que determinan que un pin o puerto
trabaje como entrada o salida.
2. Se configuran mediante los registros asociados a los puertos
(TRISA y TRISB), los pines de un puerto como entrada o
salida.
• Si coloco un uno (1) en un bit asociado a un puerto (RA0, RA1,
RB5, RB7,etc), éste se comportará como una entrada y solamente
podremos leer por esta entrada.
• Si coloco un cero (0) en un bit asociado a un puerto, éste se
comportará como una salida y solamente podremos escribir por
esta entrada.
• Podemos hacer analogía de la siguiente forma:
1 = In = Entrada = Solo lectura
0 = Out = Salida = Solo escritura
57
CONFIGURANDO UN PUERTO
La configuración de puertos es muy fácil:
3. Se selecciona o se regresa al banco 0, para trabajar con los
puertos que han sido previamente configurados.
• Si un puerto (o pin) ha sido configurado como salida, entonces se
podrá escribir sobre él, para sacar datos.
• Si un puerto (o pin) ha sido configurado como entrada, entonces
se podrá leer los datos que están ingresando por él.
• Nota: Escribir sobre un puerto (o pin) configurado como entrada,
no tiene ningún efecto. Si se desea escribir sobre él, es necesario
que el mismo sea habilitado como salida.
58
CONFIGURANDO UN PUERTO COMO ENTRADA/SALIDA (POR BYTE)
Recordemos los tres pasos:
Por Byte:
A) bsf STATUS, 5 ; (1) Selección de banco 1
movlw FFH ; B’11111111’
movwf TRISB ; (2) Todos los bits del puertoB están
; configurados como entradas
bcf STATUS,5 ; (3) Se regresa al banco 0
59
CONFIGURANDO UN PUERTO COMO
ENTRADA/SALIDA (BIT A BIT)
Recordemos los tres pasos:
Bit a bit:
bsf STATUS,5 ; (1) Selección de Banco 1
bsf PuertoA,1 ; (2) ¿Salida o Entrada?
bcf PuertoA,2 ; (2) ¿Salida o Entrada?
bsf PuertoA,3 ; (2) ¿Salida o Entrada?
bcf PuertoB,0 ; (2) ¿Salida o Entrada?
bcf PuertoB,2 ; (2) ¿Salida o Entrada?
bcf PuertoB,3 ; (2) ¿Salida o Entrada?
bsf PuertoB,5 ; (2) ¿Salida o Entrada?
bcf PuertoB,7 ; (2) ¿Salida o Entrada?
bcf STATUS,5 ; (3) Se regresa al banco 0
Nota: Estamos asumiendo que en este ejemplo hemos etiquetado
previamente a 05H como PuertoA y 06H como PuertoB.
60
REGISTROS ASOCIADOS A LOS PUERTOS
De configuración:
◦ TRISA (85H, Banco 1)
◦ TRISB (86H, Banco 1)
De Trabajo (Lectura/Escritura)
◦ PORTA (05H, Banco 0)
◦ PORTB (06H, Banco 0)
PORTA y PORTB, son registros de Lectura/Escritura, como
cualquier otro registro de propósito general, sólo que están
directamente vinculados a los puertos del microcontrolador.
Por lo tanto su Lectura/Escritura NO difiere de la de cualquier otro
registro
61
LEER Y/O ESCRIBIR EL UN VALOR
EN UN PUERTO
Ejemplo 1. Lea el valor presente en el puerto A y guárdelo en un
Registro DatoA.
movf PORTA,0 ; PORTA→W
movwf DatoA ; W→DatoA
Ejemplo 3. Active el bit RB0, desactive el bit RB1 y active el bit RA4:
bsf PORTB,0 ; RB0= 1
bcf PORTB,1 ; RB1= 0
bsf PORTA,4 ; RA4= 1
62
LEER Y/O ESCRIBIR UN VALOR EN UN PUERTO
¿Qué Efectos se tiene sobre el
siguiente circuito?
63
LEER Y/O ESCRIBIR UN VALOR EN UN PUERTO
64
ESCRIBIR Y LEER SOBRE UN PUERTO
Para configurar los Puertos como entradas y/o salidas, debemos de estar en el
banco 1. Una vez configurados, para poder leer y/o escribir sobre estos,
debemos de cambiarnos al banco 0.
Ejemplo. Realice un
programa que configure al
Puerto A como entrada y el
Puerto B como salida.
Además el Puerto B sacará
los estados que está leyendo
del Puerto A.
65
TOMA DE DECISIONES. EJEMPLO
Dado el siguiente circuito, Active el LED
ubicado en RB0 si RA0, vale 0 y en caso
contrario, active el LED ubicado en RB1.
66