Вы находитесь на странице: 1из 44

Microcontroladores

Introduccin
Antes de ver qu es un microcontrolador y de analizar sus puntos
fuertes y sus defectos, ser til hacer un repaso relativo a la estructura de
cualquier sistema programable, que pueda hacer uso de un
microcontrolador.

Unidad
Central

Memoria
ROM

Memoria
RAM

Buses del Sistema

Circuitos
de interfaz
Exterior

Figura 1.
La figura 1 presenta el esquema tipo de cualquier sistema
programable. Veamos que elementos son indispensables para su
funcionamiento:

La unidad central
La memoria ROM
La memoria RAM
Los circuitos de interfaz
Un bus de interconexin

La presencia de estos elementos bsicos es indispensable y aun


cuando no siempre se presenten tan claramente como en nuestro
esquema siempre existen. Obsrvese, que son los mismos que los de un
sistema informtico clsico, pero dentro del marco de una aplicacin que
pueda ser tratada por un microcontrolador.
La
unidad
central,
generalmente
constituida
por
un
microprocesador ms o menos evolucionado, ejecuta el programa que da
vida a la aplicacin. Los programas pueden ser muy diversos, puesto que,
como es evidente, el que asegura la gestin de un termostato inteligente
no tiene nada que ver con el que controla el correcto funcionamiento de
una fotocopiadora. Sin embargo, estos programas tienen en comn el
hecho de que muy raramente necesitan clculos complejos y, en cambio,

s suelen incluir
entrada/salida.

numerosas

manipulaciones

de

la

informacin

de

El programa se almacena en un segundo elemento, que es la


memoria ROM. Esta memoria puede constituirse de diferentes formas:
UVPROM, EEPROM u OTPROM, cualquiera que sea la que se utilice es una
memoria no voltil desde la que se ejecutar el programa una vez
alimentado el sistema. Para poder trabajar correctamente, nuestro
microprocesador necesita, a menudo, almacenar datos temporales en
alguna parte, y aqu es donde interviene la memoria RAM, que no necesita
ser de grandes dimensiones.

Estructura de un microcontrolador.
De lo visto anteriormente, un microcontrolador debe contener
todos los elementos de la figura 1 en un nico encapsulado. El esquema
bsico de un microcontrolador sera

Controlador de
interrupciones

ROM
UVPROM
OTPROM

Temporizador 1
RAM

EEPROM

Temporizador 0

Interfaz
especfica

CPU

Osc.

Controlador
de bus

Puertos de
entrada/salida

Puerto
serie

.....

Figura 2

Encontramos en l la unidad central pero se ha simplificado con


respecto a los microprocesadores clsicos. En contrapartida se le han
aadido instrucciones de manejo de bits, muy tiles para las
entradas/salidas. En ciertos circuitos, esta unidad central est dotada de
un gran nmero de registros internos, que sirven de memoria RAM, por lo
que puede parecer que sta ltima est ausente de algunos esquemas.

A continuacin podemos ver la memoria ROM, aunque sta no


siempre aparece. Cierto nmero de microcontroladores estaban, y todava
estn, disponibles sin ROM (ROMless).
Posteriormente, los fabricantes han introducido en el chip una
memoria programable elctricamente y borrable mediante rayos
ultravioleta (UVPROM) o, ms recientemente, borrable elctricamente
(EEPROM).
Un ltimo producto para almacenar de forma no voltil son las
memorias FLASH, de bajo consumo, que se puede escribir y borrar en
circuito al igual que las EEPROM, pero suelen disponer de mayor capacidad
que estas ltimas. El borrado solo es posible con bloques completos y no
se puede realizar sobre posiciones concretas.
En lo referente a la memoria RAM, suele utilizarse una del tipo
SRAM (RAM esttica) de pequeo tamao, por qu generalmente la
unidad central posee suficientes registros para realizar operaciones
intermedias. En algunos casos, esta memoria se completa con una
EEPROM de datos, que memoriza de forma semipermanente datos del
usuario que se manejan como constante en la ejecucin del programa y
que de vez en cuando (pasados meses o aos) deben ser modificados.
Algo ms delicado es hacer un esquema tipo para los circuitos de interfaz,
ya que es un punto donde se distinguen los diferentes microcontroladores,
en funcin de las aplicaciones que pretenden. No obstante se pueden
encontrar los siguientes elementos bsicos:

Lneas de entrada/salida paralelo, en cantidad variable, segn la


finalidad y el tamao del encapsulado (se plantea un problema de
nmero mximo de pines debido al crecimiento del nmero de estas
lneas).

Al menos una interfaz de entrada/salida serie asncrona, ms o


menos evolucionada segn los circuitos.

Uno o varios temporizadores internos cuyas posibilidades pueden


ser muy variables pero que, generalmente, funcionan como
contadores ascendentes y descendentes, generadores de impulsos
programables, etc.

Uno o varios convertidores analgicos/digitales, precedidos o no de


multiplexores para ofrecer varias vas.

A veces, pero es raro, un covertidor digital/analgico.

Por ltimo, aunque no sea una verdadera interfaz de entrada/salida en el


sentido en que nosotros entendemos, ciertos microcontroladores disponen
de un acceso a su bus interno. Esto permite conectar con otros circuitos
destinados a cumplir funciones que faltan en el chip, lo que a veces
resulta til. Precisemos, aunque es evidente, que todos los
microcontroladores sin memoria ROM interna disponen necesariamente de
esta interfaz, puesto que es necesario permitirle acceder a una memoria
ROM externa.

