Vous êtes sur la page 1sur 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.


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

Unidad
Central
Memoria
ROM
Memoria
RAM
Circuitos
de interfaz
Buses del Sistema
Exterior


tienen en comn el hecho de que muy raramente necesitan clculos
complejos y, en cambio, s suelen incluir numerosas manipulaciones de
la informacin de entrada/salida.

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
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.


Controlador de
interrupciones
CPU
ROM
UVPROM
OTPROM
RAM EEPROM
Osc.
Controlador
de bus
Puertos de
entrada/salida
Puerto
serie
Interfaz
especfica
Temporizador 1
Temporizador 0
.....


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 (V
DD
): De 2 a 6 V DC
VOLTAJE DE GRABACION (V
PP
): 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:

V
DD
: Tensin positiva de alimentacin.
V
SS
: 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 V
PP
.

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

P
I
C
1
6
X
8
X
11
9
8
7
6
5
4
3
2
10
18
17
16
15
14
13
12
11
RA1
RA0 RA3
RA2
OSC1/CLKIN
OSC2/CLKOUT
Vdd
RA4/TOCKI
MCLR#
Vss
RB0/INT
RB1
RB4
RB5
RB6
RB7
RB3
RB2


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 cuatro tipos de osciladores externos para
aplicarles la frecuencia de funcionamiento, se colocan entre las pins
OSC1 y OSC2. El tipo empleado debe especificarse en dos bits de la
Palabra de Configuracin, como se comentar ms adelante. Los tipos
que se pueden emplear son:

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.























MEMORIA DE DATOS
00 INDF INDF 80
01 TMR0 OPTION 81
02 PCL PCL 82
03 ESTADO ESTADO 83
04 FSR FSR 84
05 PUERTA A TRIS A 85
06 PUERTA B TRIS B 86
07 87
08 EEDATA EECON1 88
09 EEADR EECON2 89
0A PCLATH PCLATH 8A
0B INTCON INTCON 8B
0C
36
REGISTROS
DE
PROPSITO
GENERAL
MAPEADOS
EN EL
BANCO 0
8C







2F AF
30 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.
SFR
GPR



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 V
SS
(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# Z DC C
Figura 11









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 30h ;s el contenido de W sumado al PCL es 0 se retorna en esta
posicin, W=30h
retlw 31h ;s el contenido de W sumado al PCL es 1 se retorna en esta
posicin, W=31h
retlw 32h ;s el contenido de W sumado al PCL es 2 se retorna en esta
posicin, W=32h
retlw 33h ;s el contenido de W sumado al PCL es 3 se retorna en esta
posicin, W=33h
retlw 34h ;s el contenido de W sumado al PCL es 4 se retorna en esta
posicin, W=34h
retlw 35h ;s el contenido de W sumado al PCL es 5 se retorna en esta
posicin, W=35h
. ;...
.
.
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 ;llama a la rutina de retardo


retardo
movlw 0Ah ;carga 10 en el acumulador
movwf mem1 ;guarda el valor del w en mem1
r1 decfsz mem1,1 ;decrementa mem1
goto r1 ;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 ;llama a la rutina de retardo


retardo
movlw 03h ;{1}
movwf mem2 ;{2}
r2 movlw 0Ah ;{3} carga 10 en el acumulador
movwf mem1 ;{4} guarda el valor del w en mem1
r1 decfsz mem1,1 ;{5} decrementa mem1
goto r1 ;{6} se ejecuta esta instr. si el decremento <>0
decfsz mem2,1 ;{7}
goto r2 ;{8}
return ;{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} 2 ciclo
Total 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} 1 ciclo
{4} 1 ciclo
{5}{6} 764 ciclos
{7} 1 ciclo
{8} 2 ciclo
Total 769 ciclos

Esta secuencia se ejecuta 0Feh veces o 254 veces.

La segunda secuencia es

{3} 1 ciclo
{4} 1 ciclo
{5}{6} 764 ciclos
luego se ejecuta decfsz mem2 {7} 2 ciclos
como el decremento es 0 consume Total 768 ciclos
2 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 ;{1}
movwf mem3 ;{2}
r3 movlw .3 ;{3}
movwf mem2 ;{4}
r2 movlw .10 ;{5}
movwf mem1 ;{6}
r1 decfsz mem1,1 ;{7}
goto r1 ;{8}
decfsz mem2,1 ;{9}
goto r2 ;{10}
decfsz mem3,1 ;{11}
goto r3 ;{12}
return ;{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} 1 ciclo {5} 1 ciclo
{6} 1 ciclo {6} 1 ciclo
{A} 29 ciclos {A} 29 ciclos
{9} 1 ciclo {9} 2 ciclos
{10} 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} 1 ciclo {3} 1 ciclo
{4} 1 ciclo {4} 1 ciclo
{B} 101 ciclos {B} 101 ciclos
{11} 1 ciclo {11} 2 ciclos
{12} 2 ciclos 105 ciclos
106 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 ;{1} 1 ciclo


movwf mem3 ;{2} 1 ciclo
{rutina triple} ;{3}{12} 317 ciclos
return ;{13} 2 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 ;hace equivalencia entre el smbolo status indicndolo
;como 3 en hexadecimal
Cont equ 0x20
F equ 1

org 0 ;indica posicin de memoria desde donde se ensambla
Inicio
movlw 0f ;carga de w con el valor constante 15 (literal)


movwf Cont ;el contenido de w se pasa al reg. CONT
s1
decfsz Cont,F ;decremento de Cont y elude siguiente si=0
goto s1 ;salto incondicional a Loop
s2 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 Non-
project 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
MPLAB-SIM (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, E
2
PROM, 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 Pull-Up 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.




------ ------ ------ EEIF WRERR WREN WR RD
Figura 16





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 EEIE T0IE INTE RBIE T0IF INTF RBIF
Figura 17

GIE: Permiso Global de Interrupciones
0: Prohbe todas las interrupciones.
1: 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
0: Prohbe que se produzca esta interrupcin.
1: Permite que se origine esta interrupcin cuando termina la escritura
en la EEPROM de datos.

T0IE: Permiso de Interrupcin por sobrepasamiento del TMR0
0: Prohbe esta interrupcin.
1: Permite una interrupcin al desbordarse el TMR0.

INTE: Permiso de Interrupcin por activacin de la pin RB0/INT
0: Prohbe esta interrupcin.
1: Permite la interrupcin al activarse RB0/INT.

RBIE: Permiso de Interrupcin por cambio de estado en RB7-
RB4
0: Prohbe esta interrupcin
1: Permite esta interrupcin.

T0IF: Sealizador de sobrepasamiento del TMR0
0: Indica que el TMR0 no se ha desbordado.
1: Toma este valor cuando ha ocurrido el desbordamiento.

INTF: Sealizador de activacin de la pin RB0/INT
0: Indica que RB0/INT an no se ha activado.
1: Se pone a 1 al activarse RB0/INT.

RBIF: Sealizador de cambio de estado en las pins RB7-RB4
0: No ha cambiado el estado de RB7-RB4.
1: 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.

Vous aimerez peut-être aussi