0% encontró este documento útil (0 votos)
36 vistas154 páginas

Prácticas con Microcontrolador PIC16F84

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
36 vistas154 páginas

Prácticas con Microcontrolador PIC16F84

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd

_____________________________________________________________________________________

Índice

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
2__ I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
3

Índice

Presentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Capítulo 1 (Práctica 1). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

- Emisión / Recepción con código CRC . . . . . . . . . . . . . . 13

- Listado de Emisor.asm . . . . . . . . . . . . . . . . . . . . . . . . . . .17

- Organigrama general de Emisor.asm . . . . . . . . . . . . . . . .24

- Listado de Recept.asm . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

- Organigrama general de Recept.asm . . . . . . . . . . . . . . . . 33

- Listado de Rs232.asm . . . . . . . . . . . . . . . . . . . . . . . . . . .. 35

- Listado y organigramas de Teclado.asm . . . . . . . . . . . . . 37

- Listado de Lcd.asm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

- Listado de P16f84.inc . . . . . . . . . . . . . . . . . . . . . . . . . . . .43

Capítulo 2 (Práctica 2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

- Escritura / Lectura con código Hamming . . . . . . . . . . . . .47

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
4__ I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

- Listado de Hamming.asm . . . . . . . . . . . . . . . . . . . . . . . . .53

- Organigramas de Hamming.asm . . . . . . . . . . . . . . . . . . . 69

Capítulo 3 (Práctica 3). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

- Simulador ascensor de cuatro pisos . . . . . . . . . . . . . . . . .73

- Listado de Ascensor.asm . . . . . . . . . . . . . . . . . . . . . . . . . 77

- Organigrama general de Ascensor.asm . . . . . . . . . . . . . . 88

Capítulo 4 (Guía del Pic 16F84) . . . . . . . . . . . . . . . . . . . . . . . . . . 91

1. Encapsulado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

2. Arquitectura interna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

3. Registros internos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96

4. Programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

5. Instrucciones del Pic . . . . . . . . . . . . . . . . . . . . . . . . . . . .104

Capítulo 5 (Guía del Micro’Pic Trainer) . . . . . . . . . . . . . . . . . . 109

1. Arquitectura del MicroPic Trainer . . . . . . . . . . . . . . . . . 111

2. Componentes del MicroPic Trainer . . . . . . . . . . . . . . . . 115

3. El módulo de visualización LCD . . . . . . . . . . . . . . . . . . 117

4. Software recomendado . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Capítulo 6 (Guía del Micro’Pic Trainer Plus) . . . . . . . . . . . . . .123

1. Arquitectura del MicroPic Trainer Plus . . . . . . . . . . . . . .125

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
5

2. Componentes del MicroPic Trainer Plus . . . . . . . . . . . . .131

3. El teclado hexadecimal . . . . . . . . . . . . . . . . . . . . . . . . . . 132

4. Canal de comunicación serie RS232 . . . . . . . . . . . . . . . .134

5. Software de control para el MicroPic Trainer . . . . . . . . .136

Presupuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Apéndice A (Contenido del disquete) . . . . . . . . . . . . . . . . . . . . 141

Apéndice B (Bibliografía) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
6__ I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
7

Introducción

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
8__ I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
9

Introducción

El presente Proyecto Fin de Carrera tiene por objeto elaborar un conjunto de


prácticas de diferente complejidad que sirvan de apoyo en la docencia de los
microcontroladores PIC16F84.

Los microcontroladores PIC suponen un avance significativo en la materia de


dispositivos digitales empleados en el control de sistemas. Su reducido tamaño así como
sus elevadas prestaciones lo convierten en un elemento indispensable en el campo de los
microcontroladores. Por este motivo, desde el Departamento de Electrónica, Tecnología
de Computadoras y Proyectos se pretende realizar un conjunto de prácticas que
profundicen en las prestaciones de los mismos de forma que el alumno asimile los
conceptos fundamentales mediante la realización de una serie de prácticas de
complejidad creciente. Estas prácticas además están orientadas a la realización de
supuestos industriales reales con los que el alumno se va a encontrar en el ejercicio de
su profesión. Por tanto, se pretende dotar al Departamento de un conjunto de prácticas
de alto nivel, que permitan aprovechar al máximo los recursos materiales de que se
dispone en el laboratorio.

El Proyecto consta de tres capítulos en los que se desarrollan diversas prácticas


basadas en el microcontrolador PIC16F84, seguidos por tres capítulos en los que se
detallan características técnicas de este microcntrolador así como del kit de desarrollo a
fin de que este trabajo pueda ser empleado como un manual didáctico completo.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
10 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
11

Capítulo 1

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
12 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
13

Practica 1: Emisión / Recepción de datos


en serie con código CRC

La práctica trata de conectar dos placas micro’pic trainer mediante el puerto


serie del micro’pic trainer plus. Una placa va a actuar como emisora de datos y otra
como receptora. Para comprobar si la comunicación ha sido correcta se va a utilizar un
código CRC. Los dos programas necesarios para la realización de la práctica (el de la
placa emisora y el de la receptora), se van a programar en un microprocesador pic
16f84 (ver guía del pic16x84 y guía del micro’pic trainer).

La placa emisora, va a obtener los datos del teclado hexadecimal ubicado en el


micro’pic trainer plus. Los datos van a ser tomados en grupos de tres, es decir, cada vez
que se pulsen tres teclas, el programa instalado en el PIC de la placa emisora les va a
realizar el código CRC y las va a enviar junto con este a través del puerto serie ubicado
en el micro’pic trainer plus (ver figura 2). Cada tecla se va a considerar como cuatro
bits de datos de manera que al 0 le corresponderá el 0000, al 1 el 0001, al 2 el 0010, y
así hasta llegar a la F (1111). El conjunto de tres teclas, va a formar entonces un dato de
12 bits que va a ser convertido a un código CRC también de 12 bits. En el LCD del
micro’pic trainer se va a visualizar el conjunto de las tres teclas pulsadas y el código
CRC correspondiente a las mismas (ver figura 1). Una vez visualizado se mandarán vía
serie las teclas y el código correspondiente a estas. Debido a que el CRC ocupa 12 bits,
se tendrán que realizar dos transmisiones, una de 8 bits y otras con los otros 4 bits.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
14 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura 1. Micro’pic trainer. En el LCD Figura 2. Micro’pic trainer plus. En él se


se observa un ejemplo de funcionamiento encuentra el teclado y el puerto serie.
de la placa emisora.

La placa receptora, va a recibir las tres teclas pulsadas y su código CRC


correspondiente. Una vez recibidas las teclas, estas van a ser visualizadas en el LCD y, a
su vez, convertidas a su código CRC. Por último, se va a recibir el código CRC
obtenido en la placa emisora y se pasará al obtenido por esta. Si el resultado de este
nueva CRC es cero, la transmisión habrá sido correcta y nos aparecerá el mensaje de
buena. Si, por el contrario, el CRC obtenido no es nulo, la transmisión será incorrecta y
aparecerá en el LCD un mensaje de error.

Como la placa emisora realiza operaciones con el LCD y con el teclado que
pueden afectar a la transmisión, se van a introducir en ambos programas unas rutinas
con retardos. De esta forma, antes de recibir un dato, la placa receptora va a entrar en un
bucle de 0,1 segundos; si la línea de recepción se mantiene a 1 durante este periodo de
tiempo, se pasa a la recepción del dato, si la línea cambia antes de que hayan
transcurrido los 0,1 segundos, se vuelve a comenzar la cuenta desde cero. Cada vez que
la placa emisora va a transmitir, mantiene la línea de transmisión a 1 durante 0,2
segundos, para asegurarse así que la receptora pasa a recibir. Mediante este proceso de
retardos, se van a conseguir despreciar los ecos producidos en el teclado y las
operaciones realizadas en el LCD de la placa emisora, ya que esta utiliza la misma línea
para transmitir, para operar con el LCD y para obtener datos del teclado. Si no se realiza
esta operación de retardos, la placa receptora podría considerar las operaciones
realizadas por la placa emisora como datos enviados y recibir, por tanto, datos
incorrectos continuamente.

El código CRC, se obtiene a partir de un dato de 12 bits. El dato es convertido a


un código CRC de forma que si el dato varía el CRC varía, correspondiendo un único
CRC a cada conjunto de 12 bits. El CRC va a ser el especificado mediante el siguiente
polinomio generador:

Las X del polinomio generador indican que en esa posición del CRC hay
colocada una puerta OR exclusiva. De esta forma, el esquema electrónico
correspondiente a este polinomio va a ser el representado en la figura 2.

Figura 2. Esquema correspondiente a G(x)

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
15

Como se puede apreciar en la figura 2, para cada X hay una puerta XOR pero de
forma inversa, es decir, para X a la doce, tenemos una XOR (E) en el bit 0 del CRC,
para X a la 11 la tenemos en el bit 1 (D), para X cubo en el bit 9 (C), para X cuadrado
en el 10 (B) y para X lo tendremos en el bit 11 (A).

Los bits del 8 al 1 forman un registro de desplazamiento de manera que cada


pulso de reloj origina que el bit 8 pase al 7, el 7 pase al 6, y así sucesivamente hasta
llegar al 2 que pase al 1. Los bits a codificar serán introducidos por la entrada IN.

Para comprobar el modo de funcionamiento del circuito, se introduce un 1 en la


entrada IN; si se considera que el registro CRC esta a cero inicialmente, la salida de la
puerta E será un 1 (recordar que una XOR nos da a la salida un uno cuando las entradas
son distintas); este uno va a parar a las demás puertas de forma que en A se tiene este 1
y un 0 del registro once (es un cero hasta que llega el siguiente pulso de reloj, momento
en el cual pasa a valer igual que la realimentación, que es 1 en este caso), por lo que el
registro diez pasa a valer 1; a la puerta B entra el 1 y un 0 del registro diez (ya que
todavía no se ha producido el pulso de reloj cuando la realimentación llega a la puerta),
dando un 1 para el registro nueve; de igual forma se obtiene un 1 en el ocho; al siete va
lo que había en el ocho, es decir, un 0 (antes del pulso de reloj), al seis lo que había en
el siete y al final del registro de desplazamiento tendremos un 0 (en este caso); por
último en la puerta D entra el 1 y un 0 del registro 1 dando un 1 para el registro 0. Tras
esto se obtiene el CRC 111100000001 para una entrada 1; el siguiente bit entra por IN
y varia el registro CRC. Cuando los 12 bits del dato se hayan introducido, se tendrá su
código CRC correspondiente. Si al código CRC obtenido se le introduce este mismo
CRC la salida va a ser cero. Aprovechando esta propiedad, se emite el dato y su CRC
(placa emisora); tras recibir el dato (placa receptora), se le realiza el CRC y, a este, se le
introduce el CRC recibido de forma que si el resultado es cero, la transmisión ha sido
correcta. ( Ver figura 3).

Figura 3. Esquema de la comprobación de transmisión

En la tabla 1, se va a recoger todo el proceso correspondiente a la transformación


de un dato a CRC. El dato va a ser 1000 0000 1001 (809). En la tabla representada se va
a ver la posición, el código CRC en cada posición y el bit de entrada.

Posición CRC IN
0 000000000000 1
1 111100000001 0
2 100010000001 0
3 101101000001 1
4 010110100000 0
5 001011010000 0
6 000101101000 0
7 000010110100 0
8 000001011010 0
9 000000101101 0
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
16 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

10 111100010111 0
11 100010001010 1
12 1011 0100 0100
Tabla 1. Obtención de código CRC a partir de un dato

Por último, se va a obtener de nuevo el código CRC del valor obtenido en la


tabla 1 para comprobar si efectivamente tiene que dar cero. En este caso el valor inicial
del CRC no va a ser cero, sino que va a ser el valor obtenido en la anterior tabla.

Posición CRC IN
0 101101000100 0
1 010110100010 0
2 001011010001 1
3 000101101000 0
4 000010110100 0
5 000001011010 0
6 000000101101 1
7 000000010110 0
8 000000001011 1
9 000000000101 1
10 000000000010 0
11 000000000001 1
12 0000 0000 0000
Tabla 2. Comprobación de transmisión correcta.

En las próximas paginas, se presenta un listado de los distintos programas


necesarios para la programación del pic, así como comentarios explicativos de todos
ellos. Al finalizar el listado de cada programa, se presenta un organigrama del mismo.

Emisor.asm : Es el programa principal a instalar en la placa emisora (el que se instala


ha de ser el fichero emisor.hex).

Recept.asm: Es el programa a instalar en la placa receptora.

Rs232.asm: El fichero no hay que programarlo, pero hay que tenerlo a la hora de
ensamblar cualquiera de los dos anteriores programas. En el se incluyen las
rutinas necesarias para llevar a cabo la transmisión y recepción serie.

Teclado.asm: Como el anterior, pero se encarga de controlar el teclado hexadecimal.

Lcd.asm: Como los anteriores, pero para el control del LCD.

P16f84.inc: El fichero incluye únicamente las definiciones de registros y variables


necesarias para programar el micro 16f84. La directiva include del ensamblador
permite incluirlo en cualquier programa fuente.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
17

EMISOR.ASM

El programa toma las teclas pulsadas en el teclado del upic


trainer plus y las envía por el puerto serie. Las teclas pulsadas son
tomadas de tres en tres y representadas en el LCD del upic trainer.
A su vez los conjuntos de tres teclas son convertidos a un código CRC
de doce bits que es enviado por el puerto serie y visualizado en el
LCD. Mediante el uso de este código CRC, podemos comprobar si hay
error o no en la transmisión serie.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
18 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

list p=16f84 ;Se define el tipo de dispositivo

include "a:\p16f84.inc" ;Incluye archivo con definición de


registros

Lcd_var equ 0x0c ;Inicio de las variables para el LCD


Key_var equ 0x0e ;Inicio de las variables para el teclado
Rs232_var equ 0x10 ;Inicio de las variables para la comunicación
Temp_1 equ 0x13 ;Definición de las distintas variables usadas
Temp_2 equ 0x14 ;en el programa
DAVID equ 0x15
BIT1 equ 0x16
BIT2 equ 0x17
CRC1 equ 0x18
CRC2 equ 0x19
REG1 equ 0x1a
REG2 equ 0x1b
DAV equ 0x1c
DAV1 equ 0x1d
BAUDIOS equ .9600 ;Velocidad de comunicación
CLKIN equ .4000000 ;Frecuencia de trabajo en ciclos / segundo

org 0 ;Para que al resetear se vaya a INICIO


goto INICIO
org 5 ;Indica donde comienza el programa

include "a:\LCD.ASM" ;Carga rutinas del LCD


include "a:\TECLADO.ASM" ;Carga rutinas del teclado
include "a:\RS232.ASM" ;Carga rutinas para la
;comunicación

TABLA movf Temp_1,W ;Nos va a llevar los desplazamientos


movwf PCL ;dentro de los distintos mensajes

**********************************************************************
A continuación se definen los distintos mensajes que van a aparecer en
el LCD del micro’pic trainer.

Mensaje equ $
retlw 'D'
retlw 'a'
retlw 't'
retlw 'o'
retlw ':'
retlw ' '
retlw 0x00

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
19

Mensaje1 equ $
retlw 'C'
retlw 'R'
retlw 'C'
retlw ':'
retlw 0x00
Mensaje2 equ $
retlw 'E'
retlw 'm'
retlw 'i'
retlw 's'
retlw 'o'
retlw 'r'
retlw ' '
retlw 'd'
retlw 'e'
retlw ' '
retlw 'd'
retlw 'a'
retlw 't'
retlw 'o'
retlw 's'
retlw 0x00
Mensaje3 equ $
retlw 'e'
retlw 'n'
retlw ' '
retlw 's'
retlw 'e'
retlw 'r'
retlw 'i'
retlw 'e'
retlw ' '
retlw 'c'
retlw 'o'
retlw 'n'
retlw ' '
retlw 'C'
retlw 'R'
retlw 'C'
retlw 0x00

**********************************************************************
Comienzo del programa.

INICIO: clrf DAVID ;Borra la variable DAV1


bsf STATUS,RP0 ;Selecciona pagina 1 de datos
movlw b'00001111'
movwf OPTION_REG ;Preescaler de 128 para perro
;guardián
bcf INTCON,GIE ;Desconecta interrupciones
bcf STATUS,RP0 ;Selecciona pagina 0 de datos
clrwdt ;Refresca perro guardián
call UP_LCD ;Configura RB y RA para control del LCD
call LCD_INI ;Rutina de inicialización del LCD
movlw b'00001100'
call LCD_REG ;Conecta el LCD
movlw b'00000001' ;Borra el LCD y lo sitúa en la
;posición de inicio (HOME)
call LCD_REG

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
20 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

;Salida del mensaje "Emisor de datos".

movlw Mensaje2
movwf Temp_1 ;Carga la variable con el inicio del mensaje
movlw .15
movwf Temp_2 ;Nº de caracteres del mensaje

INICIO_2: call TABLA ;Lee el carácter de la tabla


call LCD_DATO ;Lo visualiza en el LCD
bcf Txd_pin ;Desactiva transmisión para que
;receptor no reciba datos erróneos
call delay ;Retardo en la visualización del carácter
incf Temp_1,F ;Va al siguiente carácter de la tabla
decfsz Temp_2,F ;Si es el último sale del bucle.
goto INICIO_2

clrwdt
btfsc DAVID,0 ;Si es la primera vez que pasa salta
goto $+9 ;para visualizar otro mensaje.
movlw 0xc0
call LCD_REG ;Segunda línea del LCD

;Visualización del mensaje "en serie con CRC".

movlw Mensaje3
movwf Temp_1
movlw .16
movwf Temp_2
bsf DAVID,0 ;Lo pone a uno para que la próxima no
goto INICIO_2 ;sea otra vez la primera pasada.

bcf DAVID,0
call delay
call delay
call LCD_INI ;Repetimos el proceso para visualizar
movlw b'00001100' ;dos nuevos mensajes.
call LCD_REG
movlw b'00000001'
call LCD_REG
movlw Mensaje ;Visualización del mensaje "Dato:"
movwf Temp_1
movlw .6
movwf Temp_2

INICIO_1: call TABLA


call LCD_DATO
incf Temp_1,F
decfsz Temp_2,F
goto INICIO_1
clrwdt
btfsc DAVID,0
goto LOOP ;Si es la 2ª pasada se va a LOOP
movlw 0xc0
call LCD_REG
movlw Mensaje1 ;Visualización del mensaje "CRC:"
movwf Temp_1
movlw .4
movwf Temp_2
bsf DAVID,0
goto INICIO_1

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
21

**********************************************************************
Bucle principal del programa.

LOOP: clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del
bucle
btfsc STATUS,Z
goto LOOP

call Key_BCD
call UP_LCD
btfss DAVID,7 ;Si es la 1ª pasada va a primera
goto primera
btfss DAVID,6 ;Si es la 2ª pasada va a segunda
goto segunda
goto tercera ;Si no es ni 1ª ni 2ª, va a tercera
primera bsf DAVID,7 ;Lo activa para que sea 2ª pasada
movwf BIT2
movlw 0x86
goto sigue
segunda bsf DAVID,6 ;Lo activa para que sea 3ª pasada
movwf BIT1
rlf BIT1,1 ;Rota a la izquierda BIT1 cuatro veces
rlf BIT1,1 ;para dejar el dato en las cuatro
rlf BIT1,1 ;posiciones de más peso.
rlf BIT1,1
bcf BIT1,3 ;Las cuatro posiciones de menos peso las
;pone a cero.
bcf BIT1,2
bcf BIT1,1
bcf BIT1,0
movlw 0x87
goto sigue
tercera bsf DAVID,5 ;Para indicar que es la 3ª pasada
movf Key_1,W
iorwf BIT1,F ;Copia la tecla en los cuatro bits
bsf Key_1,7 ; de menos peso de BIT1
bsf Key_1,6 ;La variable Key_1 se utiliza como
bsf Key_1,5 ;auxiliar en el archivo teclado.asm
bsf Key_1,4
movf Key_1,W
andwf BIT1,F
movlw 0x88
sigue call LCD_REG ;Posiciona el cursor del LCD según pasada.
movf Tecla,W ;Mueve la tecla pulsada al acumulador
sublw .9
btfss STATUS,C ;¨ Es mayor que nueve ?
goto Mayor_que_9 ;Sí
movf Tecla,W ;No
addlw 0x30 ;Ajuste ASCII de datos del 0 al 9
call LCD_DATO ;Visualiza el dato
goto serie

Mayor_que_9 movf Tecla,W


addlw 0x37 ;Ajuste ASCII de datos de la A la F
call LCD_DATO

serie bsf STATUS,RP0 ;Selecciona página 1

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
22 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

movlw b'11101111'
movwf PORTB ;RB5 entrada y RB4 salida
bsf OPTION_REG,NOT_RBPU ;Desconecta cargas pull-up
bcf STATUS,RP0 ;Selecciona página 0
bsf Txd_pin ;Activa pin de transmisión
movf Tecla,W
movwf Txdreg ;Transmite carácter pulsado
call delay ;Retardo en la transmisión
call TxD
btfsc DAVID,5 ;Si es la 3ª pasada va a CRC
goto crc
goto LOOP

Rutina de temporización de unos 0,2 segundos.


delay movlw .200
movwf DAV1
delay1 movlw .250
movwf DAV ;La temporización se realiza mediante
delay2 nop ;las restas sucesivas de dos variables
decfsz DAV,F
goto delay2
decfsz DAV1,F
goto delay1
return

Esta rutina se encarga de transmitir los 12 bits del código CRC


mediante la transmisión de CRC1 y CRC2.
crc movlw 0xc4
call LCD_REG ;Coloca posición en LCD
call PROG ;Obtiene código CRC de BIT1 y BIT2
clrf DAVID ;Borra la variable para que la
;próxima sea la 3ª pasada.
bsf STATUS,RP0 ;Selecciona página 1
movlw b'11101111'
movwf PORTB ;RB5 entrada y RB4 salida
bsf OPTION_REG,NOT_RBPU ;Desconecta cargas pull-up
bcf STATUS,RP0 ;Selecciona página 0
bsf Txd_pin
movf CRC1,W
movwf Txdreg
call delay
call TxD ;Transmite los 8 primeros bits del CRC
bsf Txd_pin
movf CRC2,W
movwf Txdreg
call delay
call TxD ;Transmite los 4 últimos bits del CRC
call UP_LCD
movlw .4
movwf DAV1
rlf CRC2,F ;Rota cuatro posiciones para colocar
rlf CRC2,F ;los 4 bits a visualizar de CRC2 en
rlf CRC2,F ;las posiciones de más peso.
rlf CRC2,F
crc2 rlf CRC2,F
btfsc STATUS,C ;Si al rotar C vale uno, el bit a
movlw '1' ;visualizar será un 1 si no será un 0
btfss STATUS,C
movlw '0'
call LCD_DATO
decfsz DAV1,F ;Cuando imprima 4 bits salta a crc2

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
23

goto crc2 ;para ver los otros ocho.


movlw .8
movwf DAV1 ;Para visualizar 8 datos
crc1 rlf CRC1,F
btfsc STATUS,C
movlw '1'
btfss STATUS,C
movlw '0'
call LCD_DATO
decfsz DAV1,F ;Cuando visualiza los 8 vuelve a LOOP
goto crc1
goto LOOP

**********************************************************************
Esta rutina se encarga de darnos el código CRC de los datos
representados en BIT1 y BIT2. El resultado de 12 bits es devuelto en
CRC1 y en los cuatro bits de menos peso de CRC2.

PROG movlw d'8'


movwf Temp_1
movlw d'5'
movwf Temp_2
clrf CRC1
clrf CRC2
clrf DAV1
movf BIT1,w
movwf REG1
base movf CRC1,w
xorwf REG1,F ;Or exclusiva entre REG1 y el acumulador
btfsc REG1,0
goto vale1
goto vale0
vale1 movlw b'00001000'
movwf DAV
movlw b'00001110'
movwf REG2
movlw b'00000010'
movwf REG1
goto $+5 ;Va cinco posiciones adelante
vale0 movlw b'11110111'
movwf DAV
clrf REG1
clrf REG2
movf REG2,w
xorwf CRC2,F
movf REG1,w
xorwf CRC1,F
goto rotar ;Rota una posición el código CRC.
finrot bcf CRC2,7
movf DAV,w
btfsc DAV,3
iorwf CRC2,F
btfss DAV,3
andwf CRC2,F
btfsc DAV1,0
goto base2
rrf BIT1,1
movf BIT1,w
movwf REG1
decfsz Temp_1,1
goto base

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
24 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

movlw d'1'
movwf DAV1
base2 movf BIT2,w
movwf REG1
rrf BIT2,1
decfsz Temp_2,1
goto base
return ;Si se han acabado los 4 bits de BIT2 sale de la
rutina.

**********************************************************************
La rutina se encarga de rotar una posición a la derecha el código CRC,
de forma que el bit de menos peso de CRC2 pasa a ser el de más peso de
CRC1.

rotar btfsc CRC1,0


bsf DAV1,7
btfss CRC1,0
bcf DAV1,7
btfsc CRC2,0
bsf DAV1,6
btfss CRC2,0
bcf DAV1,6
rrf CRC1,1
rrf CRC2,1
btfsc DAV1,7
bsf CRC1,7
btfss DAV1,7
bcf CRC1,7
btfsc DAV1,6
bsf CRC2,7
btfss DAV1,6
bcf CRC2,7
btfsc CRC1,0
bsf CRC2,3
btfss CRC1,0
bcf CRC2,3
btfsc CRC2,7
bsf CRC1,7
btfss CRC2,7
bcf CRC1,7
bcf CRC2,7
goto finrot ;Vuelve a la posición siguiente de donde
se ;llamo a la subrutina.

end

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
25

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
26 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
27

Organigrama general para el programa EMISOR.ASM

RECEPT.ASM

El programa toma las teclas pulsadas en el teclado del upic


trainer plus de la placa emisora a través del puerto serie. Las teclas
son recibidas de tres en tres y representadas en el LCD. Una vez
convertidas a su código CRC se recibe vía serie el código calculado
por el emisor y se comprueba si es igual al calculado, comprobándose
así si hay o no hay error en la transmisión.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
28 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

list p=16f84 ;Se define el tipo de dispositivo

include "a:\p16f84.inc" ;Incluye archivo con definición de


;los registros.

Lcd_var equ 0x0c ;Inicio de las variables para el LCD


Rs232_var equ 0x11 ;Inicio de las variables de las rutinas RS232
Temp_1 equ 0x13 ;Definición de las distintas variables usadas
Temp_2 equ 0x14 ;en el programa.
DAVID equ 0x15
BIT1 equ 0x16
BIT2 equ 0x17
CRC1 equ 0x18
CRC2 equ 0x19
REG1 EQU 0x1a
REG2 EQU 0x1b
SER equ 0x1c
SER1 equ 0x1d
BAUDIOS equ .9600 ;Velocidad de comunicación
CLKIN equ .4000000 ;Frecuencia de trabajo en c/s

org 0 ;Para que al resetear se vaya a INICIO


goto INICIO
org 5 ;Indica donde comienza el programa

include "a:\LCD.ASM" ;Carga rutinas del LCD


include "a:\RS232.ASM" ;Carga rutinas para la comunicación

TABLA movf Temp_1,W ;Nos va a llevar los desplazamientos dentro


movwf PCL ;de los distintos mensajes

**********************************************************************
A continuación se definen los distintos mensajes que van a aparecer
en el LCD del upic trainer.

Mensaje equ $
retlw 'D'
retlw 'a'
retlw 't'
retlw 'o'
retlw ':'
retlw ' '
retlw 0x00

Mensaje1 equ $
retlw 'R'
retlw 'e'
retlw 'c'
retlw 'e'
retlw 'p'
retlw 'c'
retlw 'i'
retlw 'o'
retlw 'n'
retlw ':'
retlw 0x00

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
29

Mensaje2 equ $
retlw ' '
retlw 'R'
retlw 'e'
retlw 'c'
retlw 'e'
retlw 'p'
retlw 't'
retlw 'o'
retlw 'r'
retlw ' '
retlw 's'
retlw 'e'
retlw 'r'
retlw 'i'
retlw 'e'
retlw 0x00

Mensaje3 equ $
retlw 'd'
retlw 'e'
retlw ' '
retlw 'd'
retlw 'a'
retlw 't'
retlw 'o'
retlw 's'
retlw ' '
retlw 'c'
retlw 'o'
retlw 'n'
retlw ' '
retlw 'C'
retlw 'R'
retlw 'C'
retlw 0x00

**********************************************************************
Comienzo del programa.

INICIO: clrf DAVID


bsf STATUS,RP0 ;Selecciona pagina 1 de datos
movlw b'00001111'
movwf OPTION_REG ;Preescaler de 128 para perro
;guardián
bcf INTCON,GIE ;Desconecta interrupciones
bcf STATUS,RP0 ;Selecciona pagina 0 de datos
clrwdt ;Refresca perro guardián
call UP_LCD ;Configura RB y RA para control del LCD
call LCD_INI ;Rutina de inicialización del LCD
movlw b'00001100'
call LCD_REG ;Conecta el LCD
movlw b'00000001' ;Borra el LCD y lo sitúa en la
;posición
call LCD_REG ;de inicio ( HOME ).

;Salida del mensaje "Receptor serie".

movlw Mensaje2
movwf Temp_1 ;Carga la variable con el inicio
;del mensaje

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
30 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

movlw .15
movwf Temp_2 ;Nº de caracteres del mensaje

INICIO_2: call TABLA ;Lee el carácter de la tabla


call LCD_DATO ;Lo visualiza en el LCD
call delay ;Retardo en la visualización del carácter
incf Temp_1,F ;Va al siguiente carácter de la tabla
decfsz Temp_2,F ;Si es el último sale del bucle.
goto INICIO_2

clrwdt
btfsc DAVID,0 ;Si es la primera vez que pasa
;salta para ver otro mensaje
goto $+9
movlw 0xc0
call LCD_REG ;Segunda línea del LCD

;Visualización del mensaje "de datos con CRC".

movlw Mensaje3
movwf Temp_1
movlw .16
movwf Temp_2
bsf DAVID,0 ;Lo pone a uno para que la próxima no sea
goto INICIO_2 ;otra vez la primera pasada.

bcf DAVID,0
call delay
call delay

call LCD_INI ;Repetimos el proceso para visualizar


movlw b'00001100' ;dos nuevos mensajes.
call LCD_REG
movlw b'00000001'
call LCD_REG

movlw Mensaje ;Visualización del mensaje "Dato:"


movwf Temp_1
movlw .6
movwf Temp_2

INICIO_1: call TABLA


call LCD_DATO
incf Temp_1,F
decfsz Temp_2,F
goto INICIO_1

clrwdt
btfsc DAVID,0
goto LOOP ;Si es la 2ª pasada se va a LOOP
movlw 0xc0
call LCD_REG
movlw Mensaje1 ;Visualización del mensaje "Recepcion:"
movwf Temp_1
movlw .10
movwf Temp_2
bsf SER,0
goto INICIO_1

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
31

**********************************************************************
Bucle principal del programa.

LOOP: clrwdt
bsf STATUS,RP0 ;Selecciona página 1
movlw b'11101111'
movwf PORTB ;RB5 entrada y RB4 salida
bsf OPTION_REG,NOT_RBPU ;Desconecta cargas pull-up
bcf STATUS,RP0 ;Selecciona página 0

bsf Rxd_pin ;Línea de recepción a "1"

comp movlw .100 ;Este bucle nos ejecuta un retardo


movwf SER1 ;de 0,1 segundos. El pin de recepción
comp2 movlw .255 ;deberá estar a 1 durante ese tiempo
movwf SER ;de manera continuada. Si este pin no
comp1 btfss Rxd_pin ;esta a 1 durante 0,1 segundos, vuelve
goto comp ;al comienzo de una nueva cuenta de
decfsz SER,F ;0,1 segundos. Con esto no consideramos
goto comp1 ;como datos las operaciones que este
decfsz SER1,F ;realizando el emisor.
goto comp2

serie call RxD ;Espera recibir un carácter

call UP_LCD
btfss DAVID,7 ;Si es la 1ª pasada va a primera
goto primera
btfss DAVID,6 ;Si es la 2ª pasada va a segunda
goto segunda
goto tercera ;Si no es ni 1ª ni 2ª, va a tercera
primera bsf DAVID,7 ;Para que la próxima sea 2ª pasada
movlw 0x86
call LCD_REG ;Posiciona el cursor
movf Rxdreg,W
movwf BIT2 ;Manda a BIT2 el carácter recibido
goto sigue
segunda bsf DAVID,6 ;Lo activa para que la próxima sea 3ª
;pasada
movlw 0x87
call LCD_REG
movf Rxdreg,W
movwf BIT1 ;Manda a los cuatro bits de mas peso de
rlf BIT1,1 ;BIT1 el caracter recibido.
rlf BIT1,1
rlf BIT1,1
rlf BIT1,1
bcf BIT1,3
bcf BIT1,2
bcf BIT1,1
bcf BIT1,0
goto sigue
tercera movlw 0x88
call LCD_REG
movf Rxdreg,W
movwf DAVID
iorwf BIT1,F ;Coloca el carácter recibido en los 4
bsf DAVID,7 ;bits de menos peso de la variable BIT1.
bsf DAVID,6
bsf DAVID,5

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
32 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

bsf DAVID,4
movf DAVID,W
andwf BIT1,F
clrf DAVID ;Para que vuelva a ser 1ª pasada
sigue movf Rxdreg,W ;Mueve la tecla recibida al acumulador
sublw .9
btfss STATUS,C ;¿ Es mayor que nueve ?
goto Mayor_que_9 ;Sí
movf Rxdreg,W ;No
addlw 0x30 ;Ajuste ASCII de datos del 0 al 9
call LCD_DATO ;Visualiza el dato
btfsc DAVID,7 ;Si es 3ª pasada va a crc
goto LOOP
goto crc
Mayor_que_9 movf Rxdreg,W
addlw 0x37 ;Ajuste ASCII de datos de la A a la F
call LCD_DATO
btfsc DAVID,7
goto LOOP
goto crc ;Si es 3ª pasada va a crc

**********************************************************************
Esta rutina se encarga de obtener el código CRC de los caracteres
recibidos. Al resultado le vuelve a realizar el código CRC con el
código CRC recibido del emisor. Si el resultado de esta operación es
cero, la transmisión habrá sido correcta.
crc movlw 0xc4
call LCD_REG
clrf CRC1 ;Borra CRC
clrf CRC2
call PROG ;Obtiene CRC de los datos BIT1 y BIT2
bsf STATUS,RP0 ;Selecciona página 1
movlw b'11101111'
movwf PORTB ;RB5 entrada y RB4 salida
bsf OPTION_REG,NOT_RBPU ;Desconecta cargas pull-up
bcf STATUS,RP0 ;Selecciona página 0
bsf Rxd_pin ;Línea de recepción a "1"

com movlw .100 ;Este bucle es similar al comp.


movwf SER1
com2 movlw .255
movwf SER
com1 btfss Rxd_pin
goto com
decfsz SER,F
goto com1
decfsz SER1,F
goto com2
call RxD ;Espera recibir un carácter

movf Rxdreg,W
movwf BIT1 ;Almacena carácter recibido en BIT1
call RxD
movf Rxdreg,W ;Espera recibir un carácter
movwf BIT2 ;Almacena carácter recibido en BIT2
call PROG ;Obtiene CRC de BIT1 y BIT2 a partir del
;CRC obtenido antes.
call UP_LCD

clrw ;Borra el acumulador


iorwf CRC1,F ;Or entre CRC1 y el acumulador

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
33

btfss STATUS,Z
goto error1 ;Si CRC1 no es cero, se va a error
clrw
bcf CRC2,7
bcf CRC2,6
bcf CRC2,5
bcf CRC2,4
iorwf CRC2,F
btfss STATUS,Z ;Si los 4 bits de menos peso de CRC2
goto error1 ;no son cero se va a error
goto bueno ;Si el CRC es nulo va a bueno

;Visualización del mensaje "Error"


error1 movlw 0xcb
call LCD_REG
movlw 'E'
call LCD_DATO
movlw 'r'
call LCD_DATO
movlw 'r'
call LCD_DATO
movlw 'o'
call LCD_DATO
movlw 'r'
call LCD_DATO
goto LOOP

;Visualización del mensaje "Buena"


bueno movlw 0xcb
call LCD_REG
movlw 'B'
call LCD_DATO
movlw 'u'
call LCD_DATO
movlw 'e'
call LCD_DATO
movlw 'n'
call LCD_DATO
movlw 'a'
call LCD_DATO
goto LOOP

**********************************************************************
Rutina de temporización de unos 0,2 segundos.

delay movlw .200


movwf SER1
delay1 movlw .250
movwf SER ;La temporización se realiza mediante
delay2 nop ;las restas sucesivas de dos variables
decfsz SER,F
goto delay2
decfsz SER1,F
goto delay1
return

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
34 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

**********************************************************************
Esta rutina es la que realiza en realidad la conversión de los datos a
su código CRC.

PROG movlw d'8'


movwf Temp_1
movlw d'5'
movwf Temp_2
clrf SER1
movf BIT1,w
movwf REG1
base movf CRC1,w
xorwf REG1,F
btfsc REG1,0
goto vale1
goto vale0
vale1 movlw b'00001000'
movwf SER
movlw b'00001110'
movwf REG2
movlw b'00000010'
movwf REG1
goto $+6
vale0 movlw b'11110111'
movwf SER
clrf REG1
clrf REG2
goto $+1
movf REG2,w
xorwf CRC2,F
movf REG1,w
xorwf CRC1,F
goto rotar ;Rota una posición el código CRC.
finrot bcf CRC2,7
movf SER,w
btfsc SER,3
iorwf CRC2,F
btfss SER,3
andwf CRC2,F

btfsc SER1,0
goto base2
rrf BIT1,1
movf BIT1,w
movwf REG1
decfsz Temp_1,1
goto base
movlw d'1'
movwf SER1
base2 movf BIT2,w
movwf REG1
rrf BIT2,1
decfsz Temp_2,1
goto base
return ;Si se han acabado los 4 bits de BIT2 sale de
la rutina.

**********************************************************************
La rutina se encarga de rotar una posición a la derecha el código CRC,
de forma que el bit de menos peso de CRC2 pasa a ser el de más peso de

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
35

CRC1.

rotar btfsc CRC1,0


bsf SER1,7
btfss CRC1,0
bcf SER1,7
btfsc CRC2,0
bsf SER1,6
btfss CRC2,0
bcf SER1,6
rrf CRC1,1
rrf CRC2,1
btfsc SER1,7
bsf CRC1,7
btfss SER1,7
bcf CRC1,7
btfsc SER1,6
bsf CRC2,7
btfss SER1,6
bcf CRC2,7
btfsc CRC1,0
bsf CRC2,3
btfss CRC1,0
bcf CRC2,3
btfsc CRC2,7
bsf CRC1,7
btfss CRC2,7
bcf CRC1,7
bcf CRC2,7
goto finrot ;Vuelve a la posición siguiente de donde se
;llamo a la subrutina.
return

end

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
36 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
37

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
38 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Organigrama general del programa RECEPT.ASM

Organigrama de la subrutina PROG empleada por


EMISOR.ASM y RECEPT.ASM para la obtención
del código CRC en las variables CRC1 y CRC2.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
39

RS232.ASM

Conjunto de rutinas diseñadas para los dispositivos 16cxx que


transmiten o reciben caracteres en serie.

CLKOUT equ CLKIN >> 2 ;Calcula duración del ciclo máquina


DELAY equ ((CLKOUT/BAUDIOS)/3)-.5 ;Calcula la duración del bit
DELAY_L equ low DELAY ;Calcula la parte baja de DELAY
DELAY_H equ high DELAY+1 ;Calcula la parte alta de DELAY
DELAY_START equ (DELAY/2)+DELAY ;Calcula duración del bit de inicio
DELAY_START_L equ low DELAY_START ;Calcula parte baja de DELAY_START
DELAY_START_H equ high DELAY_START+1 ;Calcula parte alta de
DELAY_START

CBLOCK Rs232_var ;Reserva de memoria para las variables


;utilizadas
Txdreg ;Registro de transmisión
Rxdreg ;Registro de recepción
Cont ;Contador de bits transmitidos
Dlycnt_l ;Contador de delay parte baja
Dlycnt_h ;Contador de delay parte alta
ENDC

#define Txd_pin PORTB,4 ;Línea de transmisión


#define Rxd_pin PORTB,5 ;Línea de recepción

**********************************************************************
Rutina de transmisión. Tras el bit de inicio se transmite la palabra
de 8 bits contenida en el registro transmisor Txdreg seguido de dos
bits de stop.

TxD
movlw 8 ;Transmisión de palabras de 8 bits
movwf Cont

bcf Txd_pin ;Transmite el bit de inicio


call Delay_bit

TxD_next bcf STATUS,C


rrf Txdreg,F ;Desplazamiento a dcha para
;transmitir 1º el bit LSB
btfsc STATUS,C
bsf Txd_pin ;Si el carry es uno, se transmite
;un "1"
btfss STATUS,C
bcf Txd_pin ;Si el carry es cero se transmite
;un "0"
call Delay_bit
decfsz Cont,F ;Decrementa contador de bits
goto TxD_next ;Cuando transmite los 8 sale del
;bucle
bsf Txd_pin ;Transmite un bit de stop
call Delay_bit
bsf Txd_pin ;Transmite segundo bit de stop

call Delay_bit
retlw 0
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
40 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

**********************************************************************
Rutina de recepción. Trás detectar el bit de inicio, espera recibirse
una palabra 8 bits. Se recibe primero el bit de menos peso.

RxD clrf Rxdreg ;Borrar registro receptor


RxD_1 clrwdt ;Refresco del WDT
btfsc Rxd_pin
goto RxD_1 ;Espera el bit de inicio ("0")
call Delay_ini ;Tiempo de retraso del bit de inicio (1.5
;resto de los bits)

movlw 8 ;8 bits de datos


movwf Cont

RxD_next bcf STATUS,C

rrf Rxdreg,F ;Recibir primero el bit de menos peso

btfsc Rxd_pin ;Chequea bit de entrada y mira si es "1"

bsf Rxdreg,7 ;Activa bit 7 de Rxdreg


call Delay_bit ;Espera entre bits
decfsz Cont,F ;Decrementa contador de nº de bits
goto RxD_next
call Delay_bit ;Dos retardos correspondientes a los
;dos bits de stop
call Delay_bit

retlw 0

**********************************************************************
Rutina de temporización para los intervalos entre bit y bit

Delay_bit clrwdt
movlw DELAY_H
movwf Dlycnt_h
Delay_bit_1 movlw DELAY_L
movwf Dlycnt_l
Delay_bit_2 decfsz Dlycnt_l,F
goto Delay_bit_2
decfsz Dlycnt_h,F
goto Delay_bit_1
retlw 0

*********************************************************************
Rutina de temporización para el bit de inicio en el modo de recepción.
Esta temporización es de 1.5 con respecto a la del resto de bits. Así
se consigue que el muestreo sea aproximadamente en el centro de cada
bit recibido.

Delay_ini clrwdt
movlw DELAY_START_H
movwf Dlycnt_h
Delay_ini_1 movlw DELAY_START_L
movwf Dlycnt_l
Delay_ini_2 decfsz Dlycnt_l,F
goto Delay_ini_2
decfsz Dlycnt_h,F
goto Delay_ini_1

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
41

retlw 0

TECLADO.ASM

Presenta un conjuntos de rutinas que permiten la gestión de un


teclado hexadecimal. El teclado hexadecimal se supone conectado a la
puerta B y su disposición es la siguiente:

RB0 RB1 RB2 RB3

TECLA CODIGO
----- --------------
|---|---|---|---| 0 01111101 = 0x7D
RB4 --> | 1 | 2 | 3 | F | 1 11101110 = 0xEE
|---|---|---|---| 2 11101101 = 0xED
RB5 --> | 4 | 5 | 6 | E | 3 11101011 = 0xEB
|---|---|---|---| 4 11011110 = 0xDE
RB6 --> | 7 | 8 | 9 | D | 5 11011101 = 0xDD
|---|---|---|---| 6 11011011 = 0xDB
RB7 --> | A | 0 | B | C | 7 10111110 = 0xBE
|---|---|---|---| 8 10111101 = 0xBD
9 10111011 = 0xBB
A 01111110 = 0x7E
B 01111011 = 0x7B
C 01110111 = 0x77
D 10110111 = 0xB7
E 11010111 = 0xD7
F 11100111 = 0xE7

cblock Key_var ;Reserva de memoria para las variables


Tecla ;Para devolver el código de la tecla
Key_1 ;Nº de columnas a explorar
Key_2 ;Temporal de código
Key_Delay_1 ;Variables de temporización
Key_Delay_2
endc

**********************************************************************
Rutina de exploración del teclado. La variable "Tecla" retorna con el
código de la tecla pulsada o el código 0x80 si no se pulsa ninguna.

Key_Scan: bsf STATUS,RP0 ;Selecciona página 1


movlw b'00001111'
movwf PORTB ;RB7-RB4 salidas, RB3-RB0 entradas
bsf OPTION_REG,NOT_RBPU ;Activa cargas pull-up
bcf STATUS,RP0 ;Selecciona página 0
movlw 4
movwf Key_1 ;Nº de columnas a explorar
movlw b'01111111'
movwf Tecla ;Columna a activar
Key_Scan_1: movf Tecla,W
movwf PORTB ;Activa columna
nop
movf PORTB,W
movwf Key_2
subwf Tecla,W ;Lee las filas

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
42 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

btfss STATUS,Z ;¿ Hay alguna pulsada ?


goto Key_Scan_2 ;No hay ninguna pulsada
bsf STATUS,C ;No hay ninguna en esa columna
rrf Tecla,F ;Selecciona siguiente columna
decfsz Key_1,F
goto Key_Scan_1
movlw 0x80 ;Retorna código 0x80 (no hay pulsación)
movwf Tecla
return

Key_Scan_2: movlw .100 ;Bucle de temporización de unos 20mS


movwf Key_Delay_1 ;para evitar el rebote al pulsar

Key_Scan_3: clrf Key_Delay_2


Clrwdt

Key_Scan_4: decfsz Key_Delay_2,F


goto Key_Scan_4
decfsz Key_Delay_1,F
goto Key_Scan_3

movf Tecla,W ;Tras la temporización se lee nuevamente


movwf PORTB ;si la tecla es la misma. Así se evitan
;los rebotes
nop
movf PORTB,W
subwf Key_2,W
btfss STATUS,Z ;Es la misma ??
goto Key_Scan_1 ;No, seguir con la exploración
movf Key_2,W ;Si guardar en variable de salida "Tecla"
movwf Tecla
return

**********************************************************************
Convierte el código de la tecla que haya en la variable "Tecla" a
Hexadecimal(0-F). El resultado se devuelve en la variable "Tecla".

Key_Tabla movf Key_1,W ;Calcula desplazamiento sobre


addwf PCL,F ;sobre la tabla
retlw 0x7d ;0
retlw 0xee ;1
retlw 0xed ;2
retlw 0xeb ;3
retlw 0xde ;4
retlw 0xdd ;5
retlw 0xdb ;6
retlw 0xbe ;7
retlw 0xbd ;8
retlw 0xbb ;9
retlw 0x7e ;A
retlw 0x7b ;B
retlw 0x77 ;C
retlw 0xb7 ;D
retlw 0xd7 ;E
retlw 0xe7 ;F

Key_BCD: movf Tecla,W


movwf Key_2 ;Almacena el código temporalmente
clrf Key_1 ;Contador BCD a 0

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
43

Key_BCD_2 call Key_Tabla ;Busca código en la tabla


subwf Key_2,W ;Compara con el de la tecla
btfsc STATUS,Z ;Coincide ??
goto Key_BCD_1 ;Si
incf Key_1,F ;No, incrementa contador BCD
goto Key_BCD_2

Key_BCD_1 movf Key_1,W


movwf Tecla ;Carga BCD en la variable de salida

return

Organigrama de la subrutina Key_Scan

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
44 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Organigrama de la subrutina Key_BDC

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
45

LCD.ASM

El conjunto de rutinas que se presentan a continuación permiten


realizar las tareas básicas de control del módulo de visualización
LCD. Se emplean los dispositivos 16cxx.

#define ENABLE bsf PORTA,2 ;Activa E


#define DISABLE bcf PORTA,2 ;Desactiva
#define LEER bsf PORTA,1 ;Pone LCD en Modo RD
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS (modo comando)
#define ON_COMANDO bsf PORTA,0 ;Activa RS

CBLOCK Lcd_var ;Inicio de las variables. Será la primera

Lcd_Temp_1 ;dirección libre disponible


Lcd_Temp_2
ENDC

**********************************************************************
Rutina de configuración del PIC para el LCD.

UP_LCD bsf STATUS,RP0 ;Banco 1


clrf PORTB ;RB <0-7> salidas digitales
clrf PORTA ;RA <0-7> salidas digitales
bcf STATUS,RP0 ;Banco 0
OFF_COMANDO ;RS=0
DISABLE ;E=0
Return

**********************************************************************
Rutina para lectura del Flag Busy y la dirección.

LCD_BUSY LEER ;Pone el LCD en Modo RD


bsf STATUS,RP0
movlw H'FF'
movwf PORTB ;Puerta B como entrada
bcf STATUS,RP0 ;Selecciona el banco 0
ENABLE ;Activa el LCD
nop
btfsc PORTB,7 ;Chequea bit de Busy
goto $-1
DISABLE ;Desactiva LCD
bsf STATUS,RP0
clrf PORTB ;Puerta B salida
bcf STATUS,RP0
ESCRIBIR ;Pone LCD en modo WR
return

**********************************************************************
Esta rutina efectúa un pulso de Enable

LCD_E ENABLE ;Activa E


nop
DISABLE ;Desactiva E
return

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
46 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

**********************************************************************
Rutina para escritura de datos en DDRAM o CGRAM.El dato es tomado de W

LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)


movwf PORTB ;Valor ASCII a sacar por portb
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato).
goto LCD_E ;Genera pulso de E

**********************************************************************
Esta rutina efectúa la escritura de un comando en el LCD. El código
del comando es toma de W.

LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)


movwf PORTB ;Código de comando.
call LCD_BUSY ;LCD libre?.
goto LCD_E ;SI. Genera pulso de E.

**********************************************************************
Rutina para la inicialización del LCD

LCD_INI movlw b'00111000'


call LCD_REG ;Código de instrucción
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;Código de instrucción
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;Código de instrucción
call LCD_DELAY ;Temporiza

**********************************************************************
Rutina de temporización de unos 5mS

LCD_DELAY: clrwdt
movlw .10
movwf Lcd_Temp_1
clrf Lcd_Temp_2
LCD_DELAY_1: decfsz Lcd_Temp_2,F
goto LCD_DELAY_1
decfsz Lcd_Temp_1,F
goto LCD_DELAY_1
return

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
47

P16F84.INC

Este archivo define las configuraciones, registros, y otros bits


utilizados como información para la programación en el micro-
procesador pic 16f84 (equivalente al 16c84). Los nombres empleados han
sido obtenidos del manual del 16f84 (Ver guía del pic 16x84). El
microprocesador ha de ser especificado antes de incluir este archivo
en el programa base. Para la selección del mismo, bastará poner en el
archivo de programa la instrucción: LIST P=16f84. En caso de
seleccionar otro pic, nos saldrá un mensaje de error.

LIST
NOLIST

Este archivo define las configuraciones, registros, y otros bits


utilizados como información en los microcontroladores pic 16f84. Los
nombres empleados han sido obtenidos del manual del 16f84. El
microprocesador ha de ser especificado antes de incluir este archivo
en el programa. Para la selección, basta poner en el archivo de
programa:

LIST P=16f84

IFNDEF __16F84

MESSG "Procesador seleccionado erróneo. Verificar la selección."

ENDIF

;Definiciones generales

W EQU H'0000'
F EQU H'0001'

; Registros

INDF EQU H'0000'


TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'

OPTION_REG EQU H'0081'


TRISA EQU H'0085'
TRISB EQU H'0086'
EECON1 EQU H'0088'
EECON2 EQU H'0089'

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
48 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

;Bits del registro STATUS

IRP EQU H'0007'


RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'

;Bits del registro INTCON

GIE EQU H'0007'


EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'

;Bits del registro OPTION

NOT_RBPU EQU H'0007'


INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'

;Bits del registro EECON1


EEIF EQU H'0004'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'

; Definición del microprocesador 16c84

__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'

_CP_ON EQU H'000F'


_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'

LIST

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
49

Capítulo 2

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
50 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
51

Practica 2: Escritura / lectura de Eprom


con código de errores Hamming

Antes de comenzar con la explicación de la práctica, se va a describir en que


consiste un código de errores Hamming.

Al escribir en una memoria (EPROM en nuestro caso), pueden ocurrir errores


denominados “duros” debido a defectos en la misma (fallos de fabricación o desgaste) o
errores “blandos” aleatorios. Los errores “blandos” pueden deberse sobre todo a fallos
en la fuente de alimentación. El código de errores Hamming nos va a detectar y corregir
errores “blandos” simples (en un solo bit). En la figura 4 se ilustra cómo se lleva a cabo
el proceso para detectar y corregir un error simple.

Figura 4. Diagrama de bloques del código corrector de errores

Cuando se van a escribir datos en memoria, se realiza un cálculo con ellos para
obtener un código. En la memoria se almacenan tanto los datos como el código, así se
va a almacenar una palabra de datos de M bits de datos + K bits de código.
Cuando se va a leer una palabra almacenada, se utiliza el código almacenado
para detectar y corregir errores. Se genera un nuevo código a partir de los datos
almacenados y se compara con el leído. La comparación se realiza bit a bit mediante
puertas OR-exclusivas. Si los dos códigos son iguales, los datos no tendrán errores; si

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
52 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

los códigos son distintos, habrá error en alguno de los datos y habrá que corregirlo
como veremos a continuación.

En la tabla 3, se presenta la longitud que ha de tener el código Hamming en


función de la longitud de los datos.

Bits de Bits de Bits del código Pérdida


datos comprobación Hamming %
8 4 12 50
16 5 21 31,25
32 6 38 18,75
64 7 71 10,94
128 8 136 6,25
256 9 270 3,52
Tabla 3. Tamaño del código Hamming

En nuestra práctica, se van a utilizar datos de 8 bits (insertados mediante dos


teclas del teclado hexadecimal), por tanto, el código Hamming constará de 12 bits (8 de
datos + 4 de comprobación). La columna de pérdida nos va a indicar, en tanto por
ciento, la cantidad de errores que puede corregir el código Hamming expresado.

En la Tabla 4, se presenta la distribución de los bits dentro del código Hamming


(serán 12 bits en nuestro caso).

Posición Posición Bit de Bit de


(Binario) comprobación datos
12 1100 M8
11 1011 M7
10 1010 M6
9 1001 M5
8 1000 C8
7 0111 M4
6 0110 M3
5 0101 M2
4 0100 C4
3 0011 M1
2 0010 C2
1 0001 C1
Tabla 4. Identificación de los bits del código Hamming

La posición 1, corresponde al bit 0 del código Hamming, la 2 corresponde al bit


1 del mismo y así hasta llegar a la doce que corresponderá al bit 11. De igual forma, M1
se corresponde con el bit 0 del dato, M2 con el bit 1 y así hasta M8 (será el bit 7).

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
53

A los bits de comprobación (C1, C2, C4 y C8) se le asignan aquellas posiciones


cuyos números son potencias de dos (posición 1, 2, 4 y 8). Estos bits de comprobación
se calculan como sigue:

C1 = M1  M2  M4  M5  M7
C2 = M1  M3  M4  M6  M7
C4 = M2  M3  M4  M8
C8 = M5  M6  M7  M8

Los símbolos  designan la operación OR-exclusiva. Cada bit de comprobación


se calcula realizando Or-exclusivas de todos los datos cuyo número de posición
contiene un uno en la correspondiente posición columna. Por ejemplo, la columna uno
de las direcciones contiene unos en las direcciones 3, 6, 7,10 y 11, por tanto C2 se
calculará realizando Or-exclusivas a los datos correspondientes a esas direcciones (1, 3,
4, 6 y 7 en este caso).

Recordar que una puerta OR-exclusiva nos da un cero a la salida cuando las
entradas son iguales (caso de dos entradas). En el caso de más de dos entradas, nos dan
un uno si el número de unos de entrada es impar y un cero si este es par.

Vamos a ver un ejemplo para verificar lo dicho hasta ahora. Supongamos que el
dato de entrada de 8 bits es 00100101 (25 por el teclado), con el bit M1 en la posición
de menos peso (bit 0). Los bits de comprobación van a ser:

C1 = 1  0  0  0  0 = 1
C2 = 1  1  0  1  0 = 1
C4 = 0  1  0  0 = 1
C8 = 0  1  0  0 = 1

Supongamos ahora que el bit 2 del dato (M3) se ve afectado por un error,
cambiando de 1 a 0. Cuando se recalculen los bits de comprobación (al leer), se tiene:

C1 = 1  0  0  0  0 = 1
C2 = 1  0  0  1  0 = 0
C4 = 0  0  0  0 = 0
C8 = 0  1  0  0 = 1

Cuando se comparan, mediante OR-exclusivas, los bits de comprobación


calculados en la lectura con los almacenados, se obtiene:

C8 C4 C2 C1
1 1 1 1
 1 0 0 1
-----------------------------
0 1 1 0

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
54 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

El resultado 0110, indica que en el bit 6 del código Hamming (M3) hay error,
debiéndose cambiar el 0 por el 1 y corrigiéndose así el error. Si el resultado de esta
operación hubiese sido cero, el dato no tendría ningún error. De igual forma si el
resultado solo contiene un 1, el error estaría en un bit de comprobación, siendo por tanto
correcto el dato.

La práctica trata de tomar datos desde el teclado y guardarlos en la memoria


EPROM del PIC 16F84 utilizando los códigos de Hamming vistos hasta ahora. El
programa realizado, nos indica el dato a escribir/leer, la posición que ocupa en memoria
y su código Hamming como se ve en la figura 5.

En primer lugar, el programa espera recibir una tecla y en función de esta realiza
una u otra función. Si la tecla pulsada no es A ni B ni C, el PIC nos muestra el mensaje
inicial con las teclas operativas.

- Si la tecla pulsada es la C, el PIC espera recibir dos nuevas teclas que insertará
en una variable a la que realizará el código Hamming. La primera de estas dos nuevas
teclas es insertada en las cuatro posiciones de más peso (bits 7-4) de la variable y la
segunda en las cuatro posiciones de menos peso (bits 3-0). El código Hamming
obtenido es visualizado en el LCD como puede apreciarse en la figura 5. Una vez
visualizado el mismo, el PIC volverá a esperar recibir una de las tres teclas anteriores.
La posición superior derecha del LCD se borra completamente tras pulsar la tecla C, ya
que no es necesario insertar ninguna posición de memoria en este caso.

Figura 5. Micro’pic trainer. En el LCD se observa


un ejemplo de funcionamiento de la práctica.

- Si la tecla pulsada es la B, el PIC espera recibir dos nuevas teclas que insertará
en un registro al que realizará el código Hamming. La primera de estas dos nuevas
teclas es insertada en las cuatro posiciones de más peso (bits 7-4) del registro utilizado y
la segunda en las cuatro posiciones de menos peso (bits 3-0). El código Hamming
obtenido es visualizado en el LCD y almacenado en dos registros (porque los registros
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
55

son de 8 bits y el Hamming calculado es de 12). Una vez visualizado el mismo, el PIC
espera recibir dos nuevas teclas que le indiquen la posición de memoria EPROM donde
deberá guardar el código obtenido. En la posición superior derecha del LCD aparecen
las siglas WR (write) y a su lado las dos teclas pulsadas para indicar la dirección. Estas
dos teclas son insertadas en un registro de direcciones (la primera en los 4 bits de más
peso y la segunda en los de menos). Dado que en el PIC 16F84, la memoria EPROM va
de la dirección 00h a la 3F, los dos bits de más peso de este registro de direcciones, son
puestos a cero por el programa. De igual forma, el bit de menos peso de este registro es
colocado a 0 para que la dirección de memoria en la que se graba sea siempre par (dado
que el código Hamming ocupa dos direcciones). Una vez grabado el código en la
dirección indicada, el programa vuelve a esperar una A, B o C para continuar.

- Si la tecla pulsada es la A, el PIC espera recibir dos nuevas teclas. En la


posición superior derecha del LCD aparecen las siglas RD (read) y a su lado las dos
teclas pulsadas para indicar la dirección. Estas dos teclas son insertadas en un registro
de direcciones ( la primera en los 4 bits de más peso y la segunda en los de menos ).
Dado que en el PIC 16F84, la memoria EPROM va de la dirección 00h a la 3F, los dos
bits de más peso de este registro de direcciones, son puestos a cero por el programa. De
igual forma, el bit de menos peso de este registro es colocado a 0 para que la dirección
de memoria en la que se graba sea siempre par (dado que el código Hamming ocupa dos
direcciones). A continuación el PIC realiza la lectura de la EPROM de la posición
indicada por el registro y de la siguiente, almacenando el resultado en dos registros que
contendrán el código Hamming a descifrar. Este código es visualizado en la parte
inferior del LCD y descifrado para obtener el dato (corrigiéndose en caso de error) que
será visualizado en la parte superior izquierda del LCD (ver figura 5). Una vez
visualizado el dato, el programa vuelve a esperar una A, B o C para continuar.

En las próximas paginas, se presenta un listado del programa utilizado en la


práctica, así como comentarios explicativos del mismo.

Hamming.asm: Es el programa que habrá que insertar en el PIC 16F84 para el


funcionamiento de la práctica.

Teclado.asm: se encarga de controlar el teclado hexadecimal.

Lcd.asm: se encarga de controlar el LCD.

P16f84.inc: El fichero incluye únicamente las definiciones de registros y


variables necesarias para programar el micro 16F84. La directiva include del
ensamblador permite incluirlo en cualquier programa fuente.

Estos últimos programas (LCD, teclado y p16f84) son los mismos que los
utilizados en la práctica 1, por tanto no se volverán a explicar.

Por último se presentan los tres organigramas (figuras 6, 7 y 8) correspondientes


al funcionamiento del programa, al codificador Hamming (obtiene el código Hamming

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
56 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

del dato introducido) y al decodificador Hamming (obtiene el dato a partir del código
Hamming).

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
57

HAMMING.ASM

El programa espera recibir una A, B o C del teclado y actúa


según esta. Si recibe una C, toma dos teclas y les realiza un código
Hamming. Si es una B hace lo mismo y además toma otras dos teclas para
indicar la posición de la memoria EPROM donde será guardado el código.
Si es una A, toma dos teclas para indicar la posición de memoria a
leer y decodifica la lectura mostrando en el LCD el dato que había
codificado. Al terminar cualquiera de estas tres opciones, el programa
vuelve a esperar una A, B o C.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
58 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

list p=16f84 ;Se define el tipo de dispositivo

include "a:\p16f84.inc" ;Incluye archivo con definición de registros

Lcd_var equ 0x0c ;Inicio de las variables para el LCD


Key_var equ 0x0e ;Inicio de las variables para el teclado
Temp_1 equ 0x13 ;Definición de las distintas variables utilizadas
Temp_2 equ 0x14 ;en el programa
DAVID equ 0x15
DAV equ 0x16
DAV1 equ 0x17
HAM1 equ 0x18
HAM2 equ 0x19

org 0 ;Para que al resetear se vaya a INICIO


goto INICIO
org 5 ;Indica donde comienza el programa

include "a:\LCD.ASM" ;Carga rutinas del LCD


include "a:\TECLADO.ASM" ;Carga rutinas del teclado

TABLA movf Temp_1,W ;Nos va a llevar los desplazamientos dentro


movwf PCL ;de los distintos mensajes

;***************************************************************************
;A continuación se definen los distintos mensajes que van a aparecer en el
;LCD del upic trainer.

Mensaje equ $
retlw 'D'
retlw 'a'
retlw 't'
retlw 'o'
retlw ':'
retlw ' '
retlw 0x00

Mensaje1 equ $
retlw 'C'
retlw 'H'
retlw ':'
retlw ' '
retlw 0x00
Mensaje2 equ $
retlw ' '
retlw 'C'
retlw 'o'
retlw 'd'
retlw 'i'
retlw 'g'
retlw 'o'
retlw ' '
retlw 'H'
retlw 'a'
retlw 'm'
retlw 'm'
retlw 'i'

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
59

retlw 'n'
retlw 'g'
retlw ' '
retlw 0x00

Mensaje3 equ $
retlw ','
retlw 'A'
retlw '='
retlw 'R'
retlw 'D'
retlw ','
retlw 'B'
retlw '='
retlw 'W'
retlw 'R'
retlw ','
retlw 'C'
retlw '='
retlw 'C'
retlw 'H'
retlw ' '
retlw 0x00

;***************************************************************************
;Comienzo del programa.

INICIO: clrf DAVID ;Borra la variable DAVID


bsf STATUS,RP0 ;Selecciona pagina 1 de datos
movlw b'00001111'
movwf OPTION_REG ;Preescaler de 128 para perro guardián
bcf INTCON,GIE ;Desconecta interrupciones
bcf STATUS,RP0 ;Selecciona pagina 0 de datos
clrwdt ;Refresca perro guardián

call UP_LCD ;Configura RB y RA para control del LCD


call LCD_INI ;Rutina de inicialización del LCD
movlw b'00001100'
call LCD_REG ;Conecta el LCD
movlw b'00000001' ;Borra el LCD y lo sitúa en la posición
call LCD_REG ;de inicio ( HOME ).

;Salida del mensaje "Codigo Hamming".


movlw Mensaje2
movwf Temp_1 ;Carga la variable con el inicio del mensaje
movlw .16
movwf Temp_2 ;Nº de caracteres del mensaje

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
60 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

INICIO_2: call TABLA ;Lee el carácter de la tabla


call LCD_DATO ;Lo visualiza en el LCD
call delay ;Retardo en la visualización del carácter
incf Temp_1,F ;Va al siguiente carácter de la tabla
decfsz Temp_2,F ;Si es el último sale del bucle.
goto INICIO_2
clrwdt
btfsc DAVID,0 ;Si es la primera vez que pasa salta
goto $+9 ;para visualizar otro mensaje.
movlw 0xc0
call LCD_REG ;Segunda línea del LCD

;Visualización del mensaje "A=RD,B=WR,C=CH".


movlw Mensaje3
movwf Temp_1
movlw .16
movwf Temp_2
bsf DAVID,0 ;Lo pone a uno para que la próxima no sea
goto INICIO_2 ;otra vez la primera pasada.
bcf DAVID,0
call delay
call delay
call LCD_INI ;Repetimos el proceso para visualizar dos
movlw b'00001100' ;nuevos mensajes.
call LCD_REG
movlw b'00000001'
call LCD_REG
movlw Mensaje ;Visualización del mensaje "Dato:"
movwf Temp_1
movlw .6
movwf Temp_2

INICIO_1: call TABLA


call LCD_DATO
incf Temp_1,F
decfsz Temp_2,F
goto INICIO_1
clrwdt
btfsc DAVID,0
goto LOOP ;Si es la 2ª pasada se va a LOOP
movlw 0xc0
call LCD_REG
movlw Mensaje1 ;Visualización del mensaje "CH:"
movwf Temp_1
movlw .4
movwf Temp_2
bsf DAVID,0
goto INICIO_1
clrf DAVID

;***************************************************************************
;Bucle principal del programa.

LOOP: clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle
btfsc STATUS,Z
goto LOOP

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
61

call delay ;Retardo para evitar rebotes.


movlw b'01111110'
subwf Tecla,W
btfsc STATUS,Z ;Si la tecla pulsada es una A va
goto borra2 ;a borra2
movlw b'01111011'
subwf Tecla,W
btfsc STATUS,Z ;Si es una B va a borra
goto borra
movlw b'01110111'
subwf Tecla,W
btfss STATUS,Z ;Si es una C va a borra1
goto INICIO ;Si no es ninguna vuelve a inicio
bcf DAVID,0 ;y nos muestra mensaje.m
goto borra1

borra bsf DAVID,0 ;Imprime WR: en la parte superior


movlw 0x86 ;derecha del LCD
call LCD_REG
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw 'W'
call LCD_DATO
movlw 'R'
call LCD_DATO
movlw ':'
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
goto Loop1

borra1 movlw 0x86 ;Borra la parte superior derecha


call LCD_REG ;del LCD
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
goto Loop1

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
62 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

borra2 movlw 0x86 ;Imprime RD en la parte superior


call LCD_REG ;derecha del LCD.
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
movlw 'R'
call LCD_DATO
movlw 'D'
call LCD_DATO
movlw ':'
call LCD_DATO
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
goto leer

;**************************************************************************
;Bucle principal si la tecla pulsada es la B o la C.

Loop1 clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle
btfsc STATUS,Z
goto Loop1

call Key_BCD ;Consigue código BCD de la tecla


call UP_LCD ;Reconfigura LCD
btfss DAVID,7 ;Si es la 1ª pasada va a primera
goto primera
goto segunda ;Si no es 1ª pasada, va a segunda
primera bsf DAVID,7 ;Lo activa para que la próxima sea 2ª pasada
movf Tecla,W
movwf DAV ;Copia la tecla pulsada en los 4 bits de más
rlf DAV,1 ;peso de DAV
rlf DAV,1
rlf DAV,1
rlf DAV,1
movlw 0x86
goto sigue

segunda bcf DAVID,7 ;Lo activa para que la próxima sea 1ª pasada
movf Tecla,W
iorwf DAV,1 ;Si es la segunda pasada copia la tecla en
bsf Key_1,7 ;los cuatro bits de menos peso de DAV
bsf Key_1,6 ;La variable Key_1 es utilizada como
bsf Key_1,5 ;auxiliar en el archivo teclado.asm
bsf Key_1,4
movf Key_1,W
andwf DAV,1
movlw 0x87

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
63

sigue call LCD_REG ;Posiciona el cursor del LCD según pasada.


movf Tecla,W ;Mueve la tecla pulsada al acumulador
sublw .9

btfss STATUS,C ;¨ Es mayor que nueve ?


goto Mayor_que_9 ;Sí
movf Tecla,W ;No
addlw 0x30 ;Ajuste ASCII de datos del 0 al 9
call LCD_DATO ;Visualiza el dato
btfsc DAVID,7 ;Si es la 2ªpasada va a código
goto Loop1 ;si no vuelve a Loop1
goto codigo

Mayor_que_9 movf Tecla,W


addlw 0x37 ;Ajuste ASCII de datos de la A la F
call LCD_DATO
btfsc DAVID,7 ;Si es 2ª pasada va a código si no
goto Loop1 ;vuelve a Loop1
goto codigo

;***************************************************************************
;Rutina de temporización de unos 0,2 segundos.

delay movlw .200


movwf DAV1
delay1 movlw .250
movwf DAV ;La temporización se realiza mediante
delay2 nop ;las restas sucesivas de dos variables
decfsz DAV,F
goto delay2
decfsz DAV1,F
goto delay1
return

;**************************************************************************
;Para visualizar el código Hamming en LCD

codigo movlw 0xc4


call LCD_REG ;Coloca posición en LCD
call HAMMING ;Obtiene código Hamming de DAV

ver_cod movlw .4 ;Nos saca en el LCD los doce bits


movwf DAV1 ;del código Hamming
movf HAM2,W
movwf Temp_2
movf HAM1,W
movwf Temp_1
rlf Temp_2,F ;Rota cuatro posiciones para colocar
rlf Temp_2,F ;los 4 bits a visualizar de HAM2 en
rlf Temp_2,F ;las posiciones de más peso.
rlf Temp_2,F
ham2 rlf Temp_2,F
btfsc STATUS,C ;Si al rotar C vale uno, el bit a
movlw '1' ;visualizar sera un 1 si no será un 0
btfss STATUS,C
movlw '0'
call LCD_DATO
decfsz DAV1,F ;Cuando imprima 4 bits salta
goto ham2 ;para ver los otros ocho.
movlw .8

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
64 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

movwf DAV1 ;Para visualizar 8 datos

ham1 rlf Temp_1,F


btfsc STATUS,C
movlw '1'
btfss STATUS,C
movlw '0'
call LCD_DATO
decfsz DAV1,F ;Cuando visualiza los 8 vuelve a LOOP
goto ham1
btfss DAVID,0 ;Si la tecla pulsada era C o A, vuelve a
goto LOOP ;LOOP, si no sigue con escribe.

;**************************************************************************
;Rutina para escribir el código Hamming contenido en HAM2 y HAM1 en la EPROM

escribe bcf DAVID,6 ;Activa 1ª pasada


Loop2 clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle
btfsc STATUS,Z
goto Loop2

call Key_BCD
call UP_LCD
btfss DAVID,6 ;Si es 1ª pasada va a uno, si no
goto uno ;va a dos.
goto dos
uno movlw 0x8d ;Posiciona el LCD
call LCD_REG
movf Tecla,W
movwf Temp_1 ;Copia la tecla en las 4 posiciones
rlf Temp_1,1 ;de más peso de Temp_1
rlf Temp_1,1
rlf Temp_1,1
rlf Temp_1,1
bcf Temp_1,7 ;Coloca a cero los dos bits de más peso
bcf Temp_1,6 ;porque la EPROM solo llega hasta 3F.
bsf DAVID,6 ;Activa 2ª pasada
goto sigue1
dos movf Tecla,W
iorwf Temp_1,1 ;Si es la segunda pasada copia la tecla en
bsf Key_1,7 ;los cuatro bits de menos peso de Temp_1
bsf Key_1,6 ;La variable Key_1 es utilizada como
bsf Key_1,5 ;auxiliar en el archivo teclado.asm
bsf Key_1,4
movf Key_1,W
andwf Temp_1,1
bcf Temp_1,0
bcf DAVID,6 ;Lo pone a 0 para que siempre sea dirección par

sigue1 movf Tecla,W ;Mueve la tecla pulsada al acumulador


sublw .9
btfss STATUS,C ;Es mayor que nueve ?
goto Mayor_9 ;Sí
movf Tecla,W ;No
addlw 0x30 ;Ajuste ASCII de datos del 0 al 9
call LCD_DATO ;Visualiza el dato
btfsc DAVID,6 ;Si es 2ª pasada va a WRT_EPROM

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
65

goto Loop2
goto WRT_EPROM

Mayor_9 movf Tecla,W


addlw 0x37 ;Ajuste ASCII de datos de la A la F
call LCD_DATO
btfsc DAVID,6 ;Si es 2ª pasada va a WRT_EPROM
goto Loop2
goto WRT_EPROM

;*************************************************************************
;Rutina para escribir en la EPROM

WRT_EPROM bcf STATUS,RP0 ;Activa banco de datos 0.


movf Temp_1,W ;Copia Temp_1 en el registro que va a
movwf EEADR ;indicar la posición de memoria a escribir
movf HAM1,W ;Copia HAM1 en el registro usado para
movwf EEDATA ;escribir en la EPROM.
bsf STATUS,RP0 ;Selecciona banco de datos 1.
bsf EECON1,WREN ;Habilita escritura.
bcf EECON1,EEIF ;Borra el bit de aviso de finalización
movlw 0x55 ;Carga primer valor en EECON2 (necesario
movwf EECON2 ;para realizar la escritura).
movlw 0xaa ;Carga segundo valor en EECON2.
movwf EECON2
bsf EECON1,WR ;Da el pulso para escritura.
btfss EECON1,EEIF ;Comprueba que a finalizado la escritura.
goto $-1

bcf STATUS,RP0 ;Repite el proceso para escribir en la


movf Temp_1,W ;EPROM el registro HAM2.
movwf EEADR
incf EEADR,1 ;Para copiarlo en la siguiente dirección
movf HAM2,W ;de memoria.
movwf EEDATA
bsf STATUS,RP0
bcf EECON1,EEIF
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1,WR
btfss EECON1,EEIF
goto $-1
goto LOOP ;Vuelve al bucle principal

;**************************************************************************
;Nos da el dato codificado en una dirección de memoria EPROM.

leer bcf DAVID,6 ;Activa 1ª pasada


Loop3 clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle
btfsc STATUS,Z
goto Loop3

call Key_BCD
call UP_LCD

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
66 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

btfss DAVID,6 ;Se repite el proceso seguido en escribir


goto prim ;para la obtención de la dirección a leer.
goto segun
prim movlw 0x8d
call LCD_REG
movf Tecla,W
movwf Temp_1
rlf Temp_1,1
rlf Temp_1,1
rlf Temp_1,1
rlf Temp_1,1
bcf Temp_1,7
bcf Temp_1,6
bsf DAVID,6
goto sigue2
segun movf Tecla,W
iorwf Temp_1,1 ;Si es la segunda pasada copia la tecla en
bsf Key_1,7 ;los cuatro bits de menos peso de Temp_1
bsf Key_1,6 ;La variable Key_1 es utilizada como
bsf Key_1,5 ;auxiliar en el archivo teclado.asm
bsf Key_1,4
movf Key_1,W
andwf Temp_1,1
bcf Temp_1,0
bcf DAVID,6
sigue2 movf Tecla,W ;Mueve la tecla pulsada al acumulador
sublw .9
btfss STATUS,C ;¨ Es mayor que nueve ?
goto Es_Mayor ;Sí
movf Tecla,W ;No
addlw 0x30 ;Ajuste ASCII de datos del 0 al 9
call LCD_DATO ;Visualiza el dato
btfsc DAVID,6 ;Si es 2ª pasada va a READ_EPROM.
goto Loop3
goto READ_EPROM
Es_Mayor movf Tecla,W
addlw 0x37 ;Ajuste ASCII de datos de la A la F
call LCD_DATO
btfsc DAVID,6 ;Si es 2ª pasada va a READ_EPROM.
goto Loop3
goto READ_EPROM

;*************************************************************************
;La subrutina realiza la lectura de la dirección indicada en Temp_1.

READ_EPROM bcf STATUS,RP0 ;Selección del banco 0 de datos.


movf Temp_1,W
movwf EEADR ;Copia la dirección a leer.
bsf STATUS,RP0 ;Selección del banco 1.
bsf EECON1,RD ;Pulso de lectura.
bcf STATUS,RP0 ;Selecciona banco 0.
movf EEDATA,W ;Copia el dato leído en HAM1.
movwf HAM1

movf Temp_1,W
movwf EEADR
incf EEADR,1 ;Lee la dirección siguiente.
bsf STATUS,RP0
bsf EECON1,RD
bcf STATUS,RP0
movf EEDATA,W ;Copia la lectura en HAM2

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
67

movwf HAM2
call DEC_HAMMING ;Decodifica HAM1 y HAM2

movlw 0x86
call LCD_REG ;Posiciona LCD.
movf DAV1,W
sublw .9
btfss STATUS,C ;¨ Es mayor que nueve ?
goto M_9 ;Sí
movf DAV1,W ;No
addlw 0x30 ;Ajuste ASCII de datos del 0 al 9
call LCD_DATO ;Visualiza 1er dato decodificado
goto $+4
M_9 movf DAV1,W
addlw 0x37 ;Ajuste ASCII de datos de la A la F.
call LCD_DATO ;Visualiza 1er dato decodificado

movf DAV,W
sublw .9
btfss STATUS,C ;Es mayor que nueve ?
goto MAY_9 ;Sí
movf DAV,W ;No
addlw 0x30 ;Ajuste ASCII de datos del 0 al 9
call LCD_DATO ;Visualiza 2º dato decodificado
goto $+4
MAY_9 movf DAV,W
addlw 0x37 ;Ajuste ASCII de datos de la A la F.
call LCD_DATO ;Visualiza 2º dato decodificado.
movlw 0xc4 ;Posiciona LCD en 2ª línea
call LCD_REG
bcf DAVID,0 ;Para indicar que la 1ª tecla era la A.
goto ver_cod ;Visualiza código Hamming en LCD.

;**************************************************************************
;La subrutina se encarga de decodificar el código Hamming contenido en HAM2
;y HAM1 y darnos los dos datos en DAV1 y DAV.

DEC_HAMMING clrf DAV ;Borra las variables de salida.


clrf DAV1
movf HAM2,W ;Copia el código en dos registros
movwf Temp_2 ;auxiliares.
movf HAM1,W
movwf Temp_1
rrf Temp_1,1
xorwf Temp_1,W ;XOR entre bit 1 y 0 de HAM1.
rrf Temp_1,1
xorwf Temp_1,W ;XOR entre resultado y bit 2.
rrf Temp_1,1
xorwf Temp_1,1 ;XOR entre resultado y bit 3.
btfsc Temp_1,0 ;El resultado (C8) es copiado
bsf DAV,4 ;en bit 4 de DAV.
movf HAM1,W
movwf Temp_1 ;Se realiza el mismo proceso
rrf Temp_1,1 ;para obtener C4, C2 y C1.
rrf Temp_1,1
rrf Temp_1,1
rrf Temp_1,1
rrf Temp_1,1
xorwf Temp_1,W
rrf Temp_1,1
xorwf Temp_1,W

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
68 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

rrf Temp_1,1
xorwf Temp_1,1
btfsc Temp_1,0
bsf DAV1,0
movf HAM1,W
movwf Temp_1
rrf Temp_1,1
movf Temp_1,W
rrf Temp_1,1
xorwf Temp_1,W
rrf Temp_1,1
rrf Temp_1,1
rrf Temp_1,1
xorwf Temp_1,W
rrf Temp_1,1
xorwf Temp_1,W
rrf Temp_2,1
xorwf Temp_2,1
btfsc Temp_2,0
bsf DAV1,2
movf HAM2,W
movwf Temp_2
movf HAM1,W
movwf Temp_1
rrf Temp_1,1
movf Temp_1,W
rrf Temp_1,1
rrf Temp_1,1
xorwf Temp_1,W
rrf Temp_1,1
rrf Temp_1,1
xorwf Temp_1,W
rrf Temp_1,1
rrf Temp_1,1
xorwf Temp_1,W
rrf Temp_2,1
xorwf Temp_2,1
btfsc Temp_2,0
bsf DAV1,3

movf HAM2,W ;XOR de comprobación entre HAM2 y DAV1.


xorwf DAV1,1
movf HAM1,W ;XOR de comprobación entre HAM1 y DAV.
xorwf DAV,1

btfsc DAV1,2 ;Los resultados de las dos XOR anteriores


bsf DAV1,1 ;son grabados en los 4 bits de menos peso
btfss DAV1,2 ;de DAV1.
bcf DAV1,1
btfsc DAV1,0
bsf DAV1,2
btfss DAV1,0
bcf DAV1,2
btfsc DAV1,3
bsf DAV1,0
btfss DAV1,3
bcf DAV1,0
btfsc DAV,4
bsf DAV1,3
btfss DAV,4
bcf DAV1,3

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
69

bcf DAV1,4 ;Los cuatro bits de más peso se colocan a cero.


bcf DAV1,5
bcf DAV1,6
bcf DAV1,7
movlw b'00000011' ;Si el resultado de la comparación es tres,
subwf DAV1,W ;cambia el estado del bit 1 de HAM2 y
btfss STATUS,Z ;salta a la subrutina vuelve.
goto $+7
btfss HAM2,1
goto $+3
bcf HAM2,1
goto $+2
bsf HAM2,1
goto vuelve
movlw b'00000001' ;Si el resultado es 1 cambia el bit 3
subwf DAV1,W ;de HAM2 y salta a vuelve.
btfss STATUS,Z
goto $+7
btfss HAM2,3
goto $+3
bcf HAM2,3
goto $+2
bsf HAM2,3
goto vuelve
movlw b'00000010' ;Cada dirección varía su bit correspondiente
subwf DAV1,W ;y salta a vuelve.
btfss STATUS,Z
goto $+7
btfss HAM2,2
goto $+3
bcf HAM2,2
goto $+2
bsf HAM2,2
goto vuelve
movlw b'00000100'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM2,0
goto $+3
bcf HAM2,0
goto $+2
bsf HAM2,0
goto vuelve
movlw b'00001000'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM1,4
goto $+3
bcf HAM1,4
goto $+2
bsf HAM1,4
goto vuelve
movlw b'00000101'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM1,7
goto $+3
bcf HAM1,7

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
70 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

goto $+2
bsf HAM1,7
goto vuelve

movlw b'00000110'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM1,6
goto $+3
bcf HAM1,6
goto $+2
bsf HAM1,6
goto vuelve
movlw b'00000111'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM1,5
goto $+3
bcf HAM1,5
goto $+2
bsf HAM1,5
goto vuelve
movlw b'00001001'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM1,3
goto $+3
bcf HAM1,3
goto $+2
bsf HAM1,3
goto vuelve
movlw b'00001010'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM1,2
goto $+3
bcf HAM1,2
goto $+2
bsf HAM1,2
goto vuelve
movlw b'00001011'
subwf DAV1,W
btfss STATUS,Z
goto $+7
btfss HAM1,1
goto $+3
bcf HAM1,1
goto $+2
bsf HAM1,1
goto vuelve
movlw b'00001100'
subwf DAV1,W
btfss STATUS,Z
goto vuelve
btfss HAM1,0
goto $+3
bcf HAM1,0

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
71

goto $+2
bsf HAM1,0
goto vuelve
vuelve btfss HAM2,1 ;Copia los valores de los datos contenidos
bcf DAV,0 ;en HAM2 y HAM1 en los registros de salida
btfsc HAM2,1 ;DAV1 y DAV. Estos dos registros van a
bsf DAV,0 ;contener los dos datos grabados en la EPROM.
btfss HAM1,7
bcf DAV,1
btfsc HAM1,7
bsf DAV,1
btfss HAM1,6
bcf DAV,2
btfsc HAM1,6
bsf DAV,2
btfss HAM1,5
bcf DAV,3
btfsc HAM1,5
bsf DAV,3
bcf DAV,4
bcf DAV,5
bcf DAV,6
bcf DAV,7
btfss HAM1,3
bcf DAV1,0
btfsc HAM1,3
bsf DAV1,0
btfss HAM1,2
bcf DAV1,1
btfsc HAM1,2
bsf DAV1,1
btfss HAM1,1
bcf DAV1,2
btfsc HAM1,1
bsf DAV1,2
btfss HAM1,0
bcf DAV1,3
btfsc HAM1,0
bsf DAV1,3
bcf DAV1,4
bcf DAV1,5
bcf DAV1,6
bcf DAV1,7

return

;**************************************************************************
;La subrutina se encarga de codificar las dos teclas contenidas en DAV. El
;resultado nos lo da en HAM2 y HAM1.

HAMMING clrf HAM1 ;Borra las variables de salida.


clrf HAM2
movf DAV,W ;Copia las teclas en dos registros
movwf Temp_1 ;auxiliares.
movwf Temp_2
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1 ;XOR entre bit 1 y 0 de DAV.
rrf Temp_2,1
rrf Temp_2,1
movf Temp_2,W

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
72 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

xorwf Temp_1,1 ;XOR entre resultado y bit 4 de DAV.


rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1 ;XOR entre resultado y bit 5.
rrf Temp_2,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1 ;XOR entre resultado y bit 7.
btfsc Temp_1,0 ;El resultado (C1) es copiado en el
bsf HAM2,3 ;bit 3 de HAM2.
btfss Temp_1,0
bcf HAM2,3
movf DAV,W ;Se realiza el mismo proceso para
movwf Temp_1 ;obtener C2.
movwf Temp_2
rrf Temp_2,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
rrf Temp_2,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
btfsc Temp_1,0 ;Copia C2 en bit 2 de HAM2.
bsf HAM2,2
btfss Temp_1,0
bcf HAM2,2
movf DAV,W
movwf Temp_1
movwf Temp_2
rrf Temp_1,1
rrf Temp_2,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
rrf Temp_2,1
rrf Temp_2,1
rrf Temp_2,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
btfsc Temp_1,0 ;Copia C4 en bit 0 de HAM2.
bsf HAM2,0
btfss Temp_1,0
bcf HAM2,0
movf DAV,W
movwf Temp_1
movwf Temp_2
rrf Temp_1,1
rrf Temp_1,1
rrf Temp_1,1
rrf Temp_1,1

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
73

rrf Temp_2,1
rrf Temp_2,1
rrf Temp_2,1
rrf Temp_2,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
rrf Temp_2,1
movf Temp_2,W
xorwf Temp_1,1
btfsc Temp_1,0 ;Copia C8 en bit 4 de HAM1.
bsf HAM1,4
btfss Temp_1,0
bcf HAM1,4
btfsc DAV,0 ;Copia bit 0 de DAV en el 1 de HAM2.
bsf HAM2,1
btfss DAV,0
bcf HAM2,1
btfsc DAV,1 ;Copia bit 1 de DAV en el 7 de HAM1
bsf HAM1,7
btfss DAV,1
bcf HAM1,7
btfsc DAV,2 ;Continua copiando los datos de DAV
bsf HAM1,6 ;en sus correspondientes bits de HAM1.
btfss DAV,2
bcf HAM1,6
btfsc DAV,3
bsf HAM1,5
btfss DAV,3
bcf HAM1,5
btfsc DAV,4
bsf HAM1,3
btfss DAV,4
bcf HAM1,3
btfsc DAV,5
bsf HAM1,2
btfss DAV,5
bcf HAM1,2
btfsc DAV,6
bsf HAM1,1
btfss DAV,6
bcf HAM1,1
btfsc DAV,7
bsf HAM1,0
btfss DAV,7
bcf HAM1,0
return

end

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
74 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura 8. Organigrama general del programa Hamming.asm

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
75

Figura 6. Organigrama de la subrutina codificadora HAMMING

Figura 7. Organigrama de la subrutina decodificadora DEC_HAMMING

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
76 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Capítulo 3

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
77

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
78 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Practica 3: Simulador de un ascensor de


cuatro pisos utilizando el upic trainer

La práctica trata de simular el funcionamiento de un ascensor de cuatro pisos


(planta baja, primer piso, segundo piso y tercer piso) con el LCD del upic trainer y el
teclado del upic trainer plus.

El teclado hexadecimal del upic trainer plus, va a simular los botones


correspondientes a cada piso y los correspondientes al ascensor ( ver figura 9 ). Así, en
el interior del ascensor habrá cuatro botones ( ‘0’, ‘1’, ‘2’ y ‘3’ ), simulados mediante el
teclado, que nos van a llevar a un piso u otro. A su vez, hay un botón en cada piso para
“llamar al ascensor” que también van ha ser simulados mediante el teclado ( ‘A’, ‘B’,
‘C’, y ‘D’ ).

Figura 9. Correspondencia de las teclas.

Así, por ejemplo, si el ascensor está en el primer piso y pulsamos la tecla ‘C’
(desde el segundo piso) este irá al segundo piso ya que lo estamos llamando desde el
mismo. De igual forma, si en lugar de la ‘C’ se pulsa el ‘2’, también acabará en el
segundo piso( se supone que estamos dentro del ascensor y pulsamos el botón ). Si
estamos dentro del ascensor, solo podemos pulsar las teclas 0, 1, 2 y 3; si estamos fuera,
solo podremos pulsar la tecla correspondiente al piso donde nos encontramos.
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
79

El programa trata de simular el comportamiento explicado hasta ahora en el


módulo LCD del upic trainer; de esta forma el LCD representa ( ver figura 10 ) la
posición del ascensor ( piso en el que se encuentra ), la situación de las puertas ( abiertas
o cerradas), la tecla pulsada y el desplazamiento del ascensor ( si se mueve hacia arriba
o hacia abajo).

Figura 10. Ejemplo de funcionamiento

En la figura 10, nos encontramos un ejemplo de funcionamiento del programa.


Como se puede apreciar, el ascensor está subiendo ( UP ) hacia el segundo piso
(indicado arriba) desde el primer piso. En la línea de abajo se presenta la posición actual
del ascensor; en la de arriba se indica hacia donde se dirige el mismo; en esta línea
puede aparecer el mensaje “Llamada” ( para indicar que el ascensor ha sido llamado
desde el piso ) o “Destino” ( para indicar que desde dentro del ascensor se ha pulsado el
botón del piso ); en este caso el botón pulsado ha sido el ‘C’ correspondiente al segundo
piso.

Las siglas “UP” indican que el ascensor está subiendo de piso, en este caso el
ascensor estará en una posición intermedia entre el primero y el segundo piso; esta
posición intermedia viene representada por la barra de leds del upic trainer, por lo que
está deberá estar activada mediante su correspondiente jumper ( ver guía del upic
trainer ). Las siglas “DW” indicarán que el ascensor está bajando. Dos flechas hacia los
lados ( “” ó “ ” ) indican que las puertas del ascensor están abriéndose o
cerrándose ( en caso de movimiento en la barra de leds ) o que están ya abiertas o
cerradas (en caso de no haber movimiento).

La barra de leds se enciende de forma ascendente activandose el primer led,


luego el segundo, luego el tercero,... dejando los anteriores conectados; una vez
encendidos todos los leds, comienzan a apagarse de igual forma, se apaga el primero,
luego el segundo,... hasta estar todos apagados. Este encendido-apagado completo de los
leds indican el cambio de piso del ascensor, por ejemplo, si el ascensor está en el primer
piso, para llegar al tercero tendrá que encender-apagar los leds dos veces ( por ser dos
pisos ). Este encendido-apagado de los leds también indican la apertura o el cierre de las
puertas, así la puerta tardará en abrirse lo que tarden los leds en encenderse y apagarse.

El tercer piso es considerado como un piso “privado” que necesita clave de


acceso para funcionar con el ascensor. De esta forma, cada vez que se teclea el ‘3’ como
destino del ascensor, se nos pide una clave de tres dígitos ( ‘DA0’ ) que habrá que
acertar para que el ascensor nos lleve al tercer piso; en caso de error el ascensor no se
moverá. De igual forma para llamar al ascensor desde el tercer piso ( tecla ‘D’ ) hay que
introducir esta misma clave, si no el ascensor no acudirá a la llamada.
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
80 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Las puertas del ascensor se quedan abiertas cuando este está quieto en un piso ( e
esta forma se puede entrar en el desde el piso) en todos menos en el tercero ( por ser
“privado” ). En el tercero, el ascensor está siempre cerrado, abriéndose por un periodo
de tiempo para que la persona salga de él ( en caso de venir de otro piso ) o al pulsar ‘A’
( para que la persona entre ), volviéndose a cerrar inmediatamente.

Si el ascensor se encuentra en el tercer piso y pulsamos la tecla ‘3’, el programa


no responderá ya que se supone que ninguna persona estará dentro del mismo una vez
haya cerrado las puertas.

Al comenzar el programa, el ascensor se sitúa siempre en la planta baja con las


puertas abiertas.

Para entender un poco mejor el programa, vamos a ver un pequeño ejemplo de


funcionamiento. Al encender el programa, pulsamos la tecla ‘A’, tecleamos una clave
mala, otra correcta, entramos al ascensor y pulsamos ‘2’:

- El ascensor se encuentra en la planta baja con las puertas abiertas. Al


pulsar ‘A’ nos pide la clave. Tras fallar el ascensor no hace nada
(solo nos da un mensaje de error).

- Volvemos a pulsar la tecla de llamada ‘A’ y tecleamos ‘DA0’. El


ascensor reconoce la clave y comienza ha cerrar las puertas.

- Una vez encendidos y apagados todos los leds, el LCD muestra el


mensaje ‘UP’ y repite el proceso de los leds, haciendo que el ascensor
llegue al primer piso e indicándolo en el LCD. Se repite el proceso
hasta llegar al tercer piso.

- Al llegar se abren las puertas ( mediante el encendido-apagado se


indica lo que tardan ). Tras un tiempo de espera ( en el que la persona
entra ) las puertas se cierran.

- Tras pulsar el ‘2’ el ascensor comienza a bajar ( ya que está en el


tercer piso, no tiene que cerrar las puertas ).

- Cuando se encienden y apagan los leds el LCD actualiza la nueva


posición del ascensor y las puertas comienzan ha abrirse

- Tras ello el ascensor permanece quieto esperando recibir otra


pulsación.

Por último se presenta ( figura 11 ) como se realiza el encendido y apagado de la


barra de leds situada en el upic trainer. Para modificar el valor de un led, unicamente se
envía un ‘1’ o un ‘0’ por el puerto B para activar o desactivar respectivamente el led
deseado.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
81

Figura 11. Leds encendiéndose ( izquierda ) y


apagándose ( derecha ).

En las paginas que siguen, se presenta un listado del programa utilizado en la


práctica, así como comentarios explicativos del mismo.

Ascensor.asm: Es el programa que habrá que insertar en el PIC 16F84 para el


funcionamiento de la práctica.

Teclado.asm: se encarga de controlar el teclado hexadecimal.

Lcd.asm: se encarga de controlar el LCD.

P16f84.inc: El fichero incluye únicamente las definiciones de registros y


variables necesarias para programar el micro 16F84. La directiva include del
ensamblador permite incluirlo en cualquier programa fuente.

Estos últimos programas (LCD, teclado y p16f84) son los mismos que los
utilizados en la práctica 1, por tanto no se volverán ha explicar.

Para finalizar se presenta el organigrama general (figura 11) correspondientes al


funcionamiento del programa.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
82 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

ASCENSOR.ASM

El programa simula el funcionamiento de un ascensor de cuatro pisos


con el teclado y el LCD. En el Lcd se ve la posición del ascensor y el
estado estado de sus puertas. Mediante el teclado introducimos el piso
al cual va a ir el ascensor. Para acceder al tercer piso, tendremos
que introducir la clave 'DA0'. Conectando la barra de leds, se ven los
estados transitorios entre cada piso así como la apertura-cierre de
las puertas.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
83

list p=16f84 ;Se define el tipo de dispositivo


include "a:\lib\p16f84.inc" ;Incluye archivo con definición de registros

Lcd_var equ 0x0c ;Inicio de las variables para el LCD


Key_var equ 0x0e ;Inicio de las variables para el teclado
Temp_1 equ 0x13 ;Definición de las distintas variables utilizadas
Temp_2 equ 0x14 ;en el programa
PISO equ 0x15
DAV equ 0x16
DAV1 equ 0x17

org 0 ;Para que al resetear se vaya a INICIO


goto INICIO
org 5 ;Indica donde comienza el programa

include "a:\lib\LCD.ASM" ;Carga rutinas del LCD


include "a:\lib\TECLADO.ASM" ;Carga rutinas del teclado

;***************************************************************************
;Comienzo del programa.
INICIO: movlw d'0' ;Borra la variable PISO para situar
movwf PISO ;el ascensor en la planta baja.
bsf STATUS,RP0 ;Selecciona pagina 1 de datos
movlw b'00001111'
movwf OPTION_REG ;Preescaler de 128 para perro guardián
bcf INTCON,GIE ;Desconecta interrupciones
bcf STATUS,RP0 ;Selecciona pagina 0 de datos
clrwdt ;Refresca perro guardián
call UP_LCD ;Configura RB y RA para control del LCD
call LCD_INI ;Rutina de inicialización del LCD
movlw b'00001100'
call LCD_REG ;Conecta el LCD
movlw b'00000001' ;Borra el LCD y lo sitúa en la posición
call LCD_REG ;de inicio ( HOME ).

;Visualización del mensaje 'Ascensor Piso:Bº'


movlw 0xc0
call LCD_REG
movlw 'A'
call LCD_DATO ;Lo visualiza en el LCD
call delay ;Retardo en la visualización del carácter
movlw 's'
call LCD_DATO
call delay
movlw 'c'
call LCD_DATO
call delay
movlw 'e'
call LCD_DATO
call delay
movlw 'n'
call LCD_DATO
call delay
movlw 's'
call LCD_DATO
call delay
movlw 'o'
call LCD_DATO
call delay
movlw 'r'
call LCD_DATO

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
84 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

call delay
movlw ' '
call LCD_DATO
call delay
movlw 'P'
call LCD_DATO
call delay
movlw 'i'
call LCD_DATO
call delay
movlw 's'
call LCD_DATO
call delay
movlw 'o'
call LCD_DATO
call delay
movlw ':'
call LCD_DATO
call delay
movlw 'B'
call LCD_DATO
call delay
movlw 0xdf ;Código hexadecimal del 'º'
call LCD_DATO
call delay
movlw 0x8e
call LCD_REG
movlw 0x7f ;Código hexadecimal de flechas hacia
call LCD_DATO ;derecha e izquierda respectivamente.
movlw 0x7e
call LCD_DATO
clrwdt

;***************************************************************************
;Bucle principal del programa.
LOOP movlw 0x80 ;Mini-bucle para eliminar toda la
call LCD_REG ;1¦ fila salvo sus dos últimas posiciones
movlw d'14' ;(Nos muestran el estado de las puertas).
movwf DAV
movlw ' '
call LCD_DATO
decfsz DAV,1
goto $-3
Loop_1 clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle
btfsc STATUS,Z
goto Loop_1
call delay ;Retardo para evitar rebotes.
movlw b'01111110' ;Si la tecla pulsada es 'A', va a
subwf Tecla,W ;piso_B y desactiva bit0 de DAV.
btfsc STATUS,Z
bcf DAV,0
btfsc STATUS,Z
goto piso_B
movlw b'01111011' ;Si es una 'B' va a piso_1 y DAV,0=0
subwf Tecla,W
btfsc STATUS,Z
bcf DAV,0
btfsc STATUS,Z

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
85

goto piso_1
movlw b'01110111' ;Si es 'C' va a piso_2 y DAV,0=0
subwf Tecla,W
btfsc STATUS,Z
bcf DAV,0
btfsc STATUS,Z
goto piso_2
movlw b'10110111' ;Si es 'D' va a piso_3 y Temp_1,0=0
subwf Tecla,W
btfsc STATUS,Z
bcf Temp_1,0
btfsc STATUS,Z
goto piso_3
movlw b'01111101' ;Si es '0' va a piso_B y DAV,0=1
subwf Tecla,W
btfsc STATUS,Z
bsf DAV,0
btfsc STATUS,Z
goto piso_B
movlw b'11101110' ;Si es '1' va a piso_1 y DAV,0=1
subwf Tecla,W
btfsc STATUS,Z
bsf DAV,0
btfsc STATUS,Z
goto piso_1
movlw b'11101101' ;Si es '2' va a piso_2 y DAV,0=1
subwf Tecla,W
btfsc STATUS,Z
bsf DAV,0
btfsc STATUS,Z
goto piso_2
movlw b'11101011' ;Si es '3' va a piso_3 y Temp_1,0=1
subwf Tecla,W
btfsc STATUS,Z
bsf Temp_1,0
btfsc STATUS,Z
goto piso_3
goto Loop_1 ;Si no es ninguna vuelve a LOOP.

;**************************************************************************
; Rutina para llevar el ascensor a la planta baja.

piso_B incf PISO,1 ;Si el ascensor ya esta en la planta


decfsz PISO,1 ;baja, vuelve a LOOP.
goto $+2
goto Loop_1
btfsc DAV,0 ;Si la tecla era 'A' visualiza el
call destino ;mensaje 'Llamado', si era '0'

btfss DAV,0 ;'Destino'.


call llamado
movlw 'B'
call LCD_DATO
movlw 0xdf
call LCD_DATO ;Visualiza 'Bº' (destino)
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
clrf PORTB ;Para apagar la barra de leds.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
86 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

call delay
call delay
call delay
call delay
movlw d'3' ;Si el ascensor está en el tercer
subwf PISO,W ;piso, no cierra las puertas (ya
btfsc STATUS,Z ;están cerradas).
goto $+9
movlw 0x7e
call LCD_DATO
movlw 0x7f
call LCD_DATO ;Visualiza flechas cierra puertas.
call leds ;Visualización en leds del estado
clrf PORTB ;de las puertas y borrado de los mismas.
call delay
call delay
movlw 0x8e
call LCD_REG
movlw 'D'
call LCD_DATO
movlw 'W' ;Visualización 'DW' para comenzar a
call LCD_DATO ;bajar de piso.
movlw 0xce
call LCD_REG
movf PISO,W
addlw 0x30 ;Ajusta ASCII para visualización.
call LCD_DATO ;Visualiza piso actuar.
call leds
decfsz PISO,1 ;Cuando PISO=0 estamos en la planta baja
goto $-7 ; y salimos.
movlw 0xce
call LCD_REG
movlw 'B'
call LCD_DATO ;Visualiza posici¢n ascensor (B)
clrf PORTB
call delay
call delay
movlw 0x8e
call LCD_REG
movlw 0x7f
call LCD_DATO
movlw 0x7e
call LCD_DATO ;Visualización abre puertas con estado
call leds ;de las mismas en la barra de leds.
call delay
call delay ;Tras colocar ascensor en piso bajo y
goto LOOP ;cerrar las puertas, vuelve a LOOP.

;**************************************************************************
;Rutina para llevar el ascensor al primer piso.

piso_1 movlw d'1' ;Si ya está en el primer piso vuelve


subwf PISO,W ;a LOOP.
btfsc STATUS,Z
goto LOOP
btfsc DAV,0
call destino ;Si la tecla era 'B' visualiza el
btfss DAV,0 ;mensaje 'Llamado', si era '1'
call llamado ;'Destino'.
movlw '1'

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
87

call LCD_DATO
movlw 0xdf
call LCD_DATO ;Visualiza '1º' (destino)
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
clrf PORTB
call delay
call delay
call delay
call delay
movlw d'3' ;Si el ascensor está en el tercer
subwf PISO,W ;piso, no cierra las puertas (ya
btfsc STATUS,Z ;están cerradas).
goto $+9
movlw 0x7e
call LCD_DATO
movlw 0x7f
call LCD_DATO
clrf PORTB
call delay
call leds
call delay
call delay
incf PISO,1 ;Si el ascensor está en la planta baja
decfsz PISO,1 ;sigue, si no (estará en 3ª o 2ª) va
goto esta_arriba ;a esta_arriba.
movlw 0x8e
call LCD_REG
movlw 'U'
call LCD_DATO
movlw 'P'
call LCD_DATO ;Visualización 'UP' y sube el ascensor
clrf PORTB ;un piso.
call delay
call leds
call delay
call delay
incf PISO,1
goto esta ;Como ya está en el primer piso va a esta.
esta_arriba movlw 0x8e
call LCD_REG
movlw 'D'
call LCD_DATO
movlw 'W' ;Visualiza 'DW' y baja el ascensor un piso.
call LCD_DATO
clrf PORTB
call delay
vuelve call leds
call delay
call delay
decf PISO,1
decfsz PISO,W
goto $+2 ;Si todavía no es el primero va a vuelve, si
goto esta ;ya estamos en el primero, va a esta.
movlw 0xce
call LCD_REG
movf PISO,W
addlw 0x30
call LCD_DATO ;Visualiza piso actuar.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
88 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

goto vuelve
esta movlw 0xce
call LCD_REG
movf PISO,W
addlw 0x30
call LCD_DATO ;Visualiza piso actuar (1º).
clrf PORTB
call delay
movlw 0x8e
call LCD_REG
movlw 0x7f
call LCD_DATO
movlw 0x7e
call LCD_DATO ;Para abrir las puertas.
clrf PORTB
call delay
call leds
call delay
call delay
goto LOOP

;**************************************************************************
;Rutina para llevar el ascensor al segundo piso.

piso_2 movlw d'2' ;Si ya está en el primer piso vuelve


subwf PISO,W ;vuelve a LOOP.
btfsc STATUS,Z
goto LOOP
btfsc DAV,0 ;Si la tecla era 'C' visualiza el
call destino ;mensaje 'Llamado', si era '2'
btfss DAV,0 ;'Destino'.
call llamado
movlw '2'
call LCD_DATO
movlw 0xdf
call LCD_DATO ;Visualiza '2º' (destino).
movlw ' '
call LCD_DATO
movlw ' '
call LCD_DATO
clrf PORTB
call delay
call delay
call delay
call delay
movlw d'3' ;Si el ascensor está en el tercer
subwf PISO,W ;piso, no cierra las puertas (ya
btfsc STATUS,Z ;están cerradas).
goto $+10

movlw 0x7e
call LCD_DATO
movlw 0x7f
call LCD_DATO
clrf PORTB
call delay
call leds
call delay
call delay
movlw d'3' ;Si está en el tercero, baja un piso
subwf PISO,W ;si no (estará en Bº o 1º) va a esta_abajo.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
89

btfss STATUS,Z
goto esta_abajo
movlw 0x8e
call LCD_REG
movlw 'D'
call LCD_DATO
movlw 'W'
call LCD_DATO ;Visualiza 'DW' y baja un piso.
clrf PORTB
call delay
call leds
call delay
call delay
decf PISO,1
goto yaesta ;Como ya esta en el 2º va a yaesta.
esta_abajo movlw 0x8e
call LCD_REG
movlw 'U'
call LCD_DATO
movlw 'P'
call LCD_DATO ;Visualiza 'UP' y sube un piso.
clrf PORTB
call delay
call leds
call delay
call delay
incf PISO,1
movlw d'2'
subwf PISO,W
btfsc STATUS,Z ;Si ya está en el 2º va a yaesta, si no
goto yaesta ;sube otro piso.
movlw 0xce
call LCD_REG
movf PISO,W
addlw 0x30
call LCD_DATO
clrf PORTB
call delay
call leds
call delay
call delay
incf PISO,1
yaesta movlw 0xce
call LCD_REG
movf PISO,W
addlw 0x30
call LCD_DATO ;Visualiza piso actual (2º).
clrf PORTB
call delay
movlw 0x8e
call LCD_REG
movlw 0x7f
call LCD_DATO
movlw 0x7e
call LCD_DATO ;Abre puertas.
clrf PORTB
call delay
call leds
call delay
call delay
goto LOOP

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
90 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

;**************************************************************************
;Rutina para llevar el ascensor al segundo piso.

piso_3 btfss Temp_1,0 ;Si la tecla pulsada es '3' y el


goto $+5 ;ascensor está en el tercer piso
movlw d'3' ;vuelve ha LOOP ya que en este piso
subwf PISO,W ;las puertas están cerradas y no se
btfsc STATUS,Z ;puede pulsar el '3'.
goto LOOP
movlw 0x80 ;En caso de pulsar 'A' o '3' desde
call LCD_REG ;otro piso nos muestra el mensaje
movlw 'C' ;'CLAVE:'.
call LCD_DATO
movlw 'L'
call LCD_DATO
movlw 'A'
call LCD_DATO
movlw 'V'
call LCD_DATO
movlw 'E'
call LCD_DATO
movlw ':'
call LCD_DATO
bcf Temp_1,1 ;Borra el bit para llevar correctamente
clrwdt ;la verificación de la clave.
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle
btfsc STATUS,Z
goto $-5
call delay
movlw b'01111101'
subwf Tecla,W
btfsc STATUS,Z
bsf Temp_1,1 ;Si la 1ª tecla NO es 'D' activa el bit
call UP_LCD ;(con lo que ya será falsa) y continua.
movlw 0x87
call LCD_REG
movlw '*'
call LCD_DATO ;Visualiza '*'.
clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle
btfsc STATUS,Z
goto $-5
call delay
movlw b'01111110'
subwf Tecla,W
btfss STATUS,Z
bsf Temp_1,1 ;Si la 2ª tecla NO es 'A' activa el bit
call UP_LCD ;(con lo que sería falsa) y continua.
movlw 0x88
call LCD_REG
movlw '*'
call LCD_DATO
clrwdt
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W ;Si hay tecla pulsada sale del bucle

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
91

btfsc STATUS,Z
goto $-5
call delay
movlw b'01111101'
subwf Tecla,W
btfss STATUS,Z
bsf Temp_1,1 ;Si la 3ª tecla NO es '0' activa el bit.
call no ;Va a comprobar la clave.
call UP_LCD
movlw 0x89
call LCD_REG
movlw '*'
call LCD_DATO
movlw 0x8b
call LCD_REG
movlw 'O'
call LCD_DATO
movlw 'K' ;Visualiza 'OK' ya que la clave es buena
call LCD_DATO ;y continua.
clrf PORTB
call delay
call delay
call delay
call delay
movlw d'3' ;Si está en el tercer piso (Se habrá pulsado
subwf PISO,W ;la 'A') abre las puertas y las cierra tras
btfsc STATUS,Z ;un tiempo.
goto abrecierra
btfsc Temp_1,0
call destino
btfss Temp_1,0 ;Visualiza mensaje llamada o destino según
call llamado ;si pulsamos 'A' o '3'.
movlw '3'
call LCD_DATO
movlw 0xdf
call LCD_DATO ;Visualiza destino (3º)
movlw ' '
call LCD_DATO
mov lw ' '
call LCD_DATO
clrf PORTB
call delay
call delay
call delay
call delay
movlw 0x7e
call LCD_DATO
movlw 0x7f
call LCD_DATO ;Cierra las puertas.

clrf PORTB
call delay
call leds
call delay
call delay
movlw 0x8e
call LCD_REG
movlw 'U'
call LCD_DATO
movlw 'P'
call LCD_DATO ;Visualiza 'UP'.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
92 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

clrf PORTB
call delay
aqu call leds ;Para subir un piso.
call delay
call delay
incf PISO,1
movlw d'3' ;Si ya estamos en el tercero va a aqui.
subwf PISO,W
btfsc STATUS,Z
goto aqui
movlw 0xce
call LCD_REG
movf PISO,W
addlw 0x30
call LCD_DATO ;Visualiza piso actual y vuelve a aqu.
goto aqu
aqui movlw 0xce
call LCD_REG
movf PISO,W
addlw 0x30
call LCD_DATO ;Visualiza piso actual (3º).
clrf PORTB
call delay
call delay
movlw 0x8e
call LCD_REG
movlw 0x7f
call LCD_DATO
movlw 0x7e
call LCD_DATO ;Para abrir las puertas.
call leds
call delay
call delay
call delay
call delay

call delay ;Retardo de espera.


call delay
movlw 0x8e
call LCD_REG
movlw 0x7e
call LCD_DATO
movlw 0x7f
call LCD_DATO ;Cierra las puertas.
call leds
call delay
call delay
goto LOOP ;Vuelve a LOOP.

;*************************************************************************
;Rutina para abrir las puertas y cerrarlas tras un tiempo (Solo al pulsar)
;la tecla 'A').
abrecierra movlw 0x80
call LCD_REG
movlw d'14'
movwf DAV
movlw ' ' ;Borra la primer línea salvo dos últimas
call LCD_DATO ;posiciones.
decfsz DAV,1
goto $-3
movlw 0x8e

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
93

call LCD_REG
movlw 0x7f
call LCD_DATO
movlw 0x7e
call LCD_DATO ;Abre las puertas.
call leds
call delay
call delay
call delay
call delay
call delay ;Periodo de espera.
call delay
movlw 0x8e
call LCD_REG
movlw 0x7e
call LCD_DATO
movlw 0x7f
call LCD_DATO ;Cierra las puertas.
call leds
call delay
call delay
goto LOOP ;Vuelve a LOOP.

;***************************************************************************
;Visualiza el mensaje 'NO' para indicar que la clave introducida no es buena.

no movlw '*'
call LCD_DATO
btfss Temp_1,1 ;Si algún digito es incorrecto se
return ;visualiza el mensaje 'NO', si todos son
movlw 0x8b ;buenos (Temp_1,1=0) vuelve.
call LCD_REG
movlw 'N'
call LCD_DATO
movlw 'O'
call LCD_DATO
clrf PORTB
call delay
call delay
call delay
call delay
bcf Temp_1,1
goto LOOP ;Vuelve a LOOP (por ser falsa la clave).

;***************************************************************************
;Rutina para visualizar el mensaje 'Llamado:'.
llamado call UP_LCD
movlw 0x80
call LCD_REG
movlw ' '
call LCD_DATO
movlw 'L'
call LCD_DATO
movlw 'l'
call LCD_DATO
movlw 'a'
call LCD_DATO
movlw 'm'
call LCD_DATO
movlw 'a'
call LCD_DATO

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
94 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

movlw 'd'
call LCD_DATO
movlw 'a'
call LCD_DATO
movlw ':'
call LCD_DATO
movlw ' '
call LCD_DATO
return
destino call UP_LCD
movlw 0x80
call LCD_REG
movlw ' '
call LCD_DATO
movlw 'D'
call LCD_DATO
movlw 'e'
call LCD_DATO
movlw 's'
call LCD_DATO
movlw 't'
call LCD_DATO
movlw 'i'
call LCD_DATO
movlw 'n'
call LCD_DATO
movlw 'o'
call LCD_DATO
movlw ':'
call LCD_DATO
movlw ' '
call LCD_DATO
return

;***************************************************************************
;Rutina para visualizar en la barra de leds, el estado del ascensor o las
puertas.
;Lo que hace es activar los leds de forma consecutiva (uno tras otro) y (una vez
;encendidos todos) apagarlos de igual manera pero en sentido inverso.

leds movlw b'00000000'


movwf PORTB ;Borra leds
call delay
movlw b'10000000'
movwf PORTB ;Activa el primero
call delay
movlw b'11000000'
movwf PORTB ;Activa el siguiente (dejando el anterior)
call delay
movlw b'11100000'
movwf PORTB
call delay
movlw b'11110000'
movwf PORTB
call delay
movlw b'11111000'
movwf PORTB
call delay
movlw b'11111100'
movwf PORTB
call delay

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
95

movlw b'11111110'
movwf PORTB
call delay
movlw b'11111111'
movwf PORTB
call delay
movlw b'01111111' ;Una vez conectados todos, comienza a
movwf PORTB ;apagarlos desde el primero.
call delay
movlw b'00111111'
movwf PORTB
call delay
movlw b'00011111'
movwf PORTB
call delay
movlw b'00001111'
movwf PORTB
call delay
movlw b'00000111'
movwf PORTB
call delay
movlw b'00000011'
movwf PORTB
call delay
movlw b'00000001'
movwf PORTB
call delay
movlw b'00000000'
movwf PORTB
call delay
call delay
return

;***************************************************************************
;Rutina de temporización de unos 0,25 segundos.
delay movlw .250
movwf DAV1
delay1 movlw .250
movwf DAV ;La temporización se realiza mediante
delay2 nop ;las restas sucesivas de dos variables
decfsz DAV,F
goto delay2
decfsz DAV1,F
goto delay1
return

end

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
96 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura 9. Organigrama general del programa ascensor.asm.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
97

Capítulo 4

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
98 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
99

Guía del pic 16f84

El pic que se va a utilizar para las prácticas realizadas va ha ser el 16f84. Este
pic es similar al 16c84, por tanto (aunque a veces se hable de éste) nos referimos al
16f84 a lo largo de toda la guía.

1. Encapsulado:

El 16f84 pertenece a la familia de la gama media y dentro de ella es de los más


pequeños: tan solo tiene 18 patillas. Tiene una capacidad de memoria de programa de
1K (palabras de 14 bits cada una) tipo FLASH y 64 bytes de EEPROM como memoria
auxiliar. Estas memorias son eléctricamente borrables, lo que permite grabar y borrar el
programa para realizar todas las pruebas pertinentes (soporta unos 1000 ciclos de
escritura/borrado). Este pic está fabricado con tecnología CMOS y el encapsulado (de
18 patillas) es el representado en la figura 1.1.

Figura 1.1. Patillaje del pic 16f84

A continuación se va a comentar brevemente la misión de cada patilla:

- Vdd: Patilla por la que se va a aplicar la tensión positiva de alimentación (4V


– 6V DC).

- Vss: Conectada a tierra o negativo de la alimentación.

- MCLR: Esta patilla va a ser activada a nivel bajo para resetear el pic.
También se va a utilizar durante la grabación de la memoria de programa para introducir

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
100 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

por ella la tensión Vpp (12V – 14V DC). El micropic trainer tiene un botón de reset
conectado al pic como se ve en la figura 1.2 (R1 = 100 y R = 4K7).

Figura 1.2. Circuito que permite producir un


reset al presionar un pulsador

- OSC1/CLKIN: Por ella se va a introducir la entrada del circuito oscilador


externo que va a proporcional la frecuencia de trabajo.

- OSC2/CLKOUT: Patilla auxiliar del circuito oscilador. Según la frecuencia


de trabajo del oscilador, se va a tener una u otra velocidad en la ejecución de cada
instrucción. En las prácticas realizadas, la frecuencia de trabajo es de 4 MHz, por tanto
el ciclo de instrucción va a ser de 1sg (4 periodos de reloj x 0,25sg = 1sg). Todas
las instrucciones se van a ejecutar en 1sg salvo las de salto que van ha tardar 2sg.
Los pic admiten cuatro tipos de circuito oscilador (RC, HS, XT y LP). En las
prácticas realizadas se a utilizado el XT (Figura 1.3).

Figura 1.3. Esquema del oscilador tipo XT

Este circuito utiliza un cristal de cuarzo que actúa como un oscilador que
proporciona la frecuencia de 4MHz antes citada. Los condensadores C1 y C2 están
comprendidos entre 15 – 33 pF. El micro’pic trainer los utiliza de 27 pF.

- RA0 – RA4: Son las 5 líneas de E/S digitales correspondientes a la puerta A.


La línea RA4 multiplexa el TOCKI. En este caso sirve para recibir una frecuencia
externa que alimente el temporizador interno TMR0.

- RB0 – RB7: Corresponden a las 8 líneas de E/S digitales de la puerta B. La


RB0 multiplexa el INT, que servirá de entrada a una petición externa de interrupción.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
101

El consumo típico del pic es de 2mA aproximadamente funcionando en modo


normal. Cuando entramos en el modo llamado “reposo”, mediante la instrucción SLEEP
(ver apartado 5), pasa a consumir menos de 10 A.

2. Arquitectura interna:

La arquitectura del procesador sigue el modelo Harvard. En este, la CPU se


conecta de forma independiente y con buses distintos con la memoria de instrucciones y
con la de datos, permitiendo a esta acceder simultáneamente a las dos memorias. Se
aplica la técnica de segmentación en la ejecución de las instrucciones. Esta
segmentación permite al procesador realizar al mismo tiempo la ejecución de una
instrucción y la búsqueda del código de la siguiente. De esta forma se puede ejecutar
cada instrucción en un ciclo (un ciclo de instrucción equivale a cuatro ciclos de reloj).
Las instrucciones de salto ocupan dos ciclos al no conocer la dirección de la siguiente
instrucción hasta que no se haya completado la de bifurcación.
El formato de todas las instrucciones es de la misma longitud (14 bits en los de
gama media). Procesador RISC (Computador de Juego de Instrucciones Reducido). Los
modelos de la gama media disponen de un repertorio de 35 instrucciones. Cualquier
instrucción puede manejar cualquier elemento de la arquitectura como fuente o como
destino,es decir, todos los objetos del sistema (puertas de E/S, posiciones de memoria,
etc.) están implementados como registros.

En la figura 2.1 aparece el diagrama de bloques del pic 16f84. Para analizar un
poco el funcionamiento del procesador, nos vamos a centrar en la ejecución de una
instrucción.

Figura 2.1. Arquitectura interna del PIC16F84

El contador de programa comienza la fase de búsqueda facilitando la dirección


de la memoria de instrucciones donde se ubica la instrucción. Su código binario de 14

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
102 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

bits se lee y se carga en el Registro de instrucciones (1), desde donde se transfiere al


decodificador y a la unidad de control (2). La ALU (3) es la encargada de realizar la
operación aritmético-lógica que implica la instrucción decodificada. Uno de los
operandos lo recibe del registro W (4) y el otro de un registro o de la propia instrucción.

En cuanto a la memoria de programa, el pic es capaz de contener 8.192


instrucciones de 14 bits cada una. Este mapa se divide en páginas de 2.048 posiciones.
Para direccionar 8K posiciones se necesitan 13 bits (longitud del contador de
programa). Sin embargo el pic solo tiene implementadas 1K posiciones, por lo que
ignora los 3 bits de más peso del PC (contador programa). La organización de la
memoria de programa es como indica la figura 2.2.

El vector de reset se almacena en la dirección 0000, mientras que el vector de


interrupción está en la 0004. La memoria de programa de usuario comienza en la
dirección 0005 y se extiende hasta la 03FF.

La pila es una zona aislada de las memorias de instrucciones y datos (Ver fig.
2.3). Tiene una estructura LIFO (Last In First Out) en la que el último valor guardado es
el primero que sale. Tiene ocho niveles de profundidad cada uno con 13 bits. La
instrucción CALL (Ver apartado 5) y las interrupciones originan la carga del contenido
del PC en el nivel superior de la pila. El contenido del nivel superior se saca de la pila al
ejecutar las instrucciones RETURN, RETLW y RETFIE.

Figura 2.3. Organización de la memoria de programa

3. Registros internos:

La memoria de datos del 16F84 dispone de dos zonas diferentes:

- Área EEPROM: de 64 bytes. En ella se pueden almacenar datos que no se


pierden al desconectar la alimentación.

- Área RAM estática o SRAM: en ella reside el banco de registros

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
103

específicos (SFR) y el banco de registros de propósito general (GPR). El primero tiene


24 posiciones de tamaño byte y el segundo 68.

La memoria RAM se halla dividida en dos bancos (banco 0 y banco 1) de 128


bytes cada uno. Las 12 primeras posiciones están reservadas al SFR, son los registros
encargados del control del procesador y sus recursos. Las direcciones comprendidas
entre 7H – 87H no son operativas. Los 68 registros del GPR se destinan a propósito
general y en realidad solo son operativos los 68 del banco 0 porque los del banco 1 se
mapean sobre el banco 0, es decir, cuando se apunta a uno del banco 1 se accede al
mismo pero en el banco 0.

A continuación, se describen los diferentes registros que se representan en la


figura 3.1.

Figura 3.1. Organización de los registros internos

- Registro de indirección (00): Este registro no tiene existencia física, por


tanto no se podrá leer. Si se intenta acceder a él, siempre se encontrará 00, y si se intenta
escribir se producirá un NOP, es decir, una instrucción que no hace nada. Este registro
se utiliza únicamente para realizar un direccionamiento indirecto; cuando se le hace
referencia se accede a la dirección de un banco especificada con los 7 bits de menos
peso del registro FSR. El bit de más peso del FSR junto con el IRP del registro
ESTADO se encarga de seleccionar el banco a acceder.

- Registro PCL (02): Son los 8 bits de menos peso del contador del programa
o PC. Como el PC debe tiene un tamaño de 13 bits, sus bits de mayor peso se llevan al
registro PCLATH (posiciones 0A-8A). Como muestra la figura 3.2, si el PC es destino
de una instrucción, el contenido de PCLATH se tiene en cuenta automáticamente; para
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
104 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

las instrucciones CALL y GOTO tiene lugar la misma operación (teniendo en cuenta
que el PC está ahora codificado con 11 bits en la propia instrucción).

Figura 3.2. Determinación de los bits de mayor peso del PC a través del
PCLATH. A la derecha, para instrucciones CALL y GOTO.

- Registro STATUS (03): contiene un cierto número de bits de estado de la


unidad central. Se puede leer y escribir como cualquier otro registro. En la figura 3.3 se
puede ver la estructura de este registro; hay bits que no se pueden varia al indicar
stados del procesador, así al ejecutar la instrucción de borrar el registro, este se carga
con el valor 000uu1uu (u = se queda como estaba).

Figura 3.3. Estructura interna del registro estado

El bit 0 o C (Carry) es el bit de acarreo para las operaciones de suma y


sustracción. Se pone a 1 si se produce acarreo en el bit de mayor peso. También lo
utilizan las instrucciones de rotación.
El bit 1 o DC (Digit Carry) es el bit de acarreo de dígito. Funciona igual que el
anterior, pero haciendo referencia al 4º bit.
El bit 2 o Z (Zero) se pone a 1 si el resultado de una operación aritmética o
lógica es nulo.
El bit 3 o PD (Power down) se pone a 1 durante la conexión a la alimentación
del circuito o durante la ejecución de la instrucción CLRWDT. Se pone a 0 al ejecutar
SLEEP. Es de solo lectura.
El bit 4 o TO (Time out) se pone a 1 durante la conexión a alimentación o
durante la ejecución de una instrucción CLRWDT o SLEEP. Se pone a 0 cuando el
temporizador watchdog se desborda. También es de solo lectura.
Los bit 5 y 6 o RP0 y RP1 sirven para seleccionar las páginas de memoria de
programa. El 16F84 solo utiliza el RP0 al tener tan solo dos páginas; si RP0 = 1
selecciona pagina 1, si RP0 = 0 selecciona la pagina 0.
El bit 7 o IRP no se utiliza en nuestro caso, debe programarse como 0.

Los bits T0 y PD también nos sirven para determinar la causa de la producción


de un reset (ver tabla 3.1).

TO PD Condición de reset
1 1 Reset por alimentación

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
105

0 1 Desbordamiento del WDT en funcionamiento normal


0 0 Desbordamiento del WDT en estado de reposo
1 1 Activación del MCLR en funcionamiento normal
1 0 Activación MCLR en reposo
Tabla 3.1. Determinación del origen de un reset

- Registro INTCON (0B-8B): sirve para el control global de las interrupciones


y para indicar la procedencia de alguna de ellas. Las cuatro fuentes de interrupción
posibles en el 16F84 son: activación de la patilla RB0/INT, desbordamiento del
temporizador TMR0, cambio de estado en los pines RB4 a RB7 y el fin de una escritura
en la EEPROM de datos.

Figura 3.4. Registro INTCON

Cada bit del registro INTCON (Figura 3.4) tiene un significado concreto que es
el que sigue:

El bit 0 o RBIF (RB Interrupt Flag) se pone a 1 si hay un cambio de estado en


una de las líneas de RB4 a RB7 del puerto B.
El bit 1 o INTF (Interrupt Flag) se pone a 1 si hay una interrupción provocada
por la línea RB=/INT del puerto B.
El bit 2 o T0IF (Timer 0 Interrupt Flag) se pone a 1 si hay desbordamiento del
Timer 0.
El bit 3 o RBIE (RB Interrupt Enable) se pone a 1 para autorizar las
interrupciones provocadas por un cambio de estado en las líneas RB4 a RB7 del puerto
B.
El bit 4 o INTE (Interrupt Enable) se pone a 1 para autorizar las interrupciones
provocadas por la línea RB0/INT del puerto B.
Los bit 5 o bit T0IE (Timer 0 Interrupt Enable) se pone a 1 para autorizar las
interrupciones debidas al desbordamiento del temporizador 0.
El bit 6 o EEIE (EEPROM Interrupt Enable) se pone a 1 para autorizar las
interrupciones que proceden de la memoria EEPROM de datos.
El bit 7 o GIE (Global Interrupt Enable) se pone a 1 para autorizar todas las
interrupciones que no tengan sus bits a 0. Si este bit es 0, todas las interrupciones están
desactivadas aunque sus bits particulares sean 1 (Ver figura 3.5).

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
106 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura 3.5. Lógica de control para interrupciones

- Puertas de E/S: el 16F84 solo dispone de dos puertas de entrada/salida. La


puerta A posee 5 líneas, RA0-RA4, y una de ellas soporta dos funciones multiplexadas.
Se trata de la RA4/T0CKI, que puede actuar como línea de E/S o como patilla de
entrada para los impulsos con que debe contar TMR0. La puerta B tiene 8 líneas, RB0-
RB7, y también tiene una con funciones multiplexadas, la RB0/INT, que sirve como
E/S y como patilla por la que se reciben los impulsos externos que provocan una
interrupción. Cada línea de E/S puede configurarse independientemente como entrada o
salida, según se ponga a 1 o 0, respectivamente, el bit asociado del registro de TRISA o
TRISB (direcciones 5 y 6 del banco 1 de la memoria de datos). Los registros
PUERTAA y PUERTAB guardan la información que entra o sale por la puerta
(direcciones 5 y 6 del banco 0). Al reinicializarse el pic todos los bits de los registros
TRIS quedan a 1, con lo que las líneas de las puertas quedan configuradas como
entradas; las resistencias pull-up que veremos más adelante, se desconectan al resetear.
Cada línea de salida puede suministrar una corriente máxima de 20 mA y si es entrada
puede absorber hasta 25 mA.

En la figura 3.6 se muestra la adaptación de las patillas RA4-RA0 a las señales


internas del procesador. Por ejemplo, cuando se saca un nivel lógico por una puerta A,
primero se deposita en la línea correspondiente del bus de datos y se activa la señal
WRITE, lo que origina el almacenamiento del nivel en la báscula de datos; para que
actúe como salida, la báscula de configuración debería contener un 0, por lo que la
puerta OR tendría un 0 en su salida y la AND también; estos valores producen la
conducción del PMOS superior y el bloqueo del NMOS; así, la patilla queda conectada
a Vdd y tiene nivel alto. Como la línea de salida está lacheada conserva su valor hasta
que no se reescriba en la báscula D.

Figura 3.6. Conexión electrónica de las patillas RA·-RA0.


A la derecha la patilla RA4

En la figura 3.7 se ve el esquema electrónico de conexionado para las patillas

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
107

RB7-RB0. A todas las líneas de esta puerta se le permite conectar una resistencia pull-
up de elevado valor con el positivo de la alimentación (se programa en el registro
OPTION). Las líneas RB7-RB4 pueden programarse para que generen una interrupción
si alguna de ellas cambia de valor (en ese caso se indicaría en el RBIF). Las líneas RB7
y RB6 también se utilizan para la grabación en serie de la memoria de programa (Ver
apartado 4).

Figura 3.7. A la izquierda el conexionado de las puertas RB7-RB4.


A la derecha para las puertas RB3-RB0.

- Temporizadores: el TMR0 es un temporizador/contador de 8 bits. Puede


utilizarse como contador, representado por los impulsos que se aplican a la patilla
RA4/T0CKI (de FF pasa a 00, activándose un señalizador o una interrupción), y como
temporizador, cargando un registro con un valor inicial (al desbordarse hará lo mismo
que el anterior). Para programarlo de una u otra forma se usa el registro OPTION que
veremos más adelante. El TMR0 puede ser leído y escrito (dirección 1, banco 0) en
cualquier momento al estar conectado al bus de datos. Cuando actúa como temporizador
se carga con el valor de los impulsos que se quiere temporizar, pero expresados en
complemento a 2; así, al llegar al número de impulsos deseado se desborda y activa el
señalizador TOIF y/o se produce la interrupción.
Otro temporizador importante es el perro guardián (WDT). Se trata de un
contador interno de 8 bits que origina un reset cuando se desborda. Su control de
tiempos es independiente del TMR0 y está basado en una red R-C interna, por lo que no
necesita ningún componente externo y continúa funcionando incluso cuando el reloj del
pic se para durante, por ejemplo, una instrucción SLEEP. Se programa desde el registro
OPTION. Se puede desactivar en la palabra de configuración (más adelante).
La temporización nominal del WDT es de 18 msg, pero puede llegar a 2,3
segundos utilizando el llamado divisor de frecuencia. Este divisor puede utilizarse con
el WDT o con el TMR0. Con el TMR0 actúa como Pre-divisor, es decir, los impulsos
pasan primero por el divisor y luego se aplican al TMR0. Con el WDT actúa como Post-
divisor.
Una fórmula práctica para calcular los tiempos a controlar con el TMR0 puede
ser esta:
Valor a cargar en TMR0 = Temporización / 4 * Toscilación * Rango del divisor

- Registro OPTION (dirección 81): la misión principal de este registro es


controlar el TMR0 y el divisor de frecuencia. Ocupa la dirección 81H de la memoria de

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
108 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

datos (equivale a la dirección 1 del banco 1). En la figura 3.8 se puede ver la estructura
de este registro.
Figura 3.8. Distribución de los bits del registro OPTION

Los bits 0, 1 y 2 o PS0, PS1 y PS2 son los encargados de definir el valor con el
que actúa el divisor de frecuencia. En la tabla 3.2 se pueden ver los distintos valores que
puede tomar el divisor.

PS2 PS1 PS0 División del TMR0 División del WDT


0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
Tabla 3.2. Programación de los bits PS2, PS1 y PS0

El bit 3 o PSA (Prescaler assignment) asigna el divisor de frecuencia al WDT


(1) o al TMR0 (0).
El bit 4 o RTE (Timer 0 signal edge) hace que el TMR0 se incremente cada
flanco ascendente (0) o descendente (1).
El bit 5 o RTS (Timer 0 signal source) a 0 indica que el temporizador utilizará
el reloj interno. Si está a 1 utilizará la señal aplicada en la patilla RA0/T0CKI.
El bit 6 o INTEDG (Interrupt edge) define el sentido del flanco que provocará
una interrupción a través de la patilla RB0/INT. Un 1 activa un flanco de subida y un 0
de bajada.
El bit 7 o RBPU (RB pull up enable) activa las resistencias pull-up (0) o las
desactiva (1).

- La palabra de configuración: se trata de una posición reservada de la


memoria de programa (2007H) y accesible únicamente durante la grabación del pic.

Figura 3.9. Distribución de los bits de la palabra de configuración

Los bits CP son bits de protección de la memoria de código. A 1 indican que no


está protegida, a 0 el programa no se puede leer ni sobreescribir. A 0 también evita que
pueda accederse a la EEPROM de datos, borrándose esta si el bit es modificado (si pasa
de 0 a 1).
El bit PWRTE activa (con un 0) el temporizador llamado “power-up”, que
retrasa en 72 msg la puesta en marcha al conectar la alimentación, garantizándose así la
estabilidad de la tensión aplicada.
El bit WDTE activa (1) o desactiva (0) el perro guardián.
Los bits FOSC1-FOSC0 seleccionan el oscilador utilizado: RC (11), HS (10),
XT (01) y LP (00).

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
109

Las posiciones de memoria 2000H-2003H también están reservadas para las


llamadas palabras de configuración (ID). En estas solo se usan los 4 bits de menos peso
para grabar números de serie, códigos de identificación, numeraciones secuenciales, etc.

- Memoria EEPROM de datos: el pic tiene 64 bytes de memoria donde se


pueden almacenar datos y variables que interesa que no se pierdan cuando se desconecta
la alimentación al sistema. En el registro EEADR (dirección 9 del banco 0) se carga la
dirección a acceder de la EEPROM de datos. En el registro EEDATA (dirección 8 del
banco 0) se depositan los datos que se leen o se escriben. El EECON1 (dirección 8 del
banco 1) tiene la misión de controlar las operaciones en la EEPROM (Figura 3.10).

Figura 3.10. Distribución de los bits del registro EECON1

El bit RD se pone a 1 cuando se va a realizar un ciclo de lectura de la EEPROM.


Luego pasa a cero automáticamente.
El bit WR se pone a 1 cuando se va a realizar un ciclo de escritura de la
EEPROM. Luego pasa a cero automáticamente.
El bit WREN da permiso para escribir cuando está a 1 y prohibe la escritura a 0.
El bit WRERR se pone a 1 cuando una operación de escritura ha terminado
prematuramente y a 0 cuando ha finalizado correctamente.
El bit EEIF se pone a 1 si la operación de escritura se completa con éxito y a 0
si no se ha completado.

Un ciclo de escritura tiene una duración de 10 msg. El registro EECON2 no está


implementado físicamente y se usa únicamente como dispositivo de seguridad durante
la escritura en la EEPROM.

Para leer la EEPROM basta con colocar la dirección a leer en EEADR y poner a
1 el bit RD. El dato leído estará disponible en el registro EEDATA.

Para escribir en la EEPRON se sigue una secuencia de instrucciones en las que


interviene el EECON2. Este registro solo asume funciones de seguridad, cargándose
con dos valores concretos: 55H y AAH. El ciclo de escritura comienza cargando en
EEADR la dirección de la posición a escribir, en el registro EEDATA el valor a grabar
y activado el bit WR. Al acabar la escritura, el bit WR se pone a 0 automáticamente y el
señalizador EEIF a 1 (habrá que ponerlo a 0 para volver a escribir). Para verificar la
correcta escritura, se resta el valor contenido en EEDATA con el dato escrito y se
comprueba que el bit Z pase a valer 1.

4. Programación:

La programación en serie del pic requiere 5 líneas, dos de las cuales se


destinan a soportar el reloj de la transmisión (RB6) y los bits de datos serie (RB7),
mientras que las otras tres soportan Vdd, tierra y la tensión de programación.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
110 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

El pic pasa al modo de programación/verificación poniendo a nivel bajo las


líneas RB6 y RB7 y aplicando la tensión de programación Vpp (12V – 14V). A partir de
ese momento por RB6 se transmiten los impulsos de reloj y por RB7 los bits de datos.

Figura 4.1. Esquema de conexionado de un 16F84 para


su grabación del programa en serie

5. Instrucciones del pic:

Como ya se ha visto, los pic responden a la arquitectura RISC. Esta arquitectura


contiene pocas instrucciones (35 en nuestro caso) simples y rápidas (la mayoría se
ejecutan en un ciclo de instrucción); las instrucciones son ortogonales (las instrucciones
pueden usar cualquier operando) y tienen una longitud constante (14 bits).

En la tabla 5.1, podemos ver las 35 instrucciones diferentes que se pueden usar
en la programación del pic 16F84. En la columna de sintaxis aparecen las siguientes
letras:

- f: es el registro de la dirección (7 bits).

- d: si vale 1, el resultado de la instrucción se almacena en f. Si vale 0, va al


acumulador (W).

- b: indica el numero de un bit dentro de un registro.

- k: es un valor inmediato (8 bits).

- x: indica que es un valor indeterminado.

En las últimas dos columnas, se indica el formato de la instrucción (14 bits) y


los señalizadores que activa esta (Bits). Para localizar mejor las instrucciones, se ha
separado la tabla para distribuir las instrucciones según su función (si manejan bits,

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
111

registros, etc). La columna C indican la duración en ciclos de instrucción (en nuestro


caso un ciclo dura 1 microsegundo) que tarda en ejecutarse una instrucción.

INSTRUCCIONES QUE MANEJAN REGISTROS


SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
ADDWF f, d W+f 1 00 0111 dfff ffff C,DC,Z
ANDWF f, d W AND f 1 00 0101 dfff ffff Z
CLRF f Borra f 1 00 0001 1fff ffff Z
CLRW Borra W 1 00 0001 0xxx xxxx Z
COMF f, d Invierte f 1 00 1001 dfff ffff Z
DECF f, d Decrementa f 1 00 0011 dfff ffff Z
INCF f, d Incrementa f 1 00 1010 dfff ffff Z
IORWF f, d W OR f 1 00 0100 dfff ffff Z
MOVF f, d Mueve f 1 00 1000 dfff ffff Z
MOVWF f Mueve W y f 1 00 0000 1fff ffff
NOP No operación 1 00 0000 0xx0 0000
RLF f, d Rota f a la izquierda 1 00 1101 dfff ffff C
RRF f, d Rota f a la derecha 1 00 1100 dfff ffff C
SUBWF f, d F–W 1 00 0010 dfff ffff C,DC,Z
SWAPF f, d Intercambia bits 1 00 1110 dfff ffff
XORWF f, d W XOR f 1 00 0110 dfff ffff Z
INSTRUCCIONES QUE MANEJAN BITS
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
BCF f, b Borra bit b de f 1 01 00bb bfff ffff
BSF f, b Pone a 1 bit b de f 1 01 01bb bfff ffff
INSTRUCCIONES DE BRINCO
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
BTFSC f, d Explora bit d de f y salta si es 0 1,2 01 10bb bfff ffff
BTFSS f, d Explora bit d de f y salta si es 1 1,2 01 11bb bfff ffff
DECFSZ f, d Decrementa f y si es 0 salta 1,2 00 1011 dfff ffff
INCFSZ f, d Incrementa f y si es 1 salta 1,2 00 1111 dfff ffff
INSTRUCCIONES QUE MANEJAN OPERANDOS INMEDIATOS
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
ADDLW k W+k 1 11 111x kkkk kkkk C,DC,Z
ANDLW k W AND k 1 11 1001 kkkk kkkk Z
IORLW k W OR k 1 11 1000 kkkk kkkk Z
MOVLW k Mueve a W el valor k 1 11 00xx kkkk kkkk
SUBLW k k–W 1 11 110x kkkk kkkk C,DC,Z
XORLW k W XOR k 1 11 1010 kkkk kkkk
INSTRUCCIONES DE CONTROL Y ESPECIALES
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
CALL k Llamada a subrutina 2 10 0kkk kkkk kkkk TO,PD
CLRWDT Borra o refresca el perro guardián 1 00 0000 0110 0100
GOTO k Salto incondicional a k 2 10 1kkk kkkk kkkk
RETFIE Retorno de interrupción 2 00 0000 0000 1001
RETLW k Retorno de subrutina y W=k 2 11 01xx kkkk kkkk

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
112 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

RETURN Retorno de subrutina 2 00 0000 0000 1000


SLEEP Pasa al modo de reposo 1 00 0000 0110 0011 TO,PD

Tabla 5.1. Juego de instrucciones del PIC16F84

Por último vamos ha ver más detenidamente el funcionamiento de las


instrucciones representadas en la tabla anterior.

- ADDLW k: añade el contenido de W al literal k y almacena el resultado en


W. Esta instrucción activa los bits C, DC y Z del registro de estado. Se ejecuta en un
ciclo de instrucción (todas se ejecutan en el mismo tiempo a menos que se especifique
otro valor).

- ADDWF f, d: añade el contenido de W al de f, y almacena el resultado en W


si d=0, y en f si d=1. Activa los mismos señalizadores que la anterior.

- ANDLW k: efectúa un AND lógico entre el contenido de W y el literal


k, y almacena el resultado en W. Si el resultado es nulo, activa el bit Z.

- ANDWF f, d: efectúa un AND lógico entre el contenido de W y el de f y


coloca el resultado en W (d=0) o en f (d=1).

- BCF f,b: pone a cero el bit número b de f.

- BSF f,b: pone a uno el bit número b de f.

- BTFSC f, d: si el bit número b de f es nulo, la instrucción que sigue a ésta se


ignora y se trata como un nop. En este caso (solo en este caso), la instrucción precisa de
dos ciclos para ejecutarse.

- BTFSC f, d: si el bit número b de f es 1, la instrucción que sigue a ésta se


ignora y se trata como un nop. En este caso (solo en este caso), la instrucción precisa de
dos ciclos para ejecutarse.

- CALL 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. Los pasos que sigue para su
ejecución son: PC + 1  pila, k  PC (0 – 10), PCLATH (3,4)  PC (11,12)

- CLRF f: pone el contenido de f a cero y activa el bit Z.

- CLRW: pone el registro W a cero y activa el bit Z.

- CLRWDT: pone a cero el registro contador del temporizador watchdog


(WDT), así como el predivisor. Pone a 1 los bits TO y PD.

- COMF f, d: hace el complementario de f bit a bit. 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 nulo,
activa Z.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
113

- DECF f, d: decrementa el contenido de f en una unidad. El resultado lo


almacena de nuevo en f (d=1) o en W (d=0), no variando f en este último caso. También
activa Z si el resultado es nulo.

- DECFSZ f, d: decrementa el contenido de f en una unidad. El resultado se


almacena según el valor de d. Si el resultado es nulo, se ignora la siguiente instrucción
y, en ese caso, esta instrucción dura dos ciclos.

- GOTO k: llama a la subrutina situada en la dirección cargada en el PC. La


ejecución de la instrucción sería: k  PC (0-10), PCLATH (3,4)  PC (11,12)

- INCF f, d: incrementa el contenido de f en una unidad. El resultado se


almacena de nuevo en f o W (en este caso f no varía). Activa Z si el resultado es nulo.

- INCFSZ f, d: incrementa el contenido de f en una unidad. El resultado se


almacena en f (d=1) o W (d=0 y f no varía). Si el resultado es nulo, se ignora la
siguiente instrucción y, en este caso, esta instrucción dura dos ciclos.

- IORLW k: efectúa un OR lógico inclusivo entre el contenido de W y el


literal k, y almacena el resultado en W. Si la operación da cero, se activa el bit Z.

- IORWF f, d: efectúa un OR lógico inclusivo entre el contenido de W y el


contenido de f, y almacena el resultado en W (d=0) o en f. Si la operación da cero, se
activa el bit Z.

- MOVF f, d: desplaza el contenido de f a f si d=1 ó a W si d=0. El


desplazamiento de f a f permite comprobar el contenido de f con respecto a cero, ya que
esta instrucción actúa sobre el bit Z.

- MOVLW k: carga W con el literal k.

- MOVWF f: carga f con el contenido de W.

- NOP: sólo consume tiempo de máquina, un ciclo en este caso.

- RETFIE: carga el PC con el valor que se encuentra en la parte superior 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.

- RETLW k: carga 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.

- RETURN: carga el PC con el valor que se encuentra en la parte superior de la