PIC 16F84.
Microcontrolador
diseado
por
la
empresa
Microchip
(http://www.microchip.com), que se fabrica en varias versiones de las
cuales las ms simples, pero interesantes, son la 16C84 y la 16F84. Son
idnticas en cuanto a su arquitectura interna a excepcin de la memoria
ROM y la memoria RAM. En el primer caso contiene una memoria EEPROM
de 1Kbytes de 14 bits cada una, en el segundo diseo la memoria tiene la
misma capacidad pero es de tipo Flash.
La memoria EEPROM y la Flash son elctricamente grabables y
borrables, lo que permite escribir y borrar el programa bajo prueba
manteniendo el microcontrolador en el mismo zcalo y usando el mismo
dispositivo para grabar y borrar. Esta caracterstica supone una gran
ventaja frente a la mayora de los microcontroladores, que tienen como
memoria de programa reescribible una tipo EPROM. Se graba
elctricamente, pero para borrarlas hay que someterlas durante cierto
tiempo a rayos ultravioleta, lo que implica sacar del zcalo el circuito
integrado y colocarlo en un borrador de EPROM.
Otra ventaja del PIC16F84 en cuanto a simplificar el proceso de
escritura, borrado y reescritura de programas, tan necesario en la fase de
diseo, es su sistema de grabacin de datos, que se realiza en serie. Para
escribir un programa en la memoria se manda la informacin en serie
usando slo dos pins, una para la seal de reloj y otra para los datos
serie. A continuacin exponemos las caractersticas ms significativas:

MEMORIA DE PROGRAMA: 1 K x 14
MEMORIA DE DATOS: 68 bytes
MEMORIA DE DATOS EEPROM: 64 bytes
PILA (Stack): De 8 niveles
INTERRUPCIONES: 4 tipos diferentes
JUEGO DE INSTRUCCIONES: 35

ENCAPSULADO: Plstico DIP de 18 pins


FRECUENCIA DE TRABAJO: 20 MHz mxima
TEMPORIZADORES: Slo uno el TMR0. Tambien tiene Perro
Guardin (WDT)
LINEAS DE E/S DIGITALES: 13 (5 Puerta A y 8 Puerta B)
VOLTAJE DE ALIMENTACION (VDD): De 2 a 6 V DC
VOLTAJE DE GRABACION (VPP): De 12 a 14 V DC

Existen otras variantes que se comercializan y responden a la


nomenclatura genrica PIC16X8X, atendiendo a diversas caractersticas
como pueden ser la frecuencia mxima de funcionamiento, el tipo de
oscilador externo o el margen del voltaje de alimentacin.

EL PIC16F84 est fabricado con tecnologa CMOS de altas


prestaciones y encapsulado en plstico con 18 pins, con la nomenclatura
que se muestra en la figura 3. La misin de cada pin comentada
brevemente es:
VDD: Tensin positiva de alimentacin.
VSS: Tensin conectada a tierra o negativa de alimentacin.
OSC1/CLKIN: Entrada del circuito oscilador externo que proporciona la
frecuencia de trabajo del microcontrolador.
OSC2/CLKOUT: Pin auxiliar del circuito oscilador.
MCLR#: Pin activa con nivel lgico bajo, lo que se representa con el
smbolo #. Su activacin origina la reinicializacin o Reset del PIC.
Tambin se usa durante la grabacin de la memoria para introducir por
ella la tensin VPP.
1

18

RA1

RA3

17

RA0

RA4/TOCKI

16

OSC1/CLKIN

MCLR#

15

OSC2/CLKOUT

Vss

14

Vdd

RB0/INT

PIC16X8X

RA2

13

RB7

RB1

12

RB6

RB2

11

RB5

RB3

10

RB4

Figura 3

RA0-RA4: Son las 5 lneas de E/S digitales correspondientes a la Puerta A.


La lnea RA4 multiplexa otra funcin expresada por TOCKI. En ese caso
sirve para recibir una frecuencia externa para alimentar al temporizador
TMR0.
RB0-RB7: Son las 8 lneas de E/S digitales de la Puerta B. La lnea RB0
multiplexa la funcin de servir como entrada a una peticin externa de
una interrupcin.

El reloj.
La frecuencia de trabajo del microcontrolador es un parmetro
fundamental a la hora de establecer la velocidad de ejecucin de
instrucciones y el consumo de energa.
Cuando un PIC16F84 funciona a 10 MHz, que es su mxima
frecuencia, le corresponde un ciclo de instruccin de 400 ns, puesto que
cada instruccin tarda en ejecutarse 4 perodos de reloj, o sea, 4 x 100 ns
= 400 ns. Todas las instrucciones del PIC se realizan en un ciclo de
instruccin, menos las de salto que tardan el doble.
Los impulsos de reloj entrar por la pin OSC1/CLKIN y se dividen por
4 internamente, dando lugar a las seales Q1, Q2, Q3 y Q4. Durante un
ciclo de instruccin, que comprende las cuatro seales mencionadas, se
desarrollan las siguientes operaciones:
Q1: Durante este impulso se incrementa el Contador de Programa.
Q4: Durante este impulso se busca el cdigo de la instruccin en la
memoria del programa y se carga en el Registro de Instrucciones.
Q2-Q3: Durante la activacin de estas dos seales se produce la
decodificacin y la ejecucin de la instruccin.
Para conseguir ejecutar cada instruccin en un ciclo de instruccin
(excepto las de salto), se aplica la tcnica de segmentacin o pipe-line,
que consiste en realizar en paralelo las dos fases que comprende cada
instruccin.

Figura 4.
La estructura segmentada del procesador permite realizar al mismo
tiempo la fase de ejecucin de una instruccin y la de bsqueda de la
siguiente. Cuando la instruccin ejecutada corresponde a un salto no se
conoce cul ser la siguiente hasta que se realice, por eso en esta
situacin se sustituye la fase de bsqueda por un ciclo vacio, oroginando
que las instrucciones de salto tarde en realizarse dos ciclos de instruccin.

Osciladores
Los PIC admiten
aplicarles la frecuencia de
y OSC2. El tipo empleado
Configuracin, como se
pueden emplear son:

cuatro tipos de osciladores externos para


funcionamiento, se colocan entre las pins OSC1
debe especificarse en dos bits de la Palabra de
comentar ms adelante. Los tipos que se

Oscilador RC: Es un oscilador de bajo coste formado por una


simple resistencia y un condensador. Proporciona una
estabilidad mediocre de la frecuencia, cuyo valor depende de
los valores de los dos elementos R-C.
Oscilador HS: Es un oscilador que alcanza una alta velocidad
comprendida entre 4 y 10 MHz y est basado en un cristal de
cuarzo o un resonador cermico.
Oscilador XT: Es un oscilador de cristal o resonador para
frecuencias estndar comprendidas entre 100 KHz y 4 MHz.
Oscilador LP: Oscilador de bajo consumo con cristal o
resonador diseado para trabajar en un rango de frecuencias
de 35 a 200 KHz.

RESET.
Cuando se aplica un nivel lgico bajo a la pin MCLR# el
microcontrolador reinicializa su estado. Dos acciones importantes se
producen en la reinicializacin o RESET:
1. El Contador de Programa se carga con la direccin 0, apuntando a
la primera direccin de la memoria de programa en donde deber
estar situada la primera instruccin del programa de aplicacin.
2. la mayora de los registros de estado y control del procesador
toman un estado conocido y determinado.
Se puede provocar el RESET de varias maneras, pero si se desea
realizar manualmente, habr que colocar, conectado al pin MCLR#, que al
ser apretado genere un nivel lgico bajo.
Arquitectura
Para lograr una compactacin de cdigo ptima y una velocidad
superior a la de sus competidores, los microcontroladores PIC incorporan
en su procesador tres de las caractersticas ms avanzadas en los grandes
computadores:

Procesador tipo RISC.


Ejecucin segmentada.
Arquitectura HARVARD.

El juego de instrucciones se reduce a 35 y sus modos de


direccionamiento se han simplificado al mximo. Con la estructura
segmentada se pueden realizar simultneamente las dos fases en que se
descompone cada instruccin. Con la arquitectura HARVARD se puede
acceder de forma simultnea e independiente a la memoria de datos y a la
de programa. El aislamiento y la diferenciacin de los dos tipos de
memoria permite que cada uno tenga la longitud y el tamao ms
adecuado. De esta forma, en el PIC16F84 la longitud de datos es de un
byte, mientras que la de las instrucciones es de 14 bits.
Otra caracterstica relevante de los PIC es el manejo intensivo del
Banco de Registros, los cuales participan de manera muy activa en la
ejecucin de las instrucciones. De igual forma, la memoria RAM
complementa los registros internos implementando en sus posiciones
registros de propsito especfico y de propsito general.

La arquitectura interna del PIC consta de 7 bloques fundamentales.


I. Memoria de programa EEPROM o Flash de 1 k x 14 bits.
II. Memoria de datos formada por dos reas. Una RAM donde se
alojan 22 registros de propsito especfico (SFR) y 36 de
propsito general (GDR), y otra de tipo EEPROM de 64 bytes.
III. Camino de datos con una ALU de 8 bits y un registro de trabajo
W del que normalmente recibe un operando y enva el resultado.
EL otro operando puede provenir del bus de datos o del propio
cdigo de la instruccin.
IV. Diversos recursos conectados al bus de datos, tales como
Puertas de Entrada/Salida, Temporizador TMR0, etc.
V. Base de tiempos y circuitos auxiliares.
VI. Direccionamiento de la memoria de programa en base al
Contador de Programa ligado a una Pila de 8 niveles de
profundidad.
VII. Direccionamiento directo e indirecto de la memoria RAM.

Figura 5.

Memoria de Programa.
La arquitectura de los PIC de la gama media admite un mapa de
memoria de programa capaz de contener 8192 instrucciones de 14 bits
cada una. Este mapa se divide en pginas de 2048 posiciones. para
direccionar 8 K posiciones se necesitan 13 bits, que es la longitud que
tiene el Contador de Programa. Sin embargo el PIC16F84 solo tiene
implementadas 1 K posiciones, por lo que se ignoran los tres bits de ms
peso del PC.
El Contador de Programa est implementado sobre un par de
posiciones de la memoria RAM. Cuando se escribe el Contador de
Programa como resultado de una operacin de la ALU, los 8 bits de menos
peso del PC residen en el registro PCL, que ocupa, repetido, la posicin 2
de los dos bancos de la memoria de datos. Los bits de ms peso, PC
<12:8>, residen en los 5 bits de menos peso del registro PCLATH, que
ocupa la posicin 0A H de los dos bancos de la memoria RAM. En las
instrucciones de salto, los 11 bits de menos peso del PC provienen del
cdigo de instruccin y los otros dos de los bits de PCLATH <4:3>, tal y
como se muestra en la figura 6.
La Pila es una zona aislada de las memorias de instrucciones y
datos. Tiene una estructura LIFO, en la que el ltimo valor guardado es el
primero que sale. Tiene 8 niveles de profundidad cada uno con 13 bits.
Funciona como un buffer circular, de manera que el valor que se obtiene al
realizar el noveno POP es igual al que se obtuvo en el primero.

Figura 6.
Memoria de Datos(RAM).

La memoria de datos del PIC16F84 dispone de dos zonas diferentes:


1. Area de RAM esttica o SRAM, donde reside el Banco de
Registros Especficos (SFR) y el Banco de Registros de Propsito
General (GPR). El primer banco tiene 24 posiciones de tamao
byte, aunque dos de ellas no son operativas, y el segundo 68.
2. Area EEPROM, de 64 bytes donde, opcionalmente, se pueden
almacenar datos que no se pierden al deconectar la alimentacin.
La zona de memoria RAM se halla dividida en dos bancos (banco 0 y
banco 1) de 128 bytes cada uno. En el PIC16F84 slo se hallan
implementadas fsicamente las 48 primeras posiciones de cada banco, de
las cuales las 12 primeras estn reservadas a los Registros de Propsito
Especfico (SFR), que son los encargados del control del procesador y sus
recursos. Algunos de dichos registros se hallan repetidos en la misma
direccin de los dos bancos, para simplificar su acceso (INDF, ESTADO,
FSR, PCLATH e INTCON). Las posiciones apuntadas por la direccin 7 H y
la apuntada por la 87 H no son operativas. Los 36 registros restantes de
cada banco se destinan a Registros de Propsito General y en realidad slo
son operativos los 68 del banco 0 porque los del banco 1 se mapean sobre
el banco 0, es decir, cuando se apunta a un registro general del banco 1,
se accede al mismo del banco 0.

00
01

MEMORIA DE DATOS
INDF
INDF
TMR0
OPTION

80
81

02
03
04
05
06
07
08
09
0A
0B
0C

PCL
ESTADO
FSR
PUERTA
A
SFR
PUERTA B

PCL
ESTADO
FSR
TRIS A
TRIS B

EEDATA
EEADR
PCLATH
INTCON

EECON1
EECON2
PCLATH
INTCON

36
REGISTROS
DE GPR
PROPSITO
GENERAL

MAPEADOS
EN EL
BANCO 0

2F
30

82
83
84
85
86
87
88
89
8A
8B
8C

AF
B0

7F

FF
BANCO 0

BANCO 1

Figura 7
Para seleccionar el banco a acceder hay que manipular el bit 5
(RP0) del registro ESTADO. Si RP0=1 se accede ala banco 1 y si RP0=0 se
accede al banco 0. Tras un Reset se accede automticamente al banco 0.
Para seleccionar un registro de propsito general no hay que tener en
cuenta el estado del bit RP0, porque al estar mapeado el banco 1 sobre el
banco 0, cualquier direccionamiento de un registro del banco 1
corresponde a su homlogo del banco 0. En el direccionamiento directo a
los registro GPR se ignora el bit de ms peso, que identifica el banco y sus
direcciones estn comprendidas entre el valor 0x0C y 0x4F en
hexadecimal.

Direccionamiento de la memoria de datos.

En los PIC de gama media la memoria de datos est organizada


para alojar un mximo de 4 bancos de 128 bytes cada uno. Los PIC16C84
slo tienen implementados los 48 primeros bytes de los bancos 0 y 1. En
el resto de los PIC de esta familia se destinan dos bits del registro ESTADO
(RP0 y RP1) para determinar el banco y otros siete

Figura 8
para elegir una de las 128 posiciones del banco seleccionado, tal y
como muestra la figura 8.

Direccionamiento Directo: El operando que utiliza la instruccin en


curso se referencia mediante su direccin, que viene incluida en el
cdigo OP de la misma, concretamente en los 7 bits de menos peso.
El banco a acceder lo determinan los bits RP0 y RP1 del registro
ESTADO. En el caso del PIC16C84 slo se usa el bit RP0 al tener
implementados nicamente dos bancos. Se accede a la RAM de
forma inmediata. La direccin de RAM a la que se quiere acceder
est implcita en la propia instruccin. Por ejemplo: MOVWF 20
realiza una operacin de escritura en la direccin 0x20. Este modo
de direccionamiento es el ms habitual.

Direccionamiento Indirecto: Este modo de direccionamiento se usa


cuando en una instruccin se utiliza como operando el registro INDF,
que ocupa la direccin =de ambos bancos. En realidad el registro
INDF no est implementado fsicamente y cuando se le hace
referencia, se accede a la direccin de un banco especificada con los

bits de menos peso del registro FSR. El bit de ms peso de FSR


junto al bit IRP del registro ESTADO se encargan de seleccionar el
banco a acceder, mientras que los 7 bits de menos peso apuntan a
la posicin. Como slo hay dos bancos en el PIC16C84 en este modo
de direccionamiento, el bit IRP es 0 siempre. En este modo de
direccionamiento se utilizan dos registros especiales: FSR y INDF.
FSR es un puntero de RAM, es decir, contiene la direccin de
memoria a la que se desea acceder. El registro INDF, utiliza el valor
del registro FSR para acceder al registro deseado. Por ejemplo: si
escribimos 20 en FSR y despus escribimos 215 en INDF, habremos
escrito un 215 en la direccin de memoria 20 (que era la que
contena FSR). El direccionamiento indirecto se usa para manejar
tablas manipular segmentos de memoria. Por ejemplo, Podemos
programar un bucle, en el cual, incrementamos el valor de FSR para
acceder a unas direcciones de memoria consecutivas.

Las Puertas de E/S.


Los PIC16F84 slo disponen de dos puertas de E/S. La Puerta A
posee 5 lneas, RA0-RA4, y una de ellas soporta dos funciones
multiplexadas. Se trata de RA4/TOCKI, que puede actuar como lnea de
E/S o como la pin por la que se reciben los impulsos que debe contar
TMR0. La Puerta B tiene 8 lneas, RB0-RB7, y tambin tiene una con
funciones multiplexadas, la RB0/INT, que, adems de lnea tpica de E/S,
tambin sirve como pin por la que reciben los impulsos externos que
provocan una interrupcin.
Cada lnea de E/S puede configurarse independientemente como
entrada o como salida, segn se ponga a 1 o a 0, respectivamente, el bit
asociado del registro de configuracin de cada puerta (TRISA y TRISB). Se
llaman PUERTAA y PUERTAB los registros que guardan la informacin que
entra o sale por la puerta y ocupan las direcciones 5 y 6 del banco 0 de la
memoria de datos. Los registros de configuracin TRISA y TRISB ocupan
las mismas direcciones pero en el banco 1. Al reiniciarse el PIC todos los
bits de los registros TRIS quedan a 1, con lo que las lneas de las puertas
quedan configuradas como entradas. Cada lnea de salida puede
suministrar una corriente mxima de 20 mA y si es de entrada puede
absorber hasta 25 mA. Al existir una limitacin en la disipacin mxima de
la potencia del chip se restringe la corriente mxima de absorcin de la
Puerta A a 80 mA y la de suministro a 50 mA. La Puerta B puede absorber
un mximo de 150 mA y suministrar un total de 100 mA.
Puerto A.
Las lneas RA3-RA0 admiten niveles de entrada TTL y de salida
CMOS. La lnea RA4/TOCKI dispone de un circuito Trigger Schmitt que

proporciona una buena inmunidad al ruido y la salida tiene drenador


abierto. RA4 multiplexa su funcin de E/S con la entrada de impulsos
externos para el TMR0. En el circuito de la figura 9 se muestra la
adaptacin de las pins RA3-RA0 a las seales internas del procesador.

Figura 9
Cuando se lee una lnea de la Puerta A se recoge el nivel lgico que
tiene en ese momento. Las lneas cuando actan como salidas estn
conectadas a unos biestable, lo que significa que sus pins sacan el nivel
lgico que se haya cargado por ltima vez en el registro PUERTAA. La
escritura de una puerta, tal y como se ve en la figura 9, implica que
primero se deposita el nivel lgico en la lnea correspondiente del bus
interno de datos y se activa la seal WRITE, lo que origina el
almacenamiento de dicho nivel en el biestable. En esta situacin, el
biestable de configuracin (TRIS) debera tener valor 0 para que actuase
como salida. Con estos valores la puerta OR tendra un 0 a su salida y la
AND tambin. Estos valores producen la conduccin de los transistores
MOS, en funcin del valor escrito, dando como salida final V DD o VSS (1 0
respectivamente).
Si una lnea acta como entrada, el nivel lgico depositado en ella
desde el exterior pasa a la lnea correspondiente del bus interno de datos
cuando se activa la seal READ y se hace conductor el dispositivo
triestado que les une. Al programarse como entrada, los dos transistores
MOS de salida quedan bloqueados y la lnea de alta impedancia. Tngase
en cuenta que cuando se lee una lnea de entrada se obtiene el estado

actual que tiene su pin correspondiente (almacenado en el tercer


biestable) y no el que haya almacenado en el biestable de datos. La
informacin presente en una lnea de entrada se muestrea al iniciarse el
ciclo de instruccin y debe matenerse estable durante su desarrollo.

Puerto B.
Consta de 8 lneas bidireccionales de E/S, RB7-RB0, cuya
informacin se almacena en el registro PUERTAB, que ocupa la direccin 6
del banco 0. El registro de configuracin TRISB ocupa la misma direccin
pero del banco 1. La lnea RB0/INT tiene dos funciones multiplexadas;
adems de pin de E/S acta como la pin para la peticin de una
interrupcin externa, cuando se autoriza esta funcin mediante la
adecuada programacin del registro INTCON.
Las cuatro lneas de ms peso, RB7-RB4, pueden programarse para
soportar una misin especial. Cuando las 4 lneas actan como entradas
se las puede programar para generar una interrupcin si alguna de ellas
cambia su estado lgico. Esta posibilidad es muy prctica en el control de
teclados. En la figura 10 se muestra el esquema de conexionado entre las
pins RB7-RB4 y las lneas correspondientes del bus interno.

Figura 10
El estado de las pins RB7-RB4 en modo de entrada se compara con el
valor antiguo que tenan y que se haba almacenado en un biestable
durante la ltima lectura de la Puerta B. El cambio de estado en alguna de
esas lneas origina una interrupcin y la activacin del sealizador RBIF.
La lnea RB6 tambin se utiliza para la grabacin serie de la memoria de
programas y sirve para soportar la seal de reloj. La lnea RB7 constituye
la entrada de los datos en serie.

El Registro de Estado.
Hasta ahora ESTADO es el registro ms usado y llega el momento de
describirlo en su totalidad. Ocupa la direccin 3 tanto del banco 0 como
del 1 de la memoria de datos RAM. Sus bits tienen tres misiones distintas:
I. Se encargan de avisar de la incidencias del resultado de la ALU
(C, DC y Z).
II. Indican el estado de Reset (TO# y PD#).
III. Seleccionan el banco a acceder en la memoria de datos (IRP,
RP0 y RP1).
En la figura 11 se muestra el diagrama de distribucin de los bits del
registro ESTADO, su misin es la siguiente:
C: Acarreo en el bit de ms peso
1: Acarreo en el bit de ms peso.
0: No acarreo en el bit de ms peso.
DC: Acarreo en el 4 bit
1: Acarreo en el 4 bit.
0: No acarreo en el 4 bit.
Z: Cero
1: El resultado de una instruccin lgico-aritmtica ha sido cero.
0: El resultado de una instruccin lgico-aritmtica no ha sido cero.
PD#: Power Down
1: Se pone a este valor despus de la conexin a la alimentacin o
al ejecutar clrwdt.
0: Se pone a este valor al ejecutar sleep.
TO#: Time Out
1: Se pone a este valor despus de la conexin a la alimentacin o
al ejecutar clrwdt y sleep.

0: Se pone a este valor al desbordarse el Perro Guardin


(Watchdog).
RP1-RP0: Seleccin de banco en direccionamiento directo
Como el PIC16F84 slo tiene dos bancos nicamente emplea el bit
RP0, de forma que cuando vale 1 se accede al banco 1 y cuando
vale 0 se accede al banco 0. Despus de un Reset RP0=0.
IRP: Seleccin del banco en direccionamiento indirecto
Este bit junto con el de ms peso del registro FSR sirven para
determinar el banco de la memoria de datos seleccionado. En el
PIC16F84 al disponer de dos bancos no se usa este bit.
IRP

RP1

RP0

TO#
PD#
Figura 11

DC

EL CONTADOR DE PROGRAMA
Este registro, normalmente denominado PC (PCL), es totalmente
equivalente al de todos los PIC y contiene la direccin de la prxima
instruccin a ejecutar. Se incrementa automticamente al ejecutar cada
instruccin, de manera que la secuencia natural de ejecucin del
programa es lineal, una instruccin despus de la otra. Algunas
instrucciones que llamaremos de control, cambian el contenido del PC
alterando la secuencia lineal de ejecucin. Dentro de estas instrucciones
se encuentran el GOTO y el CALL que permiten cargar en forma directa un
valor constante en el PC haciendo que el programa salte a cualquier
posicin de la memoria. Otras instrucciones de control son los saltos
condicionales, que producen un incremento adicional del PC si se cumple
una condicin especifica, haciendo que el programa saltee, sin ejecutar, la
instruccin siguiente.
Al resetearse el PIC, todos los bits del PC toman valor 1, de manera
que la direccin de arranque del programa es siempre la ultima posicin
de memoria de programa. En esta posicin se deber poner una
instruccin de salto al punto donde verdaderamente se inicia el programa.
A diferencia de la mayora de los microprocesadores
convencionales, el PC es tambin accesible al programador como registro
de memoria interna de datos, en la posicin de 02. Es decir que cualquier

instruccin comn que opere sobre registros puede ser utilizada para
alterar el PC y desviar la ejecucin del programa. El uso indiscriminado de
este tipo de instrucciones complica el programa y puede ser muy
peligroso, ya que puede producir comportamientos difciles de predecir.
Sin embargo, algunas de esta instrucciones utilizadas con cierto mtodo,
pueden ser muy tiles para implementar poderosas estructuras de control
tales como el goto computado. Como el PIC opera con datos de 8 bits, y la
memoria de datos es tambin de 8 bits, estas instrucciones solo pueden
leer o modificar los bits 0 a 7 del PC.

Subrutinas
La mayora de los microcontroladores incluyen en su repertorio de
instrucciones algunas que permiten saltar a una rutina y, cuando se
complementa su ejecucin, retornar al programa principal.

El empleo de subrutinas aporta muchas ventajas entre las que se


destacan las siguientes:
1.
Se pueden escribir como subrutinas secciones de cdigo y ser
empleadas en muchos programas (por ejemplo, la subrutina de
exploracin de un teclado).
2. Dan a los programas un carcter modular, es decir, se pueden
codificar diferentes mdulos para usarlos en cualquier programa.
3. Se reduce notablemente el tiempo de programacin, la deteccin de
errores, usando repetidamente una subrutina.
4. El cdigo es ms fcil de interpretar, dado que las instrucciones de las
subrutinas no aparecen en el programa principal. Solo figuran las llamadas
CALLs.

LAS INSTRUCCIONES CALL Y RETURN (*)


La instruccin CALL ( llamada la subrutina) consigue que la
ejecucin del programa contine en la direccin donde se encuentra la
subrutina a la que hace referencia. Es similar a GOTO pero coloca en la
pila la direccin de la siguiente instruccin que se debe ejecutar despus
de la CALL.
La subrutina finaliza con la instruccin RETURN (Retorno de la subrutina)
que retoma la direccin guardada en le pila y la coloca en el contador del
programa PC continuando el flujo de control con la instruccin que sigue a
la CALL.

En la familia PIC de gama media la pila tiene ocho niveles de


memoria del tipo FIFO (primero en entrar, ltimo en salir). Si se produce
la llamada a una subrutina durante la ejecucin de otra subrutina, la
direccin de retorno de esta segunda es colocada en la cima de la pila
sobre la direccin anterior. Esta segunda direccin es la primera en salir
de la pila mediante la instruccin RETURN.
Con la pila de ocho niveles, una subrutina puede llamar a otra y sta, a su
vez, llamar a otra hasta un mximo de ocho. La gama baja slo puede
realizar dos llamadas de este tipo al poseer una pila de slo dos niveles.
Las subrutinas deben colocarse al comienzo de las pginas debido a que el
bit 8 del contador del programa es puesto a 0 por la instruccin CALL (o
por cualquier instruccin que modifica el PC). Las subrutinas deben
colocarse en la mitad inicial de las pginas (las 256 palabras).

Consulta a tablas.
En muchas ocasiones es necesario para un programador efectuar
una coincidencia entre alguna cantidad de valores conocidos y un nmero
desconocido que se tiene como ndice, por ejemplo, basados en el
contenido de una posicin de memoria RAM (ndice) se puede obtener de
una serie consecutiva de datos almacenados en memoria de programa (a
estos datos "conocidos" almacenados se le denomina tabla), el dato
desplazado n posiciones adelante del comienzo de esta tabla, este nmero
n corresponde al contenido de la posicin de memoria RAM ndice.

Programa ejemplo:
offset equ 0Ch ;posicin de memoria RAM
w
equ 0
;destino W
f
equ 1
;destino F
................
................
................
movf
offset,w ;tomamos a W el nmero n utilizado como ndice
call
tabla
;posicin en donde se encuentra la serie de datos
;en este sitio luego del retorno de la subrutina se tiene en W el dato
ledo de la tabla
................
................
................
tabla
addwf PCL,f ;se suma al PC el contenido de W obteniendo como resultado un salto
indexado

retlw
W=30h
retlw
W=31h
retlw
W=32h
retlw
W=33h
retlw
W=34h
retlw
W=35h
.
.
.

30h

;s el contenido de W sumado al PCL es 0 se retorna en esta posicin,

31h

;s el contenido de W sumado al PCL es 1 se retorna en esta posicin,

32h

;s el contenido de W sumado al PCL es 2 se retorna en esta posicin,

33h

;s el contenido de W sumado al PCL es 3 se retorna en esta posicin,

34h

;s el contenido de W sumado al PCL es 4 se retorna en esta posicin,

35h

;s el contenido de W sumado al PCL es 5 se retorna en esta posicin,


;...

Finalmente y luego de observar el ejemplo anterior, podemos anotar que


antes de hacer el llamado a la subrutina tabla, se debe cargar en el
registro de trabajo W el valor del ndice y una vez se retorne de dicha
subrutina, es en este mismo registro de trabajo en donde se obtiene el
resultado de la consulta a la tabla (vemos que la sucesin de instrucciones
retlw k se encuentra en memoria de programa).
Rutinas de retardo
Rutina simple de retardo.
Una rutina de simple puede ser implementada como:
Call

retardo

retardo
movlw
movwf
r1
decfsz
goto

0Ah
mem1
mem1,1
r1

;llama a la rutina de retardo

;carga 10 en el acumulador
;guarda el valor del w en mem1
;decrementa mem1
;se ejecuta esta instruccin si el decremento
;no es cero

return
Cuando ejecuta la instruccin Call esta lleva en ejecutarse 2 ciclos.
Cuando esta dentro de la rutina retardo se encuentra con la instruccin
movlw 0Ah que consume 1 ciclo, luego ejecuta la instruccin movwf
mem1 que consume 1 ciclo.
Luego se ejecuta la parte principal de la rutina de demora, las
instrucciones decfsz mem1,1 y la instruccin goto r1 se ejcutan 9
veces, ya que mienstras esta decrementado y no llega a cero no se saltea
la instruccin goto, por lo tanto mienstras no de cero el decremento la
instruccin decfsz consume 1 ciclo y la instruccin goto 2, por lo tanto,

9*3=27 ciclos le lleva realizar este decremento, cuando llego a cero la


instruccin decfsz consume 2 ciclos, por lo tanto el total de ciclo de la
rutina de demora es 3*9 + 2 = 29 ciclos.
Luego retorna al programa principal mediante la instruccin return que
consume 2 ciclos.
El total de ciclos que lleva la rutina completa es 2 + 1 + 1 +29 + 2 = 35
ciclos, y el tiempo que consume esto es con un reloj de 4 Mhz, por lo
tanto el perdo es 2,5 e-7; cada instruccin consume 4 ciclos, por lo que el
tiempo que tarda en ejecutarse cada instruccin es 4*2.5e -7=1e-6, por lo
que el tiempo total en realizar la rutina es 35*1e-6
35 useg.
La secuencia de demora es {3*254 + 2=764}, el mximo tiempo que
puede realizar la demora es
(2 + 1 + 1 + {3*254 + 2} + 2)=770 ciclos
Lo que lleva un tiempo de 770 u seg.

Rutina de demora doble


Una rutina de doble puede ser implementada como:
Call
retardo
movlw
movwf
r2
movlw
movwf
r1
decfsz
goto
decfsz
goto
return

retardo

03h
mem2
0Ah
mem1
mem1,1
r1
mem2,1
r2

;llama a la rutina de retardo

;{1}
;{2}
;{3} carga 10 en el acumulador
;{4} guarda el valor del w en mem1
;{5} decrementa mem1
;{6} se ejecuta esta instr. si el decremento <>0
;{7}
;{8}
;{9}

La instruccin Call consume 2 ciclos, luego se ejecuta la instruccin retardo, luego


ejecuta la instruccin {1} que tarda 1 ciclo, luego se ejecuta la instruccin {2} - 1 ciclo.
Luego ejecuta la instruccin {3} aqu esta tarda 1 ciclo, luego ejecuta la instruccin {4} 1 ciclo, luego se ejecuta la instruccin {5}{6} que ya fue analizado en el punto anterior y
tarda siempre 29 ciclos. luego se ejecuta la instruccin {7} que decrementa mem2, si el
decremento no es cero tarda en ejecutarse 1 ciclo y pasa a ejecutar la instruccin {8},
que vuelve a la instruccin {3}.
Entonces el secuencia de instruccines:
{3}
1 ciclo
{4}
1 ciclo
{5}{6} 29 ciclos
{7}
1 ciclo

{8}
Total

2 ciclo
34 ciclos

Esta secuencia de {34} ciclos se ejecutan en su totalidad 2 veces. Luego la tercera vez
esta secuencia resulta en:
{3}
1 ciclo
{4}
1 ciclo
{5}{6}
29 ciclos
luego se ejecuta decfsz mem2
{7}
2 ciclos
como el decremento es 0 consume
Total 33 ciclos
2 ciclos
Luego se ejecuta la instruccin Return que tarda 2 ciclos.
El total de ciclos consumidos en esta rutina
2 + 1 + 1 + { 34*2 + 33 } + 2 = 2 + 1 +2 + {101} + 2 = 107 ciclos
El tiempo que se tarda en ejecutar esta secuencia es 107*1e-6= 107 u seg.
El mximo tiempo que se tarda, se cargan mem1 y mem2 con 0FFh.
La primera secuencia tarda
{3}
{4}
{5}{6}
{7}
{8}
Total

1 ciclo
1 ciclo
764 ciclos
1 ciclo
2 ciclo
769 ciclos

Esta secuencia se ejecuta 0Feh veces o 254 veces.


La segunda secuencia es

luego se ejecuta decfsz mem2


como el decremento es 0 consume
2 ciclos

{3}
{4}
{5}{6}
{7}
Total

1
1
764
2
768

ciclo
ciclo
ciclos
ciclos
ciclos

EL nmero de ciclos total es


2 + 1 + 1 + { 769*254 + 768} + 2 = 2 + 1 +2 + {101} + 2 = 196100 ciclos
Lo que lleva un tiempo de 196100*1e-6=0.1961 segundos o 196.1 milisegundos.

Rutina de retardo triple.


retardo

movlw .3
movwf mem3
movlw .3
movwf mem2
movlw .10
movwf mem1
decfsz mem1,1
goto r1
decfsz mem2,1
goto r2
decfsz mem3,1
goto r3
return

r3
r2
r1

;{1}
;{2}
;{3}
;{4}
;{5}
;{6}
;{7}
;{8}
;{9}
;{10}
;{11}
;{12}
;{13}

La llamada a subrutina call tarda 2 ciclos. Luego salta a la subrutina en la cual se


encuentra con {1} y {2} que tardan en ejecutarse 2 ciclos. Luego entra en la rutina
principal, entre las lneas {7}{8} tenemos el bucle simple el cual tarda en ejecutarse 29
ciclos, [3*(k1-1)+2]=[3*(10-1)+2]=[3*(9)+2]=29 ciclos. Entre las lneas {5}{6}{7}
{8}{9}{10}, tenemos el bucle doble, el cual incluye el bucle simple.
Denominaremos a la expresin del bucle simple como
A=[3*(k1-1)+2].
Por lo tanto el bucle doble puede expresarse como:
{5}
{6}
{A}
{9}
{10}

1 ciclo
1 ciclo
29 ciclos
1 ciclo
2 ciclos

{5}
{6}
{A}
{9}

1 ciclo
1 ciclo
29 ciclos
2 ciclos
33 ciclos

34 ciclos
Este bucle se ejecuta 2 veces, es decir (k2-1) y cuando la funcin de
decrementar resulta cero se tarda 33 ciclos. La expresin que rige el
segundo bucle,
[(1+1+A+1+2)*(k2-1)]+[1+1+A+2]= [(5+A)*(k2-1]+[4+A]=
[(5+29)*(2)]+[4+29]=[34*2]+[33]=[68]+[33]=101 ciclos
Para indicar la expresin del bucle doble lo haremos como
B=[(5+A)*(k2-1)]+[4+A]

En la lnea {3} comienza el bucle triple y finaliza en {12} la cual ocupa


las siguientes lneas:
{3}
{4}

1
1

ciclo
ciclo

{3}
{4}

1
1

ciclo
ciclo

{B}
{11}
{12}

101 ciclos
1 ciclo
2 ciclos
106 ciclos

{B}
{11}

101 ciclos
2
ciclos
105 ciclos

El primer que tarda 106 ciclos se ejecuta 2 veces, es decir (k3-1) y


cuando la funcin decrementar llega a cero tarda 105 ciclos. Por lo tanto
la cantidad de ciclos que tarda el bucle triple es:
C=[(1+1+B+1+2)*(k3-1)]+[1+1+B+2]=[(5+B)*(k3-1)]+[4+B]=
[(5+101)*(3-1)]+[4+101]=[(106)*(2)]+[105]=[212]+[105]=317
ciclos.
Por lo tanto el total de la rutina desde que se la llama es:
call

2 ciclos

retardo
movlw .3
movwf mem3
{rutina triple}
return

;{1}
;{2}
;{3}{12}
;{13}

1
1
317
2

ciclo
ciclo
ciclos
ciclos

ciclos
Por lo tanto se tarda en ejecutar esta rutina como 323 ciclos.
Para determinar una rutina generaliza es
A=[3*(k1-1)+2]
B=[(5+A)*(k2-1)]+[4+A]
C=[(5+B)*(k3-1)]+[4+B]
D = 2 + 1 +1 +C + 2
Para el mximo de los valores cargados en k1, k2 y k3 para 255.
A=[3*(255-1)+2]=764 ciclos
B=[(5+764)*(255-1)]+[4+764] = [195326]+[768] = 196064 ciclos
C=[(5+196094)*(255-1)]+[4+196094] = 50005244 ciclos
D = 2 + 1 + 1 + 50005244 + 2 = 50005250 ciclos
Para un oscilador de 4 MHz, el tiempo de ciclo de instruccin es t=1e-6 seg.
D= 50.005250 segundos

Programacin.
Programa fuente.
El programa fuente esta compuesto por una sucesin de lneas de
programa. Cada lnea de programa esta compuesta por 4 campos
separados por uno o ms espacios o tabulaciones. Estos campos son:

[Etiqueta]

Comando

[Operando(s)]

;Comentario]

La etiqueta es opcional. El comando puede ser un mnemnico del


conjunto de instrucciones. El operando esta asociado al comando, si no
hay comando no hay operando, e inclusive algunos comandos no llevan
operando. El comentario es opcional para el compilador aunque es buena
prctica considerarlo obligatorio para el programador.
La etiqueta, es el campo que empieza en la primer posicin de la
lnea. No se pueden insertar espacios o tabulaciones antes de la etiqueta
sino ser considerado comando. Identifica la lnea de programa haciendo
que el compilador le asigne un valor automticamente. Si se trata de una
lnea cuyo comando es una instruccin de programa del microcontrolador,

se le asigna el valor de la direccin de memoria correspondiente a dicha


instruccin (location counter). En otros casos se le asigna un valor de una
constante, o la direccin de una variable, o ser el nombre de una
macroinstruccin, etc.
El comando puede ser un cdigo mnemnico de instruccin del
microcontrolador, o una directiva o pseudoinstruccin para el compilador.
En el primer caso ser directamente traducido a cdigo de maquina, en el
segundo caso ser interpretado por el compilador y realizara alguna
accin en tiempo de compilacin como ser asignar un valor a una
etiqueta, etc.
El campo de parmetros puede contener uno o ms parmetros separados
por comas. Los parmetros dependen de la instruccin o directiva. Pueden
ser nmeros o literales que representen constantes o direcciones.
El campo de comentario debe comenzar con un caracter punto y coma. No
necesita tener espacios o tabulaciones separndolo del campo anterior, e
incluso puede empezar en la primer posicin de la lnea. El compilador
ignora todo el texto que contenga la lnea despus de un caracter punto y
coma. De esta manera pueden incluirse lneas que contengan solo
comentarios, y es muy buena prctica hacer uso y abuso de esta
posibilidad para que los programas resulten autodocumentados.
MPLAB.
EL MPLAB
es un Entorno de Desarrollo Integrado(Integrated
Development Environment ,IDE)que corre en Windows, mediante el cual
se puede desarrollar aplicaciones para los microcontroladores de las
familias PIC 16/17. EL MPLAB le permite escribir, depurar y optimizar los
programas (firmware) de sus diseos con PIC 16/17. EL MPLAB incluye un
editor de texto, un simulador y un organizador de proyectos.

Con el MPLAB se puede:

Depurar sus programas fuente.

Detectar errores automticamente en sus programas fuente para


editarlos.

Depurar los programas utilizando puntos de corte (breakpoints)


mediante valores de los registros internos.

Observar el flujo del programa con el simulador MPLAB -SIM,


seguirlo en tiempo real utilizando el emulador PICMASTER.

Realizar medidas de tiempo utilizando un cronmetro.

Mirar variables en las ventanas de observacin.

HERRAMIENTAS DEL MPLAB


El Organizador de Proyectos (Proyect Manager).
El organizador de proyectos (Proyect Manager) es parte fundamental de
MPLAB. Sin crear un proyecto Usted no puede realizar depuracin
simblica. Con el Organizador de Proyectos (Proyect manager) puede
utilizar las siguientes operaciones:

Crear un proyecto.

Agregar un archivo de programa fuente de proyecto.

Ensamblar o compilar programas fuente.

Editar programas fuente.

Reconstruir todos los archivos fuente, o compilar un solo archivo.

Depurar su programa fuente.

Software ensamblador.
El software ensamblador que presenta Microchi provienen dos
presentaciones, una, para entorno DOS llamado MPASM.EXE y la otra,
para entorno Windows llamado MPASMWIN.EXE. Las dos presentaciones
soportan a TODOS los microcontroladores de la familia PIC de Microchip.
El conjunto de instrucciones de los microcontroladores PIC es en esencia
la base del lenguaje ensamblador soportado por este software.

Directivas de uso frecuente:


Son instrucciones para el compilador.
END

; indica fin de programa

EQU

; define una constante de ensamble

ORG ; ensambla a partir de la direccin especificada

;ejemplo:
tatus equ

03

Cont
F

0x20
1

equ
equ

;hace equivalencia entre el smbolo status indicndolo


;como 3 en hexadecimal

org 0

;indica posicin de memoria desde donde se ensambla

movlw 0f
movwf Cont

;carga de w con el valor constante 15 (literal)


;el contenido de w se pasa al reg. CONT

Inicio
s1
s2

decfsz Cont,F ;decremento de Cont y elude siguiente si=0


goto s1
;salto incondicional a Loop
goto s2
;Salto incondicional aqui mismo
end
;Fin del cdigo

Lista de pasos:
1. Haga doble click en el cono correspondiente a MPLAB.
2. Crear el archivo fuente correspondiente (men File...New Source).
3. Salve el archivo (con extensin .ASM) una vez terminada su edicin
(men FILE...Save).
4. Debe a continuacin crearse un nuevo proyecto (men Project...New
Project).
5. Cuando aparezca la ventana de New Project editar las cajas de texto:
Project path and Name y Development Mode, hacer click en <OK>.
6. En la siguiente ventana Edit Project, hacer click en la seccin Nonproject files sobre el nombre del archivo fuente realizado en los pasos 2 y
3.
7. Haga click en el botn <=add y luego de que ste aparezca en la
seccin
Project
Files
haga
click
sobre
el
botn
<OK>.
8. Salvar el proyecto (en el men Project...Save project).

9. Realizar la "construccin de todo el proyecto" (men Project...Build All).


10. En esta etapa se realiza en forma automtica el ensamble de nuestro
programa fuente y el vaciado de ste en memoria de simulacin. El
proceso de ensamble generar un archivo de errores en caso de que estos
existan, s es as deben corregirse directamente sobre el archivo fuente,
salvar las correcciones y reconstruir el proyecto (men Project...Build All).
<<<En esta etapa del proceso ya se tiene el entorno listo para la
simulacin>>>

Vista tpica del entorno MPLAB


Como en la mayora de las aplicaciones Windows la pantalla se divide en
varias secciones:
Barra de ttulo: Se observa el nombre del proyecto
Barra de menus: Acceso a las diferentes opciones del entorno
Barra de herramientas: Cada icono ejecuta las acciones correspondientes.
Barra de estados: Indica el estado del entorno y sus ventanas

Creando un nuevo proyecto

En MPLAB es posible abrir un fichero en ensamblador (*.asm) y


ensamblarlo para poder obtener el fichero de entrada de un grabador
(*.hex), pero tambin es posible el uso de proyectos que utilicen varios
*.asm, permitiendo as reutilizar cdigo con mayor facilidad, al ser este
ms modular.
Es, pues, muy conveniente saber crear un proyecto, el cul se abrir
gracias al men Proyect, mediante su opcin Open Proyect..., muy similar
a Open File.
Tambin ser posible buscar el icono adecuado cambiando la barra de
iconos, para lo cul emplearemos el que antecede estas lneas.
Existen 4 barras, Edit, Debug, Proj y User, cuyo nombre aparece en el
registro ms a la izquierda de la barra de informacin (en la parte inferior
de la ventana). Tanto en User como en Proj existen iconos capaces
tambin de abrir un proyecto (una carpeta verde).

Compruebe usted mismo en esta barra (Proj) a qu opcin corresponde


cada icono situndose sobre l y mirando seguidamente la barra de
informacin (parte inferior de la ventana).

Esta barra (User) es una seleccin de iconos de las otras tres.


Escoja la opcin New Proyect... y dele el nombre pr1.pjt. Llegar entonces
a una ventana como la que se muestra en la pgina siguiente:
A travs del men Window, podr ver la memoria de programa (submen
Program Memory) y la de la EEPROM (si lo desea y la va a utilizar;
submen EEPROM Memory).
Cambiar los estmulos de una entrada de un puerto

Emplearemos el men DEBUG con el submen SIMULATOR STIMULUS y la


opcin ASINCRONOUS STIMULUS..., lo cul dar una ventana como la que
sigue:
Cada uno de estos botones simula un estmulo sobre una pin. La forma de
editarlos es pulsar el botn de propiedades del ratn (el derecho), sobre
uno de ellos, seleccionar la pin a la que queremos vincularlo y el tipo de
cambio que deseamos realizar con l cada pulsacin (poner la entrada a
uno o High, a cero o Low, que cambie de valor cada vez que se pulse o
Toggle). Tras pulsar el botn habr de ejecutarse la siguiente instruccin
antes de ver los cambios a travs del inspector.
En el ejemplo RA1(L) pondr a cero el bit 1 del puerto A, RA2(T) cambiar
el valor del bit 2 del puerto a y el resto de botones estn sin definir.
Tambin es posible crear secuencias sncronas por programa, en funcin
del tiempo.
Plantese como ejercicio modificar el programa para sumar las entradas
RA3-RA0 y RB3-RB0 (todas pulsadores) en el registro 0x0c y poner las
patas RA2, RA1 y RB1 con valor 1.
Puede cambiar la frecuencia de reloj a travs del men OPTIONS,
submen clock frecuency.
Simulacin bajo windows
Una vez corregidos todos los errores el programa ya est listo para ser
grabado en el PIC y probado sobre el terreno, pero resulta ms prctico
(normalmente), y ms fiable, si antes se lleva a cabo una simulacin por
software. MPLAB tiene una herramienta de simulacin software, el MPLABSIM (mire la barra y el men Debug).

Notar algo de incomodidad debida a la escasa automatizacin de algunas


tareas: por ejemplo, la simulacin comienza mediante la opcin Run

(semforo verde), y se detiene con Halt (semforo rojo), pero no


comenzar a correr si no hace un Reset mediante la pulsacin de:

Este icono es Step, ejecucin paso a paso, y avanzar una lnea de


programa cada vez que lo pulse.

Este icono es Change Program Counter, y es utilizado para cambiar


el contador de programa (salto a otra lnea de memoria de programa en
ejecucin, para, por ejemplo, probar slo una rutina especfica si el resto
ya lo sabemos correcto).

Este icono Create a New Watch Window permite editar variables


para ver su valor durante la ejecucin.

Este comando permite cambiar el valor de direcciones de memoria


en tiempo de simulacin y en cualquiera de sus reas (datos, programa,
E2PROM, pila) directamente (por su nmero) o a travs de su nombre
(mnemotcnico definido en el ensamblador, como lo es en el ejemplo
OPERANDO1). Es muy til, combinada con las dos anteriores, para probar
fcilmente todas las variantes de una rutina o zona de cdigo determinada
sin tener que ejecutar para cada una de nuevo todo el cdigo.

Con este comando se pueden definir puntos de parada (Breaks) en


la ejecucin para, mediante Run, no necesitar recorrer lnea a lnea todo el
programa si deseamos ejecutar todo un proceso de golpe hasta esa lnea.
Define condiciones de parada (Conditional Breaks), es decir, valores
de variables o pines (E/S) ante las que parar si se producen.
Por favor, experimente con todas estas opciones. Piense que la excesiva
sencillez de suma.asm hace que Run sea poco til, pero s lo es Step.
Observe como la directiva del ensamblador END no tiene equivalente en
las instrucciones del procesador, con lo que el micro no se detendr en ese
punto. Tngalo en cuenta en el futuro y solucione el problema, por
ejemplo, con un GOTO.

Seleccione pr1 [.hex] en el frame Proyect Files y se le facilitar la opcin


Node Properties. Seleccione tambin dicha opcin. Obtendr entonces esta
nueva ventana:
Seleccione el Hex Format deseado (de momento INHX8M), es decir, el tipo
de fichero en el que el ensamblador deber convertir los *.asm. Todos los
formatos suelen ser aceptados por los grabadores, a quienes van
destinados. Ya puede darle a OK.

El proyecto sigue estando vaco, y habr que aadirle nuestro programa


(suma.asm) para que pueda ensamblarse y probarse. Esto slo ser
posible si proyecto y programa estn en la misma carpeta. Observar que
ahora tiene activa la opcin Add Node del frame Project Files. Seleccinela
y aada suma.asm. Ya tenemos un proyecto activo y funcional. En
prximos apartados hablaremos del uso de mltiples mdulos o libreras.

Temporizador/Contador TMR0.
Una de las labores ms habituales en los programas de control de
dispositivos suele ser determinar intervalos concretos de tiempo, y recibe
le nombre de temporizador (timer) el elemento encargado de realizar
esta funcin. Tambin suele ser frecuente contar los impulsos que se
producen en el exterior del sistema, y el elemento destinado a este fin se
denomina contador. Si las labores del temporizador o contador las
asignamos al programa principal robaran mucho tiempo al procesador en
detrimento de actividades ms importantes. Por este motivo se disean
recursos especficamente orientados a estas misiones.
Los PIC16F84 poseen un temporizador/contador de 8 bits, llamado
TMR0, que acta de dos maneras diferentes:

Como contador de sucesos, que estn representados por los


impulsos que se aplican a la pin RA4/T0CKI. Al llegar al valor FF H
se desborda el contador y, con el siguiente impulso, pasa a 00 H,
advirtiendo esta circunstancia con la activacin de un sealizador
y/o provocando una interrupcin.
Como temporizador, cuando se carga en el registro que implementa
el recurso un valor inicial se incrementa con cada ciclo de instruccin
(Fosc/4) hasta que se desborda, o sea, pasa de FF H a 00 H y avisa
poniendo a el bit sealizador y/o provocando una interrupcin.

Para que el TMR0 funcione como un cantador de impulsos aplicados a la


pin T0CKI hay que poner a 1 el bit T0CS, que es el que ocupa la posicin 5
del registro OPTION. En esta situacin, el registro TMR0, que es el ubicado
en la direccin 1 del banco 0 de la memoria de datos, se incrementa con
cada flanco activo aplicado a la pin T0CKI. El tipo de flanco activo se elige
programando el bit T0SE, que es el que ocupa la posicin 4 del registro
OPTION. Si T0SE 0 1, el flanco activo es el de bajada, y si T0SE = 0, es el
de subida. Cuando se desea que TMR0 funcione como temporizador el bit
T0CS = 0.

Figura 10
El Divisor de frecuencias puede usarse con el TMR0 o con el WDT. Con el
TMR0 acta como Pre-divisor, es decir, los impulsos pasan primero por el
Divisor y luego se aplican al TMR0, una vez aumentada su duracin. Con
el WDT acta despus, realizando la funcin de Post-divisor. Los impulsos,
que divide por un rango el Divisor de frecuencia, pueden provenir de la
seal de reloj interna (Fosc/4) o de los que se aplican a la pin T0CKI. El
TMR0 se comporta como un registro de propsito especfico (SFR) ubicado
en la direccin 1 del banco 0 de la memoria de datos. EN igual direccin,
pero en el banco 1, se halla el registro OPTION.
TMR0 puede ser ledo y escrito en cualquier momento al estar conectado
al bus de datos. Funciona como un contador ascendente de 8 bits. Cuando
funciona como temporizador conviene cargarle con el valor de los
impulsos que se quiere temporizar, pero expresados en complemento a 2.
De esta manera, al llegar al nmero de impulsos deseados se desborda y
al pasar por 00 H se activa el sealizador TOIF y/o se produce una
interrupcin.

Para calcular los tiempos a controlar con TMR0 se utilizan las siguientes
frmulas prcticas.
Temporizacin = 4 Tosc (Valor cargado en TMR0) (Rango
del Divisor)
Valor a cargar en TMR= = Temporizacin/4 Tosc Rango del
Divisor
En cualquier momento se puede leer el valor que contiene TMR0, sin
detener su cuenta. En la figura 11 se ofrece el esquema de
funcionamiento de TMR0. Obsrvese que hay un bloque que retrasa 2
ciclos la cuenta para sincronizar el momento del incremento producido por
la seal aplicada a T0CKI con el que se producen los impulsos internos de
reloj. Cuando se escribe TMR0 se retrasan 2 ciclos su reincremento y se
pone a 0 el Divisor de frecuencia.

Figura 11
El registro OPTION.
La misin principal de este registro es controlar TMR0 y el Divisor de
frecuencia. Ocupa la posicin 81 H de la memoria de datos, que equivale a
la direccin 1 del banco 1. EL bit T0CS (Timer 0 Clock edge Select)
selecciona en el multiplexor MPX1 la procedencia de los impulsos de reloj,
que pueden ser del oscilador interno (Fosc/4) o los que se aplican desde el
exterior por la pin T0CKI. El bit T0SE (Timer 0 clock Source sElect) elige el
tipo de flanco activo en los impulsos externos. El bit PSA del registro
OPTION asigna el Divisor de frecuencia al TMR0 (PSA= 0) o al WDT (PSA
= 1).
Los 3 bits de menos peso de OPTION seleccionan el rango por el que
divide el Divisor de frecuencia los impulsos que se le aplican en su
entrada. El bit 6 INTEDG (INTerrupt EDGe) sirve para determinar el flanco

activo que provocar una interrupcin externa al aplicarse a la pin


RB0/INT. Un 1 si es de subida y un 0 si es de bajada. El bit 7 RBPU# (RB
Pull-Up) activa, si vale 0, o desactiva, cuando vale 1, las resistencias PullUp que pueden conectarse en las lneas de la Puerta B. .La figura 12
muestra la distribucin y funcin de los bits de OPTION.

Figura 12
La memoria EEPROM de Datos.

Los PIC16F84 tienen 64 bytes de memoria EEPROM de datos, donde se


pueden almacenar datos y variables que interesa que no se pierdan
cuando se desconecta la alimentacin al sistema. Soporta 1.000.000 de
ciclos de escritura/borrado y es capaz de guardar la informacin sin
alterarla ms de 40 aos. La memoria EEPROM no est mapeada en la
zona de la memoria de datos donde se ubican los registros SFR y GPR.
Para poder leerla y escribirla durante el funcionamiento normal del
microcontrolador hay que utilizar 4 registros del banco SFR: EEDATA,
EEADR y EECON1.
En el registro EEADR, ubicado en la direccin 9 del banco 0, se carga la
direccin a acceder de la EEPROM de datos. las 64 posiciones de un byte
ocupan las direcciones de un mapa que comienza en 00 H y termina en 3F
H, por eso los 2 bits de ms peso de este registro siempre valen 0. En el
registro EEDATA, ubicado en la direccin 8 del banco 0, se depositan los
datos que se leen o escriben. El registro EECON1, que ocupa la direccin
88 H de la memoria de datos, o la direccin 8 del banco 1, tiene misiones
de control de las operaciones en la EEPROM y la distribucin de sus bits se
presenta en la figura 16, sirviendo cada uno de ellos para lo siguiente:
RD: Lectura
1: Se pone a 1 cuando se va a realizar un ciclo de lectura. Luego pasa a 0
automticamente.
WR: Escritura
1: Se pone a 1 cuando se va a realizar un ciclo de ESCRITURA. Luego
pasa a 0 automticamente.
WREN: Permiso de escritura
1: Permite la escritura en la EEPROM.
0: Prohibe la escritura.
WRERR: Sealizador de error en escritura
1: Se pone a 1 cuando una operacin de escritura ha terminado
prematuramente.
0: La operacin de escritura se ha completado correctamente.
EEIF: Sealizador de final de operacin de escritura
1: Cuando este sealizador se pone a 1 indica que la operacin se ha
completado con xito. Se pone a 0 por programa.
0: La operacin de escritura no se ha completado.
-----Figura 16

------

------

EEIF

WRERR

WREN

WR

RD

Interrupciones.
Las llamadas a las subrutinas mediante instrucciones del tipo CALL son
desviaciones del flujo de control del programa originadas por
instrucciones, por lo que se consideran sncronas. Se producen cada vez
que se ejecuta dicha instruccin. La interrupciones son desviaciones del
flujo de control del programa originadas asncronamente por diversos
sucesos que no se hallan bajo la supervisin de las instrucciones. Dichos
sucesos pueden ser externos al sistema, como la generacin de un flanco
o nivel activo en una pin del microcontrolador, o bien, internos, como el
desbordamiento de un contador.
El comportamiento del microcontrolador ante la interrupcin es similar al
de la instruccin tipo CALL de llamada a subrutina. En ambos casos se
detiene la ejecucin del programa en curso, se salva la direccin actual del
PC en la Pila y se carga el PC con una direccin, que en el caso de CALL
viene acompaando a la misma instruccin, y en el caso de una
interrupcin es una direccin reservada de la memoria de cdigo,
llamada Vector de Interrupcin que da paso a un trozo de cdigo
denominado Rutina de Servicio de la Interrupcin (RSI).
La RSI suele comenzar guardando en la memoria de datos algunos
registros especficos del procesador. Concretamente aquellos que la RSI va
a emplear y va a alterar su contenido. Antes del retorno al programa
principal se recuperan los valores guardados y se restaura completamente
el estado del procesador. Algunos procesadores salvan estos registros en
la Pila, pero los PIC no disponen de instrucciones para meter (push) y
sacar (pop) informacin de la Pila, utilizando para este fin registros de
propsito general de la memoria de datos.
Los PIC16F84 pueden ser interrumpidos por 4 causas diferentes, pero
todas ellas desvan el flujo de control a la direccin 0004 H, por lo que
otra de las operaciones iniciales de la RSI es averiguar cul de las posibles
causas ha sido la responsable de la interrupcin en curso, para ello se
exploran los sealizadores de las fuentes de interrupcin. Otro detalle
importante en la RSI de los PIC16F84 es que estos microcontroladores
poseen un bit GIE (Global Interrupt Enable) que cuando vale 0 prohibe
todas las interrupciones. Pues bien, al comenzar la RSI dicho bit GIE se
pone automticamente a 0, con objeto de no atender nuevas
interrupciones hasta que se termine la que ha comenzado. En el retorno
final de la interrupcin, GIE pasa a valer automticamente 1 para volver a
tener en cuenta las interrupciones.

Antes del retorno conviene borrar el sealizador de la causa de


interrupcin que se ha atendido, porque si bien los sealizadores se ponen
a 1 automticamente en cuanto se produce la causa que indican, la
puesta a 0 se hace por programa. En la figura 17 se muestra un
organigrama de las fases ms importantes que se desarrollan durante el
proceso de ejecucin de una interrupcin.

Causas de Interrupcin.
Los PIC16F84 tienen 4 causas o fuentes posibles de interrupcin:
I. Activacin de la pin RB0/INT
II. Desbordamiento del temporizador TMR0
III. Cambio de estado en una de las 4 pins de ms peso (RB7-RB4)
de la Puerta B
IV. Finalizacin de la escritura en la EEPROM de datos
Cuando ocurre cualquiera de los 4 sucesos indicados se origina una
peticin de interrupcin, que si se acepta y se atiende comienza
depositando el valor del PC actual en la Pila, poniendo el bit GIE = 0 y
cargando en el PC el valor 0004 H, que es el Vector de Interrupcin donde
se desva el flujo de control. Cada fuente de interrupcin dispone de un
sealizador o flag, que es un bit que se pone automticamente a 1
cuando se produce. Adems cada fuente de interrupcin tiene otro bit de
permiso, que segn su valor permite o prohibe la realizacin de dicha
interrupcin.

El Registro de Control de Interrupciones INTCON.


La mayor parte de los sealizadores y bits de permiso de las fuentes de
interrupcin en los PIC16F84 estn implementados sobre los bits del
registro INTCON, que ocupa la direccin 0B H del banco 0, hallndose
duplicado en el banco 1. El significado de cada bit, que se muestra en la
figura 17, es el siguiente:

GIE
Figura 17

EEIE

T0IE

INTE

RBIE

T0IF

INTF

RBIF

GIE: Permiso Global de Interrupciones


1:Prohbe todas las interrupciones.
2:Permite la ejecucin de todas las interrupciones, cuyos bits de permiso
individuales tambin las permitan.
EEIE: Permiso de Interrupcin por fin de escritura en la EEPROM
1:Prohbe que se produzca esta interrupcin.
2:Permite que se origine esta interrupcin cuando termina la escritura en
la EEPROM de datos.
T0IE: Permiso de Interrupcin por sobrepasamiento del TMR0
1:Prohbe esta interrupcin.
2:Permite una interrupcin al desbordarse el TMR0.
INTE: Permiso de Interrupcin por activacin de la pin RB0/INT
1:Prohbe esta interrupcin.
2:Permite la interrupcin al activarse RB0/INT.
RBIE: Permiso de Interrupcin por cambio de estado en RB7-RB4
1:Prohbe esta interrupcin
2:Permite esta interrupcin.
T0IF: Sealizador de sobrepasamiento del TMR0
1:Indica que el TMR0 no se ha desbordado.
2:Toma este valor cuando ha ocurrido el desbordamiento.
INTF: Sealizador de activacin de la pin RB0/INT
1:Indica que RB0/INT an no se ha activado.
2:Se pone a 1 al activarse RB0/INT.
RBIF: Sealizador de cambio de estado en las pins RB7-RB4
1:No ha cambiado el estado de RB7-RB4.
2:Pasa a 1 cuando cambia el estado de alguna de esas lneas.
Siempre que se produzca una interrupcin por cualquier causa, GIE=1 y el
PC se carga con el valor 0004 H, que es el Vector de Interrupcin. Para
conocer que causa ha provocado la interrupcin se exploran los
sealizadores, tres de los cuales se ubican en el registro INTCON y el
cuarto, EEIF, que se pone a 1 cuando finaliza la escritura en le EEPROM, se
halla en el bit 4 del registro EECON1. Los sealizadores deben ponerse a 0
por programa antes del retorno de la interrupcin y son operativos aunque
la interrupcin est prohbida con su bit de permiso correspondiente.

Interrupcin Externa INT.

Esta fuente de interrupciones es sumamente importante para atender los


acontecimientos externos en tiempo real. Cuando ocurre alguno de ellos
activa la pin RB0/INT y se hace una peticin de interrupcin. Entonces, de
forma automtica, el bit INTF=1 y, si el bit de permiso INTE=1 se autoriza
el desarrollo de la interrupcin.
Mediante el bit 6, llamado INTDEG, del registro OPTION se puede
seleccionar cual sere el flanco activo en RB0/INT. Si se desea que sea
ascendente se escribe un 1 en dicho bit, y si se desea descendente se
escribe un 0. El procesador explora el sealizador INTF al final del primer
ciclo de reloj de cada ciclo de instruccin. Recurdese que cada ciclo de
instruccin constaba de 4 ciclos de reloj: Q1, Q2, Q3 y Q4. Al terminar Q1
se exploran los sealizadores producindose un perodo de latencia de 3
4 ciclos de instruccin desde el momento que hay un sealizador activado
hasta que se inicializa la interrupcin.

Вам также может понравиться