Guía de laboratorio
No 1
“Programación del PIC 16F84A”.
Un
microcontrolador, es un circuito integrado programable que contiene los
elementos necesarios para controlar un sistema.
PIC
significa Peripheral Interface Controler es decir un controlador de
periféricos.
Cuando
hablamos de un circuito integrado programable que controla periféricos, estamos
hablando de un sistema que contiene entre otras cosas una unidad aritmético-lógica,
unas memorias de datos y programas, unos puertos de entrada y salida, es decir
estamos hablando de un pequeño ordenador diseñado para realizar unas funciones
específicas.
Podemos
encontrar microcontroladores en lavadoras, teclados, teléfonos móviles, ratones
etc.
Hay
multitud de microcontroladores con más memoria, entradas y salidas, frecuencia
de trabajo, coste, subsistemas integrados y un largo dependiendo de cada tipo
de microcontrolador.
El
microcontrolador PIC 16F84 del fabricante Microchip Technology Inc es un
sistema sencillo, barato y potente para muchas aplicaciones electrónicas.
Las
características del controlador las podemos encontrar en la web del fabricante www.microchip.com
Estructura
interna del microcontrolador
Características:
Alimentación:
El
PIC se alimenta a 5 V entre los puntos Vdd (+) y Vss (-). El consumo del
circuito depende de las cargas en los puertos y de la frecuencia de trabajo.
Frecuencia
de trabajo:
Los
PIC's necesitan un reloj oscilador que marcará la frecuencia de trabajo.
Estos
osciladores pueden ser del tipo :
RC Formado
por una resistencia y un condensador
HS se utiliza
un cristal de cuarzo o resonador cerámico
XT Cristal o
resonador hasta 4 Mhz
LP Bajo
consumo (hasta 200Khz)
Los
osciladores se colocan entre las terminales OSC1 y OSC2
Puertos
de ENTRADA/SALIDA
Los
puertos son entradas y salidas del microcontrolador al exterior, por ellas
enviamos
o introducimos señales digitales TTL (5V) de forma que podemos
comunicar
el microcontrolador con el exterior.
En
este caso tenemos 2 puertos de entrada y salida E/S. Sus nombres son RA y RB.
El
puerto RA tiene 5 pines RA0-RA4, un caso particular es RA4/TOCK1 que puede actuar
como pin de entrada o como entrada de impulsos para un contador denominado TMRO
El
puerto RB tiene 8 líneas que van desde RB0-RB7 .Cada línea del RA o del RB se puede
configurar como entrada o salida mediante 2 registros llamados TRISA y TRISB.
Con
esta información podemos montar un sencillo entrenador para PIC's 16F84
con
el puerto RA como entrada y el puerto RB como salida. Utilizaremos como
entrada
unos microinterruptores y como salida unos leds conectados al puerto
RB0-RB7.
Memorias.
Todo dispositivo programable necesita de
una memoria para poder almacenar el programa, poder manejar variables y
almacenar datos.
MEMORIA DE PROGRAMA
En
el PIC 16F84 la memoria de programa o de instrucciones es una memoria tipo FLASH
de 1K. En esta memoria almacenaremos el programa que ejecutará el
microcontrolador.
Existe
un registro especial llamado contador de programa PC cuya finalidad es avanzar
por las instrucciones del programa de forma secuencial excepto cuando se encuentran
instrucciones de salto.
MEMORIA DE DATOS
La
memoria de datos sirve para almacenar variables, leer puertos de entrada o
escribir
en los puertos de salida, podemos también acceder al temporizador o al registro
EEPROM
La
memoria de datos en el PIC 16F84 está formada por dos zonas:
MEMORIA
RAM de 68 registros de propósito general (SRAM)
MEMORIA
EEPROM de 68 registros cuya característica principal es que no se
perderán
los datos cuando se desconecta la alimentación.
Esta memoria está formada por dos bancos
Banco0 y Banco1, los primeros registros son llamados de propósito específico y
están desde la dirección de memoria 00h – OBh para el Banco0 y desde la
dirección 80h – 8Bh para el Banco1.
Otras características:
Dentro del microcontrolador hay unos
registros especiales que determinan algunas de las características notables del
microcontrolador:
- Temporizador/Contador TMR0
- Perro guardián watchDog (WD)
- Interrupciones.
- Reset .(Reinicio del sistema)
DISEÑO DE
PROYECTOS
Frente
a un problema técnico, hay que buscar una solución de forma barata y
sencilla,
en este proceso de búsqueda de soluciones, los microcontroladores PIC pueden
ayudarnos a realizar soluciones sencillas, rápidas y baratas.
Partiremos
de un planteamiento teniendo presente todas las variables que afectan al
sistema, desarrollaremos la idea y la implementaremos con las herramientas adecuadas.
Diagrama
de flujo del desarrollo de proyectos con microcontrolador:
PROGRAMACIÓN EN ENSAMBLADOR PIC 16F84
Para programar un
PIC 16F84 necesitamos conocer las instrucciones para generar el código fuente
para posteriormente compilarlo por ejemplo con MPASM, emular el programa y
poder grabarlo para implementarlo en el circuito correspondiente.
El listado de instrucciones de microchip
(el fabricante del microcontrolador) son
las siguientes:
MNEMÓNICO
OPERANDOS |
OPERACION
|
DESCRIPCION
|
|
f,d
|
w + f
→ d
|
Suma el contenido del registro w al contenido
del registro f, y almacena el resultado en w si d = 0, y en el
registro f si d = 1.
|
|
f,d
|
w AND f
→ d
|
Efectúa la operación AND lógico entre el contenido del
registro w y el contenido del registro f, y almacena el
resultado en w si d = 0, y en f si d = 1. Esta instrucción realiza la operación AND bit a bit. |
|
f
|
00 h → f
|
Se borra el contenido del registro f y el flagZ
se activa
|
|
-
|
00 h → w
|
El registro de trabajo w se carga con 00h. El
flag Z se pone a 1
|
|
f,d
|
Complemento
de f → d
|
Hace el complemento del contenido del registro f
bit a bit. El resultado se almacena en el registro f si d=1 y
en el registro w si d=0, en este caso f no varía.
|
|
f,d
|
f - 1 → d
|
Se decrementa el contenido del registro f en una
unidad. El resultado se almacena en f si d=1 y en w si d=0,
en este caso f no varía.
|
|
f,d
|
f - 1 → d
(si es 0 salta)
|
Decrementa el contenido del registro f en una
unidad, el resultado se almacena en f si d=1 y en w si d=0,
en este caso, f no varía. Si el resultado es cero, se ignora la
siguiente instrucción y, en ese caso la instrucción tiene una duración de dos
ciclos.
|
|
f,d
|
f + 1 → d
|
Se incrementa en una unidad el contenido del registro f,
si d=1 el resultado se almacena en f, si d=0 el resultado se
almacena en w, en este caso el resultado de f no varía.
|
|
f,d
|
f + 1 → d
(si es 0 salta)
|
Incrementa el contenido del registro f en una
unidad, el resultado se almacena de nuevo en f si d=1, y en w
si d=0, en este caso, f no varía. Si el resultado es cero, se
ignora la siguiente instrucción y, en ese caso la instrucción tiene una
duración de dos ciclos.
|
|
f,d
|
w OR f
→ d
|
Efectúa la operación lógica OR entre el contenido del registro w y el contenido del registro f, y almacena el resultado en f si d=1 y en w si d=0.Esta instrucción realiza la operación OR bit a bit. | |
f,d
|
f → d
|
El contenido del registro f se carga en el
registro destino dependiendo del valor de d. Si d=0 el destino
es el registro w, si d=1 el destino es el propio registro f.
Esta instrucción permite verificar dicho registro ya que el flagZ
queda afectado.
|
|
f
|
w → f
|
Mueve el contenido del registro w al registro f
|
|
-
|
No
operación
|
No realiza operación alguna, pero sirve para consumir
un ciclo de instrucción, equivalente a 4 de reloj.
|
|
f,d
|
Rota fizq
por carry → d
|
Rotación de un bit a la izquierda del contenido del registro
f, pasando por el bit de acarreo C,desde los bits
menos significativos a los más significativos. El bit D7 pasa al CARRY del
registro STATUS, el contenido del CARRY pasa al D0, el D0 al D1, etc. Es como
si multiplicáramos por dos el contenido del registro. Si d=1 el resultado se almacena en f, si d=0 el resultado se almacena en w. |
|
f,d
|
Rota fdcha
por carry → d
|
Rotación de un bit a la derecha del contenido del registro f,
pasando por el bit de acarreo C,desde los bits más
significativos a los menos significativos. El bit C del registro STATUS pasa
al D7, el D0 pasa al bit C, el D1 al D0, etc. Es como si dividiéramos por dos
el contenido del registro. Si d=1 el resultado se almacena en f, si d=0 el resultado se almacena en w |
|
f,d
|
f - w
→ d
|
Resta en complemento a dos el contenido del registro f
menos el contenido del registro w almacena el resultado en w si
d=0 y en f si d=1.
|
|
f,d
|
Intercambia nibbles de f → d
|
Los cuatro bits de más peso del registro f se
intercambian con los 4 bits de menos peso del mismo registro. Si d=0
el resultado se almacena en w, si d=1 el resultado se almacena
en f.
|
|
f,d
|
w XOR f
→ d
|
Realiza la función OR-Exclusiva entre el contenido del
registro w y la constante k de 8 bits. El resultado se almacena
en w. Esta instrucción realiza la operación EXOR bit a bit. |
MNEMÓNICO
|
OPERACION
|
DESCRIPCION
|
|
f,b
|
Pone a 0
bit b de registro f
|
Pone a cero el bit número b del registro f.
|
|
f,b
|
Pone a 1
bit b de registro f
|
Pone a 1 el bit b del registro f
|
|
f,b
|
Salto si
bit b de reg. f es 0
|
Si el bit número b del registro f es
cero, la instrucción que sigue a ésta se ignora y se trata como un NOP
(skip). En este caso, y sólo en este caso, la instrucción BTFSC precisa dos
ciclos para ejecutarse.
|
|
f,b
|
Salto si
bit b de reg. f es 1
|
Si el bit número b del registro f está a
1, la instrucción que sigue a ésta se ignora y se trata como un NOP (skip).
En este caso, y sólo en este caso, la instrucción BTFSS precisa dos ciclos
para ejecutarse.
|
MNEMÓNICO
OPERANDOS |
DESCRIPCIÓN
|
BANDERAS
|
|
k
|
w + k
→ w
|
Suma el contenido del registro w al literal k,
y almacena el resultado en w.Si se produce acerreo el flagC se
pone a "1".
|
|
k
|
w AND k
→ w
|
Efectúa la operación AND lógico entre el contenido del
registro w y el literal k, y almacena el resultado en w. Esta instrucción realiza la operación AND bit a bit. |
|
k
|
Llamada a
subrutina k
|
Salvaguarda
la dirección de vuelta en la Pila y después llama a la subrutina situada en
la dirección cargada en el PC.
El modo de
cálculo de la dirección efectiva difiere según la familia PIC utilizada.
También hay que posicionar PA2, PA1 y PA0 (PIC 16C5X) o el registro PCLATCH
(En los demás PIC) antes de ejecutarse la instrucción.
|
|
-
|
Borra temporizador del WDT
|
Se borra tanto el registro WDT (watchdog) como
su preescaler. Los bits T0# y PD# del registro de estado se ponen a
"1".
|
|
k
|
Ir a dirección
k
|
Salto incondicional, normalmente se utiliza para llamar a la
subrutina situada en la dirección que se carga en PC. El modo de cálculo de la instrucción carga desde el bit 0 al 10 de la constante k en el PC y los bits 3 y 4 del registro PCLATH en los 11 y 12 del PC |
|
k
|
w OR k
→ w
|
Se realiza la operación lógica OR entre el registro w
y el literal k. El resultado se almacena en el registro w. Esta instrucción realiza la operación OR bit a bit. |
|
k
|
k → w
|
El registro w se carga con el valor de 8 bits
del literal k
|
|
-
|
Retorno de
una interrupción
|
Carga el PC con el valor que se encuentra en la parte
alta de la Pila, asegurando así la vuelta de la interrupción. Pone a 1 el bit
GIE, con el fin de autorizar de nuevo que se tengan en cuenta las
interrupciones.
|
|
k
|
Retorno
con k en w
|
Carga el registro w con el literal k, y
después carga el PC con el valor que se encuentra en la parte superior de la
PILA, efectuando así un retorno de subrutina.
|
|
-
|
Retorno de
una subrutina
|
Carga el PC con el valor que se encuentra en la parte
superior de la PILA, efectuando así un retorno de subrutina
|
|
-
|
Modo
Standby
|
Pone al
circuito en modo Sleep (bajo consumo) con parada del oscilador. Pone a 0 el
flagPD# (Power Down) y el flagTO# (TimerOut) se pone a 1. Se
puede salir de este estado por:
|
|
k
|
k - w
→ w
|
Resta en complemento a dos del contenido del literal k
el contenido del registro w, y almacena el resultado en w.
|
|
k
|
w XOR k
→ w
|
Realiza la función OR-Exclusiva entre el contenido del
registro w y la constante k de 8 bits. El resultado se almacena
en w. Esta instrucción realiza la operación EXOR bit a bit. |
Ejercicios:
Comprobar cada uno de los siguientes
programas en lenguaje ensamblador del PIC 16F84A usando la herramienta de
simulación MPLAB IDE y verificar el contenido de los registros tras ejecutar
cada instrucción.
PROG1.ASM
;
--------------------------------------------------------------------------------------------------------
; EL SIGUIENTE PROGRAMA SUMA 05 Y 02 en formato
hexadecimal
;
--------------------------------------------------------------------------------------------------------
COMENTARIOS
LIST P=16F84
SUMA1 EQU 0X0C
SUMA2 EQU 0X0D
RESUL EQU 0X0E
; --------------------------------------------------------------------------------------------------------
; Se han definido 3 variables SUMA, SUMA2 y RESUL en
diferentes posiciones ; de la memoria de datos REGISTER FILE MAP
; --------------------------------------------------------------------------------------------------------
ORG 0
; --------------------------------------------------------------------------------------------------------
; Origen de las instrucciones en el PROGRAM MEMORY
MAP
; --------------------------------------------------------------------------------------------------------
W SUMA1
SUMA2 RESUL COMENTARIO
movlw 0X05
movwf SUMA1
movlw 0X02
movwf SUMA2
movfw SUMA1
addwf SUMA2 , 0
movwf RESUL
END
;---------------------------------------------------------------------------------------------------------
PROG2.ASM
Sumar en binario 0001 y
0010. Guardar el resultado en 0x0E
LIST P=16F84
SUMA1 EQU 0X0C
RESUL EQU 0X0E
; --------------------------------------------------------------------------------------------------------
; Se han definido 2 variables SUMA y RESUL en
diferentes posiciones de la ;memoria de
datos en el REGISTER FILE MAP
; --------------------------------------------------------------------------------------------------------
ORG 0
; --------------------------------------------------------------------------------------------------------
; Origen de las instrucciones en el PROGRAM MEMORY
MAP
; Directiva de compilación
; --------------------------------------------------------------------------------------------------------
movlw b'0001'
movwf SUMA1
movlw b'0010'
addwf SUMA1 , 0
movwf RESUL
END
PROG3.ASM
;
--------------------------------------------------------------------------------------------------------
; PROG3.ASM PROGRAMA PARA
SUMAR EN BINARIO 2 Y 3
; RESULTADO GUARDADO EN 0X0D
;
--------------------------------------------------------------------------------------------------------
LIST P=16F84
SUMA1 EQU 0X0C
RESUL EQU 0X0D
; --------------------------------------------------------------------------------------------------------
; Se han definido 2 variables SUMA1 y RESUL
; en diferentes posiciones de la memoria de datos en
el REGISTER FILE MAP
; --------------------------------------------------------------------------------------------------------
ORG 0
; --------------------------------------------------------------------------------------------------------
; Origen de las instrucciones en el PROGRAM MEMORY
MAP
; --------------------------------------------------------------------------------------------------------
movlw b'0010'
movwf SUMA1
movlw b'0011'
addwf SUMA1 , 0
movwf RESUL
END
;--------------------------------------------------------------------------------------------------------
PROG4.ASM
;
--------------------------------------------------------------------------------------------------------
; SUMA EN DECIMAL 3 Y 5
RESULTADO EN 0X12
;
--------------------------------------------------------------------------------------------------------
LIST P=16f84
SUM EQU 0x10
RESUL EQU 0x12
ORG 0
;---------------------------------****** INICIO
*****------------------------------------------------
movlw d'3'
movwf SUM
movlw d'5'
addwf SUM,0
movwf RESUL
END
;---------------------------------------------------------------------------------------------------------
Ejercicios propuestos
- Sumar cuatro números en binario (0,1,2,3)
- Sumar tres números y almacenar los números y el
resultado en las direcciones 0x0c 0x0d 0x0e 0x0f
- Sumar 2
números, almacenar el resultado en 0x0d, borrar el contenido del registro SUM y borrar el contenido del
registro acumulador W
PROG5.ASM
Cargar el número 5 en 1Ah
(VALOR1) y incrementar dos veces (Almacenar en 1ch)
;---------------------------------------------------------------------------------------------------------
; Programa que incrementa el valor 5
; --------------------------------------------------------------------------------------------------------
LIST P=16F84
VALOR EQU 1Ah
ORG 0
;---------------------------------------------------------------------------------------------------------
; INICIO
;---------------------------------------------------------------------------------------------------------
INICIO
movlw h'5'
movwf VALOR
incf VALOR,1
incf VALOR,1
END
;---------------------------------------------------------------------------------------------------------
PROG6.ASM
DECREMENTAR UN VALOR
LIST p=16F84
v equ
0x0a
org 0
inicio
movlw
0x05
movwf v
decf v,1
decf v,1
movfw v
end
Ejercicios propuestos
-
Restar
dos números binarios y almacenar el resultado en la dirección 0x10
-
Decrementar
el valor 10 cinco veces y almacenarlo en la dirección 0x2b
PROG7.ASM
Realiza una operación AND
entre dos registros
;---------------------------------------------------------------------------------------------------------
list
p=16f84
reg1 equ 0xa0
reg2 equ 0xa1
res equ 0xa2
org 0
;---------------------------------------------------------------------------------------------------------
Inici0
movlw b'01110011'
movwf reg1
movlw b'01010101'
movwf reg2
andwf reg1,0
movwf res
end
PROG8.ASM
Realizar operación OR entre
un registro y un literal
;--------------------------------------------------------------------------------------------------------
list
p=16f84
reg1 equ
0xa0
res equ 0xa1
org 0
;---------------------------------------------
inicio del programa------------------- --------------
inicio
movlw
b'00001100'
movwf
reg1
iorlw
b'00110000'
movwf
res
end
;---------------------------------------------------------------------------------------------------------
PROG9.ASM
Rotar dos veces hacia la
izquierda el contenido de un registro
; --------------------------------------------------------------------------------------------------------
; rotar el valor 00111111 2
veces a la izquierda
;---------------------------------------------------------------------------------------------------------
list p=16f84
regequ 0x0b
org 0
;---------------------------------------------------------------------------------------------------------
inicio
movlw
b'00000110'
movwfreg
rlf
reg,1
rlf reg,1
end
Ejercicios propuestos
-Realizar una rotación 4 veces hacia la derecha de un
registro de valor
'10110000'
-Realizar una OR Exclusiva de val1='00110101' y
val2='10100110'
-Intercambiar los 4 bits menos significativos por los
cuatro más Significativos del valor
b'00111010', almacenarlos en un registro