pila, efectuando así una vuelta de subrutina. Es como la anterior pero simplificada.

- RLF f, d: rotación de un bit a la izquierda del contenido de f, pasando por el


bit de acarreo C (ver figura 5.1). Si d=1 el resultado se almacena en f, si es 0 se
almacena en W.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
114 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura 5.1. Desplazamiento a la izquierda

- RRF f, d: rotación de un bit a la derecha del contenido de f, pasando por el


bit de acarreo C (es como en la figura 5.1 pero con las flechas hacia la derecha). Si d=1
el resultado se almacena en f, si es 0 se almacena en W.

- SUBLW k: sustrae el contenido de W del literal k (k – W) y almacena el


resultado en W. La sustracción se realiza en complemento a dos.

- SUBWF f, d: sustrae el contenido de W del contenido de f (f – W) y


almacena el resultado en W o f (según valor de d). La sustracción se realiza en
complemento a 2. Tanto esta como la anterior activan los bits C, DC, y Z según el caso.

- SWAPF f, d: intercambia los cuatro bits de mayor peso con los cuatro de
menor peso de f y almacena el resultado en f o W (según d).

- XORLW k: efectúa un OR lógico exclusivo entre el contenido de W y el


literal k, y almacena el resultado en W.

- XORLW f, d: efectúa un OR lógico exclusivo entre el contenido de W y el


contenido de f, y almacena el resultado en f o W (según d). Tanto esta como la anterior
activa el bit Z si se da el caso.

- SLEEP: pone el circuito en modo SLEEP y para el oscilador. El procesador


queda congelado, no ejecutando instrucciones y manteniendo el mismo valor en la
puertas de E/S. Pone a cero el WDT (aunque sigue funcionando), el predivisor y PD;
también pone a 1 el bit TO. Para que el micro salga del modo SLEEP, se tiene que dar
una de estas situaciones: que la patilla MCLR se active externamente (reset), que se
desborde el WDT(en caso de que estuviera activado al entrar en el modo reposo) y que
se de una interrupción (como TMR0 está desactivado, solo podrá producirse una de los
otros tipos).

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
115

Capítulo 5

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
116 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
117

Guía del micropic Trainer

El sistema pic trainer consiste en un equipo completo para la evaluación para


aplicaciones basadas en los microcontroladores PIC de gama media. Dispone de una
serie de periféricos básicos de E/S con los que poder verificar el funcionamiento de una
aplicación, así como la circuitería necesaria para la grabación de todos los modelos del
PIC de gama media de 18 y 28 patillas.

1. Arquitectura del PIC Trainer:

En la figura A podemos ver el aspecto externo de la placa. En ella aparecen


representados los elementos más importantes mediante las siguientes notas:

(1): dos zócalos para insertar cualquier microcontrolador de gama media tanto
de 18 (abajo) como de 28 patillas(arriba).
(2): Cristal de cuarzo junto con dos condensadores. Nos proporciona la
frecuencia de trabajo de 4 MHz.
(3): Pulsador que genera un reset en el PIC.
(4): 5 conmutadores correspondientes a 5 entradas digitales.
(5): 4 potenciómetros correspondientes a las 4 entradas analógicas.
(6): Jumpers (J8) para selección de entradas analógicas (jumpers arriba),
digitales (abajo) o para desactivar las entradas al puerto A.
(7): Conector de expansión PIC-BUS.
(8): Barra de leds conectada a la puerta B. Arriba está su pack de resistencias.
(9): Display 7 segmentos conectado a puerta B.
(10): Jumpers (J5, J6, J7) para la activación del display, los leds y el LCD.
(11): Módulo de visualización LCD.
(12): Potenciómetro de ajuste(P1) para el LCD.
(13): Conector DB25 para conexión con el canal paralelo de cualquier PC.
(14): Led (D5) que indica la presencia de la tensión de programación (Vpp).
(15): Condensadores (C1 y C2) y puente rectificador (D1) para transformar la
tensión alterna (12VAC) en continua (el transformador se conecta por arriba).

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
118 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura A. Aspecto exterior del pic trainer

En el apartado 2, aparece la figura C correspondiente al PCB de la placa; en ella


se ven los distintos diodos (D1, D2,...), condensadores, etc a los que se hace referencia
en las explicaciones de abajo. En la figura B aparecen estas referencias pero según su
distribución en el esquemático de la placa. Las características del pic trainer son las
que se explican a continuación:

- Alimentación desde un transformador de 12VAC conectado a J1. El circuito


de estabilización está incluido en la placa y nos da la tensión general de +5V (Vcc) y la
de grabación de 13,8V. La tensión alterna proporcionada por el transformador, se
rectifica mediante el puente de diodos D1 y se filtra mediante los condensadores C1 y
C2 (obteniéndose así una tensión continua sin estabilizar). La tensión obtenida se
estabiliza a +5V mediante el regulador U6 (uA7805) y a +13,8V con el regulador
uA7812 junto con los tres diodos D2-D4.

- Soporta cualquier microcontrolador de gama media tanto de 18 como de 28


patillas; esta es la razón de la existencia de dos zócalos en la placa (ver figura A). La
frecuencia de trabajo es de 4 MHz, que se puede modificar cambiando el cristal de
cuarzo y los valores de C6 y C7.

- Generación automática de reset y manual, mediante un pulsador de la placa


(ver figura A).

- Conector de expansión PIC-BUS. Se trata de un conector de 26 contactos en el


que están disponibles las señales de las puertas E/S además de la alimentación y MCLR.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
119

- Posee 5 entradas digitales implementadas mediante 5 conmutadores (SW2-


SW6) y 4 analógicas variables mediante los potenciómetros P2-P5 (nos dan una tensión
variable de 0-5V). Están conectados a las líneas RA0-RA4 de la puerta A. Los
conmutadores son capaces de introducir niveles lógicos 1 y 0 por esas líneas. Estas
pueden programarse para actuar de diferentes formas (RA0-RA3 pueden actuar como
entradas analógicas o digitales y RA4 como entrada exterior de pulsos para el timer 0 o
como entrada digital). Los jumpers J8(0)-J8(3) seleccionan individualmente si por RA0-
RA3 se van ha introducir entradas digitales (interruptores SW2-SW5), analógicas
(potenciómetros P2-P5) o si se van a quedar desconectadas para usarlas con otros
periféricos. Con el jumper J9 se selecciona si RA4 actúa como entrada digital (SW6),
como señal de reloj (aplicada desde el exterior mediante conector J2(1)) o si está
desconectada.

- Posee 8 salidas digitales conectadas a 8 indicadores luminosos tipo LED y/o a


display 7 segmentos. Están conectadas a la puerta B y consisten en una barra de diodos
leds luminosos (D8) que representan el estado lógico de las señales RB0-RB7 y en un
display numérico de 7 segmentos. Están conectados entre sí en paralelo a la puerta B;
tanto los leds como el display disponen de los jumpers J7 y J5 respectivamente con los
que se les puede desconectar si la aplicación no los necesita. La barra de leds es de 10,
ocho de los cuales van a las puertas, uno no se utiliza y el décimo nos indica la
presencia de tensión +5V (Vcc ON). Los leds están conectados al pack de resistencias
RPACK 1 (8 resistencias de 330 que actúan como limitadoras). La línea RB0 también
puede actuar como entrada de interrupción INT (aplicada mediante conector J2(3)). Con
el jumper 10 la señal RB0 se conecta a los leds y al display.

- Tiene conectado un módulo de visualización tipo LCD (Liquid Cristal Display)


de 2x16 (dos líneas de 16 caracteres cada una) y control de contraste mediante
potenciómetro (P1). Las 8 líneas de datos del LCD (D0-D7) están conectadas a la puerta
B; por ella se aplican los diferentes códigos de control para realizar los distintos efectos
de visualización en el LCD (en este caso las puertas actúan como salida); en algunos
casos las puertas B deben actuar como entradas para comprobar el estado interno del
LCD. Mediante el jumper J6 activamos o desactivamos el LCD. (Ver apartado 3 para
más información).

- Contiene un circuito grabador que nos permite (con el software de control


necesario) grabar el PIC insertado en uno de los zócalos (el PIC podrá ser grabado,
borrado, ... desde el mismo zócalo de trabajo). Mediante el conector J3 se conecta al
canal paralelo de cualquier ordenador personal. El circuito integrado U3 se encarga de
verificar el hardware del pic trainer y la comunicación entre este y el PC. Los bits de
datos se leen o escriben en serie a través de RB7 y son aplicados al puerto paralelo
mediante los amplificadores U4D y U4F. La señal RB6 (entrada de reloj para
sincronizar la lectura/grabación) es generada por el software de control y se aplica por el
canal paralelo a través del amplificador U4C. El software también genera una señal que,
mediante U4B, se aplica al transistor de conmutación Q1 para que envíe los 13,8V a la
patilla MCLR/Vpp del pic; al mismo tiempo el diodo led D5 se ilumina indicando la
presencia de esta tensión. Finalmente, a través de U4A, el software genera la señal
MCLR que resetea al micro. Durante la lectura/escritura, hay que tener desconectados
los jumpers J5, J6 y J7 para que no se altere la información leída o grabada.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
120 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
121

Figura B. Esquema eléctrico del PIC Trainer

2. Componentes del PIC Trainer:

El PIC Trainer está montado sobre una placa de circuito impreso tamaño
Eurocard de 100x160 de doble cara. En la figura C se presenta la disposición y
orientación de los componentes sobre la placa de circuito impreso.

Figura C. Disposición de componentes en la placa

En la tabla A se presentan los valores de los distintos componentes utilizados en


la placa (ver figura C).

CIRCUITOS INTEGRADOS DIODOS

U1 PIC de 18 patillas D1 Puente rectificador de 1ª


U2 PIC de 28 patillas D2-D4 Diodos 1N4007
U3 Circuito de control D5 Diodo luminoso tipo led rojo
U4 Amplificador SN7407 D6-D7 Diodos 1N4148
U5 Estabilizador de tensión (12V) 7812 D8 Barra de 10 diodos led
U6 Estabilizador de tensión (5V) 7805 D9 Display 7 segmentos cátodo común

RESISTENCIAS CONDENSADORES

R1 1K – ¼ W C1-C2 Electrolítico de 100RF / 63V


R2 100 – ¼ W C3-C5 100nF
R3-R7 10K – ¼ W C6-C7 27pF
R9 4K7 – ¼ W
R10-R14 10K – ¼ W OTROS
R15 330 ¼ W
R16 10K – ¼ W X1 Cristal de cuarzo 4MHz
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
122 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

R17 100 – ¼ W SW1 Pulsador de reset


RPACK1 Pack de 8 resistencias DIL 330 SW2-6 Conmutadores de palanca
P1 Resistencia ajustable 10K Q1 Transistor PNP 3906
P2-P5 Resistencias ajustables 1K

JUMPERS

J1 Base de alimentación para entrada J3 Conector DB25 macho con codo de


de corriente alterna bajo perfil para c. impreso
J2 Borna de 3 contactos para circuito J4 Conector 26 contactos (2x13), macho
impreso de paso 5.08 recto
Tabla A. Lista de materiales empleados en el pic trainer

En la placa también se han utilizado otros materiales como zócalos, cables,


tornillos, refrigeradores (2 para los circuitos de estabilización), ejes de potenciómetros,
módulo LCD,...

En la tabla B, vemos el resultado obtenido según la posición ocupada por los


distintos jumpers.

JUMPER POSICIÓN DESCRIPCIÓN

J5 Abierto Display D9 desconectado


Cerrado Display D9 conectado a la puerta B
J6 Abierto Módulo LCD desconectado
Cerrado Módulo LCD conectado a la puerta B
J7 Abierto Barra de leds D8 desconectada
Cerrado Barra de leds D8 conectada a la puerta B
J8(0) Abierto Línea RA0 sin conexión
Analógico Línea RA0 entrada analógica AN0
Digital Línea RA0 entrada digital
J8(1) Abierto Línea RA1 sin conexión
Analógico Línea RA1 entrada analógica AN1
Digital Línea RA1 entrada digital
J8(2) Abierto Línea RA2 sin conexión
Analógico Línea RA2 entrada analógica AN2
Digital Línea RA2 entrada digital
J8(3) Abierto Línea RA3 sin conexión
Analógico Línea RA3 entrada analógica AN3
Digital Línea RA3 entrada digital
J9 Abierto Línea RA4 sin conexión
TOCKI Línea RA4 entrada de reloj para el Timer 0
A4 Línea RA4 entrada digital
J10 Abierto Línea RB0 sin conexión
INT Línea RB0 entrada de interrupción externa
B0 Línea RB0 salida digital
Tabla B. Posición de los jumpers.
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
123

3. El módulo de visualización LCD:

Se trata de un módulo microcontrolado capaz de representar 2 líneas de 16


caracteres cada una. A través de 8 líneas de datos se le envía el carácter ASCII que se
desea visualizar así como ciertos códigos de control que permiten realizar diferentes
efectos de visualización. Mediante estas líneas, el módulo devuelve información sobre
su estado interno. Contiene otras tres líneas para controlar el flujo de información.
Las señales empleadas en el módulo LCD son las representadas en la tabla C, así
como su numero de pin correspondiente.
El interfase entre el módulo y el pic trainer se realiza uniendo las líneas D0-D7
del LCD con la puerta B del pic; de igual forma, la señal RS (ver tabla C) se conecta a
RA0, la señal R/W se conecta a la RA1 y la señal E a RA2. Tanto RA0 como RA2
deben programarse como salidas, mientras que RA1 será entrada o salida, según si
leemos o escribimos.

PIN Nº SÍMBOLO DESCRIPCIÓN

1 Vss Patilla de tierra de alimentación


2 Vdd Patilla de alimentación de +5V
3 Vo Patilla de contraste del cristal líquido.
4 RS RS=0 Selección del registro de control o RS=1 de datos
5 R/W R/W=0 el LCD es escrito y R/W=1 es leído
6 E E=0 módulo desconectado o E=1 conectado
7 – 14 D0 – D7 Bus de datos Bi-direccional.
Tabla C. Pines del Módulo LCD

El juego de instrucciones permite configurar el LCD según los efectos que


queremos. En la tabla D vemos los valores que toman las líneas para darnos una estas
instrucciones:

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 INSTRUCCIÓN
0 0 0 0 0 0 0 0 0 1 Clear display
0 0 0 0 0 0 0 0 1 X Home
0 0 0 0 0 0 0 1 I/D S Entry mode set
0 0 0 0 0 0 1 D C B Display ON/OFF
0 0 0 0 0 1 S/C R/L X X Cur. or Dis. shift
0 0 0 0 1 DL N F X X Set
0 0 0 1 Dirección de la CG RAM Set address CG R
0 0 1 Dirección de la DD RAM Set address DD R
0 1 BF Dirección de la CG RAM o DD RAM Read busy flag
1 0 Código ASCII o byte del carácter gráfico Write data to Ram
1 1 Código ASCII o byte del carácter gráfico Read data de Ram
ABREVIATURAS EMPLEADAS
S Si es 1 desplaza la visualización al escribir un dato. Si es 0 modo normal
I/D Si es 1 el cursor se va incrementando, si es 0 decrementa
S/C Si es 1 desplaza el display, si es 0 mueve el cursor

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
124 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

R/L Si es 1 desplazamiento a la derecha, si es 0 a la izquierda


BF Si es 1 el módulo está ocupado, si es 0 está disponible
DL Si es 1 el bus de datos es de 8 bits, si es 0 será de 4 bits
N Si es 1 el LCD usa las dos líneas, si es 0 usa una
F Si es 1 el carácter es de 5x10 puntos, si es 0 es de 5x7
B Si es 1 el cursor parpadea
C Si es 1 el cursor está activado
D Si es 1 el display está conectado
X Valor indeterminado
Tabla D. Juego de instrucciones del LCD y descripción de palabras utilizadas.

A continuación vamos a explicar brevemente el uso de cada una de las


instrucciones representadas en la tabla anterior.

- Clear display: borra el módulo LCD y coloca el cursor en la primera posición


(dirección 0). Pone el bit I/D (ver tabla D) a 1 por defecto.

- Home: coloca el cursor en la posición inicio y hace que el display comience a


desplazarse desde la posición original. Tanto esta instrucción como la anterior, tardan
1.64 msg en ejecutarse, al contrario que todas las demás que tardan 40 sg.

- Entry mode set: establece la dirección de movimiento del cursor y específica


si la visualización se va desplazando a la siguiente posición de la pantalla o no.

- Display ON/OFF control: activa o desactiva poniendo en ON/OFF tanto el


display como el cursor y si este debe o no parpadear.

- Cursor or display shift: mueve el cursor y desplaza el display sin cambiar el


contenido de la memoria de datos de visualización DD RAM.

- Set: establece el tamaño de interfase con el bus de datos, número de líneas del
display y tipo de carácter.

- Set the CG RAM address: el LCD, además de tener definidos todo el


conjunto de caracteres ASCII, permite definir 4 u 8 caracteres gráficos. La composición
de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad
para 64 bytes. Cada carácter definido se compone de 16 u 6 bytes que se almacenan en
sucesivas posiciones de la CG RAM. Mediante esta instrucción se establece la dirección
de memoria CG RAM a partir de la cual se irán almacenando los bytes que definen un
carácter gráfico.

- Set the DD RAM address: los caracteres o gráficos que se van visualizando,
se van almacenando previamente en una memoria llamada DD RAM para de aquí pasar
a pantalla. Mediante esta instrucción se establece la dirección de memoria DD RAM a
partir de la cual irán almacenando los datos a visualizar. Las direcciones de la 80h a la
8Fh corresponden a los 16 caracteres de la primera línea del LCD y de la C0h a la CFh
al segundo.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
125

- Read busy flag&address: esta instrucción informa del estado del flag BUSY
además de proporcionar el valor del contador de direcciones de la CG o DD RAM
(según la última que se haya empleado). El flag BUSY indica si se está ejecutando una
instrucción (módulo ocupado) o no.

- Write data to CG or DD RAM: escribe en la memoria DD RAM los datos


que se quieren presentar en pantalla. Igualmente se escribe en la memoria CG RAM los
diferentes bytes que permiten confeccionar caracteres gráficos. El escribir en una u otra
depende de si se ha usado antes la instrucción de direccionamiento DD o CG RAM.

- Read data from CG or DD RAM: igual que la anterior pero leyendo.


En la figura D se muestran todos los caracteres gráficos disponibles para el
LCD. Por ejemplo, para que salga la “A”, tendremos que introducir por las líneas de
datos el código 41h (ver figura D).

Figura D. Juego de caracteres ASCII del módulo LCD

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
126 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Las posiciones marcadas como CG RAM (1-8) corresponden a los caracteres


gráficos definidos por el usuario.

En la tabla E se muestra un ejemplo de configuración del carácter “A”. En este


caso se ha usado un carácter 5x7 que necesita 8 octetos en la CG RAM para ser definido
(si fuera 5x10 necesitaría 16). Los octetos son introducidos en las 8 primeras posiciones
de la CG RAM (si fuera 5x10 serían 16). Cada bit de cada octeto que valga 1 implica
que su correspondiente pixel se active en el LCD. Si es el primer carácter creado de la
CG RAM, se seleccionará aplicando el código 00h en la DD RAM como si fuera
cualquier otro código ASCII. Si siguiéramos creando caracteres, estos se cargarían con
las direcciones 01h, 02h, 03h,..., 0Fh de la DD RAM (ver figura D).

Código del carácter Dirección de Patrones del carácter


DD RAM la CG RAM CG RAM
7 6 5 4 3 2 1 0 5 4 3 2 1 0 7 6 5 4 3 2 1 0
0 0 0 1 1 1 1 1
0 0 1 1 0 0 0 1
0 1 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1
1 0 1 1 0 0 0 1
1 1 0 1 0 0 0 1
1 1 1 0 0 0 0 0
Tabla E. Generación del carácter gráfico “A”

El módulo LCD ejecuta automáticamente la siguiente secuencia de inicio interna


en el instante de aplicarle la tensión de alimentación (esta tiene estabilizarse de 0.2V
hasta los 4.5V en un tiempo comprendido entre 0.1 msg y 10 msg; igualmente el tiempo
de desconexión debe ser como mínimo de 1 msg antes de volver a conectar):

- Clear display: el flag BUSY se mantiene a 1 durante 15 msg hasta que


finaliza la inicialización.

- Set: bus de datos=8 y reglones del display=1.

- Display ON/OFF control: display OFF, cursor OFF y parpadeo OFF.

- Entry mode set: incremento del cursor y modo normal del display.

- Se selecciona la primera posición de la DD RAM.

Si no se satisfacen las condiciones de alimentación,la secuencia de inicialización


habría que realizarla por software.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
127

Para terminar, en la tabla F se presentan los tiempos de las señales


recomendados para el módulo LCD utilizado en la placa. En la figura E se presenta el
diagrama de tiempos (con los tiempos representados en la tabla F) para escritura o
lectura.

Figura E. Diagrama de tiempos para la lectura/escritura

PARÁMETRO SÍMBOLO TIEMPO (nsg)


Enable cycle time tC (min) 1000
Enable pulse Width tW (min) 450
tL (min) 450
E. Raise time tr (max) 25
E. Fall Time tf (max) 25
Set-up time tB (min) 140
Data set-up time tl (min) 195
Data delay time tD (max) 320
Address hold time tA (max) 10
Hold time tH (min) 10
tO (min) 20
Tabla F. Tiempos recomendados

4. Software recomendado:

El software recomendado para la programación de los pic, es el MPASM y el


PIME-TR. Los pasos a seguir a la hora de realizar y grabar un programa en el pic son
los que siguen:

- En primer lugar, se escribe el programa utilizando cualquier editor de texto con


la particularidad de ser grabado con extensión ASM. El editor de msdos nos puede
servir para la escritura del programa.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
128 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

- Tras ello, se compila el programa utilizando el archivo MPASM.EXE. El


programa únicamente nos pide la ubicación exacta del fichero a compilar; tras
seleccionar los ficheros deseados a la salida (archivo.ERR, archivo.LIST,...) y el tipo de
pic se pulsa F10 y se obtiene el archivo compilado con extensión HEX. Si el programa
tiene errores en la compilación, estos aparecen en el archivo .ERR (si se ha seleccionado
su salida). Otro fichero de interés es el .LST, el cual contiene el listado completo de la
compilación (tanto este como el .ERR están seleccionados por defecto).

- Por último queda cargar el archivo PICME-TR.EXE. El programa funciona con


ventanas y es muy simple; a la derecha se seleccionan las distintas opciones de
programación (tipo de pic, tipo de oscilador,...) y a la izquierda nos aparece el menú
para abrir el archivo (con extensión HEX) y programarlo; desde este menú de la
izquierda, también podemos leer el pic, borrarlo y verificarlo. Mediante mensajes el
programa nos informará de cómo ha ido la programación.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
129

Capítulo 6

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
130 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
131

Guía del micropic Trainer Plus

El pic trainer plus es un equipo que conectado al pic trainer permite ampliar y
experimentar prácticamente con los recursos más avanzados y más interesantes que
soportan los pic. En esta guía se explican únicamente las partes del pic trainer plus que
se utilizan en las prácticas realizadas. Las partes no utilizadas en dichas prácticas solo
nombran y describen muy brevemente. Para más información sobre estas partes
consultar el manual del pic trainer plus que proporciona la empresa Microsystems
Engineering.

1. Arquitectura del PIC Trainer plus:

En la figura F podemos ver el aspecto externo de la placa. En ella aparecen


representados los elementos más importantes mediante las siguientes notas:

(1): Conector de expansión PIC-BUS.


(2): Teclado hexadecimal 4x4.
(3): Conector DB9 macho para conexión serie RS232. Justo debajo de él está el
convertidor MAX232.
(4): Display de 4 dígitos de 7 segmentos (SAA1064).
(5): 8 líneas de E/S digitales proporcionadas por el dispositivo PCF8574.
(6): Convertidor analógico-digital y viceversa (PCF8591).
(7): Reloj/calendario en tiempo real (PCF8583).
(8): Bornes de conexiones al exterior (8 líneas de E/S digital, ...)

Figura F. Aspecto exterior del pic trainer plus


____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
132 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

En el apartado 2 de esta guía, aparece la figura correspondiente al PCB de la


placa; en ella se ven los distintos conectores (CN1, CN2,...), circuitos integrados, etc a
los que se hace referencia en las explicaciones que se verán a continuación. En la figura
K aparecen estas referencias pero según su distribución en el esquemático de la placa.
Las características del pic trainer plus son:

- Se Conecta directamente al conector de expansión PIC-BUS del pic trainer


mediante cable plano de 26 hilos.

- La alimentación es única de +5V (Vcc) y se toma directamente del PIC-BUS o


bien se aplica a través de los bornes de conexión exterior.

- Posee teclado numérico hexadecimal de 4x4 conectado a las líneas RB0-RB7


de la puerta B (ver apartado 3).

- Posee canal de comunicaciones serie RS-232 con conector estándar DB9


macho (ver apartado 4).

- Tiene implementado un interface I²C gestionado por las líneas RC3-RC4


para los dispositivos que lo implementan por hardware, o bien mediante las líneas RB6-
RB7 (es nuestro caso) para la gestión por software. Se selecciona mediante los jumpers
J1 y J2. El bus I²C está formado por dos líneas, SDA (datos) y SCL (reloj); están
transportan la información entre los diferentes dispositivos conectados al bus (teclado,
reloj, displays, convertidor ADC/DAC, y las E/S paralelas). Cada dispositivo se
identifica por una dirección única y puede transmitir o recibir dependiendo de la
operación que se vaya a realizar. Los términos más sencillos que se utilizan en este tipo
de bus son: transmisor (coloca información en la línea SDA), receptor ( recibe esa
información), master (dispositivo que inicia la transferencia, genera la señal de reloj y
finaliza la transferencia), slave (dispositivo seleccionado por el master), multi-master
(más de un master puede hacerse con el control del bus sin corromper la información),y
arbitraje (procedimiento que garantiza que solo un master se haga cargo del bus). Dado
que este tipo de bus no se ha utilizado en las prácticas realizadas, no se explicará su
funcionamiento en profundidad (para más información ver capítulo 3 del manual de la
placa).

- Contiene un display de 4 dígitos de 7 segmentos (SAA1064) controlado por


el dispositivo I²C. Su conexión en la placa puede verse en la figura G. Las líneas SCL y
SDA son las líneas del bus I²C mediante las cuales el master envía la información a
visualizar sobre los cuatro dígitos. La dirección I²C del dispositivo es de 7 bits. Los 5
bits de más peso están establecidos por el fabricante (01110). Los dos siguientes los
establece el usuario mediante la tensión que se aplica en la patilla 1 (ADR): GND (00),
3/8 de Vcc (01), 5/8 de Vcc (10) y Vcc (11). La dirección asignada por la placa es por
tanto 0111011x; el bit x es un 0 o un 1, según se escriba o se lea. Cuando el circuito
recibe la información a visualizar sobre los 4 displays, realiza un multiplexado de los
mismos; así, en un primer momento, por las líneas P1-P8 aparece la información a
representar en el dígito 1 y, por las líneas P9-P16 las del 3; simultáneamente, aparece la
señal MX1 con la que se activa el transistor Q1. Tras un lapsus de tiempo se repite lo
mismo para los dígitos 2 y 4, activándose ahora la señal MX2 que activa el transistor
Q2. Para más información sobre el SAA1064 ver capítulo 5 del manual de la placa.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
133

Figura G. Módulo de visualización de 4 dígitos

- Contiene 4 canales de conversión analógico-digital (ADC) y un digital-


analógico (DAC) proporcionados por el bus I²C PCF8591 (U3). Su esquema electrónico
es el mostrado en la figura H. La dirección I²C esta formada por 4 bits de fabrica (100) y
otros 3 que dependen del estado lógico de las líneas A0, A1 y A2. En el caso de nuestra
placa, la dirección es 1001000x. El circuito consiste, por una parte, en un convertidor
ADC de 8 bits y cuatro canales analógicos de entrada (las señales a convertir se aplican
por las líneas AN0, AN1,AN2 y AN3 y proceden de los bornes exteriores); por otra
parte dispone de un convertido DAC de 8 bits que nos da una tensión de salida en el
borne AOUT. La señal analógica de tierra y la de referencia se aplican por los bornes
AGND y VREF; estas tensiones también se pueden conectar directamente a las de la
placa obteniéndose una resolución de 20mV/bit en las conversiones. Para más
información sobre el dispositivo PCF8591 ver el capítulo 6 del manual.

- Posee 8 líneas de E/S digital proporcionadas por el dispositivo I²C PCF8574


(U4). Su dirección está formada por los bits 0111 y el estado lógico de las puertas A0,
A1 y A2 (en nuestro caso es 0111000x). El esquema de conexiones puede observarse en
la figura I. El circuito está compuesto por 8 líneas que pueden actuar como E/S según
lean o escriban (P0-P7); la conexión a las líneas se realiza en los bornes de conexión,
pudiéndose comprobar el estado lógico de las mismas mediante una fila de 8 diodos led
(se activan por lógica negativa). La línea INT(activada con un 0) se puede utilizar como
interrupción al master cuando una línea cambia su estado. Para más información, ver
capítulo 7 del manual de la placa.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
134 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura H. Esquema electrónico del módulo ADC/DAC

Figura I. Esquema electrónico del módulo E/S

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
135

- Por último, también posee un reloj/calendario en tiempo real controlado por el


dispositivo I²C PCF8583 (U2). Junto con las clásicas funciones horarias, también realiza
funciones de alarma y temporización. Contiene 256 posiciones de memoria RAM
estática, de las cuales 16 están reservadas a esas funciones quedando, por tanto 240
posiciones libres para el usuario. En la figura J se puede ver el conexionado del
dispositivo dentro de la placa. La dirección asignada es 1010000x. La patilla 1 (OSC1)
es la entrada de reloj (la frecuencia puede ser de 50 Hz o la obtenida por el cristal
incorporado de 32.768 Hz). La patilla 7 (INT) se activa con nivel bajo en caso de alarma
o cuando se alcanza una temporización predeterminada (puede usarse para provocar
interrupciones en el master). En nuestra placa, el circuito puede alimentarse mediante
Vcc o mediante una batería de Ni/Cd; cuando tengamos Vcc, el circuito se alimenta a
través del diodo D5 y la batería se carga a través de D5 y R16; si hubiera un fallo de
alimentación, el reloj continuaría funcionando con la batería (se mantendría en hora y
no se perderían los datos en la RAM). Para más información ver capitulo 4 del manual
de la placa.

Figura J. Esquema electrónico del reloj/calendario + RAM

En la figura K se presenta el esquemático completo del pic trainer plus a falta


de ver el funcionamiento del teclado hexadecimal (apartado 3) y de la comunicación
serie RS232 (apartado 4). Como puede apreciarse, el bus I²C va conectado mediante las
líneas SCL y SDA a todos los dispositivos contenidos en la placa. El teclado y la
comunicación serie, son las dos únicas aplicaciones que se pueden utilizar sin necesidad
de utilizar el bus I²C, dado que ambas tienen jumpers de selección para conectarlas
directamente al pic trainer.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
136 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

Figura K. Esquemático general del pic trainer plus

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
137

2. Componentes del PIC Trainer plus:

El PIC Trainer está montado sobre una placa de circuito impreso tamaño
Eurocard de 100x160 de doble cara. En la figura L se presenta la disposición y
orientación de los componentes sobre la placa de circuito impreso.

Figura L. Disposición de componentes en la placa

En la tabla G se presentan los valores de los distintos componentes utilizados en


la placa (ver figura L).

CIRCUITOS INTEGRADOS RESISTENCIAS


U1 Controlador de display SAA1064 R1-R7 2K2 ¼W
U2 Reloj/calendario PCF8583P R8-R15 270 ¼W
U3 Convertidor AD/DA PCF8591 R16 150 ¼W
U4 E/S paralelo PCF8574A R17 10K ¼W
U5 Convertidor MAX232 R18 100K ¼W
DIODOS Y TRANSISTORES CONDENSADORES
DIG1-4 Display ánodo común SA36-11 C1-C5 100 nF
D5 Diodo1N4007 C6 2.7 nF
D6-D13 Diodos Leds C7-C10 22 F
Q1-Q2 Transistores NPN SC 107 C11 10 pF
OTROS
BAT1 Batería recargable Ni/Cd 3.6V X1 Cristal de cuarzo 32.768
CN1 Conector 16 contactos para CN2 Conector DB9 macho, codo bajo
cable plano, macho, recto perfil
Tabla G. Lista de materiales empleados en el pic trainer plus

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
138 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

En la placa también se han utilizado otros materiales como cable plano de 26


hilos acabado en 2 conectores hembra, tuercas (métrica 10), pines, zócalos, bornes (6 de
tres contactos para circuito impreso),..y un teclado 4x4 SECME modelo ECO 16250 06.

La placa dispone tan solo de 4 jumpers (J1-J4) de 2 posiciones cada uno. Con
ellos se selecciona que señales se harán cargo del canal serie y del bus I²C. Todo ello
queda reflejado en la tabla H. Las casillas 2-1 y 2-3, indican que los jumpers están
abiertos o cerrados por esos pines.

JUMPERS 2-1 2-3 DESCRIPCIÓN

J1 – J2 Abierto Abierto Bus I²C desconectado


Abierto Cerrado I²C controlado mediante RC3-RC4
Cerrado Abierto I²C controlado por RB6-RB7.
J3 – J4 Abierto Abierto Canal serie desconectado
Abierto Cerrado Transmite por RC6 y recibe por RC7
Cerrado Abierto Transmite por RB4 y recibe por RB5 (nuestro caso)
Tabla H. Posiciones de los jumpers

3. El teclado hexadecimal:

El esquema de conexionado del teclado se muestra en la figura M. Mediante el


conector CN1 de 26 contactos se conecta (mediante cable plano) a la placa pic trainer.
De aquí se obtienen todas las señales del pic que haya conectado a la misma.
Figura M. Esquema electrónico del teclado hexadecimal

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
139

Las 8 líneas de la puerta B (RB0-RB7) se conectan directamente al teclado


matricial de 4x4 (filas x columnas). Las líneas RB7-RB4 serán configuradas como
salidas para ir activando secuencialmente cada una de las filas; al mismo tiempo las
líneas RB3-RB0 se configuran como entradas y son leídas para comprobar si hay alguna
tecla pulsada.

El teclado hexadecimal está conectado a la puerta B y su disposición es la


siguiente:

RB0 RB1 RB2 RB3


^ ^ ^ ^
| | | |
|------|------|------|------|
RB4 --> | 1 | 2 | 3 | F |
|------|------|------|------|
RB5 --> | 4 | 5 | 6 | E |
|------|------|------|------|
RB6 --> | 7 | 8 | 9 | D |
|------|------|------|------|
RB7 --> | A | 0 | B | C |
|------|------|------|------|

Así, la línea RB0 está conectada a la columna 1 del teclado, la RB1 a la 2,...y lo
mismos con RB4 (a la fila 1), RB5 (a la fila 2),... Para comprobar si hay alguna tecla
pulsada, tendremos que activar las filas una a una y comprobar si hay alguna columna
activada (esta activación se verá si hay un 0 en alguna línea); por ejemplo, suponiendo
activada la C, la forma de detectarla es:

- Activo RB4 (fila 1): si una de las líneas RB0-RB3 esta a 0, esa línea tendrá una
tecla pulsada. En el caso de la “C”, no habría ninguna pulsada en la fila 1 y el puerto B
estaría 1110 1111 ya que RB0-RB3 es todo 1 (no pulsadas) y RB4 está activada por
nosotros.
- Activo RB5(fila 2) y ocurre lo mismo, en el puerto B tendríamos 1101 1111.
Con RB6 tendríamos 1011 1111.
- Al activar RB7(fila 4), nos aparecería activado RB3 (columna correspondiente
a la C) y en el puerto tendríamos 0111 0111, que sería el código binario correspondiente
a la “C” (en hexadecimal sería 77h).

El software que programemos, deberá realizar las activaciones de RB4-RB7 y


las comprobaciones de RB0-RB3.

Como podemos ver en la figura M, las líneas RB6 y RB7 también pueden actuar
como señales SDA y SCL para el interface I²C, aunque en las prácticas realizadas no se
ha utilizado este sistema.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
140 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

4. Canal de comunicación serie RS232:

La comunicación serie consiste básicamente en enviar datos de un transmisor


(DTE) a un receptor (DCE) de manera sincronizada.
El pic trainer plus posee un conector DB9 macho para la comunicación serie.
En la figura N, se puede ver la distribución de los pines en este tipo de conector.

Figura N. Conector DB9 hembra

Cada pin del conector, tiene un número asociado que corresponde a:

- Pin 1 (DCD): Detector de Portadora de Datos. Es utilizada por el DCE para


indicar al DTE que está listo para transmitir datos.
- Pin 2 (RxD): Recepción de Datos. Transmite datos del DCE al DTE.
- Pin 3 (TxD): Transmisión de Datos. Transmite datos del DTE al DCE
- Pin 4 (DTR): Terminal de Datos Listo. Para comunicar al DCE que el DTE
está encendido y listo para funcionar.
- Pin 5 (GND): Circuito común. Punto de referencia para todos los voltajes de
la conexión.
- Pin 6 (DSR): Dispositivo de Datos Listo. Comunica al DTE que el DCE está
encendido y listo para funcionar.
- Pin 7 (RTS): Petición de Envío. Sus usos varían ampliamente. Va del DTE
al DCE.
- Pin 8 (CTS): Dispuesto para Enviar. Sus usos varían ampliamente. Va del
DCE al DTE.
- Pin 9 (RING): No se suele utilizar.

Para realizar un cable serie para dos terminales que puedan mandar y recibir
datos (ambos), se usa la configuración representada en la figura O. En nuestra práctica,
se van a enviar datos de una placa receptora (DTE) a una emisora (DCE). Para conectar
ambas placas, se va a utilizar el conector DB9 macho de ambas; se va a utilizar un cable
serie con conectores DB9 hembras a ambos lados y con solo tres conexiones internas: el
RxD de uno con el TxD del otro y al revés (el TxD del primero con el Rxd del segundo)
y el pin común (ver figura P).

Figura O. Conexiones para


cable serie
____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
141

Para realizar la comunicación, hay que programar las dos placas de la misma
forma, es decir, las características de la comunicación deben ser iguales para que los
datos enviados sean recibidos sin error. Estas características de la comunicación serie
son las que siguen:

- Para cada byte: Los dos terminales deben tener programados el mismo numero
de bits a recibir/transmitir. Los bits a transmitir pueden ser de 7 u 8, debiéndose
programar también cual se envía primero (el más o el menos significativo). Antes de
comenzar a enviar los 7 u 8 bits, se debe enviar un bit “1” de inicio, a partir del cual se
comienza transmisión en serie de los bits. Al terminar la emisión de los 7 u 8 bits, se
manda 1 o 2 bits de stop (deberán ser programado el mismo numero en ambos
terminales). De forma opcional se puede enviar un dato de paridad (si el numero de
unos del byte es impar, se envía un 1 y si es par un 0) para comprobar si hay errores.
- Velocidad de transmisión: los bits deben ser enviados y recibidos a la misma
velocidad. Si la velocidad fuera distinta, el receptor no habría tomado el bit en curso
cuando se mandara el siguiente (en caso de que su velocidad sea menor que el
transmisor). La velocidad se expresa en baudios por segundo (bps) y puede variar entre
110 y 19200. En nuestro caso esta velocidad va ha ser de 9600 bps.
- Eléctricamente, el transmisor pone un “1” cuando la tensión va de –5V (-3V
en el caso del receptor) a –15V y pone un “0” cuando va de +5V (+3V en el receptor) a
+15V.

Los niveles TTL proporcionados por el pic, son distintos a los usados en la
comunicación serie RS232, por ello necesitamos un circuito integrado (MAX232) que
adapte estos niveles. Como se ve en la figura Q, el MAX232 (para el caso del terminal
transmisor) convierte los niveles lógicos TTL presentes en la patilla 11 (dados por el
pic) de transmisión a niveles lógicos RS232 (se obtienen en la patilla 14) y se aplican al
conector DB9 para ser transmitidos. Para el caso del receptor, la señal llega a la patilla
13 del MAX232 desde el canal serie con niveles RS232 y son convertidos a TTL,
obteniéndose estos en la patilla 12 que llega al pic de la placa receptora.

Figura Q. Esquema electrónico del canal serie RS - 232

Las líneas Rx y Tx son seleccionadas mediante los jumpers J3 y J4 para que sean
conectadas a RC6 y RC7 o a RB4 y RB5 (nuestro caso).

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
142 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

5. Software de control para el Micro’PIC Trainer:

Para terminar, se comentan algunas de las rutinas utilizadas para controlar el


LCD, el teclado, y el canal serie del pic trainer. Los archivos descritos a continuación
son los utilizados en las practicas realizadas y deben ser programados en el programa
fuente mediante la directiva “include".

- LCD.ASM: contiene una serie de sencillas rutinas que permiten controlar el


módulo LCD del pic trainer. Las rutinas que contiene son llamadas desde el programa
fuente (no olvidar usar la directiva “include” en este archivo) mediante la instrucción
“call”.
- UP_LCD: configura los puertos A y B para el control del LCD.
- LCD_INI: ejecuta la secuencia de inicialización del módulo LCD
según las especificaciones vistas en la guía de este.
- LCD_DATO: envía el carácter ASCII contenido en el registro W al
módulo LCD. La rutina se encarga de verificar que el módulo no esté ocupado
(para ello utiliza la rutina LCD_BUSY) así como de generar las señales R/W,
RS y E del mismo.
- LCD_REG: envía el código presente en W al módulo LCD. Este
código será uno de los diferentes códigos de control con los que se pueden
conseguir diferentes efectos de visualización sobre el LCD. La rutina verifica el
estado del módulo y genera las señales R/D, RS y E.
- El archivo también contiene una rutina de retardo de unos 5msg
(LCD_DELAY) y otra que genera el pulso de enable (LCD_E) para la
inicialización del LCD.

- TECLADO.ASM: contiene una serie de rutinas que permiten controlar el


teclado del pic trainer plus. Al igual que el anterior debe incluirse en el programa
fuente.
- Key_Scan: la rutina realiza una exploración del teclado. Devuelve en
la variable “Tecla” el código de la tecla pulsada o bien el código 0x80 en caso de
que no hubiera ninguna pulsada.
- Key_BCD: convierte el código de la tecla presente en la variable
“Tecla” en su correspondiente código BCD (de 0 a F).

- RS232.ASM: contiene una serie de rutinas que permiten implementar, vía


serie una comunicación RS232. La configuración programada en este archivo para la
comunicación es: transmisión de palabras de 8 bits usando 2 bits de stop y enviando en
primer lugar el bit de menos peso. La velocidad empleada es de 9600 bps y la
frecuencia de trabajo de 4 MHz.
- RxD: rutina de recepción de un carácter. Espera recibir un carácter y
lo deposita en la variable “Rxdreg”.
- TxD: rutina de transmisión de un carácter. Transmite el carácter
presente en la variable “Txdreg”.

Para estudiar con mayor profundidad las rutinas, leer los comentarios incluidos
en los archivos.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
143

Presupuesto

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
144 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
145

Presupuesto

Materiales Precio Cantidad Total


MicroPic Lab Plus 42.600 ptas 2 85.200 ptas
( Incluye micropic trainer,
micropic trainer plus,
manuales, transformador,
cables de conexión y
software )
Pic 16F84 930 ptas 2 1.860 ptas
Cable serie 720 ptas 1 620 ptas

Total Material 87.680 ptas

Proyectista Ptas / hora Horas Total


I. T. Industrial 3.000 ptas 162 486.000 ptas

Neto I. V. A. ( 16 % ) Total
Total proyecto 573.680 ptas 91.789 ptas 665.469 ptas

TOTAL PRESUPUESTO: 665.469 ptas. 3999,55 

El presente Presupuesto, asciende a la cantidad de SEISCIENTAS SESENTA Y


CINCO MIL CUATROCIENTAS SESENTA Y NUEVE PESETAS ó TRES MIL
NOVECIENTOS NOVENTA Y NUEVE CON CINCUENTA Y CINCO EUROS.

Cartagena, _______de _______ de _______

El proyectista.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
146 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
147

Apéndice A

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
148 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
149

Contenido del disquete

El CD adjunto con el proyecto contiene ( en el directorio \disco ) tanto los


archivos de prácticas listados en el mismo como los programas necesarios para la
compilación y programación de estas prácticas. Tras copiar el contenido del directorio \
disco en un disco normal de 1,44 se obtiene la siguiente estructura en el mismo:

- En el directorio raíz (A:\), vienen los programas correspondientes a la


escritura, compilación y programación de los programas en el PIC. Estos programas han
sido obtenidos de la empresa microchip (ver bibliografía) y de la micropic trainer. El
listado de los ficheros contenidos en este directorio es:

EDIT.COM: es el editor de MS-DOS para escribir los programas que


más tarde serán compilados y programados.

INSTALAR.BAT: el archivo copia el contenido del disquete al


directorio especificado (por ejemplo instalar a: c:\pic) o al directorio c:\proyecto en caso
de no especificar directorio destino.

MPASM.COM: es el compilador de ficheros proporcionado por


microchip (ver guía del MicroPic Trainer para comprobar su funcionamento).

PICME-TR.EXE: es el programador para el MicroPic Trainer


proporcionado por la empresa Microsystems Engineering (ver guía el MicroPic Trainer
para comprobar su funcionamiento).

- En el directorio \LIB, se han grabado los ficheros incluidos en las prácticas;


así tenemos:

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
150 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

LCD.ASM: Rutinas para el control del LCD empleado en todas las


prácticas realizadas.

P16F84.INC: Definición de registros para el PIC 16F84 empleado en


todas las prácticas realizadas.

RS232.ASM: Rutinas para el control de la comunicación serie empleado


en la práctica uno (tanto en la del emisor como en la del receptor).

TECLADO.ASM: Rutinas para el control del teclado hexadecimal


empleado en el programa emisor de la práctica uno y en la práctica dos.

- El directorio \PRACT1, contiene los ficheros base empleados en la


realización de la práctica uno. En todos los archivos .ASM de este directorio deberá
estar especificada la ruta donde se ha instalado el directorio anterior (\LIB). El
contenido del directorio descrito es:

EMISOR.ASM: es el programa explicado en la práctica uno. Editándolo,


se pueden ver los comentarios explicativos del mismo así como modificarlo en su caso.

EMISOR.HEX: es el anterior archivo ya compilado. Se programa


directamente en el PIC utilizando el PICME-TR.

RECEPT.ASM: es el otro programa explicado en la práctica uno (para la


placa eceptora). Editándolo, se pueden ver los comentarios explicativos del mismo así
como modificarlo en su caso.

RECEPT.HEX: es el anterior archivo ya compilado. Se programa


directamente en el PIC utilizando el PICME-TR.

- El directorio \PRACT2, contiene los ficheros base empleados en la


realización de la práctica dos. En todos los archivos .ASM de este directorio deberá
estar especificada la ruta donde se ha instalado el directorio anterior (\LIB). El
contenido del directorio descrito es:

HAMMING.ASM: es el programa explicado en la práctica dos.


Editándolo, se pueden ver los comentarios explicativos del mismo así como modificarlo
en su caso.

HAMMING.HEX: es el anterior archivo ya compilado. Se programa


directamente en el PIC utilizando el PICME-TR.

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
151

Nota: el ensamblado de los programas .ASM origina algunos mensajes de


“warnings” que no influyen en el correcto funcionamiento de los mismos. Los mensajes
que aparecen son debidos a los cambios de bancos que se ejecutan en los programas, es
decir, el compilador nos avisa de que en ciertos momentos estamos trabajando en el
banco de datos 1.

Apéndice B

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
152 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
_____________________________________________________________________________________
153

Bibliografía

1. “Microcontroladores PIC. Diseño práctico de aplicaciones”


J. Mª. Angulo y Ignacio Angulo. McGrawHill, 1997

2. “Microcontroladores PIC. La Solución en un Chip.”


J. Mª. Angulo, E. Martín, I. Angulo. Ed. Paraninfo, 1997

3. “Microcontroladores PIC”
Christian Tavernier. ITP Paraninfo, 1995

4. “Microcontroladores PIC. La solución en un chip”


J. Mª. Angulo, E. Martín y I. Angulo. ITP Parainfo, 1997

5. “El libro del RS232”


Joe Campbell. Ediciones Anaya multimedia, S.A., 1988

6. “Organización y arquitectura de computadores”


William Stallings. Prentice Hall, 1998

7. “Manual de usuario de Micro’PIC Trainer”


Microsystems Engineering. Gral. Concha 39-8º Bilbao 48012

8. “Manual de usuario de Micro’PIC Trainer Plus”


Microsystems Engineering. Gral. Concha 39-8º Bilbao 48012

9. “PIC 16F8X Microcontroller data book”


____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84
__
154 I. T. I. Especialidad Electrónica Industrial David Rodríguez González ___________

http://www.microchip.com

10. “Laboratorio Electrónico”


Curso F & G Editores, S. A., 1999

11. DIRECCIONES DE INTERNET:

Microchip: http://www.microchip.com

Microsystems Engineering: http://www.arrakis.es/~msyseng

Parallax: http://www.parallaxinc.com

Electrónica: http://eya.swin.net

Programador: http://www.lokekieras.es/personales/mgsanz/programa.htm

Pic: http///members.es.tripod.de/~InfoE/infop.htm

____________________________________________________________________________________
Realización de un conjunto de prácticas basadas en el microcontrolador PIC16F84

También podría gustarte