Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% encontró este documento útil (0 votos)
141 vistas286 páginas

Pic

Descargar como pdf o txt
Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1/ 286

Captulo 2: Programacin de los microcontroladores

Usted seguramente sabe que no solo es suficiente conectar el microcontrolador a los otros componentes y
encender una fuente de alimentacin para hacerlo funcionar, verdad? Hay que hacer algo ms. se necesita
programar el microcontrolador para que sea capaz de hacer algo til. Este captulo trata de la programacin
en Basic, por lo que vamos a presentar lo bsico que tiene que saber para escribir un programa. Le puede
parecer complicado, sobre todo si no tiene experiencia en este campo. no se rinda, respire profundamente y
empiece a programar...
2.1 LENGUAJ ES DE PROGRAMACIN
2.2 CARACTERSTICAS PRINCIPALES DEL LENGUAJ E DE PROGRAMACIN BASIC
2.3 COMPILADOR MIKROBASIC PRO FOR PIC
2.1 LENGUAJES DE PROGRAMACIN

El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto se denomina el cdigo
ejecutable y est compuesto por una serie de ceros y unos, aparentemente sin significado.
Dependiendo de la arquitectura del microcontrolador, el cdigo binario est compuesto por
palabras de 12, 14 o 16 bits de anchura. Cada palabra es interpretada por la CPU como una
instruccin a ser ejecutada durante el funcionamiento del microcontrolador. Como es ms fcil
trabajar con el sistema de numeracin hexadecimal, el cdigo ejecutable se representa con
frecuencia como una serie de los nmeros hexadecimales denominada cdigo Hex. A todas las
instrucciones que el microcontrolador puede reconocer y ejecutar se le denominan colectivamente
J uego de instrucciones. En los microcontroladores PIC con las palabras de programa de 14 bits de
anchura, el conjunto de instrucciones tiene 35 instrucciones diferentes.

Normalmente los programas se escriben en el lenguaje ensamblador cuando se requiere controlar
completamente la ejecucin de programa.
Como el proceso de escribir un cdigo ejecutable era considerablemente arduo, en consecuencia
fue creado el primer lenguaje de programacin denominado ensamblador (ASM). El proceso de
programacin se hizo un poco ms complicado. Por otro lado, el proceso de escribir un programa
dej de ser una pesadilla. Las instrucciones en ensamblador consisten en las abreviaturas con
significado. Un programa denominado ensamblador instalado en la PC compila las instrucciones
del lenguaje ensamblador a cdigo mquina (cdigo binario). Este programa compila instruccin a
instruccin sin optimizacin. La ventaja principal del lenguaje ensamblador es su simplicidad y el
hecho de que a cada instruccin cle orresponde una localidad de memoria. Como permite controlar
todos los procesos puestos en marcha dentro del microcontrolador, este lenguaje de programacin
todava sigue siendo popular.
Por otro lado, los programas se ejecutan siempre a alta velocidad y en la mayora de casos no es
necesario saber en detalle qu ocurre dentro del microcontrolador. A pesar de todos los lados
buenos del lenguaje ensamblador, los programadores siempre han necesitado un lenguaje de
programacin similar al lenguaje utilizado en el habla cotidiana. Por ltimo, los lenguajes de
programacin de alto nivel (Basic entre otros) fueron creados. La ventaja principal de estos
lenguajes es la simplicidad de escribir un programa. Varias instrucciones en ensamblador se
sustituyen por una sentencia en Basic. El programador ya no tiene que conocer el conjunto de
instrucciones del microcontrolador utilizado. Ya no es posible conocer exactamente cmo se
ejecuta cada sentencia, de todas formas ya no importa. Aunque siempre se puede insertar en el
programa una secuencia escrita en ensamblador.

El proceso de escribir un programa en Basic. Al seleccionar la opcin apropiada, el programa ser compilado
en el ensamblador y luego en el cdigo hex que ser cargado en el microcontrolador.
Similar al lenguaje ensamblador, un programa especializado e instalado en la PC se encarga de compilar un
programa a cdigo mquina. A diferencia del ensamblador, los compiladores para los lenguajes de
programacin de alto nivel crean un cdigo ejecutable que no es siempre tan corto como el cdigo escrito en
ensamblador.
La figura anterior describe el proceso de la compilacin de programa escrito en Basic en cdigo hex.
Ejemplo de un programa simple escrito en Basic:

VENTAJAS DE LOS LENGUAJES DE PROGRAMACIN DE ALTO NIVEL
Si alguna vez ha escrito un programa para un microcontrolador PIC en lenguaje ensamblador, probablemente
sepa que la arquitectura RISC carece de algunas instrucciones. Por ejemplo, no hay instruccin apropiada
para multiplicar dos nmeros. Por supuesto, este problema se puede resolver gracias a la aritmtica que
permite realizar las operaciones complejas al descomponerlas en un gran nmero de operaciones ms
simples. En este caso, la multiplicacin se puede sustituir con facilidad por adicin sucesiva (a x b =a +a +a
+... +a). Ya estamos en el comienzo de una historia muy larga... No hay que preocuparse al utilizar uno de
estos lenguajes de programacin de alto nivel como es Basic, porque el compilador encontrar
automticamente la solucin a ste problema y otros similares. Para multiplicar los nmeros a y b, basta con
escribir a*b.
2.2 CARACTERSTICAS PRINCIPALES DEL LENGUAJE DE
PROGRAMACIN BASIC
Similar al uso de cualquier lengua que no est limitada a los libros y a las revistas, el lenguaje de
programacin Basic no est estrechamente relacionado a un tipo particular de ordenador, procesador o
sistema operativo. Esto puede ser un problema, ya que Basic vara ligeramente dependiendo de su aplicacin
(como diferentes dialectos de una lengua). Por consiguiente, en este libro no vamos a darle una descripcin
detallada de todas las caractersticas de Basic, sino presentar una aplicacin muy concreta de Basic, lenguaje
de programacin utilizado en el compilador mikroBasic PRO for PIC.
El Basic es un lenguaje de programacin simple y fcil de entender. Para utilizarlo correctamente, basta con
conocer slo unos pocos elementos bsicos en los que consiste cada programa. Estos son:
Identificadores
Comentarios
Operadores
Expresiones
Instrucciones
Constantes
Variables
Smbolos
Directivas
Etiquetas
Procedimientos y funciones
Mdulos

Aqu est un ejemplo de cmo no se debe escribir un programa. Los comentarios no estn
incluidos, nombres de etiquetas no tienen significado, secciones del cdigo no estn
agrupadas...Este programa funciona correctamente, pero slo el programador que lo escribi
conoce su propsito y modo de ejecucin (como mximo uno o dos das).
En la siguiente figura se muestra la estructura de un programa simple escrito en Basic, destacando
las partes en las que consiste. Esto es un ejemplo de cmo se debe escribir un programa. Las
diferencias son ms que obvias...

ESTRUCTURA DE PROGRAMA
Similar a los otros lenguajes de programacin, Basic dispone de un conjunto de reglas estrictamente definidas
que se deben observar al escribir un programa. Para escribir un programa en Basic, es necesario instalar un
software que proporciona el entorno de trabajo apropiado y entiende estas reglas en la PC... Al escribir una
carta, se necesita un programa para procesar palabras. En este caso, se necesita el compilador mikroBasic
PRO for PIC.
A diferencia de la mayora de programas a los que est acostumbrado a manejar, el proceso de escribir
programas en el compilador no empieza por seleccionar la opcin File>New, sino Project>New. Por qu?
Bueno, usted escribe un programa en un documento con extensin .mbas (mikroBasic). Una vez que se ha
escrito el programa, el mismo se debe compilar en cdigo HEX para crear un nuevo documento con extensin
.hex. Al mismo tiempo el compilador generar automticamente varios documentos aparte de se. Por ahora
el propsito de estos documentos no importa. Por supuesto, hay algo para conectarlos todos. Usted ya lo
adivina - se trata de un proyecto. El programa que escribe es slo una parte del proyecto.

Slo para estar seguro de que estamos hablando en los mismos trminos... A partir de ahora la palabra
mdulo se refiere a un documento con extensin .mbas. El texto que contiene se refiere a un programa. Cada
proyecto escrito en el compilador mikroBasic PRO for PIC es de extensin .mbppi (microBasic Project for
PIC) y consiste en un mdulo como mnimo (mdulo principal - Main Module).
Cada proyecto en el mikroBasic PRO for PIC requiere un solo mdulo principal. Lo identifica la palabra clave
program y ordena al compilador por dnde empezar el proceso de la compilacin. Al crear con xito un
proyecto vaco en Project Wizard, el mdulo principal (main module) ser visualizado automticamente en la
ventana Code Editor:
program MyProject ' El mdulo principal es denominado MyProject
main: ' Procedimiento principal
... '*
... '* Escribir el cdigo de programa aqu
... '*
end.
A la palabra clave program no le puede preceder nada, excepto comentarios. Como hemos mencionado
anteriormente, el proyecto puede incluir a otros mdulos que, a diferencia del mdulo principal, empiezan por
la palabra clave module.
module MyModul e ' Mdul o auxi l i ar Auxi l i ar y es denomi nado MyModul e
. . . ' *
. . . ' * I mpl ement os
. . . ' *
end.
Para que el compilador pueda reconocer todos los mdulos que pertenecen a un proyecto, es necesario
especificarlos en el mdulo principal por medio de la palabra clave include seguida por un nombre del mdulo
entre comillas. La extensin de estos ficheros no se debe incluir. Se permite slo un mdulo por clusula
include. El nmero de las clusulas include no est limitado, pero todas ellas deben estar especificadas
inmediatamente despus del nombre del programa (mdulo principal). Ejemplo:

program MyPr ogr am ' I ni ci o de pr ogr ama ( mdul o pr i nci pal denomi nado
MyPr ogr am )
' Ot r os mdul os i ncl ui dos son:
include "ut i l s" ' Mdul o ut i l s
include "st r i ngs" ' Mdul o st r i ngs
include "MyUni t " ' Mdul o MyUni t
. . .
ORGANIZACIN DEL MDULO PRINCIPAL
El mdulo principal se puede dividir en dos secciones: declaraciones y el cuerpo de programa. Qu es una
declaracin en la programacin? Una declaracin es un proceso de definir las propiedades de los
identificadores que se utilizarn en el programa. Como la mayora de los dems lenguajes de programacin,
Basic tambin requiere que todos los identificadores estn declarados antes de ser utilizados en el programa.
Si no es as, el compilador no puede interpretarlos correctamente. Ejemplo de la declaracin de una variable
denominada distancia:
dim di st ance as float ' Decl ar ar l a var i abl e di st anci a
Como se puede ver, es una variable de punto flotante, o sea un nmero con posicin decimal opcional. Las
otras dos variables estn declaradas y nombradas velocidad y tiempo. Ahora, se pueden utilizar en el
siguiente programa:
Esto es un ejemplo de cmo escribir el mdulo principal correctamente:

ORGANIZACIN DE OTROS MDULOS
Los otros mdulos empiezan por la palabra clave module. Cada mdulo consiste en tres secciones: include,
interface e implementation. Solo la seccin implementation es obligatoria. Empieza por la palabra clave
implements. Vea el siguiente ejemplo:

IDENTIFICADORES
Los identificadores son los nombres arbitrarios asignados a los objetos bsicos del lenguaje teles como
constantes, variables, funciones, procedimientos etc. A alguien se le ocurri utilizar la palabra identificador en
vez de utilizar el nombre. As de simple. Aqu estn las reglas a observar al utilizar los identificadores.
Los identificadores pueden incluir cualquiera de los caracteres alfabticos A-Z (a-z), los
dgitos 0-9 y el carcter subrayado '_'.
El primer carcter de un identificador no puede ser un dgito.
Ningn identificador puede contener caracteres especiales tales como ! [{#$ % & etc.
Basic no es sensible a la diferencia entre minsculas y maysculas, lo que significa que
FIRST, first y First son identificadores idnticos.
El smbolo ^(signo de intercalacin) se utiliza para denotar un operador exponencial, el
smbolo * (asterisco) se utiliza para denotar la multiplicacin, mientras que los dems
smbolos tienen el significado comn.
Las palabras clave ya utilizadas por el compilador no deben ser utilizadas como
identificadores. Lista alfabtica de las palabras clave en Basic:
Abstract
And
Array
As
At
Asm
Assembler
Automated
Bdata
Begin
Bit
Case
Cdecl
Class
Code
Compact
Const
Constructor
Contains
Data
Default
Deprecated
Destructor
Dispid
Dispinterface
Div
Do
Downto
Dynamic
Else
End
Except
Export
Exports
External
Far
File
Finalization
Finally
For
Forward
Function
Goto
Idata
If
Ilevel
Implementation
In
Index
Inherited
Initialization
Inline
Interface
Io
Is
Label
Large
Library
Message
Mod
Name
Near
Nil
Not
Object
Of
On
Or
Org
Out
Overload
Override
Package
Packed
Pascal
Pdata
Platform
Private
Procedure
Program
Property
Protected
Public
Published
Raise
Read
Readonly
Record
Register
Reintroduce
Repeat
Requires
Resourcestring
Rx
Safecall
Sbit
Set
Sfr
Shl
Shr
Small
Stdcall
Stored
String
Stringresource
Then
Threadvar
To
Try
Type
Unit
Until
Uses
Var
Virtual
Volatile
While
With
Write
Writeonly
Xdata
Xor
Una lista de identificadores que no deben ser utilizados en el programa
COMENTARIOS
Los comentarios son las partes del programa utilizados para aclarar las instrucciones de programa o para
proporcionar ms informacin al respecto. En Basic, cualquier texto que sigue a un apstrofo (') se considera
un comentario, Los comentarios no se compilan al cdigo ejecutable. El compilador es capaz de reconocer los
caracteres especiales utilizados para designar dnde los comentarios comienzan y terminan y no hace nada
de caso al texto entre ellos durante la compilacin. Aunque los comentarios no pueden afectar a la ejecucin
de programa, son tan importantes como cualquier otra parte de programa. Aqu est el porqu... Con
frecuencia es necesario mejorar, modificar, actualizar, simplificar un programa... No es posible interpretar
incluso los programas simples sin utilizar los comentarios.

ETIQUETAS
Las etiquetas proporcionan el modo ms fcil de controlar el flujo de programa. Se utilizan para denotar las
lneas particulares en el programa donde se deben ejecutar la instruccin de salto y la subrutina apropiada.
Todas las etiquetas deben terminar por : as que el compilador las puede reconocer con facilidad.

CONSTANTES
Las constantes son los nmeros o caracteres cuyo valor no puede ser cambiado durante la ejecucin de
programa. A diferencia de las variables, las constantes se almacenan en la memoria ROM del
microcontrolador para guardar el mayor espacio posible de la memoria RAM. El compilador reconoce las
constantes por sus nombres y el prefijo const. Cada constante se declara bajo un nombre nico que debe ser
un identificador vlido. Las constantes pueden ser en formatos decimal, hexadecimal o binario. El compilador
los distingue por su prefijo. Si una constante no lleva prefijo, se considera decimal por defecto.
FORM AT O PREFI J O E J EMPL O
Decimal

const MAX = 100
Hexadecimal 0x o $ const MAX = 0xFF
Binario Punto flotante const MAX = %11011101
Las constantes se declaran en la parte de declaracin del programa o de la rutina. La sintaxis es la siguiente:
const nombr e_de_const ant e [ as t ype] = val or
Los nombres de las constantes se escriben normalmente con maysculas. El tipo de una constante se
reconoce automticamente por su tamao. En el siguiente ejemplo, la constante MINIMUM se considera un
entero con signo y ocupa dos bytes de la memoria Flash (de 16 bits):
const MI NI MUM = - 1000 ' Decl ar ar l a const ant e MI NI MUM
El tipo de constante se especifica opcionalmente. En la ausencia de tipo, el compilador lo considera el menor
tipo conveniente al valor de constante.
const MAX as longint = 10000
const MI N = 1000 ' Compi l ador supone el t i po wor d
const SWITCH = "n" ' Compi l ador supone el t i po char
En el siguiente ejemplo, una constante denominada T_MAX se declara de modo que tenga el valor fraccional
32.60. Ahora, el programa puede comparar la temperatura anteriormente medida con la constante con el
nombre con significado en vez del nmero 32.60.
const T_MAX = 32. 60 ' Decl ar ar t emper at ur a T_MAX
const T_MAX = 3. 260E1 ' Ot r a f or ma de decl ar ar l a const ant e T_MAX
Una constante de cadena consiste en una secuencia de caracteres. Debe estar encerrada entre comillas. Un
espacio en blanco se puede incluir en la constante de cadena y representa un carcter. Las constantes de
cadena se utilizan para representar cantidades no numricas tales como nombres, direcciones, mensajes etc.
const Message_1 = "Pr ess t he START but t on" ' Mensaj e 1 par a LCD
const Message_2 = "Pr ess t he RI GHT but t on" ' Mensaj e 2 par a LCD
const Message_3 = "Pr ess t he LEFT but t on" ' Mensaj e 3 par a LCD
En este ejemplo, al enviar la constante Message_1 al LCD, el mensaje press the START button aparecer en
la pantalla.
VARIABLES
Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado durante la
ejecucin de programa. Cada variable se declara bajo un nombre nicoque debe ser un identificador vlido.
Por ejemplo, para sumar dos nmeros (nmero1 +nmero2) en el programa, es necesario tener una variable
para representar qu es lo que llamamos suma en vida cotidiana. En este caso, nmero1, nmero2 y suma
son variables. La sintaxis es la siguiente:
dim nombr e_de_var i abl e as t ype
Las variables en Basic son de un tipo, lo que significa que es necesario especificar el tipo de dato que se
asignar a la variable. Las variables se almacenan en la memoria RAM y el espacio de memoria ocupado (en
bytes) depende de su tipo. Aparte de las declaraciones de una sola variable, las variables del mismo tipo, se
pueden declarar en forma de una lista. Aqu, lista de identificadores es una lista de identificadores vlidos
delimitados por comas, mientras que tipo puede ser cualquier tipo de dato.
dim i , j , k as byte ' Def i ni r var i abl es i , j , k
dim count er , t emp as word ' Def i ni r var i abl es cont ador y t emp
SMBOLOS
Los smbolos en Basic permiten crear los macros simples sin parmetros. Cualquier lnea de cdigo se puede
reemplazar por un solo identificador. Los smbolos pueden aumentar legibilidad y reutilizacin de cdigo
cuando se utilizan correctamente.

Los smbolos deben ser declarados al principio del mdulo, bajo el nombre del mdulo y la directiva opcional
include. El mbito de un smbolo es siempre limitado al mdulo en el que ha sido declarado.
symbol nombr e_de_s mbol o = cdi go
Aqu, nombre_de_smbolo debe ser un identificador vlido que se utilizar por todo el cdigo. El especificador
cdigo puede ser cualquier lnea de cdigo (literales, asignaciones, llamadas de funcin etc.)
symbol MAXALLOWED = 216 ' S mbol o MAXALLOWED par a el val or
numr i co
symbol OUT = PORTA ' S mbol o OUT par a SFR
symbol MYDELAY = Del ay_ms( 762) ' S mbol o MYDELAY par a l l amada de
pr ocedi mi ent o
dim cnt as byte ' Variable cnt
mai n:
i f cnt > MAXALLOWED then ' Pr ogr ama compr ueba si cnt > 216
cnt = 0 ' Si l o es,
OUT. 1 = 0 ' l os si gui ent es t r es comandos
MYDELAY ' se ej ecut ar n

end if
. . . ' Si no l o es, el pr ogr ama cont i na
aqu
Los smbolos no se almacenan en la memoria RAM. El compilador reemplaza los smbolos por las lneas del
cdigo apropiadas asignadas durante la declaracin.
TIPOS DE DATOS EN BASIC
Hay varios tipos de datos que se pueden utilizar en el lenguaje de programacin Basic. La siguiente tabla
muestra el rango de valores que estos datos pueden tener cuando se utilizan en su forma bsica.
TI P O DE
D A TO
DES CRI P CI N
T A MA O ( NME RO D E
B I TS )
R ANGO DE V AL ORES
bit Un bit 1 0 o 1
sbit Un bit 1 0 o 1
byte, char Carcter 8 0 ... 255
short Entero con signo corto

-127 ... 128
word Entero sin signo 16 0 ... 65535
integer Entero con signo 16 -32768 ... 32767
longword Palabra de 32 bits 32 0 ... 4294967295
longint
Palabra de 32 bits
asignada
32 -2147483648 ... 2147483647
float Punto flotante 32
1.17549435082*10
-38
...
6.80564774407*10
38

CONVERSIN DE TIPOS DE DATOS AUTOMTICA
El compilador automticamente realiza la conversin implcita en los siguientes casos:
si una sentencia requiere una expresin del tipo particular, y se utiliza la expresin de tipo
diferente;
si un operador requiere un operando de tipo particular, y se utiliza un operando de tipo
diferente;
si una funcin requiere un parmetro formal de tipo particular, y se le asigna el objeto de
tipo diferente; y
si el resultado de una funcin no corresponde al tipo del valor devuelto de la funcin
declarada.
PROMOCIN
Cuando los operandos son de tipos diferentes, mediante la conversin implcita se realiza la promocin de tipo
ms bajo a tipo ms alto, de la siguiente manera:
bit byte
short, byte/char integer, word, longint, longword
integer, word longint, longword
short, byte/char, integer, word, longint, longword float
RECORTE DE DATOS
En las sentencias de asignacin y en las sentencias que requieren una expresin de tipo particular, el valor
correcto ser almacenado en el destino slo si el resultado de expresin no excede al rango del destino. Al
contrario, si el resultado de la expresin resulta en un tipo ms complejo de lo esperado, los datos que
exceden se recortarn, o sea los bytes ms altos se pierden.
dim i as byte ' Var i abl e i ocupa un sol o byt e de l a memor i a RAM
dim j as word ' Var i abl e j ocupa dos byt es de l a memor i a RAM

. . .
j = $FF0F
i = j ' i se convi er t e en $0F, el byt e ms al t o $FF se pi er de
CONVERSIN DE DATOS EXPLCITA
La conversin explcita se puede ejecutar bajo cualquier expresin en cualquier punto al escribir la palabra
clave de tipo deseado (byte, word, short, integer, longint, float...) delante de la expresin que ser
convertida. La expresin debe estar encerrada entre parntesis. La conversin explcita no puede ser
realizada bajo el operando de la izquierda del operador de asignacin.
a = word( b) ' Conver si n expl ci t a de l a expr esi n b
word( b) = a ' Compi l ador i nf or ma de un er r or
Como no afecta a la representacin binaria de los datos, un caso especial es una conversin entre tipos de
datos con signo y sin signo.
dim a as byte
dim b as short
'...
b = - 1
a = byte( b) ' a is 255, not -1
' El dat o no cambi a su r epr esent aci n bi nar i a %11111111
' per o el compi l ador l a i nt er pr et a de l a maner a di f er ent e
OPERADORES
Un operador es un smbolo que denota una operacin aritmtica, lgica u otra operacin particular. Cada
operacin se realiza sobre uno o ms operandos (variables o constantes) en una expresin. Adems, cada
operador dispone de la ejecucin de prioridad y de la asociatividad. Si una expresin contiene ms de un
operando, los operandos se ejecutarn en orden de su prioridad. Hay 4 categoras de prioridad en Basic. Los
operadores que pertenecen a la misma categora tienen igual prioridad. Si dos o ms operandos tienen el
mismo nivel de prioridad, las operaciones se realizan de izquierda a derecha. Los parntesis se utilizan para
definir la prioridad de la operacin dentro de la expresin. A cada categora se le asigna una de dos reglas de
asociatividad: de izquierda a derecha o de derecha a izquierda. Refirase a la siguiente tabla:
PR I ORI D A D OPER AD OR ES A S OC I A T I V I D A D
OPERADORES ARITMTICOS
Los operadores aritmticos se utilizan para realizar operaciones aritmticas. Estas operaciones se realizan
sobre los operandos numricos y siempre devuelven los resultados numricos. Las operaciones binarias se
realizan sobre dos operandos, mientras que las operaciones unitarias se realizan sobre un operando. Todos
los operadores aritmticos se asocian de izquierda a derecha.
OPE R AD OR OPER AC I N
+ Adicin
- Resta
* Multiplicacin
/ Divisin - punto flotante
div Divisin - redondear
mod Remanente
DIVISIN POR CERO
Si un cero (0) se utiliza explcitamente como el segundo operando en la operacin de divisin (x div 0), el
compilador informa de un error y no generar un cdigo. En caso de una divisin implcita, o sea, en el caso
de que el segundo operando sea un objeto cuyo valor es 0 (x div y, w y=0), el resultado ser indefinido.
OPERADORES RELACIONALES
Los operadores relacionales se utilizan para comparar dos variables y determinar la validez de su relacin. En
mikroBasic, todos los operadores relacionales devuelven 255 si la expresin es evaluada como verdadera
(true). Si una expresin es evaluada como falsa (false), el operador devuelve 0. Lo mismo se aplica a las
expresiones tales como si la expresin es evaluada como verdadera, entonces...
OPER A D OR SI GN I F I C AD O E J EMPL O COND I C I N DE VER AC I D AD
> es mayor que b > a si b es mayor que a
>= es mayor o igual que a >= 5 si a es mayor o igual que 5
< es menor que a < b si a es menor que b
<= es menor o igual que a <= b si a es menor o igual que b
= es igual que a = 6 si a es igual que 6
<> no es igual que a <> b si a no es igual que b
Alta @ not + - de derecha a izquierda

* / div mod and << >> de izquierda a derecha

+ - or xor de izquierda a derecha
Baja = <> < > <= >= de izquierda a derecha
OPERADORES LGICOS DE MANEJO DE BITS
Los operadores lgicos de manejo de bits se realizan sobre los bits de un operando. Se asocian de izquierda
a derecha. La nica excepcin es el complemento not que realiza un desplazamiento de derecha a izquierda.
Los operadores de manejo de bits se enumeran en la siguiente tabla:
OP ER AND O S I GN I F I C AD O EJ EMP L O RE SUL TA D O
<< desplazamiento a la izquierda A = B << 2 B = 11110011 A = 11001100
>> desplazamiento a la derecha A = B >> 3 B = 11110011 A = 00011110
and Y lgico para manejo de bits C = A and B
A=11100011
B=11001100
C = 11000000
or O lgico para manejo de bits C = A or B
A=11100011
B=11001100
C = 11101111
not NO lgico para manejo de bits A = not B B = 11001100 A = 00110011
xor EXOR lgico para manejo de bits C = A xor B
A = 11100011
B = 11001100
C = 00101111
Los operadores de manejo de bits y (and), o (or) y xor realizan las operaciones lgicas sobre los pares de
bits de operandos apropiados. El operador not complementa cada bit de un solo operando.
$1234 and $5678 ' r esul t ado es $1230 por que:
' $1234 : 0001 0010 0011 0100
' $5678 : 0101 0110 0111 1000
' ----------------------------
' y : 0001 0010 0011 0000 ... eso es, $1230
$1234 or $5678 ' equi val e a $567C
$1234 xor $5678 ' equi val e a $444C
not $1234 ' equi val e a $EDCB
OPERADORES DE DESPLAZAMIENTO
Hay dos operadores de desplazamiento de bits en mikroBasic. Son el operador << que realiza un
desplazamiento de bits a la izquierda y el operador >>que realiza un desplazamiento de bits a la derecha. Los
operadores de desplazamiento de bits tienen dos operandos cada uno. El operando izquierdo es un objeto
que se desplaza, mientras que el derecho indica el nmero de posiciones a mover el objeto. Los dos
operandos deben ser de tipo entero. El operando derecho debe ser el valor positivo.
Al desplazar a la izquierda los bits que salen por la izquierda se pierden, mientras que los nuevos bits a la
derecha se rellenan con ceros. Por lo tanto, el desplazamiento del operando que carece de signo a la
izquierda por n posiciones equivale a multiplicarlo por 2
n
si todos los bits descartados son ceros. Lo mismo se
puede aplicar a los operandos con signo si todos los bits descartados son iguales que el signo de bit.
dim numas word ' decl ar ar l a var i abl e numcomo wor d
num= 1 ' asi gnar l e el val or deci mal 1 (00000000 00000001 bin.)
num<< 5 ' equi val e a 32 (00000000 00100000 bin.)
Al desplazar a la derecha los bits que salen por la derecha se pierden, mientras que los nuevos bits a la
izquierda se rellenan con ceros (en caso del operando sin signo) o con el signo de bit (en caso del operando
con signo). El desplazamiento del operando a la derecha por n posiciones equivale a dividirlo por 2
n
.
dim numas integer ' decl ar ar var i abl e numcomo si gned i nt eger
num= 0xFF56 ' asi gnar l e el val or hex FF56 ( 11111111 01010110 bi n. )
num>> 4 ' equi val e a 0xFFF5 ( 11111111 11110101 bi n. )
SENTENCIAS CONDICIONALES
Las condiciones son ingredientes comunes de un programa. Las condiciones permiten ejecutar una o varias
sentencias dependiendo de validez de una expresin. En otras palabras, Si se cumple la condicin (...), se
debe hacer (...). De lo contrario, se debe hacer (...). Una sentencia condicional puede ser seguida por una
sola sentencia o por un bloque de sentencias a ser ejecutadas.
SENTENCIA CONDICIONAL IF
La sintaxis en una forma simple de la sentencia if es:
if expr esi n then
oper aci ones
end if
Si el resultado de la expresin es verdadero (distinto de 0), las operaciones se realizan y el programa contina
con la ejecucin. Si el resultado de la expresin es falso (0), las operaciones no se realizan y el programa
contina inmediatamente con la ejecucin.
El operador if se puede utilizar en combinacin con el operador else:
if expr esi n then
oper aci ones1
else
ot her oper aci ones2
end if
Si el resultado de la expresin es verdadero (distinto de 0), las operaciones1 se realizan. De lo contrario, las
operaciones2 se realizan. Despus de realizar estas operaciones, el programa contina con la ejecucin.
SENTENCIAS IF ANIDADAS
La sentencia if anidada necesita una atencin adicional. Es una sentencia utilizada dentro de otra sentencia if.
Siguiendo la regla, se descomponen empezando por la sentencia if ms anidada, mientras que cada
sentencia else se enlaza a la ms cercana sentencia if disponible a la izquierda.

SENTENCIA CASE STATEMENT
La sentencia select case es una sentencia condicional de ramificacin mltiple. Consiste en una expresin
(condicin) selector y una lista de los valores posibles de la expresin. La sntaxis de la sentencia select case
es la siguiente:
El especificador selector es una expresin evaluada como un valor entero.
Los especificadores value_1...value_n representan los valores posibles del selector. Pueden ser literales,
constantes o expresiones de constantes. Los especificadores statements_1 ...statements_n pueden ser
cualquier sentencia.
La clusula case else es opcional.
Primero se evala el valor de la expresin selector. Despus se compara con todos los valores disponibles. Si
los valores son iguales (selector y uno de valores), se ejecutarn las sentencias que siguen a los valores
iguales y termina la sentencia select case. En el caso de que coincidan los valores mltiples se ejecutarn las
sentencias que siguen a los primeros valores iguales. Si no coincide ningn valor con el selector, se
ejecutarn las sentencias_por_defecto en la clusula case else (si hay alguna).

Ejemplo de la sentencia select case:
select case deci mal _di gi t ' El val or del d gi t o deci mal se est
compr obando
case 0
mask = %01111110 ' Vi sual i zar "0"
case 1
mask = %00110000 ' Vi sual i zar "1"
case 2
mask = %01101101
case 3
mask = %01111001
case 4
mask = %00110011
case 5
mask = %01011011
case 6
mask = %01011111
case 7
mask = %01110000
case 8
mask = %01111111
case 9
mask = %01111011
end select

Esta rutina de programa convierte los dgitos decimales en la combinacin binaria apropiada en el puerto para
visualizarlos en el LED.
BUCLES DE PROGRAMA
Algunas instrucciones (operaciones) deben ejecutarse ms de una vez en el programa. Un conjunto de
comandos que se repiten es denominado un bucle de programa. Cuntas veces se ejecutar, es decir cunto
tiempo el programa se quedar en el bucle, depende de las condiciones de salir del bucle.
BUCLE WHILE
El bucle while aparece cuando el nmero de iteraciones no est especificado. Es necesario comprobar la
condicin de iteracin antes de ejecutar un bucle. En otras palabras, el bucle while se ejecuta una vez
cumplidas todas las condiciones necesarias para su ejecucin. La sintaxis del bucle while se parece a lo
siguiente:
while expr esi n
sent enci as
wend
El especificador sentencias representa un grupo de sentencias que se ejecutan repetidamente hasta que el
valor del especificador expresin que representa una expresin siga siendo verdadero. En otras palabras, el
programa se queda en el bucle hasta que la expresin llegue a ser falsa. El valor de la expresin se
comprueba antes de que se ejecute la siguiente iteracin. Si el valor de la expresin es falso antes de entrar el
bucle, no se ejecuta ninguna iteracin, esto es las sentencias no se ejecutarn nunca. El programa contina
con la ejecucin desde el fin del bucle while (desde las instrucciones que siguen a la instruccin wend).
Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condicin para salir del bucle sigue
sin cambios dentro del bucle.
La ejecucin es simple en este caso ya que el resultado es siempre verdadero (1 siempre ser diferente de 0),
lo que significa que el programa se queda en el bucle:
while 1 ' Se puede escr i bi r ver dader o en vez de 1
. . . ' Las expr esi ones se ej ecut ar n r epet i dament e ( bucl e i nf i ni t o)
. . .
wend
BUCLE FOR
El bucle for se utiliza cuando el nmero de iteraciones est especificado. La sintaxis del bucle for es la
siguiente:
for cont ador = val or _i ni ci al to val or _f i nal [ step val or _de_paso]
sent enci as
next cont ador
La variable contador se incrementa por el valor de paso con cada iteracin de bucle.
El parmetro valor_de_paso es un valor entero opcional, que es igual a 1 si es omitido. Antes de ejecutar la
primera iteracin el contador se pone al valor_inicial y se incrementa hasta llegar o exceder al valor_ final. Con
cada iteracin se ejecutan las sentencias. Las expresiones valor_inicial y valor_final deben ser compatibles
con el contador. El especificador sentencia puede ser cualquier sentencia que no afecta al valor del contador.
El parmetro valor_de_paso puede ser negativo, lo que permite contar atrs.
for k=1 to 5 ' La var i abl e k se i ncr ement a ci nco veces ( de 1 a 5) y
oper at i on ' cada vez si gue ej ecut ndose l a "oper aci n"
. . .
next k
Un conjunto de instrucciones (operacin) se ejecutar cinco veces. Despus, al comprobar que k<5 sea falsa
(despus de 5 iteraciones k=5) y el programa saldr del bucle for.
BUCLE DO
La sentencia do se utiliza cuando el nmero de iteraciones no est especificado. El bucle se ejecuta
repetidamente hasta que la expresin siga siendo verdadero. La sintaxis del bucle do es la siguiente:
do
sent enci as
loop until expr esi n
En este caso, el especificador sentencias representa un grupo de sentencias que se ejecutarn hasta que la
expresin siga siendo verdadera. Las condiciones del bucle se comprueban al final del bucle, as que el bucle
se ejecuta al menos una vez, sin reparar en si la condicin es verdadera o falsa. En el siguiente ejemplo, el
programa se queda en el bucle do hasta que la variable a alcance 1E06 (un milln de iteraciones).
a = 0 ' Est abl ecer el val or i ni ci al
do
a = a+1 ' Oper aci n en mar cha
loop until a <= 1E06 ' Compr obar l a condi ci n

ESCRIBIR CDIGO EN LENGUAJE ENSAMBLADOR



A veces el proceso de escribir un programa en Basic requiere las partes del cdigo escritas en
ensamblador. Esto permite ejecutar algunas partes del programa de una forma definida con
precisin en un perodo de tiempo exacto. Por ejemplo, cuando se necesita que los pulsos muy
cortos (de unos microsegundos) aparezcan peridicamente en un pin del microcontrolador. En
tales casos la solucin ms simple sera escribir el cdigo ensamblador en la parte del programa
que controla la duracin de pulsos.
El comando asm se utiliza para introducir una o ms instrucciones en ensamblador en el programa
escrito en Basic:
asm
i nst r ucci ones en ensambl ador
. . .
end asm
Las instrucciones en ensamblador pueden utilizar los objetos (constantes, variables, rutinas etc.)
anteriormente declarados en Basic. Por supuesto, como el programa entero est escrito en Basic, sus reglas
se aplican al declarar estas constantes y variables. Veamos al siguiente ejemplo:

MATRICES
Una matriz es una lista organizada y limitada de variables del mismo tipo denominadas elementos. Este tipo
es denominado tipo bsico. Cada elemento es referenciado por un ndice nico as que los diferentes
elementos pueden tener el mismo valor. Para declarar una matriz, es necesario especificar el tipo de sus
elementos (denominado tipo de matriz), su nombre y el nmero de sus elementos encerrados entre corchetes:
dim nombr e_de_mat r i z as t i po_de_component e [ nmer o_de_component es]
Los elementos de una matriz se identifican por su posicin. Los ndices van desde 0 (el primer elemento de
una matriz) a N-1 (N es el nmero de elementos contenidos en la matriz). El compilador tiene que saber
cuntas localidades de memoria debe alojar al declarar una matriz. Por eso, el tamao de una matriz no
puede ser variable.
Para explicar con ms claridad, una matriz puede ser pensada como una lista ms o menos larga o corta de
variables del mismo tipo en la que a cada una se le asigna un nmero ordinal que siempre empieza por cero.
A esta matriz se le denomina vector. En la tabla de la derecha se muestra una matriz denominada estante que
contiene 100 elementos.
EL E MENTOS DE L A MA T R I Z CONTEN I D O DE EL E MENT OS
estante[0] 7
estante[1] 23
estante[2] 34
estante[3] 0
estante[4] 0
estante[5] 12
estante[6] 9
... ...
... ...
estante[99] 23
En este caso, el contenido de una variable (elemento) representa un nmero de productos que contiene el
estante. A los elementos se les puede acceder por medio de la indexacin, o sea, al especificar sus ndices
encerrados entre corchetes:
dim shel f as byte [ 100] ' Decl ar ar l a mat r i z "est ant e" con 100
el ement os
shel f [ 4] = 12 ' 12 el ement os est n col ocados en el
est ant e [ 4]
t emp = shel f [ 1] ' Var i abl e est ant e [ 1] se copi a a l a
var i abl e t emp
En las matrices de constantes, a los elementos se les pueden asignar sus contenidos durante la declaracin
de matriz. En el siguiente ejemplo, una constante de matriz denominada CALENDARIO se declara y a cada
elemento se le asigna un nmero especfico de das:
const CALENDARI O as byte [ 12] = ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
El nmero de los valores asignados no debe exceder la longitud de la matriz especificada, solo puede ser
menor. En este caso, a los elementos de sobra se les asignarn ceros.
SENTENCIA GOTO
La sentencia goto le permite hacer un salto absoluto a otro punto en el programa. Esta caracterstica se debe
utilizar con precaucin ya que su ejecucin puede causar un salto incondicional sin hacer caso a todos los
tipos de limitaciones de anidacin. El punto destino es identificado por una etiqueta, utilizada como un
argumento para la sentencia goto. Una etiqueta consiste en un identificador vlido seguido por dos puntos (:).
La sintaxis de la sentencia goto es:
goto: nombr e_de_et i quet a
La sentencia ejecuta un salto al especificador nombre_de_etiqueta que representa una etiqueta. La sentencia
goto puede preceder o seguir a una etiqueta. Por lo tanto, no es posible hacer un salto hacia o desde un
procedimiento o funcin. La sentencia goto se puede utilizar para salir de cualquier nivel de las estructuras
anidadas. No es recomendable saltar a bucles u otras sentencias estructuradas, ya que se pueden producir
resultados inesperados.
SENTENCIA GOSUB
Una subrutina es una parte del cdigo dentro de un programa largo ejecutado a peticin. Realiza una tarea
especfica, es relativamente independiente del resto del cdigo. El intrprete del compilador salta a la
subrutina, la ejecuta y vuelve al programa principal. Las palabras clave gosub y return se utilizan en Basic
para denotar el inicio y el final de la subrutina:
gosub nombr e_de_et i quet a
. . .
. . .
. . .
nombr e_de_et i quet a:
. . .
r et ur n
Las subrutinas se consideran difciles de mantener, leer y manejar, igual que la sentencia goto. Es
recomendable utilizarla solo si no hay otra solucin.
ACCESO A LOS BITS INDIVIDUALES
El compilador mikroBasic PRO for PIC instalado en la PC, incluye una lista de los microcontroladores PIC
soportados, con todos los registros, sus direcciones exactas y los nombres de bits. El compilador le permite
acceder a los bits individuales de estos registros por sus nombres, sin especificar sus posiciones (el
compilador ya las conoce). Hay muchas formas de acceder y modificar a un bit individual dentro de un
registro. Por ejemplo, vamos a acceder al bit GIE (Global Interrupt Enable - Habilitacin global de
interrupciones) por ejemplo. Es el sptimo bit del registro INTCON. A este bit se le puede acceder por su
nombre, al escribir lo siguiente:
I NTCON. GI E = 0 ' Poner a cer o el bi t GI E
Para denotar la posicin de bit en un registro en lugar de un nombre de bit se pueden utilizar una variable, una
constante, una llamada a funcin o una expresin encerrada entre parntesis. Adems, para acceder a los
bits individuales se utilizan las constantes globales predefinidas B0, B1, , B7, o 0, 1, 7, donde 7 se
considera el bit ms significante.
I NTCON. B0 = 0 ' Poner a cer o el bi t 0 del r egi st r o I NTCON
ADCON0. 5 = 1 ' Poner a uno el bi t 5 del r egi st r o ADCON0
i = 5
STATUS. ( i +1) = 1 ' Poner a uno el bi t 6 del r egi st r o STATUS
Por fin, a un bit deseado se le puede acceder al utilizar un nombre alias. En este caso, es el GIE_bit:
GI E_bi t = 1 ' Poner a uno el bi t GI E
TIPO SBIT
El compilador mikroBasic PRO for PIC tiene un tipo de dato sbit. Esto es un tipo de dato ms corto que se
refiere a un solo bit. Si al tipo sbit se le asigna una variable, el bit apropiado de un registro ser cambiado al
cambiar esta variable sin especificar el nombre y la localidad del registro. La variable sbit se comportar como
un puntero. Para declarar la variable sbit, basta con escribir:
dim Nombr e_de_bi t as sbit at Nombr e_de_r egi st r o. Posi ci n_de_bi t
program MyPr ogr am' Mdul o pr i nci pal
. . .
dim Out put 1 as sbit at PORTB. 0 ' Var i abl e Out put 1 es de t i po sbi t
. . .
Out put 1 = 1 ' Pi n del puer t o PORTB. 0 est a uno ( 5V)
Si una variable de tipo sbit no est definida en el mismo mdulo donde se utiliza, la palabra clave external
debe ser utilizada. Adems, el especificador de memoria apropiado se debe aadir:
dim nombr e_de_bi t as sbit sfr external

module MyModul e ' Est o no es el mdul o pr i nci pal y el bi t Out put 1
. . . ' no est def i ni do aqu
dim Out put 1 as sbit sfr external
. . .
Out put 1 = 1 ' Pi n PORTB. 0 ( def i ni do en el ej empl o ant er i or como
Out put 1) est a uno ( 5V)
TIPO BIT
El compilador mikroBasic PRO for PIC proporciona un tipo de dato bit que se puede utilizar para declarar las
variables.
dim bf as bi t
A diferencia de variables de tipo sbit, solo el nombre de bit est declarado aqu, mientras que el compilador
almacena una variable bit en algunos de los registros libres de la RAM. Como se puede ver, no es necesario
especificar un bit de algn registro especfico. La localidad exacta de la variable de tipo bit es desconocida al
usuario.
Los tipos Bit y sbit se utilizan con los siguientes limitaciones:
No pueden ser utilizados para las listas de argumentos y como valores devueltos de
funciones
No pueden ser utilizados como un miembro de estructuras
No pueden ser utilizados como elementos de matrices
No pueden ser inicializados
No se puede apuntar a ellos
Sus direcciones no se pueden leer, por eso el operador unitario @ no se puede utilizar con
variable de este tipo
dim pt r as ^bi t ' invlido
dim ar r as array[ 5] of bi t ' invlido
FUNCIONES Y PROCEDIMIENTOS
Las funciones y los procedimientos, denominados bajo el nombre comn de rutinas, son subprogramas
(bloques de sentencias autnomos) que ejecutan ciertas tareas a base de un nmero de los parmetros de
entrada. Las funciones devuelven un valor despus de la ejecucin, mientras que los procedimientos no
devuelven un valor.
PROCEDIMIENTOS
Un procedimiento es un bloque de cdigo nombrado, o sea, una subrutina con algunas caractersticas
adicionales. Por ejemplo, puede aceptar parmetros. Los procedimientos se declaran de la siguiente manera:
sub procedure nombr e_de_pr ocedi mi ent o ( l i st a_de_par met r os)
[ decl ar aci ones l ocal es ]
cuer po de pr ocedi mi ent o
end sub
El especificador nombre_de_procedimiento representa un nombre de procedimiento y
debe ser un indentificador vlido.
La lista_ de_parmetros entre parntesis representa una lista de parmetros formales
declarados de manera similar a variables. En mikroBasic PRO for PIC, los parmetros se le
pasan a un procedimiento por valor. Para pasar los parmetros por direccin, es necesario
aadir la palabra clave byref al principio de la declaracin de los parmetros.
Las declaraciones locales son declaraciones opcionales de variables y constantes que se
refieren slamente al procedimiento dado.
El cuerpo de procedimiento es una secuencia de sentencias que se ejecutarn despus
de llamar al procedimiento.
Una llamada a procedimiento se realiza al especificar su nombre seguido por los parmetros actuales
colocados en el mismo orden que los parmetros formales correspondientes. Despus de llamar a
procedimiento, todos los parmetros formales se crean como los objetos locales inicializados por los valores
de los argumentos actuales.
' Aadi r dos nmer os
sub procedure add ( dim byref sumas word, dim x, y as byte)
sum= x + y ' aadi r l os nmer os x e y y al macenar el r esul t ado en l a
var i abl e sum
end sub ' f i n del subpr ocedi mi ent o
Ahora, podemos llamar al procedimiento add para hacer clculo del peso total de una carga, por ejemplo:
add ( peso_br ut o, peso_net o, peso_t ar a)
FUNCIONES
Las funciones deben estar declaradas apropiadamente para ser interpretadas correctamente durante el
proceso de la compilacin.
sub function nombr e_de_f unci n ( l i st a_de_par met r os) as val or _devuel t o
[ decl ar aci ones l ocal es ]
cuer po de f unci n
end sub
Cada declaracin contiene los siguientes elementos:
Nombre_de_funcin es un identificador utilizado para llamar a funcin (nombre_de_funcin
en el ejemplo)
Tipo de resultado (valor devuelto) es un tipo de dato de los datos devueltos (tipo_devuelto
en el ejemplo)
Declaracin de los parmetros: cada parmetro consiste en una variable, constante,
puntero o matriz precedidos por su tipo de dato especificado similar a una declaracin de
variable regular (lista_de_parmetros en este ejemplo). Se utilizan para pasar la
informacin de la funcin al llamarla.
Declaraciones locales son declaraciones opcionales de variables y constantes que se
refieren solamente a la funcin dada.
Cuerpo de funcin es una secuencia de sentencias que sern ejecutadas despus de
llamar a la funcin.
Aqu est un ejemplo de cmo definir y utilizar la funcin power:
' f unci n que hace cl cul o de xn basado en l os par met r os de ent r ada x y
n ( n > 0)
sub function power ( dim x, n as byte) as longint ' x y n son byt es,
r esul t ado es l ongi nt
dim i as byte ' i es un byt e
r esul t = 1 ' r esul t ado = 1 si n = 0
if n > 0 then
for i = 1 to n
r esul t = r esul t *x
next i
end if
end sub
Ahora, podemos llamar a la funcin power para hacer clculo de 3
12
por ejemplo:
t mp = power ( 3, 12) ' Hacer cl cul o de 3*12
LIBRERAS DE FUNCIONES Y PROCEDIMIENTOS
Las declaraciones de todas las funciones y procedimientos utilizados en Basic se almacenan normalmente en
los ficheros de mdulo especial y se les denominan libreras. Antes de utilizar una librera en el programa, es
necesario especificar el mdulo apropiado por medio de la clusula include al principio de programa. Esto es
una regla general. Si escribe un programa en el compilador mikroBasic PRO for PIC basta con marcar la
librera deseada en la lista y el mdulo apropiado ser automticamente incluido en el proyecto. El compilador
ya contiene un gran nmero de estas libreras. Si el compilador encuentra una funcin o procedimiento
desconocidos durante la ejecucin de programa, primero va a buscar su declaracin en las libreras
anteriormente marcadas.
RUTINAS INTEGRADAS EN EL COMPILADOR MIKROBASIC PRO FOR PIC
Aparte de las libreras de funciones y procedimientos, el compilador mikroBasic PRO for PIC proporciona un
conjunto de las funciones integradas y tiles:
Lo
Hi
Higher
Highest
Inc
Dec
Chr
Ord
SetBit
ClearBit
TestBit
Delay_us
Delay_ms
Vdelay_Advanded_ms
Vdelay_ms
Delay_Cyc
Clock_KHz
Clock_MHz
Reset
ClrWdt
DisableContextSaving
SetFuncCall
SetOrg
GetDateTime
GetVersion
Las rutinas Delay_us y Delay_ms se generan en la parte del programa de la que se llaman.
Vdelay_ms, Delay_Cyc y Get_Fosc_kHz son las rutinas actuales en Basic. Sus fuentes se pueden encontrar
en el archivo Delays.mbas ubicado en el archivo uses del compilador.
PREPROCESADOR
Un preprocesador es una parte integral de cada compilador. Su funcin es de reconocer y ejecutar las
instrucciones del preprocesador. Qu son instrucciones del preprocesador? Son instrucciones especiales
que no pertenecen al lenguaje Basic, sino que estn integrados en el compilador. Antes de compilar, el
compilador inicia al preprocesador que pasa por el programa en bsqueda de estas instrucciones. Si
encuentra una, el preprocesador las sustituir por otro texto que, dependiendo del tipo de comando, puede ser
un archivo (comando include) o slo una corta sentencia de caracteres (comando define). Entonces, el
proceso de compilar puede empezar. Las instrucciones pueden estar en cualquier parte del programa fuente y
se refieren solamente a la parte del programa en la que aparecen hasta el final del programa.
DIRECTIVA DEL PREPROCESADOR INCLUDE
Muchos programas repiten con frecuencia el mismo conjunto de comandos un par de veces. Para escribir un
programa ms rpidamente, estos comandos y declaraciones se agrupan normalmente en los mdulos
particulares que se pueden incluir en el programa con facilidad por medio de la directiva include. Para decir
con ms precisin, la directiva include importa el texto del otro documento en el programa, sea un conjunto de
comandos o bien un conjunto de comentarios etc.

COMPILACIN CONDICIONAL
Las directivas de la compilacin condicional se utilizan generalmente para facilitar la modificacin y
compilacin de los programas fuente para los diferentes microcontroladores. El compilador mikroBasic PRO
for PIC soporta a la compilacin condicional. Todas las directivas de la compilacin condicional deben
terminar dentro del mdulo en el que han empezado.
DIRECTIVAS #IF, #ELIF, #ELSE, Y #ENDIF
Las directivas condicionales #if, #elif, #else y #endif se ejecutan de manera similar a las sentencias
condicionales comunes en Basic. Si una expresin escrita despus de #if tiene un valor distinto de cero, las
lneas de programa que siguen a la directiva #if sern interpretadas como un cdigo de programa vlido y
compiladas en cdigo hex. La sintaxis es la siguiente:
#i f const ant _expr essi on_1 ' Si expr esi n_de_const ant e_1 no es
cer o,
<sect i on_1> ' secci n_1 ser compi l ada
[ #el i f const ant _expr essi on_2 ' Si expr esi n_de_const ant e_2 no es
cer o,
<sect i on_2>] ' secci n_2 ser compi l ada
. . .
[ #el i f const ant _expr essi on_n ' Si expr esi n_de_const ant e_n no es
cer o,
<sect i on_n>] ' secci n_n ser compi l ada
[ #el se ' Si no se compi l a ni nguna de l as
secci ones ant er i or es
<f i nal _sect i on>] ' secci n_f i nal ser compi l ada
#endi f ' Fi nal de l a di r ect i va #i f
Cada directiva #if en un archivo fuente debe terminar por una directiva #endif de cierre
correspondiente. Entre las directivas #if y #endif puede haber cualquier nmero de las
directivas #elif, pero slo se permite una directiva #else. Si est presente la directiva #else,
debe ser la ltima directiva antes de la directiva #endif.
Seccin puede ser cualquier cdigo de programa reconocido por el compilador o
preprocesador. El preprocesador selecciona una seccin al evaluar la
expresin_de_constante que sigue a cada directiva #if o #elif hasta encontrar una
expresin_de_constante verdadera (distinta de cero).
Si todas las expresiones-constantes son evaluadas como falsas o no aparecen ninguna
directiva #elif, el preprocesador selecciona la seccin_final que sigue a la clusula #else. Si
se omite la clusula #else y todas las expresiones_constantes en el bloque #if son
evaluadas como falsas, no se seleccionar ninguna seccin para un procesamiento
posterior.
Por ltimo, resulta que solamente una seccin del cdigo ser compilada, aunque est vaca.
PUNTEROS
Como ya hemos mencionado, a cada objeto en el programa (variable, procedimiento, subrutina etc.) se le
asigna una direccin de memoria particular. Al declarar una variable en el programa el compilador le asigna
automticamente una localidad de la memoria RAM libre. Durante la programacin, estas direcciones no son
visibles para los programadores. La posibilidad de acceder a los diferentes objetos por sus nombres
(identificadores) en vez de por sus direcciones es una de las ventajas principales de los lenguajes de
programacin de alto nivel. En realidad, es ms fcil manejar las palabras (nombres) que los nmeros.
Adems, el compilador se encarga de los objetos asociados y de sus direcciones. Direccionar los objetos al
especificar sus nombres es denominado direccionamiento directo.

Sin embargo, a veces se necesita utilizar las direcciones de localidades de memoria. En este caso se utilizan
los punteros - variables que almacenan la direccin de memoria de un objeto. Entonces, es posible acceder a
los objetos que utilizan solamente los punteros. Por eso esta forma de direccionar es denominada
direccionamiento indirecto.
Antes de utilizar un puntero es necesario declarar su tipo de datos. Solo hay que anteponer el signo de
intercalacin (^) al tipo.
dim poi nt er _p as ^word ' punt er o_p apunt a al dat o de t i po wor d
Se le recomienda almacenar una varible en una localidad de memoria RAM especfica, luego se debe utilizar
la directiva absolute en el programa de la siguiente manera:
dim var i abl e_a as word absolute 12 ' var i abl e_a ocupar una pal abr a

' ( 16 bi t s) en l a
di r ecci n 12
Para acceder a los datos en la localidad de memoria del puntero, necesita posponer el signo de la
intercalacin (^) al nombre del puntero. Veamos el ejemplo de la declaracin del anteriormente mencionado
puntero puntero_p , que apunta a la palabra (en este caso, es anteriormente definida variable_a almacenada
en la direccin 12 en la RAM). A la variable apuntada variable_a se le asigna el valor 26:
dim poi nt er _p as ^word ' Punt er o_p a punt a al dat o de t i po wor d
. . .
. . .
poi nt er _p = 12 ' Punt er o_p apunt a a l a di r ecci n de memor i a 12
. . .
punt er o_p^ = 26 ' Var i abl e a en l a l ocal i dad de memor i a 12 t i ene
val or 2
' Si mi l ar a l a di r ect i va absol ut e ut i l i zada par a l as var i abl es, l a
' di r ect i va or g especi f i ca l a di r ecci n i ni ci al de una r ut i na en l a
' memor i a ROM. Se aade a l a decl ar aci n de l a r ut i na. Por ej empl o:
sub procedure pr oc( dim par as word) or g 0x200 ' El pr ocedi mi ent o
empezar
. . . ' en l a di r ecci n 0x200
end sub
En este caso, al puntero puntero_p se le asigna el valor 12 (puntero_p =12), lo que significa que la direccin
de memoria 12 est especificada.

Si quiere cambiar el valor de una variable apuntada, basta con cambiar el valor del puntero y posponer el
signo de intercalacin (^) al valor. Veamos la figura a la derecha: a la variable variable_a en la direccin 12 se
le asigna el valor 26 por medio del puntero puntero_p.
Los punteros pueden apuntar a los datos almacenados en cualquier espacio de memoria disponible y pueden
residir en cualquier espacio de memoria disponible menos en el espacio de memoria de programa (ROM).
@ OPERADOR
El operador @ devuelve la direccin de un objeto, o sea, crea un puntero sobre su operando. Las siguientes
reglas se aplican al operando @:
Si X es una variable, @X devuelve la direccin de X.
Si F es una rutina (funcin o procedimiento), @F crea un puntero a F.
dim t emp as word
pt r _b as ^byte
pt r _ar r as ^byte[ 10]
ar r as byte[ 10]
mai n:
pt r _b = @ar r ' oper ador @devol ver ^byte
t emp = @ar r ' oper ador @devol ver ^byte
pt r _ar r = @ar r ' oper ador @devol ver ^byte[10]
end.
Si la variable X es de tipo matriz, el operador @ devolver el puntero a su primer elemento bsico, excepto en
el caso de que la parte izquierda de la expresin en la que se utiliza X sea el puntero a matriz. En este caso,
el operador @ devolver el puntero a matriz, y no a su primer elemento bsico.
Estructura de programa en mikroBasic PRO for PIC:
1. Cada programa normalmente empieza con un comentario que proporciona informacin sobre
el propsito del programa, fecha de programa, programador, versin, cambios a la versin
anterior etc. Estos comentarios (cabecera) no son obligatorios, pero es una buena costumbre
escribirlos y tenerlos en el programa.
2. Cada programa empieza con una directiva de programa seguida por el nombre de programa.
3. Si el programa contiene otros mdulos, aparte del mdulo principal, sus nombres se deben
especificar al utilizar la directiva include (una directiva inlcude para cada mdulo). Por
consiguiente, si el compilador durante la compilacin del mdulo principal llega a un objeto
que no es declarado (funcin, variable etc.), primero va a buscar su declaracin dentro de los
mdulos declarados. Si no encuentra la declaracin apropiada, el compilador informar de
error.
4. La directiva include (si hay alguna) es seguida por la parte de cdigo que sirve de declarar
variables, constantes, procedimientos, subprogramas, funciones y otros objetos que se
utilizarn ms tarde en el programa. Estas declaraciones se utilizan para reservar los
registros de la memoria RAM para almacenar los datos as como para ensear al compilador
cmo ejecutar una funcin o un procedimiento. Por ejemplo, un dato de tipo byte ocupa un
solo registro, mientras que un dato de tipo float ocupa cuatro registros.
5. El programa principal empieza con la directiva mai n: (siempre seguida por dos puntos).
Tambin es llamada cuerpo de programa.
6. Cada programa termina con la directiva end. (siempre seguida por un punto).
2.3 COMPILADOR MIKROBASIC PRO FOR PIC
Todo lo que usted ha ledo hasta ahora sobre la programacin en Basic es slo teora. Es til saberlo, pero no
se olvide de que este lenguaje de programacin no est tan relacionado con algo concreto y tangible. Podr
experimentar muchos problemas con los nombres exactos de los registros, sus direcciones, nombres de los
bits de control particulares, y muchos ms al empezar a escribir su primer programa en Basic. El punto es que
usted necesita ms que una teora para que el microcontrolador haga algo til.
Teniendo en cuenta de que Es mejor prevenir que curar, hay que avisarle de todas las cosas por resolver
antes de que empiece a escribir un programa para el microcontrolador. Antes que nada, necesita un programa
instalado en la PC que eniende el lenguaje de programacin a utilizar y que proporciona un entorno de
trabajo apropiado. No hay un compilador apropiado para un tipo de compilador, tampoco para todos los
microcontroladores. Normalmente se utiliza un software para programar los similares microcontroladores de
un fabricante.
En las secciones anteriores hemos presentado el lenguaje mikroBasic, especialmente diseado para
programar los PIC. Ahora, cuando sabe lo suficiente sobre ese lenguaje, es hora de presentar el software que
utilizar para desarrollar y editar los proyectos. Este software se le denomina Entorno de desarrollo integrado
(Integrated Developement Environment - IDE) e incluye todas las herramientas necesarias para desarrollar los
proyectos (editor, depurador etc.).
Como implica su nombre, mikroBasic PRO for PIC est pensado para escribir los programas para los
microcontroladores PIC en Basic. Este compilador contiene las informaciones de arquitectura de los
microcontroladores PIC (registros, sus direcciones exactas, mdulos de memoria, funcionamiento de sus
mdulos, juego de instrucciones, disposicin de pines etc.). Adems incluye las herramientas apropiadas
para programar los microcontroladores PIC. Lo primero que tiene que hacer al iniciar el compilador es
seleccionar el chip y frecuencia de operacin de la lista. Esto no es un final, sino un comienzo. Por fin puede
empezar a escribir el programa en Basic.
El proceso de crear y ejecutar un proyecto contiene los siguientes pasos:
1. Crear un proyecto (nombre de proyecto, configuracin de proyecto, dependencias entre
archivos);
2. Editar un programa;
3. Compilar el programa y correccin de errores;
4. Depurar (ejecutar el programa paso a paso para asegurarse de que se ejecutan las
operaciones deseadas);
5. Programar un microcontrolador (cargar el archivo .hex generado por el compilador en el
microcontrolador utilizando el programador PICflash).
INSTALAR MIKROBASIC PRO FOR PIC
La instalacin del mikroBasic PRO for PIC es similar a la instalacin de cualquier programa en Windows. Todo
el procedimiento se lleva a cabo por medio de los wizards (asistentes de instalacin):

Basta con seguir las instrucciones y pulsar sobre Next, OK, Next, Next... En general, es el mismo
procedimiento menos la ltima opcin: 'Do you want to install PICFLASH v7.11 programmer?'. Para qu sirve
este software? Como ya hemos dicho, el compilador compila un programa escrito en Basic en cdigo hex. El
siguiente paso es cargar ese cdigo en el microcontrolador. Por eso es necesario instalar el programador
PICFLASH. Hgalo! Una vez ms: Next, OK, Next, Next...

Una vez completada la instalacin del PICFLASH, el sistema operativo le preguntar a instalar otro programa
similar. Es un software para programar una familia de los microcontroladores PIC que funcionan en modo de
bajo consumo (3.3 V). Salte este paso.
El ltimo paso - la instalacin del controlador (driver)!

Un controlador es un programa que permite al sistema operativo comunicarse con un perifrico. En este caso,
este dispositivo es el programador (hardware) del sistema de desarrollo. Lo necesita seguramente. Pulse
sobre Yes.

El controlador a instalar depende del sistema operativo utilizado. En este caso, el ordenador utiliza el sistema
operativo de 32 bits Windows XP. Seleccione la carpeta Win 2000, XP, 2003 32-bit que contiene el controlador
apropiado e inicie la instalacin.
Otra vez, Next, OK, Next, Next...Bueno, todo est instalado para iniciar a programar!

IDE DEL MIKROBASIC PRO FOR PIC
Al iniciar el IDE del compilador mikroBasic PRO for PIC por primera vez, aparecer una ventana como se
muestra a continuacin:

Desgraciadamente, una descripcin detallada de todas las opciones disponibles de este IDE nos tomara
mucho tiempo. Por eso vamos a describir slo lo ms importante del compilador mikroBasic PRO for PIC. De
todos modos, para obtener ms informacin presione el botn de Ayuda (Help) [F1]. En el captulo cuatro se
presentan varios ejemplos y se da una explicacin detallada de cmo crear un nuevo proyecto y escribir un
programa.
PROJECT MANAGER (Administrador de proyecto)

Un programa escrito en el compilador mikroBasic PRO for PIC no es un archivo autnomo, sino
que forma parte de un proyecto que incluye un cdigo hex, un cdigo ensamblador y otros
archivos. Algunos de ellos se requieren para compilar el programa, mientras que otros se crean
durante el proceso de compilacin. La ventana Project Manager le permite manejar todos los
ficheros del proyecto. Basta con pulsar con el botn derecho del ratn sobre una carpeta y
seleccionar la opcin que necesita para su proyecto.
LIBRARY MANAGER

Las libreras contienen un gran nmero de funciones listas para ser utilizadas. Las libreras en
mikroBasic proporcionan muchas facilidades para escribir programas para los microcontroladores
PIC. El compilador debe conocer todas las dependencias del archivo fuente de mikroBasic para
compilarlo apropiadamente. Abra la ventana Library Manager, y marque las que quiere utilizar en el
programa. Al marcar una librera, se aade automticamente al proyecto y se enlaza durante el
proceso de la compilacin. As, no necesita incluir las libreras manualmente en sus archivos del
cdigo fuente por medio de la directiva del preprocesador #include. Por ejemplo, si su programa
utiliza un LCD no hace falta escribir nuevas funciones ya que al seleccionar la librera Lcd, usted
podr utilizar funciones listas para ser utilizadas de la librera Lcd en su programa. Si esta librera
no est seleccionada en la ventana Library Manager, cada vez que intente utilizar una funcin de la
librera LCD, el compilador le informar de un error. Una descripcin de cada librera est
disponible al pulsar con el botn derecho del ratn sobre su nombre y seleccionar la opcin Help.
CODE EXPLORER (Explorador de cdigo)

La ventana Code Explorer le permite localizar funciones y procedimientos dentro de los programas
largos. Por ejemplo, si usted busca una funcin utilizada en el programa, basta con pulsar dos
veces sobre su nombre en esta ventana, y el cursor estar automticamente posicionado en la
lnea apropiada en el programa.
PROJECT SETTINGS (Configuracin de proyectos)

Al compilar un proyecto, el compilador genera el archivo .hex que se cargar en el
microcontrolador. Estos archivos sern diferentes ya que depende del tipo del microcontrolador as
como del propsito de la compilacin. Por esta razn es necesario ajustar algunos parmetros de
proyectos utilizando la ventana Project Settings.
Device (dispositivo): Al seleccionar el tipo del microcontrolador a utilizar permite al compilador
extraer el archivo de definicin asociado. El archivo de definicin de un microcontrolador contiene
la informacin especfica de sus registros SFR, de sus direcciones de memoria y algunas variables
de programacin especficas a ese tipo del microcontrolador. Es obligatorio crear un archivo .hex
compatible.
Oscillator (oscilador): Se debe especificar la velocidad de operacin del microcontrolador. Por
supuesto, este valor depende del oscilador utilizado. El compilador la necesita para compilar
rutinas, lo que requiere informacin del tiempo (por ejemplo, la funcin Delay_ms). Ms tarde, el
programador necesitar esta informacin tambin. La velocidad de operacin se configura de
modo que permita al oscilador interno del microcontrolador funcionar a una frecuencia
seleccionada.
Build/Debugger Type: Todo el proceso de compilar (building) est compuesto por anlisis sintctico
(parsing), compilar, enlazar (linking) y generar los archivos .hex. El tipo de compilacin le permite ajustar el
modo de compilacin. Dependiendo del modo seleccionado, difieren los archivos generados a cargar en el
microcontrolador.
Build type - release: Al elegir esta opcin, el compilador no puede afectar ms a la ejecucin de programa
despus de la compilacin. El programa a cargar en el microcontrolador no ser modificado de ninguna
manera.
Build type - ICD debug: El archivo .hex generado contiene los datos adicionales que permiten el
funcionamiento del depurador. Una vez completado el proceso de la compilacin y cargado el programa en la
memoria del microcontrolador, el compilador se queda conectado al microcontrolador por medio del cable
USB y el programador, y todava puede afectar a su funcionamiento. Una herramienta denominada mikroICD
(Depurador en circuito - In Circuit Debugger) permite ejecutar el programa paso a paso y proporcionar un
acceso al contenido actual de todos los registros del microcontrolador.
El simulador software se puede utilizar en ambos modos de compilacin para el propsito de depurar. Le
permite simular su programa al reproducir el comportamiento del microcontrolador. El simulador no utiliza los
dispositivos reales para simular el funcionamiento del microcontrolador, as que algunas operaciones no
pueden ser reproducidas (por ejemplo, interrupcin). De todos modos, resulta ms rpido depurar un
programa por medio de un simulador. Adems, no se requiere ningn dispositivo destino.
Note que es posible modificar cualquier configuracin en cualquier momento mientras se edita el programa.
No se olvide de recompilar y reprogramar su dispositivo despus de modificar una configuracin.
EDITAR Y COMPILAR PROGRAMAS
CODE EDITOR (Editor de cdigo)
El proceso de escribir y editar programas se debe realizar dentro de la ventana principal del IDE denominada
Code Editor. Un gran nmero de opciones utilizadas para configurar sus funciones y el diseo se encuentran
en el men Tools/Options [F12]. Al escribir el programa no se olvide de los comentarios. Los comentarios son
muy importantes para depurar y mejorar el programa. Adems, aunque el compilador no tenga las
restricciones de formateo, siempre debe seguir a las mismas reglas de editar (como en los ejemplos
proporcionados en este libro). Como no hay limitaciones de extensin, no vacile en utilizar los espacios en
blanco para hacer su cdigo ms legible.

Al escribir un programa, compile su cdigo de forma regular con el propsito de corregir cunto ms errores
de sintaxis. Asimismo usted puede compilar su programa cada vez que se complete la redaccin de una
nueva funcin as como probar su comportamiento al utilizar modo de depuracin. De este modo, resulta ms
fcil solucionar los errores de programa. De lo contrario, usted tendr que editar el programa entero.
COMPILAR Y SOLUCIONAR ERRORES
Para compilar su cdigo, pulse sobre la opcin Build en el men Project. En realidad, el proyecto entero se ha
compilado, y si la compilacin se ha realizado con xito, se generarn los archivos de salida (asm, .hex etc.).
Una compilacin se ha realizado con xito si no se ha encontrado ningn error. Durante el proceso de
compilacin se generan muchos mensajes que se visualizan en la ventana Messages. Estos mensajes
consisten en informacin, advertencia y errores. Cada error encontrado se asocia con su lnea de programa y
su descripcin. Como un error en su cdigo puede generar mucho ms errores, simplemente debe intentar
solucionar el primer error en la lista y despus recompile su programa. En otras palabras, es recomendable
solucionar los errores uno a uno.

En el ejemplo anterior el programa informa de un error de sintaxis en la lnea 80. La compilacin le permite
corregir su programa por medio de solucionar todos los errores en mikroBasic. Cuando todos los errores se
solucionen, su programa est listo para ser cargado en el microcontrolador. De todas formas, su tarea todava
no est terminada, porque an no sabe si su programa se comporta como se esperaba o no.
DEPURAR EL PROGRAMA
Como ya hemos visto, hay dos modos de depurar: un depurador software que simula el funcionamiento del
microcontrolador (modo por defecto) y depurador hardware (mikroICD) que lee directamente el contenido de la
memoria del microcontrolador. El procedimiento de depuracin es el mismo sin reparar en el modo elegido. En
caso de elegir la opcin ICD debug, hay que cargar el programa en el microcontrolador antes de depurarlo. La
depuracin es un paso muy importante ya que permite probar el programa despus de una compilacin
realizada con xito, o solucionar los errores descubiertos mientras se ejecuta el programa.
Para iniciar la depuracin, pulse sobre la opcin Start debugger del men Run. El editor del cdigo ser
ligeramente modificado automticamente y aparecer una ventana denominada Watch Values. El principio de
depuracin se basa en ejecutar el programa paso a paso y monitorear el contenido de los registros y los
valores de las variables. De este modo, es posible comprobar el resultado de un clculo y ver si algo
inesperado ha ocurrido. Al ejecutar el programa paso a paso, podr localizar los problemas con facilidad.
Durante una depuracin el programa ser modificado, por lo que usted siempre debe recompilar el programa
despus de cada correccin, y reiniciar el depurador para comprobar qu ha sido modificado.
SIMULADOR SOFTWARE
Si quiere ser un programador y dedicarse a programar los microcontroladores, tenga en cuenta de que los
programas nunca funcionan al primer intento. Por eso, empiece a funcionar un simulador. El simulador es una
parte integral del compilador utilizado para simular el funcionamiento del microcontrolador.

Antes de empezar a utilizar el simulador, seleccione el modo de funcionamiento en la ventana
Project Settings (Build type - release), compile el programa y pulse sobre la opcin Run /Start
Debugger.
El compilador se pone automticamente en el modo de simulacin. En este modo se monitorea el
estado de todos los bits de registros y se le permite ejecutar el programa paso a paso durante el
monitoreo del funcionamiento del microcontrolador en la pantalla.
Hay varios iconos, utilizados para el funcionamiento del simulador, que aparecern en la barra de
herramientas cuando el compilador entre en este modo.

Estos iconos tienen el siguiente significado:
Step Into: Ejecuta una sola instruccin. Cuando la instruccin es una llamada a una
subrutina, el depurador har un salto a la subrutina y se detendr despus de ejecutar la
primera instruccin dentro de la subrutina.
Step Over: Se ejecuta una sola instruccin. Cuando la instruccin es una llamada a una
subrutina, el depurador no har un salto a la subrutina, sino que se ejecutar toda la
subrutina. El depurador se detiene a la primera instruccin despus de la llamada a la
subrutina. Parece como si se saltara una lnea de programa aunque se ha ejecutado toda
la subrutina. El estado de todos los registros ser cambiado. Este comando se ejecuta
cuando es necesario acelerar la ejecucin de los bucles de programa largos.
Run To Cursor: El programa se ejecuta hasta la lnea en la que se encuentre el cursor.
Step out: Se ejecutan las dems instrucciones dentro de la rutina. El depurador se detiene
inmediatamente al salir de la subrutina.
Los puntos de ruptura hacen el proceso de depurar los programas de una manera ms eficiente, puesto que
permiten ejecutar el programa a toda velocidad y detenerlo automticamente en una lnea especfica (punto
de ruptura). Eso resulta muy til, permitindole comprobar slo las partes crticas del programa y no perder el
tiempo probando todo el programa lnea a lnea. Para aadir o quitar un punto de ruptura basta con pulsar
sobre la lnea apropiada en el lado izquierdo del editor del cdigo, o presionar [F5]. Una pequea ventana
denominada Breakpoints muestra dnde estn los puntos de ruptura. Note que las lneas designadas como
puntos de ruptura estn marcadas en rojo.

La lnea que se est ejecutando actualmente est marcada en azul. Es posible leer el contenido de registros y
variables seleccionados en la ventana Watch Values en cualquier momento. Para saltar directamente a los
puntos de ruptura, utilice el comando Run/Pause Debugger.
VENTANA WATCH VALUES

El depurador software y hardware tienen la misma funcin de monitorear el estado de los registros
durante la ejecucin del programa. La diferencia es que el depurador software simula ejecucin de
programa en una PC, mientras que el depurador ICD (depurador hardware) utiliza el
microcontrolador. Cualquier cambio de estado lgico de los pines se indica en el registro (puerto)
apropiado. Como la ventana Watch Values permite monitorear el estado de todos los registros,
resulta fcil comprobar si un pin est a cero o a uno. La ltima modificacin est marcada en rojo
en la ventana Watch Values. Esto le permite localizar la modificacin en el archivo list durante el
proceso de la depuracin. Para visualizar esta ventana es necesario seleccionar la opcin
View/Windows/Watch Values. Entonces usted puede hacer una lista de re-gistros/variables que
quiere monitorear.
STOPWATCH (Cronmetro)

Si quiere saber cunto tiempo tarda un microcontrolador en ejecutar una parte del programa,
seleccione la opcin Run/View Stopwatch. Aparecer una ventana como se muestra en la figura a
la derecha.Cmo funciona un cronmetro? Eso es pan comido...El tiempo que tarda un comando
(step into, step over, run/pause etc.) en ejecutarse por el depurador se mide automticamente y se
visualiza en la ventana Stopwatch. Por ejemplo, se mide tiempo para ejecutar un programa, tiempo
para ejecutar el ltimo paso etc.
DEPURADOR EN CIRCUITO
La otra forma de comprobar la ejecucin de programa es al utilizar el depurador mikroICD (depurador en
circuito). El mikroICD (depurador en circuito) es una parte integral del programador PICflash. Se utiliza con el
propsito de probar y depurar los programas. El proceso de probar y depurar se realiza al monitorizar los
estados de todos los registros dentro del microcontrolador durante su funcionamiento en entorno real. Para
habilitar la depuracin, es necesario seleccionar las opciones Build Type-ICD Debug y Debugger-mikroICD
antes de cargar el programa en el microcontrolador. Tan pronto como se inicie el depurador mikroICD,
aparecer una ventana como se muestra en la siguiente Figura. El depurador mikroICD se comunica con el
microcontrolador PIC por sus pines utilizados para la programacin. Por eso no se pueden utilizar como pines
de E/S durante la ejecucin de la depuracin de programa. Durante la operacin del depurador mikroICD, el
programador y la PC deben estar conectados al utilizar un cable USB.

Opciones del depurador mikroICD:
Start Debugger [F9]
Run/Pause Debugger [F6]
Stop Debugger [Ctrl+F2]
Step Into [F7]
Step Over [F8]
Step Out [Ctrl+F8]
Toggle Breakpoint [F5]
Show/Hide Breakpoints [Shift+F4]
Clear Breakpoints [Ctrl+Shift+F4]
Cada de estos comandos se activa por medio de los atajos de teclado o al pulsar sobre el icono apropiado en
la ventana Watch Values.
El depurador mikroICD tambin ofrece funciones tales como ejecutar el programa paso a paso, detener la
ejecucin de programa para monitorear el estado de los registros actualmente activos por medio de los puntos
de ruptura, monitorear los valores de algunas variables etc. El siguiente ejemplo muestra una ejecucin de
programa paso a paso utilizando el comando Step Over.

Paso1:

En este ejemplo la lnea de programa 31 est marcada por el azul, lo que quiere decir que es la
siguiente en ser ejecutada. El estado actual de todos los registros dentro del microcontrolador se
puede visualizar en la ventana Watch Values del mikroICD.
Paso 2:

Despus de ejecutar el comando Step Over [F8] el microcontrolador ejecutar la lnea de programa
31. La siguiente lnea en ser ejecutada (32) est marcada por el azul. El estado de los registros
cambiados durante la ejecucin de esta instruccin se puede visualizar en la ventana Watch
Values.
CARGAR EL PROGRAMA EN EL MICROCONTROLADOR
Si ha solucionado todos los errores en su cdigo y cree que su programa est listo para ser utilizado, el
siguiente paso es cargarlo en el microcontrolador. El programador PICflash se utiliza para este propsito. Es
una herramienta diseada para programar todos los tipos de microcontroladores PIC. Est compuesto por dos
partes:
La parte hardware se utiliza para poner en el bfer un cdigo hexadecimal (el programa a
ser cargado en el microcontrolador) y para programar el microcontrolador por medio de
niveles de voltaje especficos. Durante el proceso de la programacin, un nuevo programa
se escribe en la memoria flash del microcontrolador, mientras que el programa anterior se
borra automticamente.
La parte de software se encarga de enviar el programa (archivo .hex) a la parte hardware
del programador por medio de un cable USB. Se activa al pulsar sobre la opcin
mE_Programmer del men Tools o al pulsar [F11]. Por consiguiente, es posible modificar
algunas configuraciones del programador y controlar el funcionamiento de la parte
hardware (Cargar, Escribir, Verificar...).

Se puede reprogramar el microcontrolador tantas veces como se necesite.
HERRAMIENTAS DEL COMPILADOR
El compilador mikroBasic PRO for PIC proporciona herramientas que en gran medida simplifican el proceso
de escribir el programa. Todas estas herramientas se encuentran en el men Tools. En la siguiente seccin
vamos a darle una breve descripcin de todas ellas.
TERMINAL USART

El terminal USART representa una sustitucin para la estndar Windows Hyper Terminal. Se puede
utilizar para controlar el funcionamiento del microcontrolador que utiliza la comunicacin USART.
Tales microcontroladores estn incorporados en un dispositivo destino y conectados al conector
RS232 de la PC por medio de un cable serial. La ventana USART terminal dispone de opciones
para configurar la comunicacin serial y visualizar los datos enviados/recibidos.
EDITOR EEPROM

Al seleccionar la opcin EEPROM Editor del men Tools, aparecer una ventana como se muestra
en la siguiente figura. As es cmo funciona la memoria EEPROM del microcontrolador. Si quiere
cambiar de su contenido despus de cargar el programa en el microcontrolador, sta es la forma
correcta de hacerlo. El nuevo contenido es un dato de un tipo especfico (char, int o double),
primero debe seleccionarlo, introducir el valor en el campo Edit Value y pulsar sobre Edit. Luego,
pulse sobre el botn Save para guardarlo como un documento con extensin .hex. Si la opcin Use
EEPROM in Project est activa, los datos se cargarn automticamente en el microcontrolador
durante el proceso de la programacin.
VENTANA ASCII CHART
Si necesita representar numricamente un carcter ASCII, seleccione la opcin ASCII chart del men Tools.
Aparecer una tabla, como se muestra en la figura que est a continuacin.
Usted probablemente sabe que cada tecla de teclado est asociada con un cdigo (cdigo ASCII). Como se
puede ver, los caracteres que representan los nmeros tienen valores diferentes. Por esta razn, la
instruccin de programa para visualizar el nmero 7 en un LCD no visualizar este nmero, sino el
equivalente a la instruccin BEL. Si enva el mismo nmero en forma de un carcter a un LCD, obtendr el
resultado esperado - nmero 7. Por consiguiente, si quiere visualizar un nmero sin convertirlo en un carcter
apropiado, es necesario aadir el nmero 48 a cada dgito en el que consiste el nmero a visualizar.
EDITOR DE SIETE SEGMENTOS
Un editor de siete segmentos le permite determinar con facilidad el nmero a poner en un puerto de salida con
el propsito de visualizar un smbolo deseado. Por supuesto, se da por entendido que los pines del puerto
deben estar conectados a los segmentos del visualizador de manera apropiada. Basta con colocar el cursor
en cualquier segmento del visualizador y pulsar sobre l. Se visualizar inmediatamente el nmero a introducir
en el programa.

LCD CUSTOM CHARACTER (Caracteres LCD definidos por el usuario)
Adems de los caracteres estndar, el microcontrolador tambin puede visualizar los caracteres creados por
el programador. Al seleccionar la herramienta LCD custom character, se evitar un pesado trabajo de crear
funciones para enviar un cdigo apropiado a un visualizador. Para crear un smbolo, pulse sobre los cuadros
pequeos en la ventana LCD custom character, luego seleccione la posicin y la fila y pulse sobre el botn
generate. El cdigo apropiado aparece en otra ventana. No es necesita pulsar ms. Copy to Clipboard (copiar
al portapapeles) - Paste (pegar)...

GENERADOR DE MAPA DE BITS PARA UN LCD GRFICO
El generador de mapa de bits para un LCD grfico es una herramienta insustituible en caso de que el
programa que escribe utilice el visualizador LCD (GLCD). Esta herramienta le permite visualizar un mapa de
bits con facilidad. Seleccione la opcin Tools/Glcd Bitmap Editor aparecer la ventana apropiada. Para
utilizarlo, seleccione el tipo de visualizador a utilizar y cargue un mapa de bits. El mapa de bits debe ser
monocromtico y tener la resolucin apropiada del visualizador (128 x 64 pxeles en este ejemplo). El
procedimiento a seguir es igual que en el ejemplo anterior: Copy to Clipboard...

Un cdigo generado que utiliza herramientas para controlar los visualizadores LCD y GLCD contiene
funciones de la librera Lcd. Si las utiliza en el programa, no se olvide de marcar la caja de chequeo junto a
esta librera en la ventana Library Manager. As el compilador ser capaz de reconocer estas funciones
correctamente.
LIBRARAS

Uno de los elementos ms importantes del compilador mikroBasic PRO for PIC es Library
Manager, que por supuesto merece nuestra atencin.
Para que una funcin o un procedimiento realice una cierta tarea al escribir un programa, basta con
encontrarla/encontrarlo en una de las libreras incluidas en el compilador y utilizarla. Una librera
representa un archivo llamado cabecera. Contiene un conjunto de variables y constantes escritas
en mikroBasic. Cada librera tiene un propsito especfico. Por ejemplo, para que un procedimiento
genere una seal de audio, abra la librera Sound en la ventana Library Manager y pulse dos veces
sobre el procedimiento apropiado Sound_Play. Una descripcin detallada de este procedimiento
aparece en la pantalla. Copelo en su programa y ajuste los parmetros apropiados. Al marcar esta
librera, sus funciones estarn disponibles y no ser necesario utilizar la librera include.

El mikroBasic PRO for PIC incluye las libreras miscelneas y las libreras para el hardware.
LIBRERAS MISCELNEAS
Las libreras miscelneas contienen algunas funciones de propsito general:
L I B R AR A DES CRI PCI N
Button Library Eliminar la influencia del rebote de contacto
Conversions Library Rutinas para conversiones de nmeros en cadenas y BCD/decimal
C Type Library Probar y convertir los caracteres
String Library Automatizar las tareas relacionadas con las cadenas
Time Library Rutinas para calcular el tiempo en el formato de tiempo UNIX
Trigon Library
Funciones trigonomtricas
LIBRARIES LIBRERAS PARA EL HARDWARE
Las libreras para el hardware incluyen las funciones utilizadas para controlar el funcionamiento de los
mdulos hardware:
L I B R AR A DE SCRI PCI N
ADC Library Utilizada para el funcionamiento del convertidor A/D
CAN Library Utilizada para las operaciones con el mdulo CAN
CANSPI Library Utilizada para las operaciones con el mdulo CAN externo (MCP2515 o MCP2510)
Compact Flash Library Utilizada para las operaciones con las tarjetas de memoria Compact Flash
EEPROM Library Utilizada para las operaciones con la memoria EEPROM incorporada
Ethernet PIC18FxxJ60 Library Utilizada para las operaciones con el mdulo Ethernet incorporado
Flash Memory Library Utilizada para las operaciones con la memoria Flash incorporada
Graphic Lcd Library Utilizada para las operaciones con el mdulo LCD grfico con resolucin 128x64
IC Library Utilizada para las operaciones con el mdulo de comunicacin serial I
2
C incorporado
Keypad Library Utilizada para las operaciones con el teclado (botones de presin 4x4)
Lcd Library Utilizada para las operaciones con el LCD (de 2x16 caracteres)
Manchester Code Library Utilizada para la comunicacin utilizando el cdigo Manchester
Multi Media Card library Utilizada para las operaciones con las tarjetas multimedia MMC flash
OneWire Library Utilizada para las operaciones con los circuitos utilizando la comunicacin serial One Wire
Port Expander Library Utilizada para las operaciones con el extensor de puertos MCP23S17
PS/2 Library Utilizada para las operaciones con el teclado estndar PS/2
PWM Library Utilizada para las operaciones con el mdulo PWM incorporado
RS-485 Library Utilizada para las operaciones con los mdulos utilizando la comunicacin serial RS485
Software IC Library Utilizada para simular la comunicacin I
2
C con software
Software SPI Library Utilizada para simular la comunicacin SPI con software
Software UART Library Utilizada para simular la comunicacin UART con software
Sound Library Utilizada para generar las seales de audio
SPI Library Utilizada para las operaciones con el mdulo SPI incorporado
SPI Ethernet Library Utilizada para la comunicacin SPI con el mdulo ETHERNET (ENC28J 60)
SPI Graphic Lcd Library Utilizada para la comunicacin SPI de 4 bits con el LCD grfico
SPI Lcd Library Utilizada para la comunicacin SPI de 4 bits con el LCD (de 2x16 caracteres)
SPI Lcd8 Library Utilizada para la comunicacin SPI de 8 bits con el LCD
SPI T6963C Graphic Lcd Library Utilizada para la comunicacin SPI con el LCD grfico
UART Library Utilizada para las operaciones con el mdulo UART incorporado
USB HID Library Utilizada para las operaciones con el mdulo USB incorporado


Captulo 3: Microcontrolador PIC16F887
El PIC16F887 es un producto conocido de la compaa Microchip

.Dispone de todos los componentes


disponibles en la mayora de los microcontroladores modernos. Por su bajo precio, un rango amplio de
aplicaciones, alta calidad y disponibilidad, es una solucin perfecta aplicarlo para controlar diferentes
procesos en la industria, en dispositivos de control de mquinas, para medir variables de procesos etc.
Algunas de sus caractersticas principales se enumeran a continuacin.
3.1 CARACTERSTICAS BSICAS DEL PIC16F887
3.2 PRINCIPALES REGISTROS SFRS
3.3 PUERTOS DE ENTRADA/SALIDA
3.4 TEMPORIZADOR TIMER0
3.5 TEMPORIZADOR TIMER1
3.6.TEMPORIZADOR TIMER2
3.7 MDULOS CCP
3.8 MDULOS DE COMUNICACIN SERIAL
3.9 MDULOS ANALGICOS
3.10 OSCILADOR DE RELOJ
3.11 MEMORIA EEPROM
3.12 REINICIO! BLACK-OUT, BROWN-OUT O RUIDOS?
3.1 CARACTERSTICAS BSICAS PIC16F887
Arquitectura RISC
o El microcontrolador cuenta con solo 35 instrucciones diferentes
o Todas las instrucciones son uni-ciclo excepto por las de ramificacin
Frecuencia de operacin 0-20 MHz
Oscilador interno de alta precisin
o Calibrado de fbrica
o Rango de frecuencia de 8MHz a 31KHz seleccionado por software
Voltaje de la fuente de alimentacin de 2.0V a 5.5V
o Consumo: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz), 50nA (en modo de espera)
Ahorro de energa en el Modo de reposo
Brown-out Reset (BOR) con opcin para controlar por software
35 pines de entrada/salida
o Alta corriente de fuente y de drenador para manejo de LED
o Resistencias pull-up programables
individualmente por software
o Interrupcin al cambiar el estado del pin
Memoria ROM de 8K con tecnologa FLASH
o El chip se puede re-programar hasta 100.000 veces
Opcin de programacin serial en el circuito
o El chip se puede programar incluso incorporado en el dispositivo destino
256 bytes de memoria EEPROM
o Los datos se pueden grabar ms de 1.000.000 veces
368 bytes de memoria RAM
Convertidor A/D:
o 14 canales
o Resolucin de 10 bits
3 temporizadores/contadores independientes
Temporizador perro guardin
Mdulo comparador analgico con
o Dos comparadores analgicos
o Referencia de voltaje fija (0.6V)
o Referencia de voltaje programable en el chip
Mdulo PWM incorporado
Mdulo USART mejorado
o Soporta las comunicaciones seriales RS-485, RS-232 y LIN2.0
o Auto deteccin de baudios
Puerto Serie Sncrono Maestro (MSSP)
o Soporta los modos SPI e I2C



DESCRIPCIN DE PINES
La mayora de los pines del microcontrolador PIC16F887 son multipropsito como se muestra en la figura
anterior. Por ejemplo, la asignacin RA3/AN3/Vref+/C1IN+para el quinto pin del microcontrolador indica que
ste dispone de las siguientes funciones:
RA3 Tercera entrada/salida digital del puerto A
AN3 Tercera entrada analgica
Vref+Referencia positiva de voltaje
C1IN+Entrada positiva del comparador C1
La funcionalidad de los pines presentados anteriormente es muy til puesto que permite un mejor
aprovechamiento de los recursos del microcontrolador sin afectar a su funcionamiento. Estas funciones de los
pines no se pueden utilizar simultneamente, sin embargo se pueden cambiar en cualquier instante durante el
funcionamiento.
Las siguientes tablas se refieren al microcontrolador PIC16F887 DIP de 40 pines.



UNIDAD CENTRAL DE PROCESAMIENTO (CPU)
Con el propsito de explicar en forma clara y concisa, sin describir profundamente el funcionamiento de la
CPU, vamos a hacer constar que la CPU est fabricada con la tecnologa RISC ya que esto es un factor
importante al decidir qu microcontrolador utilizar.
RISC es un acrnimo derivado del ingls Reduced Instruction Set Computer, lo que proporciona al PIC16F887
dos grandes ventajas:
La CPU cuenta con slo 35 instrucciones simples. Cabe decir que para poder programar
otros microcontroladores en lenguaje ensamblador es necesario saber ms de 200
instrucciones.
El tiempo de ejecucin es igual para casi todas las instrucciones y tarda 4 ciclos de reloj.
La frecuencia del oscilador se estabiliza por un cristal de cuarzo. Las instrucciones de salto
y de ramificacin tardan ocho ciclos de reloj en ejecutarse. Esto significa que si la
velocidad de operacin del microcontrolador es 20 MHz, el tiempo de ejecucin de cada
instruccin ser 200nS, o sea, el programa ejecutar 5millones de instrucciones por
segundo!

MEMORIA
El PIC16F887 tiene tres tipos de memoria: ROM, RAM y EEPROM. Como cada una tiene las funciones,
caractersticas y organizacin especficas, vamos a presentarlas por separado.
ROM
La memoria ROM se utiliza para guardar permanente el programa que se est ejecutando. Es la razn por la
que es frecuentemente llamada memoria de programa. El PIC16F887 tiene 8Kb de memoria ROM (en total
8192 localidades). Como la memoria ROM est fabricada con tecnologa FLASH, su contenido se puede
cambiar al proporcionarle un voltaje de programacin especial (13V).

No obstante, no es necesario explicarlo en detalles puesto que se realiza automticamente por un programa
especial en la PC y un simple dispositivo electrnico denominado programador.
EEPROM
Similar a la memoria de programa, el contenido de memoria EEPROM est permanentemente guardado al
apagar la fuente de alimentacin. Sin embargo, a diferencia de la ROM, el contenido de la EEPROM se puede
cambiar durante el funcionamiento del microcontrolador. Es la razn por la que esta memoria (256
localidades) es perfecta para guardar permanentemente algunos resultados creados y utilizados durante la
ejecucin del programa.

MEMORIA RAM

Es la tercera y la ms compleja parte de la memoria del microcontrolador. En este caso consiste en dos
partes: en registros de propsito general y en los registros de funciones especiales (los SFR). Todos estos
registros se dividen en cuatro bancos de memoria de los que vamos a hablar ms tarde en este captulo.
Aunque los dos grupos de registros se ponen a cero al apagar la fuente de alimentacin, adems estn
fabricados de la misma forma y se comportan de la manera similar, sus funciones no tienen muchas cosas en
comn.

REGISTROS DE PROPSITO GENERAL
Los registros de propsito general se utilizan para almacenar los datos temporales y los resultados creados
durante el funcionamiento. Por ejemplo, si el programa realiza el conteo (de los productos en una cadena de
montaje), es necesario tener un registro que representa lo que en la vida cotidiana llamamos suma. Como el
microcontrolador no es nada creativo, es necesario especificar la direccin de un registro de propsito general
y asignarle esa funcin. Se debe crear un programa simple para incrementar el valor de este registro por 1,
despus de que cada producto haya pasado por el sensor. As es cmo es creado un simple programa.
' En est a secuenci a, l a var i abl e en el r egi st r o sumse aument a cada vez
que se
' l l eve un uno ( 1) l gi co en el pi n de ent r ada RB0
. . .
if PORTB. 0 = 1 ' Compr obar si el pi n RB0 est a uno
sum= sum+ 1 ' Si est , el val or de l a var i abl e se aument a por 1
end if ' Si no est , el pr ogr ama sal e de l a sent enci a i f
. . .
Ahora el microcontrolador puede ejecutar el programa ya que sabe qu es y dnde est la suma que se va a
incrementar. De manera similar, a cada variable de programa se le debe pre-asignar alguno de los registros
de propsito general.
REGISTROS DE FUNCIONES ESPECIALES (SFR)
Los registros de funciones especiales son tambin parte de la memoria RAM. A diferencia de los registros de
propsito general, su propsito es predeterminado durante el proceso de fabricacin y no se pueden cambiar.
Como los bits estn conectados a los circuitos parti-culares en el chip (convertidor A/D, mdulo de
comunicacin serial, etc), cualquier cambio de su contenido afecta directamente al funcionamiento del
microcontrolador o de alguno de sus mdulos. Por ejemplo, el registro ADCON0 controla el funcionamiento del
convertidor A/D. Al cambiar los bits se determina qu pin del puerto se configurar como la entrada del
convertidor, el momento del inicio de la conversin as como la velocidad de la conversin.
Otra caracterstica de estas localidades de memoria es que tienen nombres (tanto los registros como sus bits),
lo que simplifica considerablemente el proceso de escribir un programa. Como el lenguaje de programacin de
alto nivel puede utilizar la lista de todos los registros con sus direcciones exactas, basta con especificar el
nombre de registro para leer o cambiar su contenido.
' En est a secci n de pr ogr ama, el cont eni do de l os r egi st r os TRI SC y
PORTC ser modi f i cado
. . .
TRI SC = 0x00 ' un cer o l gi co ( 0) se escr i be en el r egi st r o TRI SC
( t odos
' l os pi nes del puer t o PORTC se conf i gur an como
sal i das)
PORTC = %01100011 ' cambi o de est ado l gi co de t odos l os pi nes del
puer t o PORTC
. . .
BANCOS DE LA MEMORIA RAM
La memoria RAM est dividida en cuatro bancos. Antes de acceder a un registro al escribir un programa (para
leer o cambiar su contenido), es necesario seleccionar el banco que contiene ese registro. Ms tarde vamos a
tratar dos bits del registro STATUS utilizados para seleccin del banco. Para simplificar el funcionamiento, los
SFR utilizados con ms frecuencia tienen la misma direccin en todos los bancos, lo que permite accederlos
con facilidad.

Trabajar con bancos puede ser difcil slo si se escribe un programa en lenguaje ensamblador. Al utilizar el
lenguaje de programacin de alto nivel como es Basic y el compilador como es mikroBasic PRO for PIC, basta
con escribir el nombre del registro. A partir de esa informacin, el compilador selecciona el banco necesario.
Las instrucciones apropiadas para la seleccin del banco sern incorporadas en el cdigo durante el proceso
de la compilacin. Hasta ahora usted ha utilizado slo el lenguaje ensamblador y esta es la primera vez que
utiliza el compilador mikroBasic PRO for PIC, verdad? Es una noticia maravillosa, no lo cree?




PILA
Una parte de la RAM utilizada como pila consiste de ocho registros de 13 bits. Antes de que el
microcontrolador se ponga a ejecutar una subrutina (instruccin GOSUB) o al ocurrir una interrupcin, la
direccin de la primera siguiente instruccin en ser ejecutada se coloca en la pila (se apila), o sea, en uno de
los registros. Gracias a eso, despus de ejecutarse una subrutina o una interrupcin, el microcontrolador
sabe dnde continuar con la ejecucin de programa. Esta direccin se borra (se desapila) despus de volver
al programa, ya que no es necesario guardarla, disponiendo automticamente esas localidades de la pila para
un uso futuro.

Cabe tener en mente que el dato se apila circularmente. Esto significa que despus de que se apile ocho
veces, la novena vez se sobrescribe el valor que se almacen al apilar el dato por primera vez. La dcima vez
que se apile, se sobrescribe el valor que se almacen al apilar el dato por segunda vez etc. Datos sobrescritos
de esta manera no se pueden recuperar. Adems, el programador no puede acceder a estos registros para
hacer escritura/lectura. No hay ningn bit de estado para indicar el estado de desbordamiento o
subdesbordamiento de pila. Por esta razn hay que tener un especial cuidado al escribir un programa.
Vamos a hacerlo en mikroBasic...
' Al ent r ar o al sal i r de l a i nst r ucci n en ensambl ador del pr ogr ama, el
compi l ador
' no va a guar dar l os dat os en el banco de l a RAM act ual ment e act i vo.
Est o si gni f i ca
' que en est a secci n de pr ogr ama l a sel ecci n de banco depende de l os
r egi st r os SFR
' ut i l i zados. Al vol ver a l a secci n de pr ogr ama escr i t o en mi kr oBasi c,
l os bi t s de
' cont r ol RP0 y RP1, que sel ecci onan el banco act i vo, deben devol ver el
est ado que
' t en an ant es de l a ej ecuci n del cdi go en l enguaj e ensambl ador . La
var i abl e
' auxi l i ar saveBank guar da el est ado de est os dos bi t s.

saveBank = STATUS and %01100000 ' Guar dar el est ado de l os bi t s RP0 y
RP1
' ( bi t s 5 y 6 del r egi st r o STATUS)
asm ' I ni ci o de l a secuenci a en ensambl ador
. . .
. . . ' Cdi go ensambl ador
. . .
end asm ' Fi nal de l a secuenci a en ensambl ador
STATUS = STATUS and %10011111 ' Bi t s RP0 y RP1 devuel ven su est ado
or i gi nal
STATUS = STATUS or saveBank
. . .
. . .
SISTEMAS DE INTERRUPCIONES
Al aparecer una peticin de interrupcin lo primero que hace el microcontrolador es ejecutar la instruccin
actual despus de que se detiene el proceso de ejecucin de programa. Como resultado, la direccin de
memoria de programa actual se apila automticamente y la dire-ccin por defecto (predefinida por el
fabricante) se escribe en el contador de programa. La localidad en la que el programa contina con la
ejecucin se le denomina vector de interrupcin. En el caso del microcontrolador PIC16F887 esta direccin es
0x0004h. Como se muestra en la siguiente figura la localidad que contiene el vector de interrupcin se omite
durante la ejecucin de programa regular.

Una parte de programa que se ejecutar al hacer una peticin de interrupcin se le denomina rutina de
interrupcin. Su primera instruccin se encuentra en el vector de interrupcin. Cunto tiempo tardar en
ejecutar esta subrutina y cmo ser depende de la destreza del programador as como de la fuente de
interrupcin. Algunos microcontroladores tienen ms de un vector de interrupcin (cada peticin de
interrupcin tiene su vector), pero en este caso slo hay uno. En consecuencia, la primera parte da la rutina
de interrupcin consiste en detectar la fuente de interrupcin.
Por fin, al reconocer la fuente de interrupcin y al terminar de ejecutar la rutina de inte-rrupcin el
microcontrolador alcanza la instruccin RETFIE, toma la direccin de la pila y contina con la ejecucin de
programa desde donde se interrumpi.

MikroBasic reconoce una rutina de interrupcin que se ejecutar por medio de la palabra clave interrupt. La
rutina de interrupcin, debe ser escrita por el usuario.
sub procedure interrupt ' Rut i na de i nt er r upci n
cnt = cnt + 1 ; ' I nt er r upci n causa el i ncr ement o de l a var i abl e cnt
por 1
end sub
Cmo utilizar los registros SFR?
Supongamos que usted ha comprado ya un microcontrolador y que tiene una buena idea de cmo utilizarlo...
La lista de los registros SFR as como de sus bits es muy larga. Cada uno controla algn proceso en el
microcontrolador. En general, parece como una gran tabla de control con un gran nmero de instrumentos e
interruptores. Ahora est preocupado de cmo conseguir aprender acerca de todos ellos? Es poco probable,
pero no se preocupe, Usted no tiene que hacerlo! Los microcontroladores son tan potentes que se parecen a
los supermercados: ofrecen tantas cosas a bajos precios y a usted solo le toca elegir las que necesita. Por
eso, seleccione el campo en que est interesado y examine slo lo que necesita. Cuando entienda
completamente el funcionamiento de hardware, examine los registros SFR encargados de controlarlo
(normalmente son unos pocos).
Como todos los dispositivos tienen un tipo de sistema de control el microcontrolador tiene sus palancascon
las que usted debe estar familiarizado para ser capaz de utilizarlos correctamente. Por supuesto, estamos
hablando de los registros SFR desde los que el proceso de programacin se inicia y en los que el mismo
termina.
3.2 PRINCIPALES REGISTROS SFR
El siguiente texto describe los principales registros SFR del microcontrolador PIC16F887. Los bits de cada
registro controlan los circuitos diferentes dentro del chip, as que no es posible clasificarlos en grupos
especiales. Por esta razn, se describen junto con los procesos que controlan.
Registro STATUS

Leyenda: R/W - Bit de lectura/escritura, R - Bit de solo lectura, (0) - Despus del reinicio, el bit se pone
a cero, (1) - Despus del reinicio, el bit se pone a uno, (X) - Despus del reinicio, el estado de bit es
desconocido
El registro STATUS contiene: el estado aritmtico de datos en el registro W, el estado RESET, los bits para
seleccionar el banco para los datos de la memoria.
IRP - Registro de seleccin de Banco (usado para direccionamiento indirecto)
o 1 - Bancos 0 y 1 son activos (localidades de memoria 00h-FFh)
o 0 - Bancos 2 y 3 son activos (localidades de memoria 100h-1FFh)
RP1,RP0 - Registro de seleccin de banco (usado para direccionamiento directo).
RP1 R P0 B ANC O A C T I V O
0 0 Banco 0
0 1 Banco 1
1 0 Banco 2
1 1 Banco 3
TO - Time-out bit (bit de salida del temporizador perro guardin)
o 1 - Despus de encender el microcontrolador, despus de ejecutarse la instruccin CLRWDT que
reinicia al WDT (temporizador perro guardin) o despus de ejecutarse la instruccin SLEEP que pone
al microcontrolador en el modo de bajo consumo.
o 0 - Despus de acabarse el tiempo del WDT.
PD - Power-down bit (bit de apagado)
o 1 - Despus de encender el microcontrolador, despus de ejecutar la instruccin CLRWDT que reinicia
al WDT.
o 0 - Despus de ejecutarse la instruccin SLEEP que pone al microcontrolador en el modo de bajo
consumo.
Z - Zero bit (bit cero)
o 1 - El resultado de una operacin lgica o aritmtica es 0.
o 0 - TEl resultado de una operacin lgica o aritmtica es distinto de 0.
DC - Digit carry/borrow bit (bit de acarreo/prstamo de dgito) cambia al sumar o al restar
si ocurre un desbordamiento o un prstamo en el resultado.
o 1 - Hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
o 0 - No hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
C - Carry/Borrow bit (bit de acarreo/prstamo) cambia al sumar o al restar si ocurre un
desbordamiento o un prstamo en el resultado, o sea si el resultado es mayor de 255 o
menor de 0.
o 1 - Ocurri acarreo en el bit ms significativo (MSB) del resultado.
o 0 - No ocurri acarreo en el bit ms significativo (MSB) del resultado.
Registro OPTION_REG

Leyenda: R/W - Bi t de lectura/escritura, (1) Despus del rei ni cio, el bit se pone a uno
El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del Timer0/WDT, el
temporizador Timer0, la interrupcin externa y las resistencias pull-up en el puerto PORTB.

RBPU - Port B Pull up Enable bit (resistencia Pull Up Puerto B)
o 1 - Desactivadas
o 0 - Activadas

INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupcin
externa)
o 1 - Interrupcin por flanco ascendente en el RB0/INT
o 0 - Interrupcin por flanco descendente en el RB0/INT

T0CS - TMR0 Clock Source Select bit (bit selector de tipo de reloj para el
Timer0)
o 1 - Pulsos introducidos a travs del TOCKI (contador)
o 0 - Pulsos de reloj internos Fosc/4 (temporizador)

T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco en TOCKI)
selecciona el flanco (ascendente o descendente) contado por el temporizador
Timer0 por el pin RA4/T0CKI.
o 1 - Incrementa en flanco descendente en el pin TOCKI.
o 0 - Incrementa en flanco ascendente en el pin TOCKI.

PSA - Prescaler Assignment bit asigna el pre-escalador (hay slo uno) al
temporizador o al WDT.
o 1 - Pre - escalador se le asigna al WDT
o 0 - Pre - escalador se le asigna al temporizador Timer0.
PS2, PS1, PS0 Prescaler Rate Select bits (bit selector del valor del divisor de frecuencia)
El valor del divisor de frecuencia se selecciona al combinar estos tres bits. Como se muestra en la siguiente
tabla, el valor del divisor de frecuencia se le asigna al temporizador Timer0 o al temporizador perro guardin
(WDT).
PS2 PS1 PS0 TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
Para conseguir el valor del divisor de frecuencia 1:1 cuando el temporizador Timer0 cuenta pulsos, el pre-
escalador debe ser asignado al WDT. En consecuencia, el temporizador Timer0 no utiliza el pre-escalador,
sino que cuenta directamente los pulsos generados por el oscilador, lo que era el objetivo.
Vamos a hacerlo en mikroBasic...
' Si el comando CLRWDT no se ej ecut a, el WDT va a r ei ni ci ar al
mi cr ocont r ol ador cada 32. 768
' uS ( f =4 MHz)
OPTI ON_REG = %00001111 ' Pr e- escal ador est asi gnado al WDT ( 1: 128)
asm
CLRWDT ' Comando en ensamblador para reiniciar al WDT
end asm
. . . ' El t i empo ent r e est os dos comandos CLRWDT no debe exceder
32. 768 mi cr osegundos ( 128x256)
CLRWDT ' Comando en ensambl ador par a r ei ni ci ar al WDT
. . .
. . . ' El t i empo ent r e est os dos comandos CLRWDT no debe exceder
32. 768 mi cr osegundos ( 128x256)
CLRWDT ' Comando en ensambl ador par a r ei ni ci ar al WDT
. . .
REGISTROS DEL SISTEMA DE DESARROLLO
Al llegar la peticin de interrupcin, no significa que una interrupcin ocurrir automticamente, puesto que
debe ser habilitada por el usuario (por el programa) tambin. Por esta razn, hay bits especiales utilizados
para habilitar o deshabilitar interrupciones. Es fcil de reconocerlos por las letras IE contenidas en sus
nombres (Interrupt Enable - Interrupcin habilitada). Adems, cada interrupcin se asocia con otro bit
denominado bandera que indica que una peticin de interrupcin ha llegado sin verificar si est habilitada.
Asimismo, se reconocen con facilidad por las dos ltimas letras contenidas en sus nombres - IF (Interrupt Flag
- Bandera de interrupcin).

Como hemos visto, toda la idea es muy simple y eficiente. Al llegar la peticin de interrupcin, primero el bit de
bandera se pone a uno. Si el bit IE apropiado est a cero (0), esta condicin ser ignorada completamente. De
lo contrario, ocurre una interrupcin. Si varias fuentes de interrupcin estn habilitadas, es necesario detectar
la activa antes de que la rutina de interrupcin se ponga a ejecutar. La deteccin de la fuente se realiza al
comprobar los bits de las banderas.

Cabe destacar que los bits de cada bandera no se ponen a cero automticamente, sino por el software,
mientras que la ejecucin de la rutina de interrupcin contina ejecutndose. Si no hacemos caso a este
detalle, ocurrir otra interrupcin inmediatamente despus de volver al programa principal, aunque no hay
ms peticiones de ejecucin. Simplemente, la bandera, as como el bit IE, se quedan en uno.

Todas las fuentes de interrupcin tpicas para el microcontrolador PIC16F887 se muestran en la siguiente
pgina. Fjese en lo siguiente:

El bit GIE habilita/deshabilita simultneamente las interrupciones no enmascaradas.
El PEIE habilita/deshabilita las interrupciones no enmascaradas de perifricos. Esto no se refiere al
temporizador Timer0 y a las fuentes de interrupcin del puerto PORTB.
Para habilitar una interrupcin causada por el cambio del estado lgico en el puerto PORTB, es necesario
habilitarla para cada bit por separado. En este caso, los bits del registro IOCB se comportan como los bits IE
de control.

Sistema de interrupcin del microcontrolador PIC16F887
Registro INTCON
El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del Timer0/WDT, el
temporizador Timer0, la interrupcin externa y las resistencias pull-up en el puerto PORTB.

Leyenda: R/W - Bi t de lectura/escritura, (0) Despus del rei ni cio, el bit se pone a cero, (X) - Despus del
reinicio, el estado de bit es desconocido
GIE - Global Interrupt Enable bit (bit de habilitacin de interrupciones globales) controla
simultneamente todas las fuentes de interrupciones posibles.
o 1 - Habilita las interrupciones no enmascaradas.
o 0 - Deshabilita las interrupciones no enmascaradas.
PEIE - Peripheral Interrupt Enable bit (bit de habilitacin de interrupciones perifricas) es
similar al bit GIE, sin embargo controla interrupciones habilitadas por los perifricos. Eso
significa que no influye en interrupciones causadas por el temporizador Timer0 o por el
cambio del estado en el puerto PORTB o por el cambio en el pin RB0/INT.
o 1 -Habilita las interrupciones perifricas no enmascaradas.
o 0 -Deshabilita las interrupciones perifricas no enmascaradas
T0IE - TMR0 Overflow Interrupt Enable bit (bit de habilitacin de interrupciones por el
desbordamiento del registro Timer0) controla interrupciones causadas por el
desbordamiento del Timer0.
o 1 - Habilita interrupciones por Timer0
o 0 - Deshabilita interrupciones por Timer0
INTE - RB0/INT External Interrupt Enable bit (bit de habilitacin de la interrupcin
externa en RB0) controla interrupciones causadas por el cambio del estado lgico en el pin
de entrada RB0/INT (interrupcin externa).
o 1 - Habilita interrupciones externas INT
o 0 - Deshabilita interrupciones externas INT
RBIE - RB Port Change Interrupt Enable bit. (bit de habilitacin de interrupciones por
cambios en el puerto PORTB). Cuando se configuran como entradas, los pines en el
puerto PORTB pueden causar una interrupcin al cambiar el estado lgico (no importa si
se produce bajada o subida de tensin, lo que importa es que se produce un cambio). Este
bit determina si una interrupcin va a ocurrir.
o 1 - Habilita interrupciones por cambio en el puerto PORTB
o 0 - Deshabilita interrupciones por cambio en el puerto PORTB
T0IF - TMR0 Overflow Interrupt Flag bit (bit de bandera de interrupcin por el
desbordamiento del Timer0) detecta el desbordamiento en el registro del temporizador
Timer0, o sea el contador se pone a cero.
o 1 - En el registro TMR0 ha ocurrido desbordamiento (esta bandera debe volverse a 0 por software)
o 0 - En el registro TMR0 no ha ocurrido desbordamiento
INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupcin externa en INT)
detecta el cambio en el estado lgico en el pin INT.
o 1 - Ha ocurrido una interrupcin externa por INT (esta bandera debe volverse a 0 por software)
o 0 - No ha ocurrido una interrupcin externa por INT
RBIF - RB Port Change Interrupt Flag bit (bit de bandera de interrupcin por cambio en
el puerto RB) detecta cualquier cambio del estado lgico de alguno de los pines de entrada
en el puerto PORTB.
o 1 - Al menos uno de los pines de E/S de propsito general en el puerto PORTB ha cambido de valor.
Despus de leer el puerto PORTB, el bit RBIF debe volverse a 0 por software)
o 0 - Ninguno de los pines de E/S de propsito general en el puerto PORTB ha cambiado de valor.
Vamos a hacerlo en mikroBasic...
' El pi n PORTB. 4 se conf i gur a como una ent r ada sensi bl e al cambi o del
est ado l gi co.
ANSEL, ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como di gi t al es
PORTB = 0 ' Todos l os pi nes del puer t o PORTB se ponen a cer o
TRI SB = %00010000 ' Todos l os pi nes del puer t o PORTB menos PORTB. 4
' se conf i gur an como sal i das
I NTCON. RBI E = 1 ' Se habi l i t an l as i nt er r upci ones por el cambi o en el
puer t o PORTB
I OCB. I OCB4 = 1 ' Se habi l i t a l a i nt er r upci n por el cambi o en el pi n
4 en el puer t o PORTB
I NTCON. GI E = 1 ' Se habi l i t a l a i nt er r upci n gl obal
. . .
. . .
' Desde est e punt o, se pr oduce una i nt er r upci n con cual qui er cambi o del
est ado l gi co en el pi n
' PORTB.
PIE1 Register
El registro PIE1 contiene los bits de habilitacin de interrupciones perifricas.

Leyenda: (-) Bi t no implementado, (R/W) - Bit de lectura/escritura, (0) Despus del rei nicio, el bi t se pone a
cero
ADIE - A/D Converter Interrupt Enable bit (bit de habilitacin de interrupciones del
convertidor A/D)
o 1 - Habilita la interrupcin ADC.
o 0 - Deshabilita la interrupcin ADC.
RCIE - EUSART Receive Interrupt Enable bit (bit de habilitacin de interrupciones de
recepcin del EUSART)
o 1 - Habilita la interrupcin de recepcin del EUSART.
o 0 - Deshabilita la interrupcin de recepcin del EUSART.
TXIE - EUSART Transmit Interrupt Enable bit (bit de habilitacin de interrupciones de
transmisin del EUSART)
o 1 - Habilita la interrupcin de transmisin del EUSART.
o 0 - Deshabilita la interrupcin de transmisin del EUSART.
SSPIE - Master Synchronous Serial Port (MSSP) Int errupt Enable bit (bit de habilitacin
de la interrupcin del puerto serie sncrono maestro (MSSP) habilita generar una peticin
de interrupcin despus de cada transmisin de datos por el mdulo de comunicacin serie
sncrona (modo SPI o I2C).
o 1 - Habilita la interrupcin del MSSP.
o 0 - Deshabilita la interrupcin del MSSP.
CCP1IE - CCP1 Interrupt Enable bit bit de habilitacin de la interrupcin del mdulo 1 de
Comparacin/Captura/PWM - CCP1) permite generar una peticin de interrupcin en el
mdulo CCP1 utilizado para procesamiento de la seal PWM.
o 1 - Habilita la interrupcin CCP1.
o 0 - Deshabilita la interrupcin CCP1.
TMR2IE - TMR2 to PR2 Match Interrupt Enable bit (bit de habilitacin de la interrupcin
de igualdad entre TMR2 y PR2)
o 1 - Habilita la interrupcin de igualdad entre TMR2 y PR2
o 0 - Deshabilita la interrupcin de igualdad entre TMR2 y PR2
TMR1IE - TMR1 Overflow Interrupt Enable bit (bit de habilitacin de la interrupcin de
desbordamiento del temporizador Timer1) habilita generar una peticin de interrupcin
despus de cada desbordamiento en el registro del temporizador Timer1, o sea el contador
se pone a cero.
o 1 - Habilita la interrupcin por desbordamiento en el registro TMR1.
o 0 - Deshabilita la interrupcin por desbordamiento en el registro TMR1.
Vamos a hacerlo en mikroBasic...
' El compar ador C2 se conf i gur a par a ut i l i zar l os pi nes RA0 y RA2 como
ent r adas. Al pr oduci r se
' un cambi o en l a sal i da del compar ador , el pi n de sal i da PORTB. 1 cambi a
el est ado l gi co en
' l a r ut i na de i nt er r upci n.

dim unsi gned short cnt ' Def i ni r l a var i abl e cnt
sub procedure interrupt ' I ni ci o de l a r ut i na de i nt er r upci n
cnt = cnt + 1 ' Al pr oduci r se una i nt er r upci n, l a cnt se
i ncr ement a por 1
PI R1. TMR1I F = 0 ' El bi t TMR1I F se r ei ni ci a
TMR1H = 0x80 ' A l os r egi st r os del t empor i zador TMR1H y
TMR1L se l es
TMR1L = 0x00 ' devuel ven sus val or es i ni ci al es
end sub

main:
ANSEL, ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como
di gi t al es
T1CON = 1 ' Encender el t empor i zador Ti mer 1
PI R1. TMR1I F = 0 ' El bi t TMR1I F se pone a cer o
TMR1H = 0x80 ' Est abl ecer l os val or es i ni ci al es par a el
t empor i zador Ti mer 1
TMR1L = 0x00
PI E1. TMR1I E = 1 ' Habi l i t ar l a i nt er r upci n al pr oduci r se un
' desbor dami ent o en el Ti mer 1

cnt = 0 ' Rei ni ci ar l a var i abl e cnt
I NTCON = 0xC0 ' Habi l i t ar l a i nt er r upci n ( l os bi t s GI E y
PEI E)
. . .
Registro PIE2
El registro PIE2 tambin contiene varios bits de habilitacin de interrupciones.

Leyenda: (-) Bi t no implementado, (R/W) - Bit de lectura/escritura, (0) Despus del rei nicio, el bi t se pone a
cero
OSFIE - Oscillator Fail Interrupt Enable bit (bit de habilitacin de la interrupcin de fallo
en el oscilador)
o 1 - Habilita la interrupcin de fallo en el oscilador.
o 0 - Deshabilita la interrupcin de fallo en el oscilador.
C2IE - Comparator C2 Interrupt Enable bit (bit de habilitacin de la interrupcin del
comparador C2)
o 1 - Habilita la interrupcin del comparador C2.
o 0 - Deshabilita la interrupcin del comparador C2.
C1IE - Comparator C1 Interrupt Enable bit (bit de habilitacin de la interupcin del
comparador C1)
o 1 - Habilita la interrupcin del comparador C1.
o 0 - Deshabilita la interrupcin del comparador C1.
EEIE - EEPROM Write Operation Interrupt Enable bit (bit de habilitacin de la
interrupcin de escritura en la memoria EEPROM)
o 1 - Habilita la interrupcin de escritura en la memoria EEPROM.
o 0 - Deshabilita la interrupcin de escritura en la memoria EEPROM.
BCLIE - Bus Collision Interrupt Enable bit (bit de habilitacin de la interrupcin de
colisin de bus)
o 1 - Habilita la interrupcin de colisin de bus.
o 0 - Deshabilita la interrupcin de colisin de bus.
ULPWUIE - Ultra Low-Power Wake-up Interrupt Enable bit (bit de habilitacin de la
interrupcin para salir del modo de ultra bajo consumo - la reactivacin)
o 1 - Habilita la interrupcin para salir del modo de ultra bajo consumo.
o 0 - Deshabilita la interrupcin para salir del modo de ultra bajo consumo.
CCP2IE - CCP2 Interrupt Enable bit (bit de habilitacin de la interrupcin del mdulo 2 de
Comparacin/Captura/PWM (CCP2)
o 1 - Habilita la interrupcin del CCP2.
o 0 - Deshabilita la interrupcin del CCP2.
Vamos a hacerlo en mikroBasic...
' El compar ador C2 se conf i gur a par a ut i l i zar l os pi nes RA0 y RA2 como
ent r adas. Al pr oduci r se
' un cambi o en l a sal i da del compar ador , el pi n de sal i da PORTB. 1 cambi a
el est ado l gi co en
' l a r ut i na de i nt er r upci n.

sub procedure interrupt ' I ni ci o de l a r ut i na de i nt er r upci n
PORTB. F1 = not PORTB. F1 ' La i nt er r upci n i nver t i r el est ado
l gi co del
' pi n PORTB. 1
PI R2. C2I F = 0 ' Bi t de bander a de i nt er r upci n C2I F se
pone a cer o
' Fi nal de l a r ut i na de i nt er r upci n
end sub ' Todos l os pi nes del puer t o PORTB se
conf i gur an
mai n:
TRI SB = 0 ' Bi t de bander a de i nt er r upci n C2I F se
pone a cer o
' como sal i das
PORTB. 1 = 1 ' El pi n PORTB. 1 se pone a uno
ANSEL = %00000101 ' Los pi nes RA0/ C12I N0- y RA2/ C2I N+ son l as
' ent r adas anal gi cas
ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como
di gi t al es
CM2CON0. C2CH0 = 0 ' El pi n RA0 se sel ecci ona par a ser una
ent r ada
' i nver t i da del C2
CM2CON0. C2CH1 = 0
PI E2. C2I E = 1 ' Habi l i t a l a i nt er r upci n del compar ador
C2
I NTCON. GI E = 1 ' I nt er r upci n gl obal est habi l i t ada
CM2CON0. C2ON = 1 ' Compar ador C2 est habi l i t ado
. . .
. . .
Registro PIR1
El registro PIE2 tambin contiene varios bits de habilitacin de interrupciones.

Leyenda: (-) Bi t no implementado, (R/W) - Bit de lectura/escritura, (R) - Bi t de lectura (0), Despus del
reinicio, el bi t se pone a cero
ADIF - A/D Converter Interrupt Flag bit (bit de bandera de la interrupcin del convertidor
A/D)
o 1 - Se ha completado una conversin A/D (el bit debe volverse a 0 por software).
o 0 - No se ha completado una conversin A/D o no ha empezado.
RCIF - EUSART Receive Interrupt Flag bit (bit de bandera de la interrupcin de recepcin
del EUSART)
o 1 - El bfer de recepcin del EUSART est lleno. El bit se pone a cero al leer el registro RCREG.
o 0 - El bfer de recepcin del EUSART no est lleno.
TXIF - EUSART Transmit Interrupt Flag bit (bit de la interrupcin de transmisin del
EUSART)
o 1 - El bfer de transmisin del EUSART est vaco. El bit se pone a cero al esribir un dato en el registro
TXREG
o 0 - El bfer de transmisin del EUSART est lleno.
SSPIF - Master Synchronous Serial Port (MSSP) Interrupt Flag bit (bit de bandera de la
interrupcin de puerto serie sncrono maestro)
o 1 - Se ha cumplido la condicin de ocurrir una interrupcin del MSSP al transmitir/recibir los datos.
Difieren dependiendo del modo de operacin del MSSP (SPI o I2C). El bit debe ponerse a cero por
software antes de volver de la rutina de servicio de interrupciones)
o 0 - No se ha cumplido ninguna condicin de ocurrir una interrupcin del MSSP.
CCP1IF - CCP1 Interrupt Flag bit (bit de bandera de la interrupcin del mdulo 1 de
Comparacin/Captura/PWM (CCP1)
o 1 - Se ha cumplido la condicin de la interrupcin del CCP1 (CCP1 es una unidad para captar,
comparar y generar una seal PWM). Dependiendo del modo de operacin (modo captura o modo
comparacin), se produce una captura o la igualdad en la comparacin. En ambos casos, el bit debe
volverse a cero por software. El bit no se utiliza en el modo PWM.
o 0 - No se ha cumplido la condicin de la interrupcin del CCP1
TMR2IF - Timer2 to PR2 Interrupt Flag bit (bit de bandera de la interrupcin de igualdad
entre el temporizador Timer2 y el registro PR2)
o 1 - Se ha producido igualdad con el valor del TMR2 (registro de 8 bits del temporizador) y el valor del
PR2. El bit debe ponerse a cero por software antes de volver de la rutina de servicio de interrupciones)
o 0 - No se ha producido igualdad con el valor del TMR2 y el valor del PR2.
TMR1IF - Timer1 Overflow Interrupt Flag bit (bit de bandera de la interrupcin de
desbordamiento del temporizador Timer1)
o 1 - Se ha producido desbordamiento en el registro TMR1. El bit debe ponerse a cero por software.
o 0 - No se ha producido desbordamiento en el registro TMR1.
Registro PIR2
El registro PIR2 contiene los bits de banderas da la interrupcin.
Leyenda: (-) Bi t no implementado, (R/W) - Bit de lectura/escritura, (0) Despus del rei nicio, el bi t se pone a
cero
OSFIF - Oscillator Fail Interrupt Flag bit (bit de bandera de la interrupcin de fallo en el
oscilador)
o 1 - Se ha producido un fallo en el oscilador del sistema. La entrada de reloj ha sido conmutada al
oscilador interno INTOSC. El bit debe ponerse a cero por software.
o 0 - El oscilador del sistema funciona correctamente.
C2IF - Comparator C2 Interrupt Flag bit (bit de bandera de la interrupcin del
comparador C2)
o 1 - La salida del comparador analgico C2 ha sido cambiada (el bit C2OUT). El bit debe ponerse a cero
por software.
o 0 - La salida del comparador analgico C2 no ha sido cambiada.
C1IF - Comparator C1 Interrupt Flag bit (bit de bandera de la interrupcin del
comparador C1)
o 1 - La salida del comparador analgico C1 ha sido cambiada (el bit C1OUT). El bit debe ponerse a cero
por software.
o 0 - La salida del comparador analgico C1 no ha sido cambiada
EEIF - EE Write Operation Interrupt Flag bit (bit de bandera de la interrupcin de la
operacin de escritura en la memoria EEPROM)
o 1 - La operacin de escritura en la memoria EEPROM se ha completado. El bit debe ponerse a cero por
software.
o 0 - La operacin de escritura en la memoria EEPROM no se ha completado o todava no se ha iniciado.
BCLIF - Bus Collision Interrupt Flag bit (bit de bandera de la interrupcin de colisin de
bus en el MSSP)
o 1 - Se ha producido una colisin de bus en el MSSP al ser configurado para el modo maestro I2C. El bit
debe ponerse a cero por software.
o 0 - No se ha producido colisin de bus en el MSSP.
ULPWUIF - Ultra Low-power Wake-up Interrupt Flag bit (bit de bandera de la
interrupcin para salir del modo de ultra bajo consumo - la reactivacin)
o 1 - Se ha cumplido la condicin de salir del modo de ultra bajo consumo. El bit debe ponerse a cero por
software.
o 0 - No se ha cumplido la condicin de salir del modo de ultra bajo consumo.
CCP2IF - CCP2 Interrupt Flag bit (bit de la interrupcin del mdulo 2 de
Comparacin/Captura/PWM - CCP2)
o 1 - Se ha cumplido la condicin de la interrupcin del CCP2 (CCP2 es una unidad para captar,
comparar y generar una seal PWM). Dependiendo del modo de operacin (modo captura o modo
comparacin), se produce una captura o la igualdad en la comparacin. En ambos casos, el bit debe
volverse a cero por software. El bit no se utiliza en el modo PWM.
o 0 -No se ha cumplido la condicin de la interrupcin del CCP2.
Vamos a hacerlo en mikroBasic...
' Secuenci a de act i vaci n del mdul o ULPWU
mai n:
PORTA. 0 = 1 ' Pi n PORTA. 0 se pone a uno
ANSEL, ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como di gi t al es
TRI SA = 0 ' Los pi nes del puer t o PORTA se conf i gur an como sal i das
Del ay_ms( 1) ' Car gar el capaci t or
PI R2. ULPWUI F = 0 ' Bander a ULPWUI F se pone a cer o
PCON. ULPWUE = 1 ' Habi l i t ar el f unci onami ent o del mdul o ULPWU
TRI SA. 0 = 1 ' PORTA. 0 se conf i gur a como ent r ada
PI E2. ULPWUI E = 1 ' Habi l i t ar l a i nt er r upci n por el mdul o ULPWU
I NTCON. GI E = 1 ' Habi l i t ar t odas l as i nt er r upci ones no enmascar adas
I NTCON. PEI E = 1 ' Habi l i t ar l as i nt er r upci ones de l os per i f r i cos
asm ' I nst r ucci n Asm
SLEEP ' Pasar al modo de baj o consumo
. . .
Registro PCON
El registro PCON contiene solamente dos bits de banderas utilizados para diferenciar entre un Power-on reset
(POR), un Brown-out reset (BOR), un reinicio por el temporizador perro guardin (WDT) y un reinicio externo
por el pin MCLR.

Leyenda: (-) Bi t no implementado, (R/W) - Bit de lectura/escritura, (1) - Despus del reinicio, el bi t se pone a
uno, (0) Despus del rei nicio, el bit se pone a cero
ULPWUE - Ultra Low-Power Wake-up Enable bit (bit de habilitacin para salir del modo
de ultra bajo consumo - la reactivacin)
o 1 - Se habilita salir del modo de ultra bajo consumo.
o 0 - No se habilita salir del modo de ultra bajo consumo.
SBOREN - Software BOR Enable bit (bit de habilitacin del BOR por software)
o 1 - Se habilita Brown-out reset.
o 0 - Se deshabilita Brown-out reset.
POR - Power-on Reset Status bit (bit de estado Power - on reset)
o 1 - No se ha producido Power - on reset
o 0 - Se ha producido Power - on reset. El bit debe ponerse a uno por software despus de que se haya
producido un Power - on reset.
BOR - Brown-out Reset Status bit (bit de estado Brown - out reset)
o 1 - No se ha producido Brown - out reset.
o 0 - Se ha producido Brown - out reset. El bit debe ponerse a uno por software despus de que se haya
producido Brown - out reset.
Registros PCL y PCLATH
La memoria de programa del PIC16F887 es de 8K y tiene 8192 localidades para el almace-namiento de
programa. Por esta razn, el contador de programa (PC) debe de ser de 13 bits de anchura (213 =8192).
Para habilitar el acceso a una localidad de memoria de programa durante el funcionamiento del
microcontrolador, es necesario acceder a su direccin por medio de los registros SFR. Como todos los
registros SFR son de 8 bits de anchura, este registro de direccionamiento es creado al combinar dos registros
independientes: el byte bajo (de 8 bits) del contador de programa ocupa el registro PCL, mientras que el byte
alto (5 bits) ocupa el registro PCLATH. Si la ejecucin de programa no afecta al contador de programa, el
valor de este registro (PCL y PCLATH) va incrementndose automtica y constantemente: +1, +1, +1, +1...
De esta manera, el programa se ejecuta como est escrito - instruccin a instruccin, seguido por un
incremento de direccin constante.

Si el contador de programa ha sido cambiado por software, debe tomar en cuenta lo siguiente:
Los ocho bits inferiores (el byte inferior) del registro PCL son de lectura/escritura, mientras
que los cinco bits superiores del registro PCLATH son de slo escritura.
El registro PCLATH se borra con cada reinicio.
En el lenguaje ensamblador, el valor del contador de programa est marcado con PCL y se
refiere slo a los ocho bits ms bajos. Usted debe tener cuidado al utilizar la instruccin en
ensamblador ADDWF PCL. Esto es una instruccin de salto que especifica la localidad
destino al aadir un nmero a la direccin actual. Se utiliza con frecuencia para saltar a la
tabla de bsqueda o a la tabla de ramificacin de programa y leerlas. Un problema surge si
el registro PCLATH ha sido cambiado al aadir un nmero a la direccin actual. La
ejecucin de una instruccin sobre el registro PCL causa simultneamente la sustitucin de
los bits del contador de programa por los contenidos de los dos registros, PCLATH y PCL.
De todos modos, el registro PCL puede acceder slo a 8 bits inferiores del resultado de la
instruccin, pues el siguiente salto ser completamente incorrecto. La solucin a este
problema es poner estas instrucciones en las direcciones que terminan en xx00h. De esta
manera se habilitan los saltos de programa hasta 255 localidades. Si se ejecutan los saltos
ms largos por medio de esta instruccin, el registro PCLATH debe ser incrementado por 1
cada vez que se produce desbordamiento en el registro PCL.
Al llamar una subrutina o al ejecutarse un salto (instrucciones CALL y GOTO), el
microcontrolador es capaz de proporcionar solamente direccionamiento de 11 bits. Similar
a la RAM que est dividida en bancos, la ROM est dividida en las cuatro pginas de 2K
cada una. Las instrucciones dentro de estas pginas se ejecutan regularmente. Dicho de
manera sencilla, como el procesador est proporcionado con una direccin de 11 bits del
programa, es capaz de direccionar cualquier localidad dentro de 2KB.
La siguiente figura muestra el salto a la direccin del subprograma PP1. Sin embargo, si una subrutina o una
direccin de salto no est en la misma pgina que la localidad de salto, se deben proporcionar dos bits
superiores que faltan al escribir en el registro PCLATH. La siguiente figura muestra el salto a la direccin de la
subrutina PP2.

En ambos casos, cuando la subrutina llega a las instrucciones RETURN, RETLW o RETFIE (vuelta al
programa principal), el microcontrolador continuar con la ejecucin de programa desde donde se interrumpi,
ya que la direccin de retorno se empuja y se guarda en la pila que consiste en registros de 13 bits, como
hemos mencionado.
DIRECCIONAMIENTO INDIRECTO
Adems del direccionamiento directo, que es lgico y claro (basta con especificar la direccin de un registro
para leer su contenido), este microcontrolador es capaz de realizar el direccionamiento indirecto por los
registros INDF y FSR. A veces esto facilita el proceso de escribir un programa. El procedimiento entero est
habilitado ya que el registro INDF no es real (no existe fsicamente), sino que solamente especifica el registro
cuya direccin est situada en el registro FSR. Por esta razn, escribir o leer los datos del registro INDF
realmente significa escribir o leer del registro cuya direccin est situada en el registro FSR. En otras
palabras, direcciones de registros se especifican en el registro FSR, y su contenido se almacena en el registro
INDF. La diferencia entre el direccionamiento directo e indirecto se muestra en la siguiente figura:

Como hemos visto, el problema con los bits de direccionamiento que faltan se soluciona con un prstamo
del otro registro. Esta vez, es el sptimo bit, denominado bit IRP del registro STATUS.
3.3 PUERTOS DE ENTRADA/SALIDA
Una de las caractersticas ms importantes del microcontrolador es el nmero de los pines de entrada/salida,
que permite conectarlo con los perifricos. El PIC16F887 tiene en total 35 pines de E/S de propsito general,
lo que es suficiente para la mayora de las aplicaciones.
Con el propsito de sincronizar el funcionamiento de los puertos de E/S con la organizacin interna del
microcontrolador de 8 bits, ellos se agrupan, de manera similar a los registros, en cinco puertos denotados
con A, B, C, D y E. Todos ellos tienen las siguientes caractersticas en comn:
Por las razones prcticas, muchos pines de E/S son multifuncionales. Si un pin realiza una
de estas funciones, puede ser utilizado como pin de E/S de propsito general.
Cada puerto tiene su propio registro de control de flujo, o sea el registro TRIS
correspondiente: TRISA, TRISB, TRISC etc. lo que determina el comportamiento de bits
del puerto, pero no determina su contenido. Al poner a cero un bit del registro TRIS (bit=0),
el pin correspondiente del puerto se configurar como una salida. De manera similar, al
poner a uno un bit del registro TRIS (bit=1), el pin correspondiente del puerto se
configurar como una entrada. Esta regla es fcil de recordar: 0 =Salida 1 =Entrada.
Registros PORTA y TRISA
El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISA controlan los
pines del puerto PORTA, o sea si se comportan como entradas o salidas digitales:

Similar a que los bits del registro TRISA determinan cules pines sern configurados como entradas y cules
sern configurados como salidas, los bits apropiados del registro ANSEL determinan si los pines sern
configurados como entradas analgicas o entradas/salidas digitales.
RA0 =AN0 (determinado por el bit ANS0 del registro ANSEL)

RA1 =AN1 (determinado por el bit ANS1 del registro ANSEL)

RA2 =AN2 (determinado por el bit ANS2 del registro ANSEL)

RA3 =AN3 (determinado por el bit ANS3 del registro ANSEL)
RA5 =AN4 (determinado por el bit ANS4 del registro ANSEL)
Cada bit de este puerto tiene una funcin adicional relacionada a algunas unidades perifricas integradas.
Este captulo cubre slo la funcin adicional del pin RA0, puesto que est relacionado al puerto PORTA y a la
unidad ULPWU. En los siguientes captulos vamos a describir las funciones adicionales de los otros pines.
Vamos a hacerlo en mikroBasic...
' El pi n PORTA. 2 se conf i gur a como una ent r ada di gi t al . Todos l os dems
pi nes del puer t o PORTA
' son sal i das di gi t al es
...
ANSEL = ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como di gi t al es
PORTA = 0 ' Todos l os pi nes del puer t o PORTA se ponen a cer o
TRI SA = %00000100 ' Todos l os pi nes del puer t o PORTA except o el
' PORTA. 2 se conf i gur an como sal i das
. . .
UNIDAD ULPWU
El microcontrolador se utiliza generalmente en los dispositivos que funcionan peridicamente y
completamente independiente utilizando una fuente de alimentacin de batera. En tal caso, el consumo de
corriente mnimo es una de las prioridades. Los ejemplos tpicos de tales aplicaciones son: termmetros,
sensores de deteccin del fuego y similar. Es conocido que al reducir frecuencia de reloj se reduce el
consumo de corriente, pues una de las soluciones ms convenientes a este problema es bajar la frecuencia
de reloj, o sea utilizar el cristal de cuarzo de 32KHz en vez de el de 20MHz.

Al poner el microcontrolador en el modo de reposo es otro paso en la misma direccin. An ha
quedado el problema de salir de este modo y poner el microcontrolador en modo normal de
funcionamiento. Es obviamente necesario tener una seal externa en alguno de los pines. Esta
seal
debe ser generada por componentes electrnicos adicionales, lo que resulta en un consumo de
energa ms alto del dispositivo completo...
La solucin perfecta sera que el microcontrolador saliera del modo de reposo peridicamente por
si mismo, lo que no es imposible. El circuito que lo habilita se muestra en la figura a la izquierda.
El principio de funcionamiento es simple:
Un pin se configura como salida y se le lleva un uno lgico (1). Esto causa una carga del capacitor.
Inmediatamente despus, el mismo pin se configura como entrada. El cambio de estado lgico habilita una
interrupcin y el microcontrolador entra en modo de reposo. Slo ha quedado esperar que se descargue el
capacitor por la corriente de fuga fluyendo por el pin de entrada. Despus de la descarga, se produce una
interrupcin y el microcontrolador contina con la ejecucin de programa en modo normal. Todo el
procedimiento se repite.

En teora, esto es una solucin perfecta. El problema es que todos los pines capaces de causar
una interrupcin son digitales y tienen una corriente de fuga relativamente alta cuando el voltaje
sobre ellos no est cerca de los valores lmites de Vdd (1) o VSS (0). En este caso, el
condensador se descarga en poco tiempo ya que la corriente es de varias centenas de
microamperios. Por esta razn se dise el circuito ULPWU, capaz de indicar una lenta cada de
voltaje con un consumo de corriente mnimo. La salida genera una interrupcin, mientras que la
entrada est conectada al pin RA0 del microcontrolador. Refirindose a la Figura (R=200 ohms,
C=1nF), el tiempo de descarga es aproximadamente 30mS, mientras que un consumo total de
corriente del microcontrolador es 1000 veces ms bajo (de varias centenas de nanoamperios).
Registros PORTB y TRISB
El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISB determinan la
funcin de sus pines.

Similar al puerto PORTA, un uno lgico (1) en el registro TRISB configura el pin apropiado en el puerto
PORTB y al revs. Los seis pines de este puerto se pueden comportar como las entradas analgicas (AN).
Los bits del registro ANSELH determinan si estos pines sern configurados como entradas analgicas o
entradas/salidas digitales:
RB0 =AN12 (determinado por el bit ANS12 del registro ANSELH)

RB1 =AN10 (determinado por el bit ANS10 del registro ANSELH)

RB2 =AN8 (determinado por el bit ANS8 del registro ANSELH)

RB3 =AN9 (determinado por el bit ANS9 del registro ANSELH)

RB4 =AN11(determinado por el bit ANS11 del registro ANSELH)

RB5 =AN13 (determinado por el bit ANS13 del registro ANSELH)
Cada bit de este puerto tiene una funcin adicional relacionada a algunos mdulos perifricos integrados, que
vamos a describir en los siguientes captulos.
Este puerto dispone de varias caractersticas por las que se distingue de otros puertos y por las que sus pines
se utilizan con frecuencia:
Todos los pines del puerto PORTB tienen las resistencias pull-up integradas, que los hacen
perfectos para que se conecten con los botones de presin (con el teclado), interruptores u
optoacopladores. Con el propsito de conectar las resisitencias a los puertos del
microcontrolador, el bit apropiado del registro WPUB debe estar a uno.*

Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias virtualesno afectan a
los pines configurados como salidas, sino que sirven de un complemento til a los pines configurados como
entradas. De lo contrario, se comportaran como si fueran flotantes gracias a su alta resistencia de entrada.

* Adems de los bits del registro WPUB, hay otro bit que afecta a la instalacin de las resistencias pull-up. Es
el bit RBPU del registro OPTION_REG.
El puerto PORTB se puede utilizar como una fuente de aliemntacin. Al estar habilitado,
cada bit del puerto PORTB configurado como una entrada puede causar una interrupcin
al cambiar su estado lgico. Con el propsito de habilitar que los pines causen una
interrupcin, el bit apropiado del registro IOCB debe estar a uno.

Gracias a estas caractersticas, los pines del puerto PORTB se utilizan con frecuencia para comprobar los
botones de presin en el teclado ya que detectan cada apretn de botn infaliblemente. Por eso, no es
necesario examinar todas las entradas una y otra vez.Cuando los pines X,Y y Z se configuran como entradas
de puesta a uno (1), slo se necesita esperar una peticin de interrupcin que aparece al apretar un botn.
Ms tarde, se comprueba cul botn fue activado al combinar ceros y unos en las entradas.

Vamos a hacerlo en mikroBasic...
' El pi n PORTB. 1 se conf i gur a como ent r ada di gi t al . Se pr oduce una
i nt er r upci n con cual qui er
' cambi o de su est ado l gi co. Tambi n t i ene una r esi st enci a pul l - up.
Todos l os dems pi nes del
' puer t o PORTB son sal i das di gi t al es.
...
ANSEL, ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como
di gi t al es
PORTB = 0 ' Todos l os pi nes del puer t o PORTB se ponen a cer o
TRI SB = %00000010 ' Todos l os pi nes del puer t o PORTB except o PORTB. 1
' se conf i gur an como sal i das
OPTI ON_REG. RBPU = 0 ' Se habi l i t an l as r esi st enci as pul l - up
WPUB. 1 = 1 ' La r esi st enci a pul l - up se conect a al pi n PORTB. 1
I OCB. 1 = 1 ' El pi n PORTB. 1 puede causar una i nt er r upci n por
el
' cambi o del est ado l gi co
I NTCON. RBI E = 1 ' Se habi l i t a una i nt er r upci n por el cambi o del
est ado
' l gi co en el puer t o
I NTCON. GI E = 1 ' Se habi l i t an t odas l as i nt er r upci ones no
enmascar adas
. . .
PIN RB0/INT
El pin RB0/INT es la nica fuente verdaderade la interrupcin externa. Se puede confi-gurar de manera que
responda al borde ascendente de seal (transicin de cero a uno) o al borde descendente de seal (transicin
de uno a cero). El bit INTEDG del registro OPTION_REG selecciona la seal apropriada.
Pines RB6 y RB7
El PIC16F887 no dispone de ningn pin especial para la programacin. Esta funcin se les asigna a los pines
de E/S. Ms concretamente son los pines del puerto PORTB utilizados para la transmisin de seal de reloj
(RB6) y de datos (RB7) durante la programacin. Adems, es necesario suministrar el voltaje de alimentacin
Vdd (5V) as como el voltaje apropiado Vpp (12-14V) para la programacin de memoria FLASH. El pin MCLR
se utiliza para este propsito. No se preocupe de los detalles relacionados a este proceso, tampoco se
preocupe de cul voltaje se aplica primero puesto que el programador se encargan de eso. Se habilita cargar
el programa en el microcontrolador an despus de haber sido soldado en el dispositivo destino. Por
supuesto, el programa cargado se puede cambiar de la misma manera. Esta funcin se le denomina ICSP (In-
Circuit Serial Programming - Programacin serial en circuito). Para utilizarlo correctamente es necesario
planificar con antelacin.

Slo es necesario instalar un conector miniatura de 5 pines en el dispositivo destino para suministrar al
microcontrolador un voltaje de programacin necesario. Para evitar la interferencia entre los voltajes y el
funcionamiento de los otros mdulos conectados a los pines del microcontrolador, es necesario aislarlos de la
placa durante la programacin utilizando las resistencias o los puentes.

Como hemos visto, los voltajes aplicados a los pines del zcalo del programador son los mismos que los
utilizados durante la programacin ICSP.
Registros PORTC y TRISC
El puerto PORTC es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISC determinan la
funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro TRISC configura el pin apropiado
del puerto PORTC como entrada.

Todas las funciones adicionales del puerto PORTC se describen en los siguientes captulos.
Registros PORTD y TRISD
El puerto PORTD es un puerto bidireccional de 8 bits de anchura. Los bits del registro TRISD determinan la
funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro TRISD configura el pin apropiado
del puerto PORTD como entrada

Registros PORTE y TRISE
El puerto PORTE es un puerto bidireccional, de 4 bits de anchura.
Los bits del registro TRISE determinan la funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el
registro TRISE configura el pin apropiado del puerto PORTE como entrada.
La excepcin es el pin RE3, que siempre est configurado como entrada.

Similar a los puertos PORTA y PORTB, en este caso los tres pines se pueden configurar como entradas
analgicas. Los bits del registro ANSEL determinan si estos pines sern configurados como entradas
analgicas (AN) o entradas/salidas digitales:
RE0 =AN5 (determinado por el bit ANS5 del registro ANSEL);

RE1 =AN6 (determinado por el bit ANS6 del registro ANSEL); y

RE2 =AN7 (determinado por el bit ANS7 del registro ANSEL).
Vamos a hacerlo en mikroBasic...
' El pi n PORTE. 0 se conf i gur a como una ent r ada anal gi ca mi ent r as que
l os dems t r es pi nes
' del mi smo puer t o se conf i gur an como di gi t al es
ANSEL = %00100000 ' El pi n PORTE. 0 se conf i gur a como anal gi co
ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como di gi t al es
TRI SE = %00000001 ' Todos l os pi nes del puer t o PORTE except o el
' PORTE. 0 se conf i gur an como sal i das
PORTE = 0 ' Todos l os bi t s del puer t o PORTE se ponen a cer o
. . .
Registros ANSEL y ANSELH
Los registros ANSEL y ANSELH se utilizan para configurar el modo de entrada de un pin de E/S como
analgico o como digital.

La regla es la siguiente:
Para configurar un pin como una entrada analgica, el bit apropiado de los registros ANSEL o ANSELH se
debe poner a uno (1). Para configurar un pin como una entrada/salida digital, el bit apropiado se debe poner a
cero (0).

El estado lgico de los bits del registro ANSEL no tiene influencia en las funciones de salidas digitales. Al
intentar a leer un pin de puerto configurado como una entrada analgica, el resultado es siempre 0.

En breve
Es probable que usted nunca vaya a escribir un programa que no utilice puertos, as que el esfuerzo para
aprender todo sobre ellos en definitiva vale la pena. De todos modos, los puertos son probablemente los
mdulos ms simples dentro del microcontrolador. Se utilizan de la siguiente manera:
Al disear un dispositivo, seleccione un puerto por el que el microcontrolador comunicar al
entorno perifrico. Si usted utiliza slo entradas/salidas digitales, seleccione cualquier
puerto. Si utiliza alguna de las entradas analgicas, seleccione los puertos apropiados que
soportan al configuracin de los pines (AN0-AN13).
Cada pin del puerto se puede configurar como salida o como entrada. Los bits de los
registros TRISA,TRISB, TRISC, TRISD y TRISE determinan cmo se comportarn los
pines apropiados de los puertos PORTA, PORTB, PORTC, PORTD y PORTE.
Simplemente...
Si utiliza alguna de las entradas analgicas, primero es necesario poner a uno los bits
apropiados de los registros ANSEL y ANSELH en el principio de programa.
Si utiliza resistencias o botones de presin como una fuente de seal de entrada,
conctelos a los pines del puerto PORTB, ya que tienen las resistencias pull-up. El uso de
estos registros est habilitado por el bit RBPU del registro OPTION_REG, mientras que la
instalacin de las resistencias individuales est habilitada por los bits del registro WPUB.
Con frecuencia se necesita responder tan pronto como los pines de entrada cambien su
estado lgico. Sin embargo, no es necesario escribir un programa para comprobar el
estado lgico de los pines. Es mucho ms simple conectar estas entradas a los pines del
puerto PORTB y habilitar que ocurra una interrupcin con cada cambio de voltaje. Los bits
de los registros IOCB e INTCON se encargan de eso.
3.4 TEMPORIZADOR TIMER0
El microcontrolador PIC16F887 dispone de tres temporizadores/contadores independientes, denominados
Timer0, Timer1 y Timer2. En este captulo se presenta una descripcin detallada de los mismos.
El temporizador Timer0 tiene una amplia gama de aplicaciones en la prctica. Slo unos pocos programas no
lo utilizan de alguna forma. Es muy conveniente y fcil de utilizar en programas o subrutinas para generar
pulsos de duracin arbitraria, en medir tiempo o en contar los pulsos externos (eventos) casi sin limitaciones.
El mdulo del temporizador Timer0 es un temporizador/contador de 8 bits con las siguientes caractersticas:
Temporizador/contador de 8 bits;
Pre-escalador de 8 bits (lo comparte con el temporizador perro guardin);
Fuente de reloj interna o externa programable;
Generacin de interrupcin por desbordamiento; y
Seleccin del flanco de reloj externo programable.
La siguiente figura muestra el esquema del temporizador Timer0 con todos los bits que determinan su
funcionamiento. Estos bits se almacenan en el registro OPTION_REG.

Registro OPTION_REG

RBPU - PORTB Pull-up enable bit (resistencia Pull Up del puerto PORTB)
o 0 - Resistencias pull-up del puerto PORTB estn deshabilitadas.
o 1 - Pines del puerto PORTB pueden estar conectados a las resistencias pull-up.
INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupcin
externa)
o 0 - Interrupcin por flanco ascendente en el pin INT (0-1).
o 1 - Interrupcin por flanco descendente en el pin INT (1-0).
T0CS - TMR0 Clock Select bit (bit selector de tipo de reloj para el Timer0)
o 0 - Los pulsos se llevan a la entrada del temporizador/contador Timer0 por el pin RA4.
o 1 - El temporizador utiliza los pulsos de reloj internos (Fosc/4).
T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco)
o 0 - Incrementa en flanco descendente en el pin TMR0.
o 1 - Incrementa en flanco ascendente en el pin TMR0.
PSA - Prescaler Assignment bit (bit de asignacin del pre-escalador)
o 0 - Pre-escalador se le asigna al WDT.
o 1 - Pre-escalador se le asigna al temporizador/contador Timer0.
PS2, PS1, PS0 - Prescaler Rate Select bit (bit selector del valor del divisor de
frecuencias)
o El valor del divisor de frecuencias se ajusta al combinar estos bits. Como se muestra en la tabla a la
derecha, la misma combinacin de bits proporciona los diferentes valores del divisor de frecuencias
para el temporizador/contador Timer0 y el temporizador perro guardin, respectivamente.
PS2 PS1 PS 0 T MR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
Cuando el bit PSA est a 0, el pre-escalador se le asigna al temporizador/contador Timer0, como se muestra
en la siguiente figura:

Vamos a hecerlo en mikroBasic...
' En est e ej empl o, Ti mer 0 se conf i gur a como un t empor i zador y se l e
asi gna un pr e- escal ador .
unsi gned cnt ' Decl ar ar l a var i abl e cnt
sub procedure interrupt ' Rut i na de i nt er r upci n
cnt = cnt + 1 ' I nt er r upci n causa el i ncr ement o de cnt por 1
TMR0 = 155 ' Tempor i zador ( o cont ador ) Ti mer 0 devuel ve su
val or i ni ci al
I NTCON = 0x20 ' Bi t T0I E est a 1, bi t T0I F est a 0

end sub
mai n:
OPTI ON_REG = 0x04 ' Pr e- escal ador ( 1: 32) se l e asi gna al
t empor i zador Ti mer 0
TMR0 = 155 ' Ti mer 0 cuent a de 155 a 255
I NTCON = 0xA0 ' Habi l i t ada l a i nt er r upci n por el
desbor dami ent o en el r egi st r o TMR0
. . .
. . .
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
' En el si gui ent e ej empl o, Ti mer 0 se conf i gur a como un t empor i zador y se
l e asi gna
' un pr e- escal ador .
OPTI ON_REG = 0x20 ' Pr e- escal ador ( 1: 2) se l e asi gna al Ti mer 0
TMR0 = 155 ' Ti mer 0 cuent a de 155 a 255
I NTCON = 0xA0 ' Habi l i t ada l a i nt er r upci n por el
desbor dami ent o en el
' r egi st r o TMR0
. . .
Cuando el bit PSA est a 1, el pre-escalador se le asigna al temporizador perro guardin como se muestra en
la siguiente figura:

Vamos a hacerlo en mikroBasic...
' En est e ej empl o, el pr e- escal ador ( 1: 64) se l e asi gna al t empor i zador
per r o guar di n.
mai n:
OPTI ON_REG = 0x0E ' Pr e- escal ador se l e asi gna al WDT ( 1: 64)
asm
CLRWDT ' Comando en ensambl ador par a r ei ni ci ar el WDT
end asm
. . .
. . .
asm
CLRWDT ' Comando en ensambl ador par a r ei ni ci ar el WDT
end asm
. . .
Aparte de lo dicho anteriormente, cabe destacar lo siguiente:
Al asignarle el pre-escalador al temporizador/contador, el pre-escalador se pondr a 0 con
cualquier escritura en el registro TMR0.
Al asignar el pre-escalador al temporizador perro guardin, tanto el WDT como el pre-
escalador se pondrn a 0 con la instruccin CLRWDT.
Al escribir en el registro TMR0, utilizado como un temporizador, no se inicia el conteo de
los pulsos inmediatamente, sino con retraso de dos ciclos de instrucciones. Por
consiguiente, es necesario ajustar el valor escrito en el registro TMR0.
Al poner el microcontrolador en el modo de reposo se apaga el oscilador de reloj. No
puede ocurrir el desbordamiento ya que no hay pulsos a contar. Es la razn por la que la
interrupcin por el desbordamiento del TMR0 no puededespertar al procesador del modo
de reposo..
Si se utiliza como un contador de reloj externo sin pre-escalador, la longitud de pulso
mnima o tiempo muerto entre dos pulsos deber ser 2 Tosc +20 nS (Tosc es el perodo
de seal de reloj del oscilador).
Si se utiliza como un contador de reloj externo con pre-escalador, la longitud de pulso
mnima o tiempo muerto entre dos pulsos es slo 10nS.
El registro del pre-escalador de 8 bits no est disponible al usuario, lo que significa que no
es posible leerlo o escribir en l directamente.
Al cambiar de asignacin del pre-escalador del Timer0 al temporizador perro guardin, es
necesario ejecutar la siguiente secuencia de instrucciones escritas en ensamblador para
impedir reiniciar el microcontrolador:
BANKSEL TMR0
CLRWDT ;PONER A CERO WDT
CLRF TMR0 ; PONER A CERO TMR0 Y PRE- ESCALADOR
BANKSEL OPTI ON_REG
BSF OPTI ON_REG, PSA ; ASI GNARLE EL PRE- ESCALADOR AL WDT
CLRWDT ; PONER A CERO WDT
MOVLWb 11111000 ;; SELECCI ONAR LOS BI TS PS2, PS1, PS0 Y PONERLOS
ANDWF OPTI ON_REG, W;A CERO POR LA I NSTRUCCI N Y LGI CO
I ORLWb 00000101 ;BI TS PS2, PS1, Y PS0 PONEN EL VALOR
MOVWF OPTI ON_REG ;DEL DI VI SOR DE FRECUENCI AS A 1: 32
De manera similar, al cambiar de asignacin del pre-escalador del WDT al Timer0, es
necesario ejecutar la siguiente secuencia de instrucciones, tambin escritas en
ensamblador:
BANKSEL TMR0
CLRWDT ;PONER A CERO WDT Y PRE- ESCALADOR
BANKSEL OPTI ON_REG
MOVLWb 11110000 ;SELECCI ONAR SLO LOS BI TS PSA, PS2, PS1, PS0
ANDWF OPTI ON_REG, W;Y PONERLOS A CERO POR LA I NSTRUCCI N Y LGI CO
I ORLWb 00000011 ; VALOR DEL DI VI SOR DE FRECUENCI AS ES 1: 16
MOVWF OPTI ON_REG
En breve
Para utilizar el Timer0 apropiadamente, es necesario:
Paso 1: Seleccionar el modo:
El modo de temporizador se selecciona por el bit TOSC del registro OPTION_REG (TOSC:
0=temporizador, 1=contador).
Cuando se asigna el pre-escalador al temporizador/contador se debe poner a cero el bit
PSA del registro OPTION_REG. El valor del divisor de frecuencias se configura al
utilizar los bits PS2-PS0 del mismo registro.
Al utilizar una interrupcin, los bits GIE y TMR0IE del registro INTCON deben estar a uno.
Paso 2: Medir y contar
Para medir tiempo:
Reiniciar el registro TMR0 o escribir un valor conocido en l.
El tiempo transcurrido(en microsegundos al utilizar el oscilador de 4MHz) se mide al leer el
registro TMR0.
El bit de bandera TMR0IF del registro INTCON se pone a uno automticamente siempre
que ocurra el desbordamiento del registro TMR0. Si est habilitada, ocurre una
interrupcin.
Para contar pulsos:
La polaridad de pulsos a contar en el pin RA4 se selecciona por el bit TOSE del registro
OPTION_REG (T0SE: 0=pulsos positivos, 1=pulsos negativos).
Varios pulsos se pueden leer del registro TMR0. El pre-escalador y la interrupcin se
utilizan de la misma forma que en el modo de temporizador.
3.5 TEMPORIZADOR TIMER1
El mdulo del temporizador Timer1 es un temporizador/contador de 16 bits, lo que significa que consiste en
dos registros (TMR1L y TMR1H). Puede contar hasta 65535 pulsos en un solo ciclo, o sea, antes de que el
conteo se inicie desde cero.

Similar al temporizador Timer0, estos registros se pueden leer o se puede escribir en ellos en cualquier
momento. En caso de que ocurra un desbordamiento, se genera una interrupcin si est habilitada.

El mdulo del temporizador Timer1 puede funcionar en uno o dos modos bsicos, eso es como un
temporizador o como un contador. A diferencia del temporizador Timer0, cada uno de estos dos modos tiene
funciones adicionales.
El temporizador Timer1 tiene las siguientes caractersticas:
Temporizador/contador de 16 bits compuesto por un par de registros;
Fuente de reloj interna o externa programable;
Pre-escalador de 3 bits;
Oscilador LP opcional;
Funcionamiento sncrono o asncrono;
Compuerta para controlar el temporizador Timer1 (conteo habilitado) por medio del
comparador o por el pin T1G;
Interrupcin por desbordamiento;
Despierta al microcontrolador (salida del modo de reposo) por desbordamiento (reloj
externo); y
Fuente de reloj para la funcin de Captura/Comparacin.

Esquema simplificado del temporizador Timer1
SELECCIN DE LA FUENTE DE RELOJ DEL TEMPORIZADOR TIMER1
El bit TMR1CS del registro T1CON se utiliza para seleccionar la fuente de reloj para este temporizador:
FUE NTE DE REL OJ TMR1 CS
Fosc/4 0
pin T1CKI 1
Al seleccionar la fuente de reloj interna, el par de registros TMR1H-TMR1L ser incrementado con varios
pulsos Fosc como es determinado por el pre-escalador.

Al seleccionar la fuente de reloj externa, este temporizador puede funcionar como un temporizador o un
contador. Los pulsos en el modo temporizador pueden estar sincronizados con el reloj interno del
microcontrolador o funcionar asncronamente.
PRE-ESCALADOR DEL TEMPORIZADOR TIMER1
El temporizador Timer1 tiene un escalador completamente separado que permite dividir la frecuencia de
entrada de reloj por 1, 2, 4 o 8. No es posible leer el pre-escalador o escribir en l directamente. De todas
formas, el contador del pre-escalador se pone a 0 automticamente despus de escribir en los registros
TMR1H o TMR1L.
OSCILADOR DEL TIMER1
Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar los pulsos que vienen de los dispositivos
perifricos, pero tambin tienen una funcin adicional. Como se puede ver en la siguiente figura, se configuran
simultneamente como entrada (pin RC1) y salida (pin RC0) del oscilador de cuarzo LP (Low Power - de bajo
consumo) adicional. Este circuito est principalmente diseado para funcionar a bajas frecuencias (hasta 200
KHz), exactamente para el uso de cristal de cuarzo de 32.768 KHz. Este cristal se utiliza en los relojes de
cristal puesto que es fcil de obtener un pulso de duracin de un segundo al dividir esta frecuencia. Como el
oscilador no depende del reloj interno, puede funcionar incluso en el modo de reposo. Se habilita al poner a
uno el bit de control T1OSCEN del registro T1CON. El usuario debe proporcionar tiempo muerto por medio de
software (unos pocos milisegundos) para habilitar que el oscilador se inicie apropiadamente.

La siguiente tabla muestra los valores recomendados de los capacitores convenientes con el
oscilador de cuarzo. No es necesario que estos valores sean exactos. De todas formas, la regla
general es: cunto ms alta sea la capacidad, tanto ms alta ser la estabilidad, lo que a la vez
prolonga el tiempo necesario para la estabilizacin del oscilador.
OSC I L AD OR FR ECUENC I A C 1 C2
LP
32 kHz 33 pF 33 pF
100 kHz 15 pF 15 pF
200 kHz 15 pF 15 pF
El consumo de corriente del microcontrolador se reduce a nivel ms bajo en el modo de reposo ya que el
consumidor de corriente principal - el oscilador - no funciona. Es fcil de poner al microcontrolador en este
modo - al ejecutar la instruccin SLEEP. El problema es cmo despertar al microcontrolador, o sea cmo
generar una interrupcin para despertarlo. Como el microcontrolador duerme, se debe usar una
interrupcin causada por dispositivos perifricos para despertarlo. Se pone muy complicado si es necesario
despertar al microcontrolador a intervalos de tiempo regulares...
Para resolver el problema, un oscilador de cuarzo LP (de bajo consumo de corriente) completamente
independiente, capaz de funcionar en el modo de reposo, est integrado en el microcontrolador PIC16F887.
Simplemente, un circuito anteriormente separado ahora est integrado en el microcontrolador y asignado al
temporizador Timer1. El oscilador est habilitado al poner a 1 el bit T1OSCEN del registro T1CON. El bit
TMR1CS del mismo re-gistro se utiliza para habilitar que el temporizador Timer1 utilice secuencias de pulsos
de ese oscilador.

Una seal generada por este oscilador de cuarzo est sincronizada con el reloj del
microcontrolador al poner a 0 el bit T1SYNC. En este caso, el temporizador no puede
funcionar en modo de reposo porque el circuito para sincronizacin utiliza el reloj del
microcontrolador.
La interrupcin por desbordamiento en el registro del temporizador Timer1 puede estar
habilitada. Si el bit T1SYNC se pone a 1, tales interrupciones se producirn en el modo de
reposo tambin.
COMPUERTA DEL TEMPORIZADOR TIMER1
El pin TG1 o la salida del comparador C2 pueden ser una fuente de los pulsos que pasan por la compuerta del
temporizador Timer1. Se configuran por software. Esta compuerta permite que el temporizador mida
directamente la duracin de los eventos externos al utilizar el pin T1G o las seales analgicas al utilizar la
salida del comparador C2. Refirase a la Figura en la pgina 163. Para medir duracin de seal, basta con
habilitar esta compuerta y contar los pulsos en el registro TMR1.
TIMER1 EN EL MODO CONTADOR
El temporizador Timer1 se pone a funcionar como un contador al poner a 1 el bit TMR1CS. Este bit cuenta los
pulsos llevados al pin PC0/T1CKI y se incrementa en el flanco ascendente de la entrada del reloj externo
T1CKI. Si el bit de control T1SYNC del registro T1CON se pone a 0, las entradas del reloj externo se
sincronizarn antes de llegar al par del registro TMR1. En otras palabras, el temporizador Timer1 se
sincroniza con el reloj interno del microcontrolador y se le denomina contador sncrono.
Al poner en modo de reposo el microcontrolador que funciona en el modo contador, los registros del
temporizador TMR1H y TMR1L no sern incrementados aunque los pulsos de reloj aparezcan en los pines de
entrada. Como el reloj interno del microcontrolador no funciona en este modo, no hay entradas de reloj que se
utilicen para la sincronizacin. De todas formas, el pre-escalador sigue funcionando siempre que haya pulsos
de reloj en los pines, porque es un simple divisor de frecuencias.

Este contador detecta un uno lgico (1) en los pines de entrada. Cabe destacar que al menos un flanco
ascendente debe ser detectado antes de empezar a contar los pulsos. Refirase a la Figura a la izquierda.
Las flechas en la figura indican los incrementos del contador.

TIMER1 EN EL MODO TEMPORIZADOR
Para seleccionar este modo, es necesario poner a 0 el bit TMR1CS. Despus de eso, el re-gistro de 16 bits
ser incrementado con cada pulso generado por el oscilador interno. Si se utiliza el cristal de cuarzo de 4
MHZ, el registro ser incrementado cada microsegundo.

En este modo, el bit T1SYNC no afecta al temporizador porque cuenta los pulsos de reloj interno. Como todos
los dispositivos utilizan estos pulsos, no hace falta sincronizarlos.

El oscilador de reloj del microcontrolador no funciona durante el modo de reposo as que el desbordamiento
en el registro del temporizador no puede causar interrupcin en este modo.
Vamos a hacerlo en mikroBasic...
' En est e ej empl o, el Ti mer 1 est conf i gur ado como un t empor i zador con
el val or del
' pr e- escal ador 1: 8. Cada vez que ocur r a un desbor dami ent o de l os
r egi st r os TMR1H
' y TMR1L, se sol i ci t ar una i nt er r upci n.

mai n:
. . .
PI R1. TMR1I F = 0 ' Poner a 0 l a bander a de bi t del TMR1I F
TMR1H = 0x22 ' Poner el val or i ni ci al par a el t empor i zador Ti mer 1
TMR1L = 0x00
T1CON. TMR1CS = 0 ' Ti mer 1 cuent a l os pul sos del osci l ador i nt er no
T1CON. T1CKPS0 = 1 ' El val or del pr e- escal ador asi gnada es 1: 8
T1CON. T1CKPS1 = 1
PI E1. TMR1I E = 1 ' I nt er r upci n habi l i t ada por desbor dami ent o
I NTCON = 0xC0 ' I nt er r upci n habi l i t ada ( bi t s GI E y PEI E)
T1CON. TMR1ON = 1 ' Encender el t empor i zador Ti mer 1
. . .
Registro T1CON
Los bits del registro T1CON estn en control del funcionamiento del temporizador Timer1.

T1GINV - (Bit inversor de la compuerta del temporizador1) se comporta como un inversor del estado lgico en
la compuerta formada por el pin T1G o la salida (C2OUT) del comparador C2. Este bit habilita al temporizador
para contar los pulsos cuando la compuerta est a alto o a bajo.
1 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn a alto (1).
0 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn a bajo (0).
TMR1GE - (Bit de habilitacin de la compuerta del temporizador Timer1) determina si la compuerta formada
por el pin T1G o salida del comparador C2 (C2OUT) estar activa o no. Este bit es funcional slo en caso de
que el temporizador Timer1 est encendido (el bit TMR1ON =1). De lo contrario, este bit se ignora.
1 - Temporizador Timer1 est encendido slo si la compuerta no est activa.
0 - Compuerta no afecta al temporizador Timer1.
T1CKPS1, T1CKPS0 - (Bits de seleccin del pre-escalador de seal de reloj del Temporizador1) determina el
valor del divisor de frecuencias asignada al temporizador Timer1.
T 1 CK PS 1 T1 CK PS0 V A L OR DEL PRE - ESC A L AD OR
0 0 1:1
0 1 1:2
1 0 1:4
1 1 1:8
T1OSCEN - (bit de habilitacin del oscilador LP del Timer1)
1 - Oscilador LP est habilitado para el reloj del Timer1 (oscilador de bajo consumo y de
frecuencia de 32.768 kHz).
0 - Oscilador LP est apagado.
T1SYNC - (Bit de control de sincronizacin de la seal de entrada) habilita la sincronizacin de la entrada del
oscilador LP o de la entrada del pin T1CKI con el reloj interno del microcontrolador. Este bit se ignora al contar
los pulsos desde el oscilador principal (el bit TMR1CS =0).
1 - Entrada de reloj externa no est sincronizada.
0 - Entrada de reloj externa est sincronizada.
TMR1CS - (bit de seleccin de la fuente de reloj del temporizador Timer1)
1 - Cuenta los pulsos por el pin T1CKI (por el flanco ascendente 0-1)
0 - Cuenta los pulsos del reloj interno del microcontrolador
TMR1ON - (TMR activo, hace entrar o no en funcionamiento el Timer1).
1 - Habilita el temporizador Timer1.
0 - Deshabilita el temporizador Timer1.
En breve
Para utilizar el Timer1 apropiadamente, es necesario hacer lo siguiente:
Como no es posible apagar el pre-escalador, su valor debe estar ajustado a los bits
T1CKPS1 y T1CKPS0 del registro T1CON (Refirase a la tabla anterior).
Seleccionar el modo por el bit TMR1CS del registro T1CON. TMR1CS: 0=la fuente de reloj
es oscilador de cuarzo interno, 1=la fuente de reloj es oscilador de cuarzo externo.
Al configurar el bit T1OSCEN del mismo registro, el oscilador est habilitado y los registros
TMR1H y TMR1L se incrementan con cada pulso de reloj. Al poner este bit a 0, se detiene
el conteo.
Al reiniciar los registros del contador o al escribir en ellos, se reinicia el pre-escalador.
Al llenar ambos registros del temporizador, la bandera TMR1IF se pone a uno y el conteo
empieza desde cero.
3.6 TEMPORIZADOR TIMER2
El temporizador Timer2 es un temporizador de 8 bits.

Los pulsos que vienen del oscilador de cuarzo primero pasan por el pre-escalador cuyo valor puede ser
modificado al combinar los bits T2CKPS1 y T2CKPS0. La salida del pre-escalador se utiliza para incrementar
el registro TMR2 empezando por 00h. Los valores del TMR2 y del PR2 se comparan constantemente y el
registro TMR2 va incrementndose hasta alcanzar el valor del registro PR2. Cuando se igualan los valores de
los registros, lo que ser registrado por el comparador, el Timer2 se reinicia automticamente. El post-
escalador del temporizador Timer2 se incrementa con cada igualdad de valores y su salida se utiliza para
generar una interrupcin si est habilitada.
Los ambos registros TMR y PR2 son de lectura y escritura. El conteo se puede detener al poner a 0 el bit
TMR2ON, lo que resulta en un ahorro de energa.
El momento de reinicio del TMR2 se puede utilizar para determinar la velocidad de transmisin en baudios de
la comunicacin serie sncrona.
Varios bits del registro T2CON estn en control del temporizador Timer2.
Registro T2CON

TOUTPS3 - TOUTPS0 - (bits de seleccin del rango del divisor del post-escalador para el Timer2) se utilizan
para determinar el valor del post-escalador segn la siguiente tabla:
T OUTPS 3 TOU TPS2 TOUT PS1 TOUTP S0 V A L OR DEL P OST - ES C A L AD OR
0 0 0 0 1:1
0 0 0 1 1:2
0 0 1 0 1:3
0 0 1 1 1:4
0 1 0 0 1:5
0 1 0 1 1:6
0 1 1 0 1:7
0 1 1 1 1:8
1 0 0 0 1:9
1 0 0 1 1:10
1 0 1 0 1:11
1 0 1 1 1:12
1 1 0 0 1:13
1 1 0 1 1:14
1 1 1 0 1:15
1 1 1 1 1:16
TMR2ON - (bit de activacin del TIMR2) hace entrar en funcionamiento el temporizador Timer2.
1 - Habilita el funcionamiento del Timer2.
0 - Deshabilita el funcionamiento del Timer2.
T2CKPS1, T2CKPS0 - (seleccin del rango del divisor del pre-escalador del Timer2) determina el valor del
divisor de frecuencias:
T2 CK P S1 T 2 CK P S0 V AL OR D EL P OST - ESC A L AD OR
0 0 1:1
0 1 1:4
1 x 1:16
En breve
Al utilizar el temporizador Timer2 hay que saber varios detalles relacionados con sus registros:
En el momento de encender una fuente de alimentacin, el registro PR2 contiene el valor
FFh.
Tanto el pre-escalador como el post-escalador se borran al escribir en el registro TMR2.
Tanto el pre-escalador como el post-escalador se borran al escribir en el registro T2CON.
Al producirse cualquier reinicio, como puede anticiparse, tanto el pre-escalador como el
post-escalador se borran.
3.7 MDULOS CCP
Los mdulos CCP pueden funcionar en muchos modos diferentes, por lo que se consideran los ms
complicados. Si usted intenta analizar su funcionamiento a base de tablas que describen las funciones de bits,
comprender mejor de lo qu le estamos hablando. Si utiliza alguno de los mdulos CCP, primero seleccione
el modo que necesita, analice la figura apropiada y entonces pngase a modificar los bits de registros. Si no...
El mdulo CCP (Captura/Comparacin/PWM) es un perifrico que le permite medir y controlar diferentes
eventos. Como indica su nombre, puede funcionar en tres modos diferentes:
El modo de captura proporciona el acceso al estado actual de un registro que cambia su valor
constantemente. En este caso, es el registro del temporizador Timer1.
El modo de comparacin compara constantemente valores de dos registros. Uno de ellos es el registro del
temporizador Timer1.
PWM (Pulse Width Modulation - modulacin por ancho de pulsos) puede generar seales de frecuencia y de
ciclo de trabajo variados por uno o ms pines de salida.
El microcontrolador PIC16F887 dispone de dos mdulos CCP - CCP1 y CCP2. Ambos son idnticos en modo
normal de funcionamiento, mientras que las caractersticas del PWM mejorado estn disponibles slo en el
modo CCP1. sta es la razn por la que en este captulo se describe detalladamente el funcionamiento del
mdulo CCP1. Con respecto al CCP2, se presentarn slo las caractersticas que lo distinguen del CCP1.
MDULO CP1
Una parte central de este circuito es un registro CCPR1 de 16 bits que consiste en registros CCPR1L y
CCOR1H. Se utiliza para capturar los nmeros binarios desde el registro del temporizador TMR1(TMR1H y
TMR1L) o para comparar los nmeros binarios almacenados en los registros CCPR1 y TMR1.

Si est habilitado por software, puede ocurrir el reinicio del temporizador Timer1 al igualarse los valores en
modo de Comparacin. Adems, el mdulo CCP1 puede generar seales PWM de frecuencia y de ciclo de
trabajo variados.

Los bits del registro CCP1CON estn en control del mdulo CCP1.
CCP1 EN MODO DE CAPTURA
En este modo, registro CCP1 (que consiste en los registros CCPR1H y CCPR1L) captura el valor de 16 bits
del registro del temporizador TMR1 (que consiste en los registros TMR1H y TMR1L) en las siguientes
situaciones:
Cada flanco ascendente (1 g 0) en el pin RC2/CCP;
Cada flanco descendente (0 g 1) en el pin RC2/CCP1;
Cada cuarto flanco ascendente (0g 1) en el pin RC2/CCP1; y
Cada decimosexto flanco descendente (0g 1) en el pin RC2/CCP1.
Al combinar cuatro bits (CCP1M3, CCP1M2, CCP1M1 y CCP1M0) del registro de control se determina cul de
estos eventos causar la captura de dato de 16 bits. Adems, se deben cumplir los siguientes requisitos:
El pin RC2/CCP1 debe estar configurado como entrada; y
El Timer1 debe funcionar como temporizador o contador sncrono.

El bit de bandera CCP1IF se pone a uno despus de acabar la captura. Si se pone a 1 el bit CCP1IE del
registro PIE1, se producir una interrupcin.
Cuando el mdulo CCP1 sale del modo de captura, puede producirse una interrupcin de captura no deseada.
Para evitarlo, antes de que ocurra un cambio en el registro de control CCP1CON se deben poner a 0 tanto el
bit que habilita la interrupcin CCP1IE, como el bit de bandera CCP1IF.
Las interrupciones no deseadas pueden producirse al cambiar el valor del pre-escalador. Para evitarlo, el
mdulo CCP1 debe estar apagado temporalmente antes de cambiar el valor del pre-escalador. Se recomienda
la siguiente secuencia de programa, escrita en ensamblador:
BANKESEL CCP1CON
CLRF CCP1CON ' REGI STRO DE CONTROL BORRADO
' MDULO CCP1 EST APAGADO
MOVLWXX ' NUEVO MODO DEL PRE- ESCALADOR EST SELECCI ONADO
MOVWF CCP1CON ' MDULO CCP1 SE ENCI ENDE SI MULTNEAMENTE
'MDULO CCP1 SE ENCI ENDE SI MULTNEAMENTE
Vamos a hacerlo en mikroBasic...
. . .
asm
BANKESEL CCP1CON
CLRF CCP1CON 'REGI STRO DE CONTROL BORRADO
'MDULO CCP1 EST APAGADO
MOVLWXX 'NUEVO MODO DEL PRE- ESCALADOR EST SELECCI ONADO
MOVWF CCP1CON ' EN EL REGI STRO DE CONTROL SE I NTRODUCE UN NUEVO VALOR
'MDULO CCP1 SE ENCI ENDE SI MULTNEAMENTE
end asm
. . .
CCP1 EN MODO DE COMPARACIN
En este modo, el valor almacenado en el registro CCP1 se compara constantemente al valor almacenado en
el registro del temporizador TMR1. Al igualarse los valores, el estado lgico en el pin de salida RC2/CCP1
puede ser cambiado, lo que depende del estado de bits en el registro de control (CCP1M3 - CCP1M0). El bit
de bandera CCP1IF se pone a uno simultneamente.

Para poner el mdulo CCP1 en este modo de funcionamiento, se deben cumplir dos condiciones:
El pin RC2/CCP1 debe estar configurado como salida; y
El temporizador Timer1 debe estar sincronizado con el reloj interno.
CCP1 EN MODO PWM
Las seales de frecuencia y de ciclo de trabajo variados tienen una amplia gama de aplicaciones en
automatizacin. Un ejemplo tpico es un circuito de control de potencia. Refirase a la siguiente figura. Si un
cero lgico (0) indica un interruptor abierto y un uno lgico (1) indica un interruptor cerrado, la potencia
elctrica que se transmite a los consumidores ser directamente proporcional a la duracin del pulso. Esta
relacin se le denomina Ciclo de Trabajo.

El otro ejemplo, comn en la prctica, es el uso de seales PWM en un circuito para generar seales de forma
de onda arbitraria como una onda sinusoidal. Vea la siguiente figura:

Los dispositivos que funcionan segn este principio se utilizan con frecuencia en la prctica como variadores
de frecuencia ajustable que controlan motores elctricos (velocidad, aceleracin, desaceleracin etc.).

La Figura anterior muestra el diagrama de bloques del mdulo CCP1 puesto en el modo PWM. Para generar
un pulso de forma arbitraria en el pin de salida, es necesario ajustar el perodo de pulsos (frecuencia) y la
duracin de pulsos.

PERODO PWM
El perodo de pulso de salida (T) depende del valor almacenado en el registro PR2 del temporizador Timer2.
El perodo de PWM se puede calcular por la siguiente ecuacin:
Perodo PWM =(PR2 +1) * 4Tosc * Valor de pre-escala del TMR2
Si el perodo de PWM (T) es conocido, es fcil caluclar la frecuencia de seal (F), porque estos dos valores
estn relacionados por la ecuacin F=1/T.
ANCHO DE PULSOS DE PWM
El ancho de pulsos de PWM se especifica al utilizar en total 10 bits: los ocho bits ms significativos del registro
CCPR1L y los dos bits menos significativos del registro CCP1CON (DC1B1 y DC1B0). El resultado es un
nmero de 10 bits dado por la siguiente frmula:
Ancho de pulsos =(CCPR1L,DC1B1,DC1B0) * Tosc * Valor de pre-escala del TMR2
La siguiente tabla muestra cmo generar las seales PWM de diferentes frecuencias cuando el
microcontrolador utiliza un cristal de cuarzo de 20 MHz (Tosc=50nS).
FRE CUENCI A [ K H Z] 1 . 2 2 4 . 8 8 1 9 . 5 3 7 8 . 1 2 1 5 6 . 3 2 0 8 . 3
Pre-escalador del TMR2 16 4 1 1 1 1
Registro PR2 FFh FFh FFh 3Fh 1Fh 17h
CICLO DE TRABAJO DE PWM
El ciclo de trabajo se obtiene al dividir el ancho de pulsos por el perodo:
Ciclo de trabajo =(CCPR1L,DC1B1,DC1B0) / ( 4(PR2 +1))
Notas adicionales:
El pin de salida se va a poner a 1 constantemente, si por error el ancho de pulso generado
es ms largo que el perodo de PWM.
En este caso, no se puede utilizar el post-escalador del temporizador Timer2 para generar
perodos de PWM largos.
RESOLUCIN DE SEAL PWM
Una seal PWM no es nada ms que una secuencia de pulsos que varan su ciclo de trabajo. Para una
frecuencia especfica (nmero de pulsos por segundo), hay un nmero limitado de combinaciones de ciclos de
trabajo. Este nmero representa una resolucin medida en bits. Por ejemplo, si una resolucin es de 10 bits
estarn disponibles 1024 ciclos de trabajo discretos; si una resolucin es de 8 bits estarn disponibles 256
ciclos de trabajo disretos etc. En este microcontrolador la resolucin depende del contenido del registro PR2.
La mxima resolucin se obtiene al introducir el nmero FFh en este registro.
Frecuencias y resoluciones de seales PWM (Fosc =20MHz):
FRE CUENCI A P WM 1 . 2 2 K HZ 4 . 8 8 K HZ 1 9 . 5 3 K H Z 7 8 . 1 2 K HZ 1 5 6 . 3 K HZ 2 0 8 . 3 K HZ
Pre-escala del temporizador 16 4 1 1 1 1
Valor del PR2 FFh FFh FFh 3Fh 1Fh 17h
Resolucin mxima 10 10 10 8 7 6
PWM signals' frequences and resolutions (Fosc =8MHz):
FR ECUENC I A P WM 1 . 2 2 K HZ 4 . 9 0 K HZ 1 9 . 6 1 K HZ 7 6 . 9 2 K HZ 1 5 3 . 8 5 K H Z 2 0 0 . 0 K HZ
Pre-escala del temporizador 16 4 1 1 1 1
Valor del PR2 65h 65h 65h 19h 0Ch 09h
Resolucin mxima 8 8 8 6 5 5
Vamos a hacerlo en mikroBasic...
' En est e ej empl o, el mdul o PWMest i ni ci al i zado y aj ust ado par a
pr oduci r una secuenci a
' de pul sos de ci cl o de t r abaj o del 50%. Par a est e pr opsi t o, se
ut i l i zan l as f unci ones
' PWM1_I ni t ( ) , PWM1_St ar t ( ) y PWM1_Set _Dut y( ) . Todas l as f unci ones l as
cont i ene l a
' l i br er a PWM del mi kr oC PRO f or PI C. Sl o es necesar i o copi ar l as al
pr ogr ama.

dim dut y_c as byte ' Def i ni r l a var i abl e dut y_c
. . .
sub procedure I ni t Mai n( )
ANSEL, ANSELH = 0 ' Todos l os pi nes de E/ S se conf i gur an como
di gi t al es
PORTC, TRI SC = 0 ' Est ado i ni ci al de l os pi nes de sal i da del puer t o
PORTC
PWM1_I ni t ( 5000) ' I ni ci al i zaci n del mdul o PWM ( 5KHz)

end sub
mai n:
I ni t Mai n( )
dut y_c = 127 ' Val or i ni ci al del ci cl o de t r abaj o
PWM1_St ar t ' I ni ci ar el mdul o PWM1
PWM1_Set _Dut y( dut y_c) ' Aj ust ar el ci cl o de t r abaj o de PWM al 50%
. . .
. . .
Registro CCP1CON
C CP1 M3 CCP1 M2 CC P1 M1 CCP1 M0 MOD O
0 0 0 0 Mdulo est deshabilitado (reinicio)
0 0 0 1 No utilizado
0 0 1 0
Modo de comparacin
El bit CCP1IF bit se pone a 1 al ocurrir una coincidencia.
0 0 1 1 No utilizado
0 1 0 0
Modo de captura
Cada flanco descendente en el pin CCP1
0 1 0 1
Modo de captura
Cada flanco ascendente en el pin CCP1
0 1 1 0
Modo de captura
Cada cuarto flanco ascendente en el pin CCP1
0 1 1 1
Modo de captura
Cada decimosexto flanco ascendente en el pin CCP1
1 0 0 0
Modo de comparacin
La salida y el bit CCP1IF se ponen a 1 al ocurrir una coincidencia
1 0 0 1
Modo de comparacin
La salida se pone a 0 y el bit CCP1IF se pone a 1 al ocurrir una
coincidencia
1 0 1 0
Modo de comparacin
Llega la solicitud de interrupcin y el bit CCP1IF se pone a 1 al ocurrir una
coincidencia
1 0 1 1
Modo de comparacin
Wl bit CCP1IF se pone a 1 y los registros de temporizadores 1 o 2 se
borran al ocurrir una coincidencia
1 1 0 0
Modo PWM
Pines P1A y P1C estn activos a nivel alto
Pines P1B y P1D estan activos a nivel alto
1 1 0 1
Modo PWM
Pines P1A y P1C estn activos a nivel alto
Pines P1B y P1D estn activos a nivel bajo
1 1 1 0
Modo PWM
Pines P1A y P1C estn activos a nivel bajo
Pines P1B y P1D estn activos a nivel alto
1 1 1 1
Modo PWM
Pines P1A y P1C estn activos a nivel bajo
Pines P1B y P1D estn activos a nivel bajo

P1M1, P1M0 - PWM Output Configuration bits (bits de configuracin del modo PWM). El pin P1A se siempre
configura como una entrada en el modo de Captura/Comparacin. Los pines P1B, P1C y P1D actan como
los pines de E/S del puerto PORTD.
En el modo PWM estos bits afectan al funcionamiento del mdulo CCP1 como se muestra en la siguiente
tabla:
P1 M1 P1 M0 MOD O
0 0
PWM con una sola salida
Por el pin P1A sale una seal modulada.
Pines P1B, P1C y P1D son entradas/salidas del puerto D.
0 1
Configuracin Full Bridge - Forward (puente completo con salida directa)
Por el pin P1D sale una seal modulada.
Pin P1A est activo.
Pines P1B y P1C estn inactivos.
1 0
Configuracin Half Bridge (medio-puente)
Por los pines P1A y P1B sale una seal modulada.
Pines P1C y P1D son entradas/salidas del puerto D.
1 1
Configuracin Full Bridge - Reverse (puente completo con salida inversa)
Por el pin P1B sale una seal modulada.
Pin P1C est activo.
Pines P1A y P1D estn inactivos.
DC1B1, DC1B0 -PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de trabajo de
PWM). Se utilizan slo en el modo PWM y representan dos bits menos significativos de un nmero de 10 bits.
Este nmero determina el ciclo de trabajo de la seal PWM. Los dems 8 bits se almacenan en el registro
CCPR1L.
CCP1M3 - CCP1M0 bits - CCP1 Mode Select bits (bits de seleccin de modo del mdulo CCP1) determina el
modo de funcionamiento del mdulo CCP1.
MDULO CCP2
Con exclusin de los nombres diferentes de los registros y de los bits en los mdulos CCP1 y CCP2, el
mdulo CCP2 es una muy buena copia del mdulo CCP1 puesto en modo normal. La nica diferencia
significativa entre ellos es el funcionamiento en modo de comparacin del mdulo CCP2.
La diferencia se refiere a la seal de reinicio del temporizador Timer1. Concretamente, si el convertidor A/D
est habilitado, al igualarse los valores de los registros TMR1 y CCPR2, la seal de reinicio del temporizador
Timer1 iniciar automticamente la conversin A/D.
C CP2 M3 CCP2 M2 CC P2 M1 CCP2 M0 MOD O
0 0 0 0 Mdulo est deshabilitado (reinicio).
0 0 0 1 No utilizado
0 0 1 0 No utilizado
0 0 1 1 No utilizado
0 1 0 0
Modo de captura
Cada flanco descendente en el pin CCP2
0 1 0 1
Modo de captura
Cada flanco ascendente en el pin CCP2
0 1 1 0
Modo de captura
Cada cuarto flanco ascendente en el pin CCP2
0 1 1 1
Modo de captura
Cada decimosexto flanco ascendente en el pin CCP2
1 0 0 0
Modo de comparacin
La salida y el bit CCP2IF bit se ponen a 1 al ocurrir una coincidencia
1 0 0 1
Modo de comparacin
La salida se pone a 0 y el bit CCP2IF se pone a 1 al ocurrir una
coincidencia
1 0 1 0
Modo de comparacin
Se produce una interrupcin, el bit CCP2IF bit se pone a 1 y no hay
cambio en el pin CCP2 al ocurrir una coincidencia

El mdulo CCP2 est bajo el control de los bits del registro de control. Esta vez es el registro CCP2CON.
Registro CCP2CON

DC2B1, DC2B0 -PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de trabajo de
PWM). Se utilizan slo en modo PWM y representan dos bits menos significativos de un nmero de 10 bits.
Este nmero determina el ciclo de trabajo de la seal PWM. Los dems 8 bits se almacenan en el registro
CCPR2L.
CCP2M3 - CCP2M0 bits -CCP2 Mode Select bits (bits de seleccin de modo del mdulo CCP2) determina el
modo del mdulo CCP2.
En breve
1 0 1 1
Modo de comparacin
Al ocurrir una coincidencia, el bit CCP2IF se pone a 1, los registros del
temporizador Timer 1 se borran y la conversin A/D se inicia si el
convertidor A/D est habilitado.
1 1 x x Modo PWM
Cmo configurar e iniciar el mdulo CCP1 para funcionar en modo PWM?
Para configurar e iniciar el mdulo CCP1 para funcionar en modo PWM, siga los siguientes pasos:
Deshabilitar el pin de salida del CCP1. Deber estar configurado como entrada.
Seleccionar el perodo de seal PWM al introducir el valor en el registro PR2.
Configurar el mdulo CCP1 para funcionar en modo PWM al combinar los bits del registro
CCP1CON.
Ajustar el ciclo de trabajo de seal PWM al introducir el valor en el registro CCPR1L y al
utilizar los bits DC1B1 y DC1B0 del registro CCP1CON.
Configurar e iniciar el temporizador Timer2:
o Poner a cero el bit de bandera de interrupcin TMR2IF en el registro PIR1
o Ajustar el valor de divisin de frecuencia del temporizador Timer2 por los bits T2CKPS1 y T2CKPS0 del
registro T2CON.
o Iniciar el temporizador Timer2 al poner a uno el bit TMR2ON del registro T2CON.
Habilitar los pines de salida de PWM despus de que haya sido acabado un ciclo de PWM:
o Esperar el desbordamiento del temporizador Timer2 (el bit TMR2IF del registro PIR1 se pone a uno)
o Configurar el pin apropiado como salida al poner a cero el bit en el registro TRIS.
MDULO CCP1 EN MODO MEJORADO
El mdulo CCP1 es el nico que se puede poner en modo mejorado. Este modo bsicamente no difiere del
modo normal del CCP1 y la mejora se refiere a la transmisin de la seal PWM a los pines de salida. Por
qu es eso tan importante? Por el uso cada vez ms frecuente de los microcontroladores en los sistemas de
control de motores elctricos. Aqu no vamos a describir estos dispositivos, sin embrago si tiene la
oportunidad de trabajar en el desarrollo de los dispositivos similares, reconocer los elementos que se
utilizaban hasta hace poco como los perifricos. Decimos se utilizaban porque todos estos elementos ahora
estn integrados en el microcontrolador y pueden funcionar en varios modos diferentes.
MODO PWM CON UNA SALIDA
El modo PWM con una salida est habilitado slo en el caso de que se pongan a cero los bits P1M1 y P1M0
en el registro CCP1CON. En tal caso, una seal PWM puede estar disponible simultneamente en como
mximo cuatro diferentes pines de salida. Adems, la secuencia de seales PWM puede aparecer en forma
de onda bsica o invertida. La distribucin de seales depende de los bits del registro PSTRCON, mientras
que su polaridad depende de los bits CCP1M1 y CCP1M0 del registro CCP1CON.

Si se utiliza una salida invertida, los pines activos a nivel bajo y los pulsos que tienen la misma forma de onda
se generan siempre en parejas: en los pines P1A y P1C as como en los pines P1B y P1D, respectivamente.

MODO DE MEDIO-PUENTE
En cuanto al modo de medio-puente, la seal PWM es una salida en el pin P1A, mientras que a la vez la seal
complementaria PWM es una salida en el pin P1B. Estos pulsos activan a los controladores MOSFET en
modo de Medio-Puente que habilitan/deshabilitan el flujo de corriente por el dispositivo.

En este modo es muy peligroso encender los controladores MOSFET simultneamente (el cortocircuito
producido en aquel momento sera fatal). Para evitarlo, es necesario proporcionar un tiempo muerto entre
encender y apagar los controladores. Este tiempo muerto est marcado con td (time delay) en la siguiente
figura. El problema se resuelve al utilizar los bits PDC0-PDC6 del registro PWM1CON.

Como se muestra en la siguiente figura, el modo de medio-puente se puede utilizar para activar los
controladores MOSFET en la configuracin Puente completo:

MODO PUENTE-COMPLETO
Todos los cuatro pines se utilizan como salidas en el modo Puente completo. En la prctica, este modo es
utiliza con frecuencia para activar los motores, lo que proporciona un control simple y completo de velocidad y
direccin de rotacin. Hay dos configuraciones de este modo: Full Bridge-Forward (puente completo con
salida directa) y Full Bridge-Reverse (puente completo con salida inversa).

CONFIGURACIN PUENTE COMPLETO - DIRECTO
En modo Directo ocurre lo siguiente:
Un uno lgico (1) aparece en el pin P1A (pin est activo a nivel alto);
Secuencia de pulsos aparece en el pin P1D; y
Un cero lgico (0) en los pines P1B y P1C (pines estn activos a nivel bajo).
La siguiente figura muestra el estado de los pines P1A-P1D durante un ciclo PWM completo:

CONFIGURACIN PUENTE COMPLETO - INVERSO
Lo similar ocurre en modo Inverso, a menos que estos pines dispongan de funciones diferentes:
Un uno lgico (1) aparece en el pin P1C (pin est activo a nivel alto);
Secuencia de pulsos aparece en el pin P1B; y
Un cero lgico (0) aparece en los pines P1A y P1D (pines estn activos a nivel bajo).

Registro PWM1CON

PRSEN PWM Restart Enable bit (Bit de habilitacin del reinicio automtico del PWM)
1 - Despus de un apagado automtico, el mdulo PWM se reinicia automticamente, y el
bit ECCPASE del registro ECCPAS se pone a cero.
0 - Para iciar el mdulo PWM despus de un apagado automtico, el bit ECCPASE debe
ponerse a cero por software.
PDC6 - PDC0 PWM Delay Count bits - (Bits de configuracin del tiempo muerto en el modo PWM) El nmero
binario de 7 dgitos determina el nmero de ciclos de instrucciones (4Tosc) aadidos como tiempo muerto al
activar los pines de entrada PWM.


Registro PSTRCON

STRSYNC - Steering Sync bit (bit de sincronizacin de direccin) determina el momento de la direccin de
los pulsos de PWM:
1 - La direccin ocurre despus de que el registro PSTRCION haya sido cambiado, slo si
se ha completado la forma de onda del PWM.
0 - La direccin ocurre despus de que el registro PSTRCION haya sido cambiado. La
seal PWM en la salida del pin ser cambiada inmediatamente sin reparar en si el ciclo
anterior ha sido completado. Este procedimiento es til cuando es necesario detener la
transmisin de una seal PWM del pin.
STRD - Steering Enable bit D (bit D de habilitacin de direccin) determina la funcin del pin P1D.
1 - El pin P1D tiene la forma de onda del PWM con polaridad determinada por los bits
CCP1M0 y CCP1M1
0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRC Steering Enable bit C (bit C de habilitacin de direccin) determina la funcin del pin P1C.
1 - El pin P1C tiene la forma de onda del PWM con polaridad determinada por los bits
CCP1M0 y CCP1M1
0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRB - Steering Enable bit B (bit B de habilitacin de direccin) determina la funcin del pin P1B.
1 - El pin P1B tiene la forma de onda del PWM con polaridad determinada por los bits
CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRA - Steering Enable bit A (bit A de habilitacin de direccin) determina la funcin del pin P1A.
1 - El pin P1A tiene la forma de onda del PWM con polaridad determinada por los bits
CCP1M0 y CCP1M1
0 -Pin est configurado como entrada/salida general del puerto PORTC.
Registro ECCPAS

ECCPASE - ECCP Auto-Shutdown Event Status bit (bit de estado del apagado automtico) indica si ha
ocurrido el apagado automtico del mdulo CCP (estado de Apagado):
1 - Mdulo CCP est en estado de Apagado.
0 - Mdulo CCP funciona normalmente.
ECCPAS2 - ECCPAS0 - ECCP Auto-Shutdown Source Select bits (Bits de seleccin de la fuente de
apagado automtico) selecciona la fuente de apagado automtico.
E CCPAS2 ECCPA S1 ECCP AS0 FUEN TE DEL EST A D O D E A P A GA D O
0 0 0 Estado del apagado deshabilitado
0 0 1 Cambio de salida del comparador C1
0 1 0 Cambio de salida del comparador C2
0 1 1 Cambio de salidas de los comparadores C1 o C2
1 0 0 Cero lgico (0) en el pin INT
1 0 1 Cero lgico (0) en el pin INT o cambio de salida del comparador C1
1 1 0 Cero lgico (0) en el pin INT o cambio de salida del comparador C2
1 1 1 Cero lgico (0) en el pin INT o cambio de salidas de los comparadores C1 o C2
PSSAC1, PSSAC0 - Pins P1A, P1C Shutdown State Control bits (Bits de configuracin de los pines P1A y
P1C en modo de apagado) define el estado lgico de los pines P1A y P1C cuando el mdulo CCP est en el
estado de apagado.
PSSAC 1 P SSAC0 EST AD O L GI CO DE L OS P I N ES
0 0 0
0 1 1
1 X Alta impedancia (Tri-estado)
PSSBD1, PSSBD0 - Pins P1B, P1D Shutdown State Control bits (Bits de configuracin de los pines P1B y
P1D en modo de apagado) define el estado lgico de los pines P1B y P1D cuando el mdulo CCP est en el
estado de apagado.
PSSB D 1 P SSB D0 EST AD O L GI CO DE L OS P I N ES
0 0 0
0 1 1
1 X Alta impedancia (Tri-estado)
3.8 MDULOS DE COMUNICACIN SERIE
El microcontrolador PIC 16F887 dispone de varios mdulos de comunicacin serie independientes, adems
cada uno se puede configurar a funcionar en modos diferentes. Eso es lo que los hace insustituibles en
muchos casos. Acurdese de lo que hemos dicho sobre los mdulos CCP ya que lo mismo se aplica aqu. No
se preocupe de los detalles del funcionamiento de todos los mdulos, solo seleccione uno y utilice lo que
realmente necesita.
El USART es uno de los primeros sistemas de comunicacin serie. Las versiones nuevas de este sistema
estn actualizadas y se les denomina un poco diferente - EUSART.
EUSART

El mdulo Transmisor/Receptor Universal Sncrono/Asncrono mejorado (Enhanced Universal
Synchronous Asynchronous Receiver Transmitter - EUSART) es un perifrico de comunicacin
serie de entrada/salida. Asimismo es conocido como Interfaz de comunicacin serie (Serial
Communications Interface - SCI). Contiene todos los generadores de seales de reloj, registros de
desplazamiento y bfers de datos necesarios para realizar transmisin de datos serie de
entrada/salida, independientemente de la ejecucin de programa del dispositivo. Como indica su
nombre, aparte de utilizar el reloj para la sincronizacin, este mdulo puede establecer la conexin
asncrona, lo que lo hace nico para algunas aplicaciones. Por ejemplo, en caso de que sea difcil
o imposible proporcionar canales especiales para transmisin y recepcin de datos y seales de
reloj (por ejemplo, mando a distancia de radio o infrarrojas), el mdulo EUSART es definitivamente
la mejor opcin posible.
El EUSART integrado en el PIC16F887 posee las siguientes caractersticas:
Transmisin y recepcin asncrona en modo Full-duplex;
Caracteres de anchura de 8 9 bits programables;
Deteccin de direccin en modo de 9 bits;
Deteccin de errores por saturacin del bfer de entrada; y
Comunicacin Half Duplex en modo sncrono.
EUSART EN MODO ASNCRONO
El EUSART transmite y recibe los datos utilizando la codificacin de no retorno a cero - NRZ (non-return-to-
zero). Como se muestra en la siguiente figura, no se utiliza una seal de reloj y los datos se transmiten de
forma muy simple:

Cada dato se transmite de la siguiente forma:
En estado inactivo la lnea de datos permanece en estado alto (1);
Cada transmisin de datos comienza con un bit de arranque (START), el cual, siempre es
cero (0);
Cada dato tiene un ancho de 8 o 9 bits (primero se transmite el bit menos significativo-
LSB); y
Cada transmisin de datos termina con un bit de parada (STOP), el cual, siempre es uno
(1).
La siguiente figura muestra cmo conectar de manera habitual un microcontrolador PIC que utiliza el mdulo
EUSART. El circuito RS-232 se utiliza como un convertidor de nivel de voltaje.

EUSART EN MODO DE TRANSMISOR ASNCRONO

Para habilitar la transmisin de datos por medio del mdulo EUSART, es necesario configurarlo para que
funcione como un transmisor. En otras palabras, es necesario definir el estado de los siguientes bits:
TXEN = 1 - El transmisor EUSART se habilita al poner a uno el bit TXEN del registro
TXSTA
SYNC = 0 - El EUSART se configura a funcionar en modo asncrono al poner a cero el bit
SYNC del registro TXSTA.
SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART est habilitado y el
pin TX/CK se configura automticamente como salida. Si el bit se utiliza simultneamente
para alguna funcin analgica, se debe deshabilitar al poner a cero el bit correspondiente
del registro ANSEL.
La parte central del transmisor EUSART ocupa el registro de desplazamiento TSR que no est directamente
disponible al usuario. Para iniciar la transmisin de datos, el mdulo debe estar habilitado al poner a uno el bit
TXEN del registro TXSTA. Los datos a enviar se deben escribir en el registro TXREG, lo que resultar en la
siguiente secuencia de eventos:
Byte ser transmitido inmediatamente al registro de desplazamiento TSR;
El registro TXREG permanece vaco, lo que indica la bandera de bit TXIF del registro PIR1.
Si se pone a uno el bit TXIE del registro PIE1, se generar una interrupcin. De todos
modos, la bandera se pone a uno sin reparar en si una interrupcin est habilitada o no y
no se puede poner a cero por software, sino al escribir un dato nuevo en el registro
TXREG.
Dispositivos electrnicos de control empujan el dato hacia el pin TX en sincronizacin con
seal de reloj interna: bit de arranque (START) (1).....datos....bit de parada (STOP) (1).
Cuando el ltimo bit abandona el registro TSR, el bit TRMT en el registro TXSTA se pone a
uno automticamente.
Si mientras tanto se escribe un dato nuevo en el registro TXREG, todo el procedimiento se
repite inmediatamente despus de la transmisin del bit de parada del dato anterior.
Para transmitir un dato de 9 bits es necesario poner a uno el bit TX9 del registro TXSTA. El bit TX9D del
registro TXSRTA es el noveno bit y el ms significativo. Al transmitir un dato de 9 bits, el bit de datos TX9D
deber estar escrito antes de que de se escriban los 8 bits menos significativos en el registro TXREG. Todos
los nueve bits de datos se transmiten al registro de desplazamiento TSR inmediatamente despus de que se
acabe la escritura en el registro TXREG.
EUSART EN MODO RECEPTOR ASNCRONO

Similar al poner en marcha el transmisor del EUSART, para habilitar el receptor es necesario configurar los
siguientes bits:
CREN = 1 - El receptor EUSART se habilita al poner a uno el bit CREN del registro
RCSTA;
SYNC = 0 - El EUSART se configura a funcionar en modo asncrono al poner a cero el bit
SYNC del registro TXSTA; y
SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART est habilitado y el
pin RX/DT se configura automticamente como salida. Si el bit se utiliza simultneamente
para alguna funcin analgica, se debe deshabilitar al poner a cero el bit correspondiente
del registro ANSEL.
Despus de que se haya terminado el primer paso necesario y se haya detectado el bit de arranque
(START), el dato se transmite al registro de desplazamiento RSR por el pin RX. Al haber recibido el bit de
parada (STOP), ocurre lo siguiente:
El dato se transmite automticamente al registro RCREG (si est vaco);
El bit de bandera RCIF se pone a uno y ocurre una interrupcin si est habilitada por el bit
RCIE en el registro PIE1. Similar al transmisor, el bit de bandera se pone a cero slo por
software, o sea, al leer el registro RCREG. Tenga en cuenta que esto es un doble registro
de tipo FIFO (primero en entrar, primero en salir - first-in, first-out), lo que permite
almacenamiento de dos caracteres simultneamente);
Si el registro RCREG est ocupado (contiene dos bytes) y el registro de desplazamiento
detecta el nuevo bit de parada (STOP), el bit de sobrescritura OERR se pondr a uno. En
tal caso se pierde un dato nuevo que viene, y el bit OERR debe ponerse a cero por
software al poner a cero y luego al poner a uno el bit CREN;
Nota: No es posible recibir un dato nuevo sino hasta que el bit OERR est a uno.
Si el bit de parada (STOP) est a cero (0), el bit FERR del registro RCSTA estar a uno, lo
que indica un error en recepcin; y
Para habilitar la recepcin de un dato de 9 bits, es necesario poner a uno el bit RX9 del
registro RCSTA.
DETECCIN DE ERRORES EN RECEPCIN
El microcontrolador puede detectar automticamente dos tipos de errores. El primero es denominado error de
encuadre (Framing error). Ocurre cuando el receptor no detecta el bit de parada en un intervalo
predeterminado de tiempo. Este error se indica mediante el bit FERR del registro RCSTA. Si el bit est a uno,
el ltimo dato recibido puede ser incorrecto. Cabe destacar lo siguiente:
El error de encuadre no genera por si mismo una interrupcin;
Si el bit FERR est a uno, el ltimo dato recibido contiene un error;
El error de encuadre (bit est a uno) no impide la recepcin de un dato nuevo;
El bit FERR se pone a cero al leer el dato recibido, lo que significa que se debe hacer una
verificacin antes de leer el dato; y
El bit FERR no se puede poner a cero por software. Si es necesario, se puede borrar al
poner a cero al bit SPEN del registro RCSTA, lo cual, simultneamente causa una
reinicializacin del sistema EUSART.
Otro tipo de error es denominado error de sobrescritura (Overrun Error). Como hemos mencionado
anteriormente, el registro de tipo FIFO puede almacenar slo dos caracteres. Un error de sobrescritura ocurre
cuando el registro recibe el tercer carcter. Simplemente no hay espacio para almacenar un byte ms, por lo
que un error es inevitable. Cuando ocurre este error, el bit OERR del registro RCSTA se pone a uno. Las
consecuencias son las siguientes:
Los datos almacenados en los registros FIFO (2 bytes) se pueden leer normalmente;
No se recibirn ms datos hasta que el bit OERR est puesto a cero; y
A este bit no se le puede acceder directamente. Para borrarlo, es necesario poner a cero el
bit CREN del registro RCSTA o reiniciar el sistema EUSART al poner a cero al bit SPEN
del registro RCSTA.
RECEPCIN DE DATOS DE 9 BITS
Aparte de recibir los datos de forma estndar de 8 bits, el sistema EUSART soporta la recepcin de datos de 9
bits. En el lado del transmisor, el noveno bit se adjunta al byte ori-ginal directamente antes del bit de parada.
En el lado del receptor, al poner a uno el bit RX9 del registro RCSTA, el noveno bit de datos ser
automticamente escrito en el bit RX9D del mismo registro. Despus de almacenar este byte, es necesario
tener cuidado en como leer estos bits - primero se debe leer el bit RX9D y luego los ocho (8) bits menos
significativos del registro RCREG. De otra forma, el noveno bit ser puesto a cero antes de ser ledo.

DETECCIN DE DIRECCIN
Cuando el bit ADDEN del registro RCSTA est a uno, el modulo EUSART es capaz de recibir slo los datos
de 9 bits, mientras que se ignoran todos los datos de 8 bits. Aunque parece una restriccin, este modo
habilita la comunicacin serial entre varios microcontroladores. El principio de funcionamiento es muy simple.
El dispositivo maestro enva un dato de 9 bits que representa la direccin de un microcontrolador esclavo. No
obstante, todos deben tener el bit ADDEN puesto a uno, ya que de esta manera se habilita la deteccin de
direccin. Todos los microcontroladores esclavos que comparten la misma lnea de transmisin, reciben este
dato (direccin) y verifican automticamente si coincide con su propia direccin. El software, en el que ocurre
la coincidencia de direccin, debe deshabilitar la deteccin de direccin, poniendo a cero el bit ADDEN.

El dispositivo maestro sigue enviando los datos de 8 bits al microcontrolador. Todos los datos que pasan por
la lnea de transmisin sern recibidos slo por el mdulo EUSART direccionado. Una vez recibido el ltimo
byte, el microcontrolador esclavo debe poner a uno el bit ADDEN para habilitar de nuevo la deteccin de
direccin.

Registro TXSTA

CSRC - Clock Source Select bit - (bit de seleccin de la fuente de reloj) determina la fuente del reloj. Se
utiliza slo en modo sincrnico.
1 - Modo Maestro. Reloj generado internamente por el generador de tasa de baudios.
0 - Modo Esclavo. Reloj proveniente de una fuente externa.
TX9 - 9-bit Transmit Enable bit (bit de habilitacin del modo de 9 bits en transmisin)
1 - Se habilita el modo de 9 bits en transmisin por el sistema EUSART.
0 - Se habilita el modo de 8 bits en transmisin por el sistema EUSART.
TXEN - Transmit Enable bit (Bit de habilitacin de transmisin)
1 - Transmisin habilitada.
0 - Transmisin deshabilitada.
SYNC - EUSART Mode Select bit (Bit de seleccin del modo EUSART)
1 - El EUSART funciona en modo sncrono
0 - El EUSART funciona en modo asncrono.
SENDB - Send Break Character bit (Bit de envo de carcter Break en modo asncrono) se utiliza slo en
modo asncrono y cuando se requiere obedecer el estndar de bus LIN.
1 - Se enviar un carcter Break en la prxima transmisin (se pone a 0 por hardware
cuando finaliza el envo)
0 - Envo del carcter de transmisin Break completado.
BRGH - High Baud Rate Select bit (bit de seleccin de modo de alta velocidad en modo asncrono).
Determina la velocidad de transmisin en modo sncrono. No afecta al EUSART en modo sncrono.
1 - EUSART funciona a alta velocidad.
0 - EUSART funciona a baja velocidad.
TRMT - Transmit Shift Register Status bit (bit de estado de registro de desplazamiento de transmisin)
1 - Registro TSR est vaco.
0 - Registro TSR est lleno.
TX9D - Ninth bit of Transmit Data (Valor del noveno bit en transmisin) Puede ser utilizado como direccin
o bit de paridad o para distinguir entre direccin o dato en los buses maestro-esclavo).

Registro RCSTA

SPEN - Serial Port Enable bit (bit de habilitacin del puerto serie)
1 - Puerto serie habilitado. Los pines RX/DT y TX/CK se configuran automticamente como
entrada y salida, respectivamente.
0 - Puerto serie deshabilitado.
RX9 - 9-bit Receive Enable bit (bit de habilitacin del modo de 9 bits en recepcin):
1 - Se habilita la recepcin de datos de 9 bits por medio del sistema EUSART.
0 - Se habilita la recepcin de datos de 8 bits por medio del sistema EUSART.
SREN - Single ReceiveEnable bit (bit de habilitacin de la recepcin simple). Es utilizado mslo en modo
sincrnico y en funcionamiento como Maestro.
1 - Recepcin simple habilitada.
0 - Recepcin simple deshabilitada.
CREN - Continuous Receive Enable bit (bit de habilitacin de la recepcin continua) acta dependiendo del
modo EUSART
Modo asncrono:
1 - Recepcin habilitada.
0 - Recepcin deshabilitada.
Modo sncrono:
1 - Se habilita la recepcin continua hasta que el bit CREN est a cero.
0 - No se habilita la recepcin en forma continua.
ADDEN - Address Detect Enable bit (bit de habilitacin de la deteccin de direccin) se utiliza slo en modo
de detectar la direccin.
1 - Habilita la deteccin de direccin (slo se procesa un byte recibido en el registro de
desplazamiento de recepcin si el noveno bit est a uno)
0 - Deteccin de direccin deshabilitada (todos los bytes recibidos en el registro de
desplazamiento de recepcin son procesados independientemente del valor del noveno bit
recibido). El noveno bit se utiliza como bit de paridad.
FERR - Framing Error bit (bit de error de encuadre)
1 - Se ha producido un error de encuadre en recepcin.
0 - No se ha producido un error de encuadre.
OERR - Overrun Error bit (bit de error de sobrescritura).
1 - Se ha producido un error de sobrescritura en recepcin.
0 - No se ha producido un error de sobrescritura.
RX9D - Ninth bit of Received Data (valor del noveno bit recibido) puede ser utilizado como bit de direccin o
de paridad.
El siguiente diagrama muestra tres palabras que aparecen en la entrada RX. El bfer de recepcin de datos
ser ledo despus de la tercera palabra, lo que causa poner a uno el bit OEER (bit de error de sobrescritura).

GENEREADOR DE BAUDIOS DEL EUSART (BRG)
Si mira atentamente al diagrama del receptor o transmisor EUSART asncrono, ver que los ambos utilizan
seal de reloj del temporizador local BRG para la sincronizacin. La misma fuente de reloj se utiliza tambin
en modo sncrono.

El temporizador BRG consiste en dos registros de 8 bits haciendo un registro de 16 bits.

El valor de un nmero escrito en estos dos registros determinar la velocidad de transmisin en baudios.
Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro BAUDCTL, afectan la frecuencia
de reloj utilizada para el clculo de los baudios. Las tablas en las siguientes pginas contienen los valores que
deben estar escritos en el registro de 16 bits SPBRG y asignados a los bits SYNC, BRGH y BRGH16 para
obtener algunos valores de la velocidad de transmisin en baudios estndar.

La frmula para hacer el clculo de la velocidad de transmisin en baudios:

Ejemplo
Para un dispositivo en modo asncrono con una frecuencia de reloj de 16MHz y velocidad de transimisin de
datos en baudios de 9600, el Generados de baudios (BRG) se calcula de la siguiente manera:









Registro BAUDCTL

ABDOVF - Auto-Baud Detect Overflow bit (bit de desbordamiento de auto-deteccin de la velocidad de
transmisin) se utiliza slo en modo asncrono durante la deteccin de la velocidad de transmisin.
1 -Se ha producido desbordamiento durante la auto-deteccin.
0 -No se ha producido desbordamiento durante la auto-deteccin.
RCIDL - Receive Idle Flag bit (bit de estado de la operacin de recepcin) se utiliza slo en modo asncrono.
1 - Receptor en estado inactivo. No hay operacin de recepcin en marcha.
0 - Se ha recibido el bit de arranque (START) y hay una operacin de recepcin en
marcha.
SCKP - Synchronous Clock Polarity Select bit (bit de seleccin de polaridad de la seal de reloj en modo
sncrono). El estado lgico de este bit difiere dependiendo de cul modo de EUSART est activo
Modo asncrono:
1 - El dato invertido se transmite al pin RC6/TX/CK.
0 - El dato no invertido se transmite al pin RC6/TX/CK.
Modo sncrono:
1 - Sincronizacin en el flanco ascendente de la seal de reloj.
0 - Sincronizacin en el flanco descendente de la seal de reloj.
BRG16 16-bit Baud Rate Generator bit - (bit de habilitacin del generador de velocidad de transmisin de 16
bits) determina si el registro SPBRGH se utilizar, o sea si el temporizador BGRG tendr 8 o 16 bits.
1 - Se utiliza el generador de velocidad de transmisin de 16 bits.
0 - Se utiliza el generador de velocidad de transmisin de 8 bits.
WUE Wake-up Enable bit (bit de habilitacin del modo de auto-activacin en modo asncrono):
1 - Modo de auto-activacin habilitado. El receptor espera a que el flanco descendente
aparezca en el pin RC7/RX/DT para que el microcontrolador se despierte del modo de
reposo
0 - Modo de auto-activacin habilitado. El receptor funciona normalmente.
ABDEN - Auto-Baud Detect Enable bit (bit de habilitacin de auto-deteccin de velocidad de transmisin) se
utiliza slo en modo asncrono.
1 - Modo de auto-deteccin habilitado. Al detectar la velocidad de transmisin, el bit se
pone a uno automticamente.
0 - Modo de auto-deteccin deshabilitado.
Vamos a hacerlo en mikroBasic...
' En est e ej empl o, el mdul o EUSART i nt er no se i ni ci al i za y se aj ust a
par a envi ar el
' mensaj e i nmedi at ament e despus de r eci bi r l o. La vel oci dad de
t r ansmi si n en baudi os
' se aj ust a a 9600 bps. El pr ogr ama ut i l i za l as si gui ent es r ut i nas de
l i br er a UART:
' UART1_i ni t ( ) , UART1_Wr i t e_Text ( ) , UART1_Dat a_Ready( ) , UART1_Wr i t e( ) y
UART1_Read( ) .

dim uar t _r d as byte
mai n:
ANSEL, ANSELH = 0 ' Todos l os pi nes AN se conf i gur an como
di gi t al es
CM1CON0. C1ON = 0 ' Deshabi l i t ar l os compar ador es
CM2CON0. C2ON = 0
UART1_I ni t ( 9600) ' I ni ci al i zar el mdul o UART a 9600 bps
Del ay_ms( 100) ' Esper ar a que seal de r el oj del mdul o
UART se ponga est abl e
UART1_Wr i t e_Text ( "St ar t ")
while 1 ' Bucl e i nf i ni t o
if ( UART1_Dat a_Ready( ) ' Si el dat o se ha r eci bi do,
uar t _r d = UART1_Read( ) ' l al o,
end if
UART1_Wr i t e( uar t _r d) ' y env el o at r s por el UART
wend
. . .
En breve
Transmisin serial asncrona a travs de los registros del mdulo EUSART
1. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del
registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
2. El bit SYNC (del registro TXSTA) deber estar puesto a cero y el bit SPEN (del registro
RCSTA) deber estar puesto a uno (1) a fin de habilitar el puerto serie.
3. Para una transmisin de datos de 9 bits, el bit TX9 (del registro TXSTA) deber estar puesto
a uno (1)
4. La transmisin de datos es habilitada poniendo a uno el bit TXEN del registro TXSTA. El bit
TXIF del registro PIR1 est automticamente puesto a uno.
5. Para que el bit TXEN cause una interrupcin, tanto el bit TXIE del registro PIE1 como los bits
GIE, PEIE del registro INTCON debern estar puestos a uno.
6. En una transmisin de datos de 9 bits, el valor del noveno bit deber estar escrito en el bit
TX9D del registro TXSTA.
7. La transmisin comienza cuando se escribe el dato de 8 bits sobre el registro de recepcin
TXREG.
Recepcin serial asncrona a travs de los registros del mdulo EUSART:
1. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del
registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
2. El bit SYNC (del registro TXSTA) deber estar puesto a cero y el bit SPEN (del registro
RCSTA) deber estar puesto a uno a fin de habilitar el puerto serie.
3. Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON debern
estar puestos a uno si se necesita habilitar que la recepcin de dato cause una interrupcin.
4. Para una recepcin de datos de 9 bits, el bit RX9 (del registro RCSTA) deber estar puesto a
uno.
5. La recepcin de datos es habilitada poniendo a uno el bit CREN del registro RCSTA.
6. El registro RCSTA deber leerse para obtener informacin acerca de la ocurrencia de errores
durante la recepcin. Para una recepcin de datos de 9 bits, El valor del noveno bit ser
almacenado en este registro.
7. El dato de 8 bits recibido ser almacenado en el registro RCREG y deber leerse para
obtener dicho dato.
Ajustar el modo de deteccin de direccin:
1. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del
registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
2. El bit SYNC (del registro TXSTA) deber estar puesto a cero y el bit SPEN (del registro
RCSTA) deber estar puesto a uno (1) a fin de habilitar el puerto serie.
3. Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON debern
estar puestos a uno si se necesita habilitar que la recepcin de dato cause una interrupcin.
4. El bit RX9 del registro RCSTA debe estar a uno.
5. El bit ADDEN del registro RCSTA debe estar a uno, lo que habilita que un dato sea
reconocido como direccin.
6. La recepcin de datos es habilitada poniendo a uno el bit CREN del registro RCSTA.
7. Tan pronto como se reciba un dato de 9 bits, el bit RCIF del registro PIR1 estar
automticamente puesto a uno. Si est habilitada se produce una interrupcin.
8. El registro RCSTA deber leerse para obtener informacin acerca de la ocurrencia de errores
durante la transmisin. El noveno bit RX9D siempre estar a uno.
9. El dato de 8 bits recibido ser almacenado en el registro RCREG y deber leerse. Se deber
comprobar si la combinacin de estos bits coincide con la direccin predefinida. Si coincide,
es necesario poner a cero el bit ADDEN del registro RCSTA, lo que habilita la recepcin de
datos de 8 bits.
MDULO PUERTO SERIE SNCRONO MAESTRO (MSSP)
El MSSP (Puerto serie sncrono maestro - Master Synchronous Serial Port) es un mdulo muy til, y a la vez
uno de los circuitos ms complejos dentro del microcontrolador. Este mdulo permite la comunicacin de alta
velocidad entre un microcontrolador y otros pe-rifricos u otros microcontroladores al utilizar varias lneas de
E/S (como mximo dos o tres lneas). Por eso, se utiliza con frecuencia para conectar el microcontrolador a
los visualizadores LCD, los convertidores A/D, las memorias EEPROM seriales, los registros de
desplazamiento etc. La caracterstica principal de este tipo de comunicacin es que es sncrona y adecuada
para ser utilizada en sistemas con un slo maestro y uno o ms esclavos. Un dispositivo maestro contiene un
circuito para generacin de baudios y adems, suministra seales de reloj a todos los dispositivos del sistema.
Los dispositivos esclavos no disponen de un circuito interno para generacin de seales de reloj. El mdulo
MSSP puede funcionar en uno de dos modos:
modo SPI (Interfaz perifrica serial - Serial Peripheral Interface); y
modo I
2
C (Circuito inter-integrado - Inter-Integrated Circuit).
Como se muestra en la siguiente figura, un mdulo MSSP representa slo una mitad de un hardware
necesario para establecer una comunicacin serial, mientras que la otra mitad se almacena en el dispositivo
con el que intercambia los datos. Aunque los mdulos en ambas puntas de lnea son los mismos, sus modos
de funcionamiento difieren esencialmente dependiendo de si el mdulo funciona como Maestro o como
Esclavo:
Si el microcontrolador a ser programado controla otro dispositivo o circuito (perifricos), deber funcionar
como un dispositivo maestro. Este mdulo generar seal de reloj cuando sea necesario, o sea slo cuando
se requiera recibir y transmitir los datos por software. Por consiguiente, el establecimiento de conexin
depende nicamente del dispositivo maestro.

De lo contrario, si el microcontrolador a ser programado est integrado en un dispositivo ms complejo (por
ejemplo en una PC), deber funcionar como un dispositivo esclavo. Como tal, un esclavo siempre tiene que
esperar a que un dispositivo maestro enve la solicitud de transmisin de datos.
MODO SPI
El modo SPI permite la transmisin y recepcin simultnea de datos de 8 bits al utilizar tres lneas de
entrada/salida:
SDO - Serial Data Out (salida de datos serie )- lnea de transmisin;
SDI - Serial Data In (entrada de datos serie) - lnea de recepcin; y
SCK - Serial Clock (reloj de comunicacin) - lnea de sincronizacin.
Adicionalmente, hay una cuarta lnea (SS) que se puede utilizar si el microcontrolador intercambia los datos
con varios dispositivos perifricos. Refirase a la siguiente figura.

SS - Slave Select (Seleccin de esclavo) - Es una lnea adicional utilizada para la seleccin de un dispositivo
especfico. Esta lnea est activa slo si el microcontrolador funciona como esclavo, o sea cuando el
dispositivo externo - maestro requiere intercambiar los datos.
Al funcionar en modo SPI, el mdulo MSSP utiliza 4 registros en total:
SSPSTAT - registro de estado
SSPCON - registro de control
SSPBUF - bfer serie de transmisin/recepcin
SSPSR - registro de desplazamiento (no es accesible directamente)
Los primeros tres registros son de lectura/escritura y se pueden modificar en cualquier momento, mientras que
el cuarto, como no es accesible, se utiliza para convertir datos en formato serial.

Como se muestra en la siguiente figura, la parte central del mdulo SPI consiste de dos re-gistros conectados
a los pines para recepcin, transmisin y sincronizacin.

El registro de desplazamiento (SSPRS) est directamente conectado a los pines del microcontrolador y es
utilizado para transmisin de datos en formato serie. El registro SSPRS dispone de la entrada y salida para
desplazar los datos hacia dentro y hacia fuera del dispositivo. En otras palabras, cada bit que aparece en la
entrada (lnea de recepcin) desplaza simultneamente otro bit hacia la salida (lnea de transmisin).

El registro SSPBUF (Bfer) es una parte de memoria utilizada para almacenar temporalmente los datos antes
de que se enven, o sea inmediatamente despus de que se reciban. Despus de que todos los 8 bits hayan
sido recibidos, el byte se mueve del registro SSPRS al registro SSPBUF. Este proceso de crear un doble bfer
para recibir los datos permite iniciar la recepcin del prximo byte antes de leer los datos que se acaban de
recibir. Durante la transmisin/recepcin de datos se ignora un intento de escribir un dato en el registro
SSBUF. Desde el punto de vista de un programador, este registro se considera el ms importante por haber
sido accedido con ms frecuencia.

Concretamente, si dejamos aparte el ajuste del modo de funcionamiento, la transmisin de datos por el
mdulo SPI no es nada ms que escritura y lectura de datos de este registro, mientras que las dems
acrobacias como mover los registros, se llevan a cabo automticamente por el hardware.
Vamos a hacerlo en mikroBasic...
' En est e ej empl o, el mi cr ocont r ol ador PI C ( maest r o) env a un byt e de
dat os a un chi p per i f r i co
' ( escl avo) por el mdul o SPI . El pr ogr ama ut i l i za l as f unci ones de
l i br er a SPI SPI 1_i ni t ( ) y
' SPI 1_Wr i t e.
dim Chi p_Sel ect as sbit at PORTC. RC0 ' L nea per i f r i ca chi p_sel ect
est conect ada al pi n RC0
dim Chi p_Sel ect _Di r ect i on as sbit at TRI SC. 0 ' Bi t TRI SC0 def i ne el pi n
RC0 como ent r ada o sal i da
dim val ue as unsi gned int ' Dat o a ser envi ado es de
t i po unsi gned i nt
mai n:
ANSEL, ANSELH = 0 ' Todos l os pi nes de E/ S son di gi t al es
TRI SB. 0 = 1
TRI SB. 1 = 1 ' Conf i gur ar l os pi nes RB0 y RB1 como ent r adas
Chi p_Sel ect = 0 ' Sel ecci onar el chi p per i f r i co
Chi p_Sel ect _Di r ect i on = 0 ' Conf i gur ar el pi n CS# como sal i da
SPI 1_I ni t ( ) ' I ni ci al i zar el mdul o SPI
SPI 1_Wr i t e( val ue) ' Env ar el val or al chi p per i f r i co
. . .
En breve
Comunicacin serial sncrona SPI
Antes de inicializar el mdulo SPI, es necesario especificar varias opciones:
Modo maestro TRISC.3=0 (pin SCK es salida de seal de reloj);
Modo de esclavo TRISC.3=1 (pin SCK es entrada de seal de reloj);
Fase de datos de entrada - la mitad o el final del tiempo de salida (bit SMP del registro
SSPSTAT);
Flanco de reloj (bit CKE del registro SSPSTAT);
Velocidad de transmisin en baudios, los bits SSPM3-SSPM0 del registro SSPCON (slo
en modo Maestro);
Seleccin de modo esclavo, bits SSPM3-SSPM0 del registro SSPCON (slo en
modoEsclavo).
El mdulo se pone en marcha al poner a uno el bit SSPEN:

Paso 1
Los datos a ser transmitidos debern ser escritos en el registro del bfer SSPBUF. Si el mdulo
SPI funciona en modo maestro, el microcontrolador ejecutar automticamente la secuencia de
los siguientes pasos 2,3 y 4. Si el mdulo SPI funciona en modo esclavo, el microcontrolador no
ejecutar la secuencia de los si-guientes pasos hasta que el pin SCK detecte seal de reloj.

Paso 2
El dato se mueve al registro SSPSR y el contenido del registro SSPBUF no se borra.

Paso 3
El dato se desplaza hacia el pin de salida (primero se desplaza el bit ms significativo - MSB),
mientras que a la vez el registro se carga con los bits por el pin de entrada. En modo maestro el
microcontrolador en si mismo genera seal de reloj, mientras que el modo esclavo utiliza seal de
reloj externa (pin SCK).

Paso 4
El registro SSPSR est lleno despus de que hayan sido recibidos 8 bits de datos, lo que se indica
al poner a uno el bit BF del registro SSPSTAT y el bit SSPIF del registro PIR1. Los datos recibidos
(un byte) son automticamente movidos del registro SSPSR al registro SSPBUF. Como la
transmisin de datos serial se realiza automticamente, el resto de programa se ejecuta
normalmente mientras que la transmisin de datos est en progreso. En este caso, la funcin del
bit SSPIF es de generar una interrupcin al acabar la transmisin de un byte.

Paso 5
Por ltimo, el dato almacenado en el registro SSPBUF est listo para su uso y debe moverse al
registro deseado.
MODO I
2
C
El modo I
2
C (Bus de circuito inter-integrado) es adecuado para ser utilizado cuando el microcontrolador debe
intercambiar los datos con un circuito integrado dentro de un mismo dispositivo. stos son con frecuencia
otros microcontroladores, o los circuitos integrados especializados y baratos que pertenecen a la nueva
generacin de as llamados perifricos inteligentes(memorias, sensores de temperatura, relojes de tiempo
real etc.)
Similar a la comunicacin serie en modo SPI, la transmisin de datos en modo I2C es sncrona y bidireccional.
Esta vez slo dos pines se utilizan para transmisin de datos. stos son los pines de SDA (Datos seriales) y
SCL (Reloj serial). El usuario debe configurar estos pines como entradas o salidas por los bits TRISC.
Al observar las reglas particulares (protocolos), este modo habilita conectar simultneamente de una manera
simple hasta 112 diferentes componentes al utilizar slo dos valiosos pines de E/S. Vamos a ver cmo
funciona el sistema:
El reloj, necesario para sincronizar el funcionamiento de ambos dispositivos, siempre es generado por un
dispositivo maestro (un microcontrolador) y su frecuencia directamente afecta a la velocidad de transmisin de
datos. Aunque hay un protocolo que permite como mximo una frecuencia de reloj de 3,4 MHz (as llamado
bus I
2
C de alta velocidad), este libro cubre slo el protocolo utilizado con ms frecuencia, con una frecuencia
de reloj limitada a 100 KHz. La frecuencia mnima no est limitada.
Cuando los componentes maestro y esclavo estn sincronizados por el reloj, el maestro siempre inicia cada
intercambio de datos. Una vez que el mdulo MSSP se ha habilitado, espera que ocurra una condicin de
arranque (Start condition). El dispositivo maestro primero enva el bit de arranque (est a cero) por el pin SDA,
luego la direccin de 7 bits del dispositivo esclavo seleccionado, y por ltimo, el bit que requiere al dispositivo
escribir (0) o leer (1) el dato enviado. En otras palabras, los ocho bits se desplazan al registro SSPSR
despus de ocurrir una condicin de arranque. Todos los dispositivos esclavos que comparten la misma lnea
de transmisin recibirn simultneamente el primer byte, pero slo el que contiene la direccin coincidente
recibir el dato entero.

Una vez que el primer byte se ha enviado (slo se transmiten datos de 8 bits), el maestro se pone en modo de
recepcin y espera el reconocimiento del dispositivo receptor acerca de la direccin coincidente. Si el
dispositivo esclavo enva un bit de reconocimiento (1) la transmisin de datos continuar hasta que el
dispositivo maestro (microcontrolador) enve el bit de parada (Stop).

Esto es una explicacin simple de cmo se comunican dos componentes. Este microcontrolador es capaz de
controlar las situaciones ms complicadas cuando estn conectados 1024 diferentes componentes (direccin
de 10 bits), compartidos por varios dispositivos maestros diferentes. Por supuesto, estos dispositivos se
utilizan pocas veces en la prctica por lo que no es necesario hablar de ellos detalladamente.
La siguiente figura muestra el diagrama de bloques del mdulo MSSP en modo I
2
C.

En una operacin I2C con el mdulo MSSP intervienen seis registros. Algunos de ellos se muestran en la
Figura anterior.
SSPCON
SSPCON2
SSPSTAT
SSPBUF
SSPSR
SSPADD
Registro SSPSTAT

SMP Sample bit (Bit de muestra)
Modo maestro SPI -Este bit determina fase de datos de entrada.
1 - Estado lgico se lee al final del tiempo de salida.
0 - Estado lgico se lee en la mitad del tiempo de salida.
Modo esclavo SPI - Este bit debe ser borrado cuando SPI se emplea en modo esclavo.
Modo IC (maestro o esclavo)
1 - Deshabilita control de variaciones para velocidad estndar (100kHz).
0 - Habilita control de variaciones para velocidad alta (400k Hz).
CKE - Clock Edge Select bit (bit de seleccin del flanco de reloj) selecciona el modo de sincronizacin.
CKP =0:
1 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
0 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
CKP =1:
1 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
0 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
D/A - Data/Address bit (bit de direcciones/datos) se utiliza slo en modo I
2
C
1 - Indica que el ltimo byte recibido o transmitido es un dato.
0 - Indica que el ltimo byte recibido o transmitido es una direccin.
P - Stop bit (bit de parada) se utiliza slo en modo IC.
1 - Bit de parada (STOP) se ha detectado.
0 - Bit de parada (STOP) no se ha detectado.
S - Start bit se utiliza slo en modo IC.
1 - Bit de arranque (START) se ha detectado.
0 - Bit de arranque (START) no se ha detectado.
R/W - Read Write bit (bit de informacin Lectura/Escritura) se utiliza slo en modo I
2
C. Este bit contiene la
informacin del bit de L/E despus de la ltima direccin coincidente. Este bit es vlido slo desde la direccin
coincidente hasta el siguiente bit de arranque, bit de parada o bit no ACK.
Modo I
2
C en modo esclavo
1 - Lectura de dato.
0 - Escritura de dato.
Modo IC en modo maestro
1 - Transmisin en progreso.
0 - Transmisin no est en progreso.
UA - Update Address bit (bit de activacin de direccin) se utiliza slo en modo I
2
C de 10 bits.
1 - Indica que es necesario actualizar la direccin en el registro SSPADD.
0 - Indica que la direccin es correcta y que no se necesita actualizarla.
BF Buffer Full Status bit (bit de estado de bfer lleno)
Durante la recepcin de dato (en modos SPI e I
2
C)
1 - Recepcin completa. El registro SSPBUF est lleno.
0 - Recepcin no completa. El registro SSPBUF est vaco.
Durante la transmisin de dato (slo en modo I
2
C)
1 - Transmisin de dato en progreso (no incluye el bit ACK y bits de parada).
0 - Transmisin de dato completa (no incluye el bit ACK y bits de parada).
Registro SSPCON

WCOL Write Collision Detect bit (bit detector de colisin)
1 - Colisin detectada. En el registro SSPBUF se ha escrito cuando no se han cumplido las
condiciones para iniciar una transmisin
0 - No hay colisin.
SSPOV Receive Overflow Indicator bit (bit detector de desbordamiento en recepcin)
1 - Se recibe un nuevo byte antes de leer el dato anteriormente recibido. Como no hay
espacio para recibir datos nuevos, uno de estos dos bytes debe ser borrado. En este caso,
los datos almacenados en el registro SSPSR se pierden irremediablemente.
0 - Dato serial es recibido correctamente.
SSPEN - Synchronous Serial Port Enable bit (bit de habilitacin del mdulo SSP - puerto serie sncrono)
determina la funcin de los pines del microcontrolador e inicializa el mdulo MSSP:
En modo SPI
1 - Enables MSSP module and configures pins SCK, SDO, SDI and SS as serial port pins.
0 - Disables MSSP module and configures these pins as I/O port pins.
En modo IC
1 - Habilita el mdulo MSSP y configura los pines SDA y SCL como una fuente de pines
del puerto serie.
0 - Deshabilita el mdulo MSSP y configura estos pines como pines del puerto de E/S.
CKP - Clock Polarity Select bit (bit de seleccin de polaridad de reloj) no se utiliza en modo I
2
C maestro.
En modo SPI
1 - Para una seal de reloj, el estado inactivo es un nivel alto.
0 - Para una seal de reloj, el estado inactivo es un nivel bajo.
En modo I
2
C esclavo
1 - Seal de reloj habilitada.
0 - Mantiene la salida de seal de reloj en estado bajo. Se utiliza para proporcionar ms
tiempo para estabilizacin de datos.
SSPM3-SSPM0 - Synchronous Serial Port Mode Select bits.(bit de seleccin del modo del SSP (puerto
serie sncrono). El modo SSP se determina al combinar los siguientes bits:
S SPM3 SSPM2 SSP M1 SS PM0 MODO
0 0 0 0 Modo maestro del SPI, reloj = Fosc/4
0 0 0 1 Modo maestro del SPI, reloj = Fosc/16
0 0 1 0 Modo maestro del SPI, reloj = Fosc/64
0 0 1 1 Modo maestro del SPI, reloj = (output TMR)/2
0 1 0 0 Modo esclavo del SPI, habilitado el pin de control SS
0 1 0 1
Modo esclavo del SPI, deshabilitado el pin de control SS, SS se puede utilizar
como pin de E/S
0 1 1 0 Modo esclavo IC, direccin de 7 bits utilizada
0 1 1 1 Modo esclavo IC, direccin de 10 bits utilizada
1 0 0 0 Modo mastro IC, reloj = Fosc / [4(SSPAD+1)]
1 0 0 1 Mscara utilizada en modo esclavo IC

0 1 0 No utilizado
1 0 1 1 Modo maestro IC controlado
1 1 0 0 No utilizado
1 1 0 1 No utilizado
1 1 1 0
Modo esclavo IC, direccin de 7 bits utilizada, los bits de arranque (START) y de
parada (STOP) habilitan interrupcin
1 1 1 1
Modo esclavo IC, direccin de 10 bits utilizada, los bits de arranque (START) y
de parada (STOP) habilitan interrupcin
Registro SSPCON2

GCEN - General Call Enable bit (bit de habilitacin general)
Slo en modo esclavo I
2
C
1 - Habilita interrupcin cuando una direccin de llamada general es recibida en el SSPST
(0000h).
0 - Deshabilita direccin de llamada general.
ACKSTAT - Acknowledge Status bit (bit de estado de reconocimiento)
Slo en modo de transmisin maestro I
2
C
1 - Reconocimiento del esclavo no recibido.
0 - Reconocimiento del esclavo recibido.
ACKDT - Acknowledge data bit (bit de recepcin)
Slo en modo de recepcin maestro IC
1 - No reconocimiento
0 - Reconocimiento
ACKEN - Acknowledge Sequence Enable bit (bit de habilitacin de secuencia de reconocimiento)
En modo de recepcin maestro IC
1 - Indica una secuencia de reconocimiento en los pines SDA y SCL y transmite el bit
ACKDT. Automticamente borrado por hardware.
0 - Secuencia de reconocimiento en reposo.
RCEN - Receive Enable bit (bit de habilitacin de recepcin)
Slo en modo maestro IC
1 - Habilita recepcin en modo I
2
C.
0 - Recepcin deshabilitada.
PEN - STOP condition Enable bit (bit de habilitacin de condicin de Parada)
Slo en modo maestro IC
1 - Indica una condicin de Parada en los pines SDA y SCL. Luego, este bit es
automticamente borrado por hardware.
0 - Condicin de Parada en reposo.
RSEN - Repeated START Condition Enabled bit (bit de habilitacin de repetir condicin de Arranque)
Slo en modo maestro IC
1 - Indica repeticin de condicin de Arranque en los pines SDA y SCL. Luego, este bit es
automticamente borrado por hardware
0 - Condicin de repeticin de Arranque en reposo.
SEN - START Condition Enabled/Stretch Enabled bit (bit de habilitacin de condicin de Arranque)
Slo en modo maestro IC
1 - Indica condicin de Arranque en los pines SDA y SCL. Luego, este bit es
automticamente borrado por hardware.
0 - Condicin de Arranque en reposo.
I
2
C En Modo Maestro
El caso ms comn es que un microcontrolador funciona como maestro y un perifrico como esclavo. Es la
razn por la que este libro slo trata este modo. Se da por entendido que la direccin consiste en 7 bits y el
dispositivo contiene un solo microcontrolador (dispositivo con maestro nico).
Para habilitar el mdulo MSSP en este modo, siga las siguientes instrucciones:
Ajuste la velocidad de transmisin (registro SSPADD), desactive el control de velocidad de rotacin (al poner a
uno el bit SMP del registro SSPSTAT) y seleccione el modo maestro (registro SSPCON). Despus de finalizar
todos los ajustes y habilitar el mdulo (registro SSPCON: bit SSPEN), es necesario esperar a que los
circuitos de control internos indiquen con una seal que todo est preparado para transmisin de datos: o sea,
que el bit SSPIF del registro PIR1 se haya puesto a uno.
Despus de poner este bit a cero por software, el microcontrolador est listo para intercambiar los datos con
los perifricos.
TRANSMISIN DE DATOS EN MODO MAESTRO I
2
C
La transmisin de datos en el pin SDA se inicia con un cero lgico (0) que aparece al poner a uno el bit SPEN
del registro SSPCON2. Sin embargo, aunque est habilitado, el microcontrolador tiene que esperar cierto
tiempo antes de iniciar la comunicacin. Se le denomina Condicin de Inicio durante la que se realizan las
preparaciones y verificaciones internas. Si se cumplen con todas la condiciones, el bit SSPIF del registro
PIR1 se pone a uno y la transmisin de datos se inicia en cuanto se cargue el registro SSPBUF.

Como mximo 112 circuitos integrados (dispositivos esclavos) pueden compartir simultneamente la misma
lnea de transmisin. El primer byte de datos enviado por el dispositivo maestro contiene la direccin que
coincide con una sola direccin del dispositivo esclavo. Todas las direcciones se enumeran en las hojas de
datos respectivas. El octavo bit del primer byte de datos especifica la direccin de transmisin de datos, o sea
si el microcontrolador va a enviar o recibir los datos. En este caso, como se trata de transmisin de datos, el
octavo bit se pone a cero (0).

Cuando ocurre la coincidencia de dire-cciones, el microcontrolador tiene que esperar a que el dispositivo
esclavo enve el bit de reconocimiento, o sea que se ponga a cero el bit ASKSTAT del registro SSPCON2.
Una vez que la coincidencia de dire-cciones ha ocurrido apropiadamente, todos los bytes de datos se
transmiten de la misma manera.
La transmisin de datos termina al poner a uno el bit SEN del registro SSPCON2. Ocurre la condicin de
parada (STOP), lo que habilita que el pin SDA reciba una secuencia de pulsos:
Inicio - Direccin - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento - Parada!
Recepcin de datos en modo maestro I
2
C
Las preparaciones para recibir los datos son similares a las de transmitir los datos, con excepcin de que el
ltimo bit del primer byte enviado (el que contiene la direccin) se ponga a uno lgico (1). Eso especifica que
el dispositivo maestro espera recibir los datos del dispositivo esclavo direccionado. Con respecto al
microcontrolador, ocurre lo siguiente:
Despus de hacer las pruebas internas y poner a uno el bit de arranque (START), el dispositivo esclavo enva
byte por byte. Estos bytes se almacenan en el registro serial SSPSR. Despus de recibir el ltimo - octavo bit,
cada dato se carga en el registro SSPBUF del que se puede leer. Al leer este registro, se enva
automticamente el bit de reconocimiento, lo que significa que el dispositivo maestro est listo para recibir los
nuevos datos.
Al igual que en el caso de la transmisin, la recepcin de datos termina al poner a uno el bit de parada
(STOP):

Inicio - Direccin - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento - Parada!
En esta secuencia de pulsos, el bit de reconocimiento se enva al dispositivo esclavo.
GENERADOR DE BAUDIOS
Para sincronizar la transmisin de datos, todos los eventos que ocurren en el pin SDA deben estar
sincronizados con la seal de reloj generada en el dispositivo maestro. Esta seal de reloj se genera por un
simple oscilador cuya frecuencia depende de la frecuencia del oscilador principal del microcontrolador, del
valor que se introduce al registro SSPADD y as como del modo SPI actual.
La frecuencia de seal de reloj del modo descrito en este libro depende del cristal de cuarzo seleccionado y
del registro SPADD. La frmula utilizada para hacer el clculo de frecuencia de reloj es:

Vamos a hacerlo en mikroBasic...
' En est e ej empl o, el mi cr ocont r ol ador PI C est conect ado a l a memor i a
EEPROM 24C02 por l os
' pi nes SCL y SDA. El pr ogr ama env a un byt e de dat o a l a di r ecci n 2 de
l a EEPROM. Ent onces,
' el pr ogr ama l ee est e dat o por el modo I 2C de l a EEPROM y l o env a al
puer t o PORTB par a
' compr obar si el dat o se ha escr i t o con xi t o. El byt e par a di r ecci onar
l a EEPROM est
' compuest o por 7 bi t s de l a di r ecci n ( 1010001) y el bi t que det er mi na
l ect ur a o escr i t ur a del
' dat o ( LSB - bi t menos si gni f i cat i vo) .

mai n:
ANSEL = ANSELH = PORTB = TRI SB = 0 ' Todos l os pi nes son di gi t al es. Los
pi nes del
' puer t o PORTB son sal i das.
I 2C1_I ni t ( 100000) ' I ni ci al i zar I 2C con r el oj deseado
I 2C1_St ar t ( ) ' Seal de i ni ci o de I 2C
I 2C1_Wr ( 0xA2) ' Envi ar byt e por I 2C ( di r ecci n de di sposi t i vo +
W)
I 2C1_Wr ( 2) ' Envi ar byt e ( di r ecci n de l a l ocal i dad EEPROM)
I 2C1_Wr ( 0xF0) ' Envi ar l os dat os a escr i bi r
I 2C1_St op( ) ' Seal de par ada de I 2C
Del ay_100ms( )
I 2C1_St ar t ( ) ' Seal de i ni ci o de I 2C
I 2C1_Wr ( 0xA2) ' Envi ar byt e por I 2C ( di r ecci n de di sposi t i vo +
W)
I 2C1_Wr ( 2) ' Envi ar byt e ( di r ecci n de dat o)
I 2C1_Repeat ed_St ar t ( ) ' Se vuel ve a gener ar el i ni ci o de seal I 2C
I 2C1_Wr ( 0xA3) ' Envi ar byt e ( di r ecci n de di sposi t i vo + R)
PORTB = I 2C1_Rd( 0u) ' Leer el dat o ( r econoci mi ent o NO)
I 2C1_St op( ) ' Seal de par ada de I 2C
NOTAS TILES ...
Cuando el microcontrolador se comunica con un perifrico, puede ocurrir un fallo en la transmisin de datos
por alguna razn. En este caso, es recomendable comprobar el estado de algunos bits que pueden aclarar el
problema. En la prctica, el estado de estos bits se comprueba al ejecutar una pequea subrutina despus de
transmisin y recepcin de cada byte (por si acaso).
WCOL (SPCON,7) - Si intenta escribir un dato nuevo al registro SSPBUF mientras que otra
transmisin/recepcin de datos est en progreso, el bit WCOL se pone a uno y el contenido del registro
SSBUF se queda sin cambios. No hay escritura. Luego, el bit WCOL debe ser borrado por el software.
BF (SSPSTAT,0) -Al transmitir los datos, este bit se pone a uno durante la escritura en el registro SSPBUF y
se queda puesto a uno hasta que el byte en formato serial se desplace del registro SSPRS. En modo de
recepcin, este bit se pone a uno al cargar un dato o una direccin al registro SSPBUF. Se pone a cero
despus de leer el registro SSPBUF.

SSPOV (SSPCON,6) - En modo de recepcin, este bit se pone a uno al recibir un nuevo byte en el
registro SSPSR por medio de la comunicacin serial, todava sin haber ledo el dato anteriormente
recibido del registro SSPBUF.
Pines SDA y SCL - Cuando el mdulo SSP est habilitado, estos pines se vuelven a las salidas
de Drenaje Abierto. Esto significa que deben estar conectados a resistencias conectados a la otra
punta al polo positivo de la fuente de alimen- tacin.
En breve
Recibir/Transmitir los datos en el modo I
2
C
Para establecer la comunicacin serial en modo I2C, se debe realizar lo siguiente:
Ajustar el mdulo y enviar la direccin:
Introducir en el registro SSPADD el valor para definir la velocidad de transmisin en
baudios.
Poner a uno el bit SMP del registro SSPSTAT para desactivar el control de la velocidad de
rotacin.
Introducir el valor binario 1000 a los bits SSPM3-SSPM0 del registro SSPCON1 para
seleccionar el modo Maestro.
Poner a uno el bit SEN del registro SSPCON2 (secuencia de Inicio - START).
El bit SSPIF se pone a uno automticamente en final de la secuencia de Inicio cuando el
mdulo est listo para funcionar. Se deber poner a cero.
Introducir la direccin de esclavo al registro SSPBUF.
Cuando se enva un byte, el bit SSPIF (interrupcin) se pone a uno automticamente
despus de haber recibido el bit de reconocimiento del dispositivo esclavo.
Transmitir los datos:
Introducir en el registro SSPBUF los datos a enviar.
Cuando se enva un byte, el bit SSPIF (interrupcin) se pone a uno automticamente
despus de haber recibido el bit de reconocimiento del dispositivo esclavo.
La condicin de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro
SSPCON para informar al dispositivo Esclavo que la transmisin de datos se acab.
Recibir los datos:
Poner a uno el bit RSEN del registro SSPCON2 para habilitar la recepcin.
El bit SSPIF indica con su estado lgico la recepcin de datos. Despus de leer los datos
del registro SSPBUF, el bit ACKEN del registro SSPCON2 debe ponerse a uno para
habilitar el envo del bit de reconocimiento.
La condicin de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro
SSPCON para informar al dispositivo Esclavo que la transmisin se acab.
3.9 MDULOS ANALGICOS
Aparte de disponer de un gran nmero de lneas digitales de E/S utilizadas para la comunicacin con los
perifricos, el PIC16F887 contiene 14 entradas analgicas. Debido a stas, el microcontrolador no slo puede
reconocer si un pin es llevado a bajo o alto (0 o +5V), sino que puede medir con precisin el voltaje y
convertirlo en un valor numrico, o sea, en formato digital.
El convertidor A/D es uno de los mdulos analgicos ms importantes dentro del microcontrolodar. Dispone
de las siguientes caractersticas:
La conversin se lleva al cabo aplicando el mtodo de aproximacin sucesiva;
Dispone de 14 entradas analgicas separadas que se conectan a los pines del puerto del
microcontrolador;
El convertidor A/D convierte una seal de entrada analgica en un nmero binario de 10
bits;
La resolucin mnima o calidad de conversin se puede ajustar a diferentes necesidades al
seleccionar voltajes de referencia Vref- y Vref+.

CONVERTIDOR A/D
Aunque a primera vista parece muy complicado utilizar un convertidor A/D, en realidad es muy simple. De
hecho resulta ms simple utilizar un convertidor A/D que los temporizadores o mdulos de comunicacin
serie.

El funcionamiento del convertidor A/D est bajo el control de los bits de cuatro registros:
ADRESH Registro alto del resultado de la conversin A/D;
ADRESL Registro bajo del resultado de la conversin A/D;
ADCON0 Registro de control 0; y
ADCON1 Registro de control 1.
Registros ADRESH y ADRESL
El resultado obtenido despus de convertir un valor analgico en digital es un nmero de 10 bits que se
almacenar en los registros ADRESH y ADRESL. Hay dos maneras de manejarlo: justificacin a la izquierda y
a la derecha que simplifica en gran medida su uso. El formato del resultado de la conversin depende del bit
ADFM del registro ADCON1. En caso de que no se utilice el convertidor A/D, estos registros se pueden utilizar
como registros de propsito general.

REQUERIMIENTOS DE ADQUISICIN A/D
Para que el convertidor A/D alcance su exactitud especificada, es necesario proporcionar un cierto tiempo
muerto entre seleccionar una entrada analgica especfica y la medicin misma. Este tiempo se le denomina
tiempo de adquisicin y generalmente depende de la impedancia de la fuente. Se utiliza una ecuacin para
hacer clculo de tiempo de adquisicin con precisin, cuyo valor mnimo es de 20uS aproximadamente. Por
consiguiente, para realizar una conversin con precisin, no se olvide este detalle.
RELOJ PARA LA CONVERSIN A/D
El tiempo necesario para realizar una conversin A/D cuyo resultado es 1 bit se define en unidades de TAD.
Se requiere que sea como mnimo 1,6 uS. Para realizar una conversin completa de 10 bits se requiere un
poco ms tiempo de lo esperado, son 11 TAD. Como la frecuencia de reloj as como la fuente de conversin
A/D son determinadas por software, es necesario seleccionar una de las combinaciones de los bits
disponibles ADCS1 y ADCS0 antes de empezar a medir voltaje en una de las entradas analgicas. Estos bits
se almacenan en el registro ADCON0.
FUE NTE DE REL OJ D E A D C A DCS1 A DCS 0
FRECU ENCI A D E D I SP OS I T I V O ( FOSC )
20 Mhz 8 Mhz 4 Mhz 1 Mhz
Fosc/2 0 0 100 nS 250 nS 500 nS 2 uS
Fosc/8 0 1 400 nS 1 uS 2 uS 8 uS
Fosc/32 1 0 1.6 uS 4 uS 8 uS 32 uS
Frc 1 1 2 - 6 uS 2 - 6 uS 2 - 6 uS 2 - 6 uS
Cualquier cambio de la frecuencia de reloj del microcontrolador afectar a la frecuencia de reloj de la
conversin A/D, lo que puede perjudicar al resultado de la conversin A/D. En la siguiente tabla se muestran
las frecuencias de reloj posibles del dispositivo y cmo afectan a la velocidad de la conversin A/D. Los
valores en las celdas sombreadas estn fuera del rango recomendado.

CMO UTILIZAR EL CONVERTIDOR A/D?
Para llevar a cabo una conversin A/D sin problemas as como para evitar los resultados inesperados, es
necesario considerar lo siguiente:
El convertidor A/D no hace diferencia entre seales digitales y analgicas.Para evitar
errores en medicin o daar el chip, los pines se deben configurar como entradas
analgicas antes de que empiece el proceso de conversin. Los bits utiliza dos para este
propsito se almacenan en los registros TRIS y ANSEL (ANSELH);
Al leer el estado de puerto con las entradas analgicas marcadas como CH0-CH13, el
estado de los bits correspondientes, o sea, su valor digital se leer como cero lgico (0); y
Hablando en trminos generales, la medicin de voltaje en el convertidor est basado en
comparar voltaje de entrada con una escala interna que tiene 1024 grados (2
10
=1024). El
grado ms bajo de esta escala representa el voltaje Vref-, mientras que el grado ms alto
se refiere al voltaje Vref+. La siguiente figura muestra los voltajes de referencia
seleccionables as como sus valoresmximos y mnimos.

Registros ADCON0

ADCS1, ADCS0 - A/D Conversion Clock Select bits (bits de seleccin de reloj de conversin A/D)
selecciona la frecuencia de reloj utilizada para sincronizacin interna del convertidor A/D. Asimismo afecta a la
duracin de la conversin.
A DCS1 A DCS2 R EL OJ
0 0 Fosc/2
0 1 Fosc/8
1 0 Fosc/32
1 1 RC *
* Seal de reloj se genera por el oscilador interno RC que est integrado en el convertidor.
CHS3-CHS0 - Analog Channel Select bits (bits de seleccin de canal analgico) selecciona un pin o un
canal analgico para la conversin A/D, o sea para medir el voltaje:
CHS3 CHS2 CHS1 CHS0 C AN AL PI N
0 0 0 0 0 RA0/AN0
0 0 0 1 1 RA1/AN1
0 0 1 0 2 RA2/AN2
0 0 1 1 3 RA3/AN3
0 1 0 0 4 RA5/AN4
0 1 0 1 5 RE0/AN5
0 1 1 0 6 RE1/AN6
0 1 1 1 7 RE2/AN7
1 0 0 0 8 RB2/AN8
1 0 0 1 9 RB3/AN9
1 0 1 0 10
RB1/AN1
0
1 0 1 1 11
RB4/AN1
1
1 1 0 0 12
RB0/AN1
2
1 1 0 1 13
RB5/AN1
3
1 1 1 0 CVref
1 1 1 1 Vref = 0.6V
GO/DONE - A/D Conversion Status bit (bit de estado de la conversin A/D) determina el estado actual de de
la conversin:
1 - La conversin A/D est en progreso
0 - La conversin A/D ha finalizado. El bit se pone a cero automticamente por hardware
cuando la conversin A/D finaliza.
ADON - A/D On bit (bit de encendido A/D) habilita el convertidor A/D.
1 - Convertidor A/D est habilitado.
0 - Convertidor A/D est deshabilitado.
Vamos a hacerlo en mikroBasic...
' Est e cdi go es un ej empl o de l eer el val or anal gi co del canal 2 y de
vi sual i zar l o
' en l os puer t os PORTB y PORTC como nmer o bi nar i o de 10 bi t s.

dim adc_r d as word
mai n:
ANSEL = 0x04 ' Conf i gur ar AN2 como pi n anal gi co
TRI SA = 0xFF ' PORTA se conf i gur a como ent r ada
ANSELH = 0 ' Conf i gur ar l os dems pi nes AN como E/ S
di gi t al es
TRI SC = 0x3F ' Pi nes RC7 y RC6 se conf i gur an como sal i das
TRI SB = 0 ' PORTB se conf i gur a como sal i da

while 1
t emp_r es = ADC_Read( 2) ' Obt ener el r esul t ado de 10 bi t s de l a
conver si n AD
PORTB = t emp_r es ' Envi ar l os 8 bi t s ms baj os al PORTB
PORTC = t emp_r es >> 2 ' Envi ar l os 2 bi t s ms si gni f i cat i vos a l os RC7
y RC6
wend ' Quedar se en el bucl e
end.
Registro ADCON1

ADFM - A/D Result Format Select bit (bit de seleccin del formato del resultado de la conversin A/D)
1 - Resultado de conversin est justificado a la derecha. No se utilizan los seis bits ms
significativos del registro ADRESH
0 - Resultado de conversin est justificado a la izquierda. No se utilizan los seis bits
menos significativos del registro ADRESL.
VCFG1 - Voltage Reference bit (bit de configuracin de voltaje de referencia) selecciona la fuente de voltaje
de referencia bajo que se necesita para el funcionamiento del convertidor A/D.
1 - Voltaje de referencia bajo se aplica al pin Vref-
0 - Voltaje de alimentacin Vss se utiliza como una fuente de voltaje de referencia bajo.
VCFG0 - Voltage Reference bit (bit de configuracin de voltaje de referencia) selecciona la fuente de voltaje
de referencia alto que se necesita para el fucionamiento del convertidor A/D.
1 - Voltaje de referencia alto se aplica al pin Vref+
0 - Voltaje de alimentacin Vdd se utiliza como una fuente de voltaje de referenia alto.
En breve
Utilizar el convertidor A/D
Para medir el voltaje en un pin de entrada por medio del convertidor A/D, se debe realizar lo siguiente:
Paso 1 - Configuracin del puerto:
Escribir un uno lgico (1) a un bit del registro TRIS, lo que resulta en configurar el pin
apropiado como una entrada.
Escribir un uno lgico (1) a un bit del registro ANSEL, lo que resulta en configurar el pin
apropiado como una entrada analgica.
Paso 2 - Configuracin del mdulo de la conversin A/D:
Configurar voltaje de referencia en el registro ADCON1.
Seleccionar una seal de reloj de la conversin A/D en el registro ADCON0.
Seleccionar uno de los canales de entrada CH0-CH13 del registro ADCON0.
Seleccionar el formato de dato por medio de ADFM del registro ADCON1.
Habilitar el convertidor A/D al poner a uno el bit ADON del registro ADCON0.
Paso 3 - Configuracin de la interrupcin (opcionalmente):
Poner a cero el bit ADIF.
Poner a uno los bits ADIE, PEIE y GIE .
Paso 4 -Tiempo de espera para que transcurra el tiempo de adquisicin (aproximadamente 20uS).
Paso 5 - Inicio de la conversin poniendo a uno el bit GO/DONE del registro ADCON0.
Paso 6 - Esperar a que la conversin A/D finalice.
Es necesario comprobar en el bucle de programa si el bit GO/DONE est a cero o esperar
que se produzca una interrupcin (deber estar anteriormente habilitada).
Paso 7 - Lectura del resultado de la conversin A/D:
Leer los registros ADRESH y ADRESL.
COMPARADOR ANALGICO
Aparte del convertidor A/D, hay otro mdulo, que hasta hace poco ha sido incorpodo slo en los circuitos
integrados que pertenecen a los llamados componentes analgicos. Debido al hecho de que casi no hay
ningn dispositivo automtico complejo que en cierto modo no utilice estos circuitos, dos comparadores de
alta calidad, junto con los componentes adicionales estn integrados en el microcontrolador y conectados a
sus pines.
Cmo funciona un comparador? Bsicamente, el comparador analgico es un amplificador que compara la
magnitud de voltajes en dos entradas. Dispone de dos entradas y una salida. Dependiendo de cul voltaje de
entrada es ms alto (valor analgico), un cero lgico (0) o un uno lgico (1) (valores digitales) ser la salida:

Cuando el voltaje analgico en Vin- es ms alto que el voltaje anlogo en Vin+, la salida
del comparador estar a un nivel digital bajo.
Cuando el voltaje analgico en Vin+es ms alto que el voltaje anlogo en Vin-, la salida
del comparador estar a un nivel digital alto.
El microcontrolador PIC16F887 dispone de dos de estos comparadores de voltaje cuyas entradas estn
conectadas a los pines de E/S RA0-RA3, mientras que las salidas estn conectadas a los pines RA4 y RA5.
Adems, hay una fuente de voltaje de referencia interna en el chip mismo, la que vamos a discutir ms tarde.
Estos dos circuitos estn bajo el control de los bits almacenados en los siguientes registros:
CM1CON0 est en control del comparador C1;
CM2CON0 est en control del comparador C2;
CM2CON1 est en control del comparador C2;
FUENTE INTERNA DE VOLTAJE DE REFERENCIA
Uno de dos voltajes analgicos proporcionados en las entradas del comparador es por lo general estable e
inalterable. Es denominado voltaje de referencia(Vref). Para generarlo, se pueden utilizar tanto una fuente de
voltaje externa como una fuente de voltaje interna. El voltaje de referencia Vref se deriva despus de
seleccionar una fuente, por medio de las dos puntas de una red en escalera que consiste en 16 resistencias,
formando un divisor de voltaje. El bit VRSS del registro VRCON se utiliza para seleccionar la fuente de voltaje
de referencia.
El mdulo de voltaje de referencia del comparador proporciona un voltaje de referencia generado
internamente para los comparadores (CVref). El voltaje de referencia CVref dispone de dos gamas con 16
diferentes niveles de voltaje cada una. La seleccin de gama es controlada por el bit VRR del registro
VRCON. El voltaje de referencia seleccionado CVref puede ser la salida al pin RA2/AN2 si el bit VROE se
pone a uno. Adems, los bits VR0-VR3 se utilizan para seleccionar los niveles de voltaje apropiados. Veamos
la siguiente figura:

Aunque la idea principal con el mdulo de voltaje de referencia era de proporcionar un voltaje de referencia
variable a los mdulos analgicos, ahora se utiliza como un convertidor A/D. Este convertidor se ha probado
muy til en algunas aplicaciones. Su funcionamiento est bajo el control del registro VRCON.
COMPARADORES E INTERRUPCIN
Siempre que haya un cambio del estado lgico en la salida de un comparador, el bit de bandera CMIF del
registro PIR se pone a uno. Ese cambio tambin causar una interrupcin si los siguientes bits se ponen a
uno:
El bit CMIE del registro PIE =1;
El bit PEIE del registro INTCON =1; y
El bit GIE del registro INTCON =1.
Si una interrupcin est habilitada, un cambio en la salida de un comparador cuando el microcontrolador est
en modo de reposo puede causar que el microcontrolador salga de reposo y vuelva a funcionar en modo
normal.
FUNCIONAMIENTO EN MODO DE REPOSO (SLEEP MODE)
Si est habilitado antes de entrar en modo de reposo, el comparador se queda activo durante el modo de
reposo. Si el comparador no se utiliza para despertarel dispositivo, el consumo de corriente se puede
reducir en modo de reposo al apagar el comparador. Esto se lleva a cabo al poner a cero el bit CxON del
registro CMxCON0.
Para que el comparador despierte al microcontrolador del modo de reposo, el bit CxIE del registro IE2 y el bit
PEIE del registro INTCON debern ponerse a uno. La primera instruccin que se ejecutar despus de que el
microcontrolador salga del modo de reposo ser la que sigue a la instruccin Sleep. Si el bit GIE del registro
INTCON se pone a uno, el microcontrolador ejecutar la rutina de servicio de interrupcin.
Registro CM1CON0

Los bits de este registro estn en control del comparador C1. Eso afecta principalmente a la configuracin de
las entradas. Para explicarlo con ms claridad, vea la siguiente figura en la que se muestran slo los
componentes directamente afectados por los bits de este registro.

C1ON - Comparator C1 Enable bit (bit de habilitacin del comparador C1) habilita al comparador C1.
1 - Comparador C1 est habilitado.
0 - Comparador C1 est deshabilitado.
C1OUT - Comparator C1 Output bit (bit de salida del comparador C1) es la salida del comparador C1.
Si C1POL =1 (salida del comparador est invertida)
1 - Voltaje de entrada C1Vin+es ms bajo que el voltaje de entrada C1Vin-.
0 - Voltaje de entrada C1Vin+es ms alto que el voltaje de entrada C1Vin-.
Si C1POL =0 (salida del comparador no est invertida)
1 - Voltaje de entrada C1Vin+es ms alto que el voltaje de entrada C1Vin-.
0 - Voltaje de entrada C1Vin+es ms bajo que el voltaje de entrada C1Vin-.
C1OE Comparator C1 Output Enable bit (bit de habilitacin de salida del comparador C1)
1 - Salida del comparador C1OUT est conectada al pin C1OUT*.
0 - Salida del comparador se utiliza internamente.
* Para habilitar que el bit C1OUT aparezca en el pin, se deben cumplir dos condiciones: C1ON =1 (el
comparador debe estar activado) y el pin correspondiente se debe configurar como salida (bit TRIS =0).
C1POL - Comparator C1 Output Polarity Select bit (bit de seleccin de polaridad de salida del comparador
C1) habilita la inversin del estado de la salida del comparador C1.
1 - Salida del comparador C1 est invertida.
0 - Salida del comparador C1 no est invertida.
C1R - Comparator C1 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del
comparador C1)
1 - Entrada no invertida C1Vin+est conectada a la fuente de voltaje de referencia C1Vref.
0 - Entrada no invertida C1Vin+est conectada al pin C1IN+.
C1CH1, C1CH0 - Comparator C1 Channel Select bit (bit de seleccin de canal del comparador C1)
Registro CM2CON0

Los bits de este registro estn en control del comparador C1. Eso afecta principalmente a la configuracin de
las entradas. Para explicarlo con ms claridad, vea la siguiente figura en la que se muestran slo los
componentes directamente afectados por los bits de este registro.

C2ON - Comparator C2 Enable bit (bit de habilitacin del comparador C2) habilita el comparador C2.
1 - Comparador C2 est habilitado.
C1 CH1 C1 CH0 ENT RAD A C1 V I N DEL C OMP A R A D OR
0 0 Entrada C1Vin- est conectada al pin C12IN0-
0 1 Entrada C1Vin- est conectada al pin C12IN1-
1 0 Entrada C1Vin- est conectada al pin C12IN2-
1 1 Entrada C1Vin- est conectada al pin C12IN3-
0 - Comparador C2 est deshabilitado.
C2OUT - Comparator C2 Output bit (bit de salida del comparador C2) es la salida del comparador C2.
Si C2POL =1 (salida del comparador est invertida)
1 - Voltaje de entrada C2Vin+es ms bajo que el voltaje de entrada C2Vin-.
0 - Voltaje de entrada C2Vin+es ms alto que el voltaje de entrada C2Vin-.
Si C2POL =0 (salida del comparador no est invertida)
1 - Voltaje de entrada C2Vin+es ms alto que el voltaje de entrada C2Vin-.
0 - Voltaje de entrada C2Vin+es ms bajo que el voltaje de entrada C2Vin-.
C2OE - Comparator C2Output Enable bit (bit de habilitacin de salida del comparador C2)
1 - Salida del comparador C2OUT est conectada al pin C2OUT*.
0 - Salida del comparador se utiliza internamente.
* Para habilitar que el bit C2OUT aparezca en el pin, se deben cumplir dos condiciones: C2ON =1 (el
comparador debe estar activado) y el pin correspondiente se debe configurar como salida (bit TRIS =0)
C2POL - Comparator C2 Output Polarity Select bit (bit de seleccin de polaridad de salida del comparador
C2) habilita la inversin del estado de la salida del comparador C2.
1 - Salida del comparador C2 est invertida.
0 - Salida del comparador C2 no est invertida.
C2R - Comparator C2 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del
comparador C2)
1 - Entrada no invertida C2Vin+est conectada a la fuente de voltaje de referencia C2Vref.
0 - Entrada no invertida C2Vin+est conectada al pin C2IN+.
C2CH1, C2CH0 Comparator C2 Channel Select bit (bit de seleccin de canal del comparador C2)
C2 CH1 C2 CH 0 EN TRAD A C2 V I N DEL C OMP AR A D OR
0 0 Entrada C2Vin- est conectada al pin C12IN0-
0 1 Entrada C2Vin- est conectada al pin C12IN1-
1 0 Entrada C2Vin- est conectada al pin C12IN2-
1 1 Entrada C2Vin- est conectada al pin C12IN3-
Registro CM2CON1

Mirror Copy of the C1OUT bit es una copia del bit C1OUT
Mirror Copy of the C2OUT bit es una copia del bit C2OUT
C1RSEL Comparator C1 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del
comparador C1)
1 - Voltaje seleccionable CVref se utiliza en la fuente de voltaje de referencia C1Vref.
0 - Voltaje de referencia fijo de 0,6V se utiliza en la fuente de voltaje de referencia C1Vref.
C2RSEL - Comparator C2 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del
comparador C2)
1 - Voltaje seleccionable CVref se utiliza en la fuente de voltaje de referencia C2Vref.
0 - Voltaje de referencia fijo de 0,6V se utiliza en la fuente de voltaje de referencia C2Vref.
T1GSS - Timer1 Gate Source Select bit (bit de seleccin de la fuente de la compuerta del temporizador
Timer1)
1 - Compuerta del temporizador Timer1 utiliza seal del pin T1G.
0 - Compuerta del temporizador Timer1 utiliza seal SYNCC2OUT.
C2SYNC - Comparator C2 Output Synchronization bit (bit de sincronizacin de salida del comparador C2)
1 - Salida del comparador C2 est sincronizada con un flanco ascendente de seal de reloj
del temporizador Timer1
0 - Salida del comparador es una seal asncrona.
Registro VRCON

VREN Comparator C1 Voltage Reference Enable bit (bit de habilitacin de la fuente de voltaje de referencia
del comparador C1)
1 - Fuente de voltaje de referencia CVref est encendido.
0 - Fuente de voltaje de referencia CVref est apagado.
VROE Comparator C2 Voltage Reference Enable bit (bit de habilitacin de la fuente de voltaje de referencia
del comparador C2)
1 - Fuente de voltaje de referencia CVref est conectada al pin.
0 - Fuente de voltaje de referencia CVref no est conectada al pin.
VRR - CVref Range Selection bit (bit de seleccin de gama de voltaje de referencia Vref)
1 - Fuente de voltaje de referencia se ajusta a producir baja gama de voltaje.
0 - Fuente de voltaje de referencia se ajusta a producir alta gama de voltaje.
VRSS - Comparator Vref Range selection bit (bit de seleccin de gama de voltaje de referencia Vref del
comparador)
1 - Voltaje de referencia est en la gama de Vref+a Vref-.
0 - Voltaje de referencia est en la gama de Vdd a Vss. (voltaje de alimentacin).
VR3 - VR0 CVref Value Selection (seleccin de valor de voltaje de referencia)
Si VRR =1 (gama baja)
El voltaje de referencia se calcula por medio de la frmula: CVref =([VR3:VR0]/24)Vdd.
Si VRR =0 (gama alta)
El voltaje de referencia se calcula por medio de la frmula CVref =Vdd/4 +([VR3:VR0]/32)Vdd.
En breve
Pasos a seguir para utilizar apropiadamente los comparadores integrados:
Paso 1 - Configuracin del mdulo:
Para seleccionar el modo apropiado, se deben configurar los estados de los bits de los
registros CM1CON0 y CM2CON0. La interrupcin debe estar deshabilitada durante el
cambio de modo.
Paso 2 - Configurar la fuente de voltaje de referencia Vref interna (slo si se utiliza). En el registro VRCON es
necesario realizar lo siguiente:
Seleccionar una de dos gamas de voltaje por medio del bit VRR.
Configurar el voltaje de referencia Vref necesario por medio de los bits VR3 -VR0.
Poner a uno el bit VROE si es necesario.
Habilitar la fuente de voltaje de referencia Vref al poner a uno el bit VREN.
Frmula utilizada para calcular el voltaje de referencia:
VRR = 1 (gama baja)
CVref =([VR3:VR0]/24)VLADDER
VRR = 0 (gama alta)
CVref =(VLADDER/4) +([VR3:VR0]VLADDER/32)
Vladder =Vdd or ([Vref+] - [Vref-]) or Vref+
Paso 3 - Inicio del funcionamiento:
Habilitar una interrupcin al poner a uno los bits CMIE (registro PIE), PEIE y GIE (registro
INTCON ).
Leer los bits C1OUT y C2OUT del registro CMCON.
Leer la bandera de bit CMIF del registro PIR. Despus de haber sido puesto a uno, este bit
se pone a cero por software.
3.10 OSCILADOR DE RELOJ
Para sincronizar todos los procesos que se llevan a cabo dentro del microcontrolador, se debe utilizar una
seal de reloj, mientras que para generar una seal de reloj, se debe utilizar un oscilador. As de simple. El
microcontrolador dispone de varios osciladores capaces de funcionar en modos diferentes. Y aqu es donde
viene lo interesante...
Como se muestra en la siguiente figura, la seal de reloj se genera por uno de los dos osciladores integrados.

Un oscilador externo est incorporado dentro del microcontrolador y conectado a los pines OSC1 y OSC2. Es
denominado externo porque est conectado a los componentes externos tales como: cristal de cuarzo,
resonador cermico o circuito resistor - capacitor. El modo de funcionamiento del oscilador se selecciona por
los bits de la Palabra de Configuracin, cargados en el microcontrolador durante la programacin.

El oscilador interno consiste en dos osciladores internos separados:

El HFINTOSC es un oscilador interno de alta frecuencia calibrado a 8MHz. El microcontrolador puede utilizar
una seal de reloj generada a esta frecuencia o despus de haber sido dividida en el pre-escalador.

El LFINTOSC es un oscilador interno de baja frecuencia calibrado a 31 kHz. Sus pulsos de reloj se utilizan
para funcionamiento de los temporizadores de encendido y perro guardin, asimismo puede utilizarse como
fuente de seal de reloj para el funcionamiento de todo el microcontrolador.

El bit System Clock Select (bit de seleccin del reloj del sistema - SCS) del registro OSCCON determina si
una fuente de seal de reloj del microcontrolador ser interna o externa.
Registro OSCCON
El registro OSCCON se utiliza para seleccionar y gobernar el oscilador de reloj y la frecuancia de reloj.
Contiene los siguientes bits: bits de seleccin de frecuencia (IRCF2, IRCF1, IRCF0), bits de estado de
frecuencia (HTS, LTS), bits de control de reloj del sistema (OSTA, SCS).

IRCF2-0 - Internal Oscillator Frequency Select bits. (bits de seleccin de frecuencia del oscilador interno).
El valor del divisor de frecuencias depende de la combinacin de estos tres bits. La frecuencia de reloj del
oscilador interno se determina de la misma manera.
I R CF2 I RCF1 I RC F0 FRE CUENCI A OSC .
1 1 1 8 MHz HFINTOSC
1 1 0 4 MHz HFINTOSC
1 0 1 2 MHz HFINTOSC
1 0 0 1 MHz HFINTOSC
0 1 1 500 kHz HFINTOSC
0 1 0 250 kHz HFINTOSC
0 0 1 125 kHz HFINTOSC
0 0 0 31 kHz LFINTOSC
OSTS - Oscillator Start-up Time-out Status bit (bit de estado del temporizador de encendido) indica cul
fuente de reloj est actualmente en uso. Es un bit de slo lectura.
1 - Se utiliza el oscilador de reloj externo.
0 - Se utiliza uno de los osciladores de reloj interno (HFINTOSC o LFINTOSC).
HTS - HFINTOSC Status bit (8 MHz - 125 kHz) (bit de estado del HFINTOSC) indica si el oscilador interno de
alta frecuencia funciona en modo estable.
1 - HFINTOSC est estable.
0 - HFINTOSC no est estable.
LTS - LFINTOSC Stable bit (31 kHz) (bit de estado del LFINTOSC) indica si el oscilador de baja frecuencia
funciona en modo estable.
1 - LFINTOSC est estable.
0 - LFINTOSC no est estable.
SCS - System Clock Select bit (bit de seleccin del reloj del sistema) determina cul oscilador se utilizar
como una fuente de reloj.
1 - Oscilador interno se utiliza como reloj del sistema.
0 - Oscilador externo se utiliza como reloj del
sistema.

El modo del oscilador se configura por medio de los bits,
denominados Palabra de Configuracin, que se escribe en la memoria del
microcontrolador durante el proceso de la programacin.
MODOS DE RELOJ EXTERNO
El oscilador externo se puede configurar para funcionar en uno de varios modos, lo que habilita que funcione a
diferentes velocidades y utilice diferentes componentes para estabilizar la frecuencia. El modo de
funcionamiento se selecciona durante el proceso de escribir un programa en el microcontrolador. Antes que
nada, es necesario activar el programa en una PC que se utilizar para programar el microcontrolador. En
este caso, es el programa PICflash. Pulse sobre la casilla del oscilador y seleccione uno de la lista
desplegable. Las informaciones sobre esta configuracin se gurdan automticamente en la Palabra de
Configuracin.
Durante el proceso de la programacin del microcontrolador, los bits de la Palabra de Configuracin se
escriben en la memoria ROM del microcontrolador y se almacenan en los registros especiales no disponibles
al usuario. A base de estos bits, el microcontrolador sabe qu hacer, aunque eso no se indica explcitamente
en el programa.
Modo de funcionamiento se sele-cciona despus de escribir y compilar un programa.
OSCILADOR EXTERNO EN MODO EC
El oscliador de reloj externo en el modo EC (external clock) utiliza un oscilador externo independiente como
una fuente de seal de reloj. La mxima frecuencia de seal de reloj est limitada a 20 MHz.

Las ventajas del funcionamiento del oscilador externo en modo EC son las siguientes:
La fuente de reloj externa independiente est conectada al pin de entrada OSC1. El pin
OSC2 est disponible como pin de E/S de propsito general;
Es posible sincronizar el funcionamiento del microcontrolador con los dems componentes
incorporados en el dispositivo;
En este modo el microcontrolador se pone a funcionar inmediatamente despus de
encenderlo. No se requiere esperar para estabilizar la frecuencia.
Al deshabilitar temporalmente la fuente de reloj externa, se detiene el funcionamiento del
dispositivo, dejando todos los datos intactos. Despus de reiniciar el reloj externo, el
dispositivo sigue funcionando como si no hubiera pasado nada.

OSCILADOR EXTERNO EN MODO LP, XT o HS

El oscilador en los modos LP, XT y HS utilizan un oscilador externo dentro del microcontrolador como una
fuente de reloj. La frecuencia de reloj est determinada por un cristal de cuarzo o por resonadores cermicos
conectados a los pines OSC1 y OSC2. Dependiendo de las caractersticas de los componentes utilizados,
seleccione uno de los siguientes modos:
Modo LP - (Baja potencia) se utiliza slo para cristal de cuarzo de baja frecuencia. Este
modo est destinado para trabajar con cristales de 32.768 KHz normalmente embebidos
en los relojes de cristal. Es fcil de reconocerlos por sus dimensiones pequeas y una
forma cilndrica. Al utilizar este modo el consumo de corriente ser menor que en los
dems modos.
Modo XT se utiliza para cristales de cuarzo de frecuencias intermedias hasta 8 MHz. El
consumo de corriente es media en comparacin con los dems modos.
Modo HS - (Alta velocidad) se utiliza para cristales de reloj de frecuencia ms alta de 8
MHz. Al utilizar este modo el consumo de corriente ser mayor que en los dems modos.

Resonadores cermicos en modo XT o HS
Los resonadores cermicos son similares a los cristales de cuarzo segn sus caractersticas, por lo que se
conectan de la misma manera. A diferencia de los cristales de cuarzo, son ms baratos y los osciladores que
hacen uso de ellos son de calidad ms baja. Se utilizan para las frecuencias de reloj entre 100 kHz y 20 MHz.

OSCILADOR EXTERNO EN MODOS RC Y RCIO
El uso de los componentes para estabilizar la frecuencia sin duda alguna tiene muchas ventajas, pero a veces
realmente no es necesario. En la mayora de casos el oscilador puede funcionar a frecuencias que no son
precisamente definidas, as que sera una prdida de dinero embeber tales componentes. La solucin ms
simple y ms barata es estas situaciones es utilizar una resistencia y un capacitor para el funcionamiento del
oscilador. Hay dos modos:

Modo RC. Cuando el oscilador externo se configura a funcionar en modo RC, el pin OSC1 debe
estar conectado al circuito RC como se muestra en la figura a la derecha. La seal de frecuencia
del oscilador RC dividida por 4 est disponible en el pin OSC2. Esta seal se puede utilizar para la
calibracin, sincronizacin o para otros propsitos.

Modo RCIO. De manera similar, el circuito RC est conectado al pin OSC1. Esta vez, el pin OSC2
est disponible para ser utilizado como pin de E/S de propsito general.
En ambos casos se le recomienda utilizar los componentes como se muestra en la figura.

La frecuencia de este oscilador se calcula por medio de la frmula f =1/T segn la que:
f =frecuencia [Hz];
T =R*C =constante de tiempo [s];
R =resistencia elctrica [W]; y
C =capacitancia del condensador [F].
MODOS DE RELOJ INTERNO
El circuito del oscilador interno consiste en dos osciladores separados que se pueden sele-ccionar como la
fuente del reloj del microcontrolador:

El oscilador HFINTOSC est calibrado de fbrica y funciona a 8Mhz. La frecuencia de este oscilador se puede
configurar por el usuario por medio de software utilizando los bits del registro OSCTUNE.

El oscilador LFINTOSC no est calibrado de fbrica y funciona a 31kHz.

Similar al oscilador externo, el interno tambin puede funcionar en varios modos. El modo de funcionamiento
se selecciona de la misma manera que en el oscilador externo - por medio de los bits que forman Palabra de
configuracin. En otras palabras, todo se lleva a cabo dentro del software antes de escribir un programa en el
microcontrolador.

OSCILADOR INTERNO EN MODO INTOSC
En este modo, el pin OSC1 est disponible para ser utilizado como pin de E/S de propsito
general. La seal de frecuencia del oscilador interno dividida por 4 est disponible en el pin OSC2.

OSCILADOR INTERNO EN MODO INTOSCIO
En este modo, los dos pines estn disponibles como pines de E/S de propsito general.
CONFIGURACIN DEL OSCILADOR INTERNO
El oscilador interno consiste en dos circuitos separados:
1. El oscilador interno de alta frecuencia HFINTOSC est conectado al post-escalador (divisor de
frecuencias). Est calibrado de fbrica y funciona a 8 Mhz. Al utilizar el post-escalador, este oscilador puede
producir una seal de reloj a una de siete frecuencias. La seleccin de frecuencia se realiza dentro del
software utilizando los pines IRCF2, IRCF1 y IRCF0 del registro OSCCON.
El HFINTOSC est habilitado al seleccionar una de siete frecuencias (entre 8 Mhz y 125 kHz) y poner a uno
el bit de la fuente de reloj del sistema (SCS) del registro OSCCON. Como se muestra en la siguiente figura ,
todo el procedimiento se realiza por medio de los bits del registro OSCCON.

2. El oscilador de baja frecuencia LFINTOSC no est calibrado de fbrica y funciona a 31 kHz. Est habilitado
al seleccionar la frecuencia (bits del registro OSCCON) y poner a uno el bit SCS del mismo registro.
MODE DE CAMBIO AUTOMTICO DE VELOCIDAD DE RELOJ
(Two-Speed Clock Start-up Mode)
El modo de cambio automtico de velocidad de reloj se utiliza para reducir el consumo de corriente cuando el
microcontrolador funciona en modo de reposo. De qu se trata todo esto?

Cuando se configura en modo LP, XT o HS, el oscilador externo se desactiva al pasar a modo de reposo para
reducir el consumo de corriente total del dispositivo.

Cuando se cumplen las condiciones de despertamiento, el microcontrolador no se pone a funcionar
inmediatamente puesto que tiene que esperar a que se estabilice la frecuencia de seal de reloj. Este tiempo
muerto dura exactamente 1024 pulsos, despus de que el microcontrolador contina con la ejecucin del
programa. El caso es que se ejecutan slo unas pocas instrucciones antes de que el microcontrolador vuelva
al modo de reposo. Eso significa que la mayora de tiempo as como la mayora de corriente de bateras se ha
perdido en vano. El caso se soluciona utilizando el oscilador interno para ejecutar el programa durante la
duracin de 1024 pulsos. Tan pronto como se estabilice la frecuencia del oscilador externo, l retoma
automticamente el papel principal.Todo el procedimiento se habilita al poner a uno el bit de palabra de
configuracin. Para programar el microcontrolador, es necesario seleccionar la opcin Int-Ext Switchover
(conmutacin interna/externa) por software.

MONITOR PARA DETECTAR UN FALLO DE LA FUENTE DE RELOJ (FAIL-SAFE
CLOCK MONITOR)
Como indica su nombre, el monitor para detectar un fallo de la fuente de reloj (Fail-Safe Clock Monitor -
FSCM) monitorea el funcionamiento del oscilador externo y permite al microcontrolador continuar con la
ejecucin de programa en caso de que el oscilador falle por alguna razn. En tal caso, el oscilador interno
toma su funcin.

El monitor detecta un fallo al comparar las fuentes de reloj interno y externo. Si los pulsos del oscilador
externo tardan ms de 2mS en llegar, la fuente de reloj ser automticamente cambiada por la interna. As, el
oscilador interno sigue funcionando controlado por los bits del registro OSCCON. Si el bit OSFIE del registro
PIE2 est a uno, se producir una inte-rrupcin. El reloj interno sigue siendo la fuente del reloj del sistema
hasta que el dispositivo reinicie con xito el oscilador externo que vuelve a ser la fuente de reloj del sistema.

De manera similar a casos anteriores, este mdulo est habilitado al cambiar la palabra de configuracin
justamente antes de que se inicie el proceso de programar el chip. Esta vez, esto se realiza al seleccionar la
opcin Fail-Safe Clock Monitor.

Registro OSCTUNE
Los cambios del registro OSCTUNE afectan a la frecuencia del oscilador HFINTOSC, pero no a la frecuencia
del LFINTOSC. No hay ninguna indicacin de que haya ocurrido desplazamiento de frecuencia durante el
funcionamiento del microcontrolador.
TU N4 TUN3 TUN2 T UN1 TUN 0 F RECUEN CI A
0 1 1 1 1 Mxima
0 1 1 1 0

0 1 1 0 1





0 0 0 0 1

0 0 0 0 0 Calibrada
1 1 1 1 1




TUN4 - TUN0 Frequency Tuning bits. (bits de calibrar la frecuencia). Al combinar estos cinco bits, la
frecuencia del oscilador de 8Mhz se reduce o se aumenta. De este modo, las frecuencias obtenidas por la
divisin en el post-escalador cambian tambin.
3.11 MEMORIA EEPROM
La EEPROM es un segmento de memoria separado, que no pertenece a la memoria de programa (ROM),
tampoco a la memoria de datos (RAM). Aunque a estas localidades de memoria no se les puede acceder fcil
y rpidamente, su propsito es insustituible. Los datos almacenados en la EEMPROM estn
permanentemente guardados incluso al apagar la fuente de alimentacin, y pueden ser cambiados en
cualquier momento. Por estas caractersticas excepcionales cada byte de la EEPROM se considera valioso.
El microcontrolador PIC16F887 dispone de 256 localidades de memoria EEPROM controlados por los bits de
los siguientes registros:
EECON1 (registro de control);
EECON2 (registro de control);
EEDAT (almacena los datos listos para escritura y lectura); y
EEADR (almacena la direccin de la EEPROM a la que se accede).
Adems, el registro EECON2 no es un registro verdadero, no existe fsicamente en el chip. Se utiliza slo
durante la escritura de los datos en la memoria.

Los registros EEDATH y EEADRH se utilizan durante la escritura y lectura de la EEPROM. Los dos se utilizan
tambin durante la escritura y lectura de la memoria de programa (FLASH).

Por considerar esto una zona de riesgo (por supuesto usted no quiere que el microcontrolador borre su propio
programa por casualidad), no vamos a discutirlo aqu, no obstante le avisamos que tenga cuidado.


1 0 0 1 0

1 0 0 0 1

1 0 0 0 0 Mnima
Registro EECON1

EEPGD - Program/Data EEPROM Select bit (bit de seleccin de memorias)
1 - Acceso a la memoria Flash de programa.
0 - Acceso a la memoria de datos EEPROM.
WRERR - EEPROM Error Flag bit (bit de error de escritura)
1 - Se produce un error de escritura de forma prematura y ha ocurrido un error.
0 - Se ha completado la operacin de escritura.
WREN - EEPROM Write Enable bit (bit de habilitacin de escritura)
1 - Escritura de datos en la EEPROM habilitada.
0 - Escritura de datos en la EEPROM deshabilitada.
WR - Write Control bit (bit de control de escritura)
1 - Se ha iniciado una operacin de escritura de datos en la EEPROM
0 - Se ha completado una operacin de escritura de datos en la EEPROM
RD - Read Control bit (bit de control de lectura)
1 - Inicia una lectura de la memoria EEPROM.
0 - Lectura de la memoria EEPROM deshabilitada.
LECTURA DE LA MEMORIA EEPROM
Para leer los datos de la memoria EEMPROM, siga los siguientes pasos:
Paso 1: Escribir la direccin (00h - FFh) en el registro EEADR.
Paso 2: Seleccionar el bloque de memoria EEPROM al poner a cero el bit EEPGD del
registro EECON1.
Paso 3: Poner a uno el bit RD del mismo registro para leer el contenido de la localidad.
Paso 4: El dato se almacena en el registro EEDAT y est listo para su uso.
El siguiente ejemplo muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje
ensamblador:
BSF STATUS, RP1 ;
BCF STATUS, RP0 ; Acceder al banco 2
MOVF ADDRESS, W ; Mover l a di r ecci n al r egi st r o W
MOVWF EEADR ; Escr i bi r l a di r ecci n
BSF STATUS, RP0 ; Acceder al banco 3
BCF EECON1, EEPGD ; Sel ecci onar l a EEPROM
BSF EECON1, RD ; Leer l os dat os
BCF STATUS, RP0 ; Acceder al banco 2
MOVF EEDATA, W ; Dat o se al macena en el r egi st r o W
La misma secuencia de programa escrita en Basic se parece a lo siguiente:
W= EEPROM_Read ( ADDRESS)
Las ventajas del uso del lenguaje Basic se han hecho ms obvias, no lo cree?
ESCRITURA EN LA MEMORIA EEPROM
Antes de escribir los datos en la memoria EEPROM es necesario escribir la direccin en el registro EESADR y
los datos en el registro EESAT. Slo ha quedado seguir a una secuencia especial para iniciar la escritura para
cada byte. Durante el proceso de escritura las interrupciones deben estar deshabilitadas.

El ejemplo que sigue muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje
ensamblador:
BSF STATUS, RP1
BSF STATUS, RP0
BTFSC EECON, WR1 ; Esper ar a que se compl et e l a escr i t ur a ant er i or
GOTO $- 1 ;
BCF STATUS, RP0 ; Banco 2
MOVF ADDRESS, W ; Mover l a di r ecci n a W
MOVWF EEADR ; Escr i bi r l a di r ecci n
MOVF DATA, W ; Mover l os dat os a W
MOVWF EEDATA ; Escr i bi r l os dat os
BSF STATUS, RP0 ; Banco 3
BCF EECON1, EEPGD ;Sel ecci onar l a EEPROM
BSF EECON1, WREN ; Escr i t ur a a l a EEPROM habi l i t ada
BCF I NCON, GI E ; Todas l as i nt er r upci ones deshabi l i t adas
BSF I NTCON, GI E ; I nt er r upci ones habi l i t adas
BCF EECON1, WREN ; Escr i t ur a a l a EEPROM deshabi l i t ada
MOVLW55h
MOVWF EECON2
MOVLWAAh
MOVWF EECON2
BSF EECON1, WR
La misma secuencia de programa escrita en Basic se parece a lo siguiente:
W= EEPROM_Wr i t e( ADDRESS, W)
No hace falta comentar nada.
Vamos a hacerlo en mikroBasic...
' El ej empl o muest r a cmo ut i l i zar l a l i br er a EEPROMen el compi l ador
mi kr oBasi c PRO f or PI C.
program eepr om_t est
dim i i as byte ' La var i abl e i i ut i l i zada en el bucl e
mai n:
ANSEL = 0 ' Conf i gur aci n de l os pi nes AN como E/ S di gi t al es
ANSELH = 0
PORTB = 0
PORTC = 0
PORTD = 0
TRI SB = 0
TRI SC = 0
TRI SD = 0

for i i = 0 to 32 step 1 ' Ll enar el bf er con l os dat os
EEPROM_Wr i t e( 0x80+i i , i i ) ' Escr i bi r l os dat os en l a di r ecci n
0x80+i i
next i i

EEPROM_Wr i t e( 0x02, 0xAA) ' Escr i bi r un dat o en l a di r ecci n 2 de l a
EEMPROM
EEPROM_Wr i t e( 0x50, 0x55) ' Escr i bi r un dat o( nmer o 0x55) en l a di r ecci n
0x50 de l a EEMPROM
Del ay_ms( 1000) ' Los di odos en l os puer t os PORTB y PORTC
PORTB = 0xFF ' par padean par a i ndi car el comi enzo de l a
l ect ur a


PORTC = 0xFF
Del ay_ms( 1000)
PORTB = 0x00
PORTC = 0x00
Del ay_ms( 1000)
PORTB = EEPROM_Read( 0x02) ' Leer el dat o de l a di r ecci n 2 de l a EEPROM
' y vi sual i zar l o en el puer t o PORB
PORTC = EEPROM_Read( 0x50) ' Leer el dat o de l a di r ecci n 0x50 de l a
EEPROM y
' vi sual i zar l o en el puer t o PORC
Del ay_ms( 1000)

for i i = 0 to 32 step 1 ' Leer el bl oque de 32 byt es de l a
di r ecci n
PORTD = EEPROM_Read( 0x80+i i ) ' 0x80 y vi sual i zar el dat o en el
puer t o PORTD
Del ay_ms( 250)
next i i

end.
3.12 REINICIO! BLACK-OUT, BROWN-OUT O RUIDOS?
A primera vista, basta con encender una fuente de alimentacin para hacer funcionar un microcontrolador. A
primera vista, basta con apagar una fuente de alimentacin para detenerlo. Slo a primera vista. En realidad,
el arranque y el final del funcionamiento son las fases crticas de las que se encarga una seal especial
denominada RESET.
Al producirse un reinicio el microcontrolador detiene su funcionamiento inmediatamente y borra sus registros.
Una seal de reinicio se puede generar externamente en cualquier momento (nivel lgico bajo en el pin
MCLR). Si se necesita, una seal tambin puede ser generada por la lgica de control interna. Al encender
una fuente de alimentacin siempre se produce un reinicio. Por muchos eventos de transicin que ocurren al
encender una fuente de alimentacin (centelleos y fogonazos de contactos elctricos en interruptores, subida
de voltaje lenta, estabilizacin de la frecuencia de seal de reloj graduada etc.) es necesario proporcionar un
cierto tiempo muerto antes de que el microcontrolador se ponga a funcionar. Dos temporizadores internos
PWRT y OST se encargan de eso. El PWRT puede estar habilitado/deshabilitado durante el proceso de
escribir un programa. Vamos a ver cmo funciona todo.

Cuando el voltaje de la fuente de alimentacin alcanza entre 1.2 y 1.7V, un circuito denominado
temporizador de arranque (Power-up timer) mantiene al microcontrolador reiniciado durante unos
72mS. Tan pronto como transcurra el tiempo, otro temporizador denominado temporizador de
encendido del oscilador (Oscillator start-up timer) genera otra seal de reinicio durante la duracin
de 1024 perodos del oscilador de cuarzo. Al expirar el tiempo muerto (marcado con Reset T en la
Figura) y al poner a alto el pin MCLR, todas las condiciones se han cumplido y el microcontrolador
se pone a ejecutar la primera instruccin en el programa.
Aparte de este reinicio controlado que ocurre al encender una fuente de alimentacin, hay dos
tipos de reinicio denominados Black-out y Brown-out que pueden producirse durante el
funcionamiento del microcontrolador as como al apagar una fuente de alimentacin.
REINICIO BLACK-OUT

El reinicio black out ocurre al apagar una fuente de alimentacin correctamente. El
microcontrolador no tiene tiempo para hacer nada imprevisible puesto que el voltaje cae muy
rpidamente por debajo de su valor mnimo. En otras palabras, se apaga la luz, las cortinas bajan
y el espectculo ha terminado!
REINICIO BROWN-OUT

Cuando el voltaje de la fuente de alimentacin cae lentamente (un ejemplo tpico es descarga de
bateras, aunque el microcontrolador experimentara unas cadas mucho ms rpidas como un
proceso lento) los componentes internos detienen su funcionamiento gradualmente y ocurre el as
llamado reinicio Brown-out. En tal caso, antes de que el microcontrolador detenga su
funcionamiento completamente, hay un peligro real de que los circuitos que funcionan a
frecuencias altas se pongan a funcionar de forma imprevisible. El reinicio brown-out puede causar
cambios fatales en el programa ya que se almacena en la memoria flash incorporada en el chip.
RUIDOS ELCTRICOS

Es un tipo especial del reinicio Brown-out que ocurre en un ambiente indu-strial cuando voltaje de
alimentacin parpadea por un momento y cae por debajo del valor mnimo. Aunque es corto, este
ruido producido en una lnea de conduccin elctrica puede afectar desfavorablemente al
funcionamiento del dispositivo.
MCLR PIN

Un cero lgico (0) al pin MCLR causa un reinicio inmediato y regular. Es recomendable conectarlo
de la forma mostrada en la Figura a la derecha. La funcin de los componentes adicionales es de
mantener un uno lgico puro (1) durante el funcionamiento normal. Si estos componentes se
configuran de manera que proporcionen un nivel lgico alto (1) en el pin despus de que haya
transcurrido el tiempo muerto reset T, el microcontrolador se pondr a funcionar inmediatamente.
Esto puede ser muy til cuando se necesita sincronizar el funcionamiento del microcontrolador con
los componentes adicionales o con el funcionamiento de varios microcontroladores.
Para evitar posibles errores al producirse el reinicio Brown-out, el PIC 16F887 tiene un mecanismo
de proteccin incorporado. Es un circuito simple, pero eficaz que reacciona cada vez que el voltaje
de alimentacin cae por debajo de 4V y mantiene este nivel de voltaje por ms de 100
microsegundos. Este circuito genera una seal despus de que todo el microcontrolador funcionar
como si hubiera sido encendido por primera vez.


Captulo 4: Ejemplos
El propsito de este captulo es de proporcionar la informacin bsica que necesita saber para ser capaz de
utilizar microcontroladores con xito en la prctica. Por eso, este captulo no contiene ningn programa muy
elaborado, tampoco dispone de un esquema de dispositivo con soluciones extraordinarias. Por el contrario, los
siguientes ejemplos son la mejor prueba de que escribir un programa no es un privilegio ni cosa de talento,
sino una habilidad de poner las piezas juntas del rompecabezas al utilizar directivas. Tenga la seguridad de
que el diseo y el desarrollo de los dispositivos generalmente siguen al mtodo probar-corregir-repetir. Por
supuesto, cunto ms ahonde sobre el tema, ms se complica, ya que tanto los nios como los arquitectos de
primera lnea, ponen las piezas juntas del rompecabezas.
4.1 CONEXIN BSICA
4.2 COMPONENTES ADICIONALES
4.3 EJ EMPLO 1 - Escribir cabecera, configurar pines de E/S, utilizar la funcin Delay
4.4 EJ EMPLO 2 - Utilizar instrucciones en ensamblador y el oscilador interno LFINTOSC...
4.5 EJ EMPLO 3 - Timer0 como un contador, declarar variables nuevas, utilizar smbolos,
utilizar rels...
4.6 EJ EMPLO 4 - Utilizar los temporizadores Timer0, Timer1 y Timer2. Utilizar
interrupciones, declarar nuevos procedimientos...
4.7 EJ EMPLO 5 - Utilizar el temporizador perro - guardin
4.8 EJ EMPLO 6 - Mdulo CCP1 como generador de seal PWM
4.9 EJ EMPLO 7 - Utilizar el convertidor A/D
4.10 EJ EMPLO 8 - Utilizar memoria EEPROM
4.11 EJ EMPLO 9 - Contador de cuatro dgitos LED, multiplexin
4.12 EJ EMPLO 10 - Utilizar el visualizador LCD
4.13 EJ EMPLO 11 - Comunicacin serial RS232
4.14 EJ EMPLO 12 - Medicin de temperatura por medio del sensor DS1820. Uso del
protocolo 1-wire...
4.15 EJ EMPLO 13 - Generacin de sonido, librera de sonido...
4.16 EJ EMPLO 14 - Utilizar el visualizador LCD grfico
4.17 EJ EMPLO 15 - Utilizar el panel tctil...
4.18 EJ EMPLO 16 - Utilizar el teclado 4x4
4.1 CONEXIN BSICA
Para que un microcontrolador funcione apropiadamente es necesario proporcionar lo siguiente:
Alimentacin;
Seal de reinicio; y
Seal de reloj.

Como se muestra en la figura anterior, se trata de circuitos simples, pero no tiene que ser siempre as. Si el
dispositivo destino se utiliza para controlar las mquinas caras o para mantener funciones vitales, todo se
vuelve mucho ms complicado.
ALIMENTACIN
Aunque el PIC16F887 es capaz de funcionar a diferentes voltajes de alimentacin, no es recomendable
probar la ley de Murphy. Lo ms adecuado es proporcionar un voltaje de alimentacin de 5V DC. Este circuito,
mostrado en la pgina anterior, utiliza un regulador de voltaje positivo de tres terminales LM7805. Es un
regulador integrado y barato que proporciona una estabilidad de voltaje de alta calidad y suficiente corriente
para habilitar el funcionamiento apropiado del controlador y de los perifricos (aqu suficiente significa una
corriente de 1A).
SEAL DE REINICIO
Para que un microcontrolador pueda funcionar apropiadamente, un uno lgico (VCC) se debe colocar en el pin
de reinicio. El botn de presin que conecta el pin MCLR a GND no es necesario. Sin embargo, este botn
casi siempre est proporcionado ya que habilita al microcontrolador volver al modo normal de funcionamiento
en caso de que algo salga mal. Al pulsar sobre el botn RESET, el pin MCLR se lleva un voltaje de 0V, el
microcontrolador se reinicia y la ejecucin de programa comienza desde el principio. Una resistencia de 10k
se utiliza para impedir un corto circuito a tierra al presionar este botn.
SEAL DE RELOJ
A pesar de tener un oscilador incorporado, el microcontrolador no puede funcionar sin componentes externos
que estabilizan su funcionamiento y determinan su frecuencia (velocidad de operacin del microcontrolador).
Dependiendo de los elementos utilizados as como de las frecuencias el oscilador puede funcionar en cuatro
modos diferentes:
LP - Cristal de bajo consumo;
XT - Crystal / Resonator;
HS - Cristal/Resonador de alta velocidad; y
RC - Resistencia / Condensador.

Por qu son estos modos importantes? Como es casi imposible construir un oscilador estable que
funcione a un amplio rango de frecuencias, el microcontrolador tiene que saber a qu cristal est
conectado, para poder ajustar el funcionamiento de sus componentes internos. sta es la razn
por la que todos los programas utilizados para escribir un programa en el chip contienen una
opcin para seleccionar el modo de oscilador. Vea la figura de la izquierda.
Cristal de cuarzo
Al utilizar el cristal de cuarzo para estabilizar la frecuencia, un oscilador incorporado funciona a una frecuencia
determinada, y no es afectada por los cambios de temperatura y de voltaje de alimentacin. Esta frecuencia
se etiqueta normalmente en el encapsulado del cristal.
Aparte del cristal, los condensadores C1 y C2 deben estar conectados como se muestra en el siguiente
esquema. Su capacitancia no es de gran importancia. Por eso, los valores proporcionados en la siguiente
tabla se deben tomar como recomendacin y no como regla estricta.

Resonador cermico
Un resonador cermico es ms barato y muy similar a un cuarzo por la funcin y el modo de funcionamiento.
Por esto, los esquemas que muestran su conexin al microcontrolador son idnticos. No obstante, los valores
de los condensadores C1 y C2 difieren un poco debido a las diferentes caractersticas elctricas. Refirase a
la tabla que est a continuacin.

Estos resonadores se conectan normalmente a los osciladores en caso de que no sea necesario proporcionar
una frecuencia extremadamente precisa.
Oscilador RC
Si la frecuencia de operacin no es de importancia, entonces no es necesario utilizar los componentes caros y
adicionales para la estabilizacin. En vez de eso, basta con utilizar una simple red RC, mostrada en la
siguiente figura. Como aqu es utilizada slo la entrada del oscilador de reloj del microcontrolador, la seal de
reloj con la frecuencia Fosc/4 aparecer en el pin OSC2. sta es la frecuencia de operacin del
microcontrolador, o sea la velocidad de ejecucin de instrucciones.

Oscilador externo
Si se requiere sincronizar el funcionamiento de varios microcontroladores o si por alguna razn no es posible
utilizar ninguno de los esquemas anteriores, una seal de reloj se puede generar por un oscilador externo.
Refirase a la siguiente figura.

4.2 COMPONENTES ADICIONALES
A pesar del hecho de que el microcontrolador es un producto de la tecnologa moderna, no es tan til sin estar
conectado a los componentes adicionales. Dicho de otra manera, el voltaje llevado a los pines del
microcontrolador no sirve para nada si no se utiliza para llevar a cabo ciertas operaciones como son
encender/apagar, desplazar, visualizar etc.
Esta parte trata los componentes adicionales utilizados con ms frecuencia en la prctica, tales como
resistencias, transistores, diodos LED, visualizadores LED, visualizadores LCD y los circuitos de comunicacin
RS-232.
INTERRUPTORES Y BOTONES DE PRESIN

Los interruptores y los botones de presin son los dispositivos simples para proporcionar la forma
ms simple de detectar la aparicin de voltaje en un pin de entrada del microcontrolador. No
obstante, no es tan simple como parece...Es por un rebote de contacto. El rebote de contacto es un
problema comn en los interruptores mecnicos.
Al tocarse los contactos, se produce un rebote por su inercia y elasticidad. Por consiguiente, la
corriente elctrica es rpidamente pulsada en lugar de tener una clara transicin de cero a la
corriente mxima. Por lo general, esto ocurre debido a las vibraciones, los desniveles suaves y la
suciedad entre los contactos. El rebote ocurre demasiado rpido, asi que no es posible percibirlo al
utilizar estos componentes en la vida cotidiana. Sin embargo, pueden surgir problemas en algunos
circuitos analgicos y lgicos que responden lo suficientemente rpido de manera que
malinterpreten los pulsos producidos al tocarse los contactos como un flujo de datos. De todos
modos, el proceso entero no dura mucho (unos pocos micro - o milisegundos), pero dura lo
suficiente para que lo detecte el microcontrolador. Al utilizar slo un botn de presin como una
fuente de seal de contador, en casi 100% de los casos ocurren los errores.

El problema se puede resolver con facilidad al conectar un simple circuito RC para suprimir rpidos cambios
de voltaje. Como el perodo del rebote no est definido, los valores de los componentes no estn
precisamente determinados. En la mayora de los casos es recomendable utilizar los valores que se muestran
en la siguiente figura.

Si se necesita una estabilidad completa, entonces hay que tomar medidas radicales. La salida del circuito,
mostrado en la siguiente figura (biestable RS, tambin llamado flip flop RS), cambiar de estado lgico
despus de detectar el primer pulso producido por un rebote de contacto. Esta solucin es ms cara
(interruptor SPDT), pero el problema es resuelto.

Aparte de estas soluciones de hardware, hay tambin una simple solucin de software. Mientras el programa
prueba el estado de circuito lgico de un pin de entrada, si detecta un cambio, hay que probarlo una vez ms
despus de un cierto tiempo de retardo. Si el programa confirma el cambio, esto significa que un
interruptor/botn de presin ha cambiado de posicin. Las ventajas de esta solucin son obvias: es gratuita,
se borran los efectos del rebote de contacto y se puede aplicar a los contactos de una calidad ms baja
tambin.
RELS

Un rel es un interruptor elctrico que se abre y se cierra bajo el control de otro circuito electrnico.
Por eso est conectado a los pines de salida del microcontrolador y utilizado para encender/apagar
los dispositivos de alto consumo tales como: motores, transformadores, calefactores, bombillas
etc. Estos dispositivos se colocan casi siempre lejos de los componentes sensibles de la placa.
Hay varios tipos de rels, pero todos funcionan de la misma manera. Al fluir la corriente por la
bobina, el rel funciona por medio de un electromagneto, abriendo y cerrando uno o ms conjunto
de contactos. Similar a los optoacopladores no hay conexin galvnica (contacto elctrico) entre
los circuitos de entrada y salida. Los rels requieren con frecuencia tanto un voltaje ms alto y una
corriente ms alta para empezar a funcionar. Tambin hay rels miniatura que se pueden poner en
marcha por una corriente baja obtenida directamente de un pin del microcontrolador.
La figura que sigue muestra la solucin utilizada con ms frecuencia en caso de conectar un rel a los
dispositivos alimentados por la red elctrica.

Para prevenir la aparicin de un alto voltaje de autoinduccin, causada por una parada repentina del flujo de
corriente por la bobina, un diodo polarizado invertido se conecta en paralelo con la bobina. El propsito de
este diodo es de cortar este pico de voltaje.
DIODOS LED
Probablemente sepa todo lo que necesita saber sobre los diodos LED, pero tambin debe pensar en los
jvenes... A ver, cmo destruir un LED? Bueno...muy fcil.

Quemar con rapidez
Como cualquier otro diodo, los LEDs tienen dos puntas - un nodo y un ctodo. Conecte un diodo
apropiadamente a la fuente de alimentacin y va a emitir luz sin ningn problema. Ponga al diodo al revs y
conctelo a la misma fuente de alimentacin (aunque sea por un momento). No emitir luz - nunca ms!
Quemar lentamente
Hay un lmite de corriente nominal, o sea, lmite de corriente mxima especificada para cada LED que no se
deber exceder. Si eso sucede, el diodo emitir luz ms intensiva, pero slo por un perodo corto de tiempo.
Algo para recordar
De manera similar, todo lo que tiene que hacer es elegir una resistencia para limitar la corriente mostrada a
continuacin. Dependiendo de voltaje de alimentacin, los efectos pueden ser espectaculares.

VISUALIZADOR LED

Bsicamente, un visualizador LED no es nada ms que varios diodos LED moldeados en la misma
caja plstica. Hay varios tipos de los visualizadores y algunos de ellos estn compuestos por varias
docenas de diodos incorporados que pueden visualizar diferentes smbolos. No obstante, el
visualizador utilizado con ms frecuencia es el visualizador de 7 segmentos. Est compuesto por 8
LEDs. Los siete segmentos de un dgito estn organizados en forma de un rectngulo para
visualizar los smbolos, mientras que el segmento adicional se utiliza para el propsito de visualizar
los puntos decimales. Para simplificar la conexin, los nodos y los ctodos de todos los diodos se
conectan al pin comn as que tenemos visualizadores de nodo comn y visualizadores de ctodo
comn, respectivamente. Los segmentos estn etiquetados con letras de a a g y dp, como se
muestra en la siguiente figura. Al conectarlos, cada diodo LED se trata por separado, lo que
significa que cada uno dispone de su propia resistencia para limitar la corriente.
Aqu le presentamos unas cosas importantes a las que debe prestar atencin al comprar un visualizador LED:
Como hemos mencionado, dependiendo de si nodos o ctodos estn conecta dos al pin
comn, tenemos visualizadores de nodo comn y visualizadores de ctodo comn. Visto
de afuera, parece que no hay ninguna diferencia entre estos visualizadores, pues se le
recomienda comprobar cul se va a utilizar antes de instalarlo.
Cada pin del microcontrolador tiene un lmite de corriente mxima que puede recibir o dar.
Por eso, si varios visualizadores estn conectados al microcontrolador, es recomendable
utilizar as llamados LEDs de Bajo consumo que utilizan solamente 2mA para su
funcionamiento.
Los segmentos del visualizador estn normalmente etiquetados con letras de a a g, pero
no hay ninguna regla estricta a cules pines del visualizador estarn conectados. Por eso
es muy importante comprobarlo antes de empezar a escribir un programa o disear un
dispositivo.

Los visualizadores LED conectados al microcontrolador normalmente ocupan un gran nmero de los pines de
E/S valiosos, lo que puede ser un problema sobre todo cuando se necesita visualizar los nmeros compuestos
por varios dgitos. El problema se vuelve ms obvio si, por ejemplo, se necesita visualizar dos nmeros de
seis dgitos (un simple clculo muestra que en este caso se necesitan 96 pines de salida). La solucin de este
problema es denominada multiplexin. Aqu es cmo se ha hecho una ilusin ptica basada en el mismo
principio de funcionamiento como una cmara de pelcula. Un slo dgito est activo a la vez, pero se tiene la
impresin de que todos los dgitos de un nmero estn simultneamente activos por cambiar tan rpidamente
de las condiciones de encendido/apagado.

Veamos la figura anterior. Primero se aplica un byte que representa unidades al puerto PORT2 del
microcontrolador y se activa el transistor T1 a la vez. Despus de poco tiempo, el transistor T1 se apaga, un
byte que representa decenas se aplica al puerto PORT2 y el transistor T2 se activa. Este proceso se est
repitiendo cclicamente a alta velocidad en todos los dgitos y transistores correspondientes.
Lo decepcionante es que el microcontrolador es slo un tipo de computadora miniatura di-seada para
interpretar el lenguaje de ceros y unos, lo que se pone de manifiesto al visualizar cualquier dgito.
Concretamente, el microcontrolador no conoce cmo son unidades, decenas, centenas, ni diez dgitos a los
que estamos acostumbrados. Por esta razn, cada nmero a visualizar debe pasar por el siguiente
procedimiento:

Antes que nada, un nmero de varios dgitos debe ser dividido en unidades, centenas etc. en una subrutina
especfica. Luego, cada de estos dgitos se debe almacenar en los bytes particulares. Los dgitos se hacen
reconocibles al realizar enmascaramiento. En otras pa-labras, el formato binario de cada dgito se sustituye
por una combinacin diferente de los bits por medio de una subrutina simple. Por ejemplo, el dgito 8 (0000
1000) se sustituye por el nmero binario 0111 1111 para activar todos los LEDs que visualizan el nmero 8. El
nico diodo que queda inactivo aqu est reservado para el punto decimal.

Si un puerto del microcontrolador est conectado al visualizador de tal manera que el bit 0 active el segmento
a, el bit 1 active el segmento b, el bit 2 active el segmento c etc, entonces la tabla que sigue muestra la
mscara para cada dgito.
D GI TOS A
VI SU AL I Z A R
SEGMENT OS DEL V I SU A L I Z AD OR

dp a b c d e f g
0 0 1 1 1 1 1 1 0
1 0 0 1 1 0 0 0 0
2 0 1 1 0 1 1 0 1
3 0 1 1 1 1 0 0 1
4 0 0 1 1 0 0 1 1

Adems de los dgitos de 0 a 9, hay algunas letras - A, C, E, J , F, U, H, L, b, c, d, o, r, t - que se pueden
visualizar al enmascarar.

En caso de que se utilicen los visualizadores de nodo comn, todos los unos contenidos en la tabla anterior
se deben sustituir por ceros y viceversa. Adems, los transistores PNP se deben utilizar como controladores.
OPTOACOPLADORES
Un optoacoplador es un dispositivo frecuentemente utilizado para aislar galvnicamente el microcontrolador
de corriente o voltaje potencialmente peligroso de su entorno. Los optoacopladores normalmente disponen de
una, dos o cuatro fuentes de luz (diodos LED) en su entrada mientras que en su salida, frente a los diodos, se
encuentra el mismo nmero de los elementos sensibles a la luz (foto-transistores, foto-tiristores, foto-triacs). El
punto es que un optoacoplador utiliza una corta ruta de transmisin ptica para transmitir una seal entre los
elementos de circuito, que estn aislados elctricamente. Este aislamiento tiene sentido slo si los diodos y
los elementos foto-sensitivos se alimentan por separado. As, el microcontrolador y los componentes
adicionales y caros estn completamente protegidos de alto voltaje y ruidos que son la causa ms frecuente
5 0 1 0 1 1 0 1 1
6 0 1 0 1 1 1 1 1
7 0 1 1 1 0 0 0 0
8 0 1 1 1 1 1 1 1
9 0 1 1 1 1 0 1 1
de destruccin, dao y funcionamiento inestable de los dispositivos electrnicos en la prctica. Los
optoacopladores utilizados con ms frecuencia son aqullos con foto-transistores en sus salidas. En los
optoacopladores con la base conectada al pin 6 interno (tambin hay optoacopladores sin ella), la base puede
quedarse desconectada.

La red R/C representada por una lnea quebrada en la figura anterior indica una conexin opcional de la base
de transistores dentro del optoacoplador, que reduce los efectos de ruidos al eliminar los pulsos muy cortos.
VISUALIZADOR LCD
Este componente est especficamente fabricado para ser utilizado con los microcontroladores, lo que
significa que no se puede activar por los circuitos integrados estndar. Se utiliza para visualizar los diferentes
mensajes en un visualizador de cristal lquido miniatura. El modelo descrito aqu es el ms utilizado en la
prctica por su bajo precio y grandes capacidades. Est basado en el microcontrolador HD44780 (Hitachi)
integrado y puede visualizar mensajes en dos lneas con 16 caracteres cada una. Puede visualizar todas las
letras de alfabeto, letras de alfabeto griego, signos de puntuacin, smbolos matemticos etc. Tambin es
posible visualizar smbolos creados por el usuario. Entre otras caractersticas tiles es el desplazamiento
automtico de mensajes (a la izquierda y a la derecha), aparicin del cursor, retroiluminacin LED etc.

Pines del visualizador LCD
A lo largo de un lado de una placa impresa pequea del visualizador LCD se encuentran los pines que le
permiten estar conectado al microcontrolador. Hay 14 pines en total marcados con nmeros (16 si hay
retroiluminacin). Su funcin se muestra en la tabla que sigue:
FUNCI N NMERO NOMB RE
ESTAD O
L GI C O
DE SCRI PCI N
Tierra 1 Vss - 0V
Alimentacin 2 Vdd - +5V
Contraste 3 Vee - 0 - Vdd
Control de
funcionamiento
4 RS
0
1
D0 D7 considerados como comandos
D0 D7 considerados como datos
5 R/W
0
1
Escribir los datos (del microcontrolador al
LCD)
Leer los daots (del LCD al
microcontrolador)
6 E Transicin de 1 a 0
Acceso al visualizador LCd deshabilitado
Funcionamiento normal
Datos/comandos se estn transmitiendo
al LCD
Datos / comandos
7 D0 0/1 Bit 0 LSB
8 D1 0/1 Bit 1
9 D2 0/1 Bit 2
10 D3 0/1 Bit 3
11 D4 0/1 Bit 4
12 D5 0/1 Bit 5
13 D6 0/1 Bit 6
14 D7 0/1 Bit 7 MSB
Pantalla LCD
Una pantalla LCD puede visualizar dos lneas con 16 caracteres cada una. Cada carcter consiste en 5x8 o
5x11 pxeles. Este libro cubre un visualizador de 5x8 pxeles que es utilizado con ms frecuencia.

El contraste del visualizador depende del voltaje de alimentacin y de si los mensajes se visualizan en una o
dos lneas. Por esta razn, el voltaje variable 0-Vdd se aplica al pin marcado como Vee. Un potencimetro
trimer se utiliza con frecuencia para este propsito. Algunos de los visualizadores LCD tienen retroiluminacin
incorporada (diodos LED azules o verdes). Al utilizarlo durante el funcionamiento, se debe de conectar una
resistencia en serie a uno de los pines para limitar la corriente (similar a diodos LED).

Si no hay caracteres visualizados o si todos los caracteres estn oscurecidos al encender el visualizador, lo
primero que se debe hacer es comprobar el potencimetro para ajustar el contraste. Est ajustado
apropiadamente? Lo mismo se aplica si el modo de funcionamiento ha sido cambiado (escribir en una o en
dos lneas).
Memoria LCD
El visualizador LCD dispone de tres bloques de memoria:
DDRAM Display Data RAM (RAM de datos de visualizacin);
CGRAM Character Generator RAM (generador de caracteres RAM); y
CGROM Character Generator ROM (generador de caracteres ROM).
Memoria DDRAM
La memoria DDRAM se utiliza para almacenar los caracteres a visualizar. Tiene una capacidad de almacenar
80 caracteres. Algunas localidades de memoria estn directamente conectadas a los caracteres en el
visualizador.

El principio de funcionamiento de la memoria DDRAM muy simple: basta con configurar el visualizador para
incrementar direcciones automticamente (desplazamiento a la derecha) y establecer la direccin inicial para
el mensaje que se va a visualizar (por ejemplo 00 hex).

Luego, todos los caracteres enviados por las lneas D0-D7 se van a visualizar en el formato de mensaje al que
nos hemos acostumbrado - de la izquierda a la derecha. En este caso, la visualizacin empieza por el primer
campo de la primera lnea ya que la direccin inicial es 00hex. Si se enva ms de 16 caracteres, todos se
memorizarn, pero slo los primeros 16 sern visibles. Para visualizar los dems, se debe utilizar el comando
shift. Virtualmente, parece como si el visualizador LCD fuera una ventana, desplazndose de la izquierda a la
derecha sobre las localidades de memoria con diferentes caracteres. En realidad, as es cmo se cre el
efecto de desplazar los mensajes sobre la pantalla.

Si se habilita ver el cursor, aparecer en la localidad actualmente direccionada. En otras palabras, si un
carcter aparece en la posicin del cursor, se va a mover automticamente a la siguiente localidad
direccionada.

Como sugiere su nombre, la memoria DDRAM es un tipo de memoria RAM as que los datos se pueden
escribir en ella y leer de ella, pero su contenido se pierde irrecuperablemente al apagar la fuente de
alimentacin.
Memoria CGROM
La memoria CGROM contiene un mapa estndar de todos los caracteres que se pueden visualizar en la
pantalla. A cada carcter se le asigna una localidad de memoria:

Las direcciones de las localidades de memoria CGROM corresponden a los caracteres ASCII. Si el programa
que se est actualmente ejecutando llega al comando enviar el carcter P al puerto, el valor binario 0101
0000 aparecer en el puerto. Este valor es el equivalente ASCII del carcter P. Al escribir este valor en un
LCD, se visualizar el smbolo de la localidad 0101 0000 de la CGROM. En otras palabras, se visualizar el
carcter P. Esto se aplica a todas las letras del alfabeto (minsculas y maysculas), pero no se aplica a los
nmeros.

Como se muestra en el mapa anterior, las direcciones de todos los dgitos se desplazan por 48 en relacin
con sus valores (direccin del dgito 0 es 48, direccin del dgito 1 es 49, direccin del dgito 2 es 50 etc.). Por
consiguiente, para visualizar los dgitos correctamente es necesario aadir el nmero decimal 48 a cada uno
antes de enviarlos a un LCD.

Qu es un cdigo ASCII? Desde su aparicin hasta hoy en da, las computadoras han sido capaces de
reconocer solamente nmeros, y no las letras. Esto significa que todos los datos que una computadora
intercambia con un pe-rifrico, reconocidos como letras por los humanos, en realidad estn en el formato
binario (el teclado es un buen ejemplo). En otras palabras, a cada carcter le corresponde la combinacin
nica de ceros y unos. El cdigo ASCII representa una codificacin de caracteres basada en el alfabeto
ingls. El ASCII especifica una correspondencia entre los smbolos de caracteres estndar y sus equivalentes
numricos.
Memoria CGRAM
Adems de los caracteres estndar, el visualizador LCD puede visualizar smbolos definidos por el usuario.
Esto puede ser cualquier smbolo de 5x8 pxeles. La memoria RAM deno-minada CGRAM de 64 bytes lo
habilita.

Los registros de memoria son de 8 bits de anchura, pero slo se utilizan 5 bits ms bajos. Un uno lgico (1)
en cada registro representa un punto oscurecido, mientras que 8 localidades agrupados representan un
carcter. Esto se muestra en la siguiente figura:

Los smbolos estn normalmente definidos al principio del programa por una simple escri-tura de ceros y unos
de la memoria CGRAM as que crean las formas deseadas. Para visualizarlos basta con especificar su
direccin. Preste atencin a la primera columna en el mapa de caracteres CGROM. No contiene direcciones
de la memoria RAM, sino los smbolos de los que se est hablando aqu. En este ejemplo visualizar 0
significa visualizar sonrisa, visualizar 1 significa - visualizar ancla etc.
Comandos bsicos del visualizador LCD
Todos los datos transmitidos a un visualizador LCD por las salidas D0-D7 sern interpretados como un
comando o un dato, lo que depende del estado lgico en el pin RS:
RS = 1 - Los bits D0 - D7 son direcciones de los caracteres a visualizar. El procesador LCD
direcciona un carcter del mapa de caracteres y lo visualiza. La direccin DDRAM
especifica la localidad en la que se va a visualizar el carcter. Esta direccin se define
antes de transmitir el carcter o la direccin del carcter anteriormente transmitido ser
aumentada automticamente.
RS = 0 - Los bits D0 - D7 son los comandos para ajustar el modo del visualizador.
En la siguiente tabla se muestra una lista de comandos relacionados con la operacin del LCD:
COMA ND O RS R W D7 D6 D5 D4 D3 D2 D1 D0
TI EMPO DE
EJ ECUCI N
Borrar el visualizador 0 0 0 0 0 0 0 0 0 1 1.64mS
Poner el cursor al inicio 0 0 0 0 0 0 0 0 1 x 1.64mS
Modo de entrada 0 0 0 0 0 0 0 1 I/D S 40uS
Activar/desactivar el
visualizador
0 0 0 0 0 0 1 D U B 40uS
Desplazar el cursor/visualizador 0 0 0 0 0 1 D/C R/L x x 40uS
Modo de funcionamiento 0 0 0 0 1 DL N F x x 40uS
Establecer la direccin CGRAM 0 0 0 1 Direccin CGRAM 40uS
Establecer la direccin DDRAM 0 0 1 Direccin DDRAM 40uS
Leer la bandera
BUSY(ocupado)(BF)
0 1 BF Direccin DDRAM -
Escribir en la CGRAM o en la
DDRAM
1 0 D7 D6 D5 D4 D3 D2 D1 D0 40uS
Leer la CGRAM o la DDRAM 1 1 D7 D6 D5 D4 D3 D2 D1 D0

I/D 1 = I ncr ement o ( por 1) R/L 1 =
Despl azami ent o a l a der echa
0 = Decr ement o ( por 1) 0 =
Despl azami ent o a l a i zqui er da

S 1 = Despl azami ent o del vi sual i zador act i vado DL 1 = Bus de
dat os de 8 bi t s
0 = Despl azami ent o del vi sual i zador desact i vado 0 = Bus de
dat os de 4 bi t s

D 1 = Vi sual i zador encendi do N 1 =
Vi sual i zar en dos l neas
0 = Vi sual i zador encendi do 0 =
Vi sual i zar en una l nea

U 1 = Cur sor act i vado F 1 =
Car ct er de 5x10 punt os
0 = Cur sor desact i vado 0 =
Car ct er de 5x7 punt os

B 1 = Par padeo del cur sor encendi do D/C 1 =
Despl azami ent o del vi sual i zador
0 = Par padeo del cur sor apagado 0 =
Despl azami ent o del cur sor
QU ES UNA BANDERA DE OCUPADO (BUSY FLAG)?
En comparacin al microcontrolador, el LCD es un componente extremadamente lento. Por esta razn, era
necesario proporcionar una seal que, al ejecutar un comando, indicara que el visualizador estaba listo para
recibir el siguiente dato. Esta seal denominada bandera de ocupado (busy flag) se puede leer de la lnea D7.
El visualizador est listo para recibir un nuevo dato cuando el voltaje en esta lnea es de 0V (BF=0).
Conectar el visualizador LCD
Dependiendo de cuntas lneas se utilizan para conectar un LCD al microcontrolador, hay dos modos de LCD,
el de 8 bits y el de 4 bits. El modo apropiado se selecciona en el inicio del funcionamiento en el proceso
denominado inicializacin. El modo de LCD de 8 bits utiliza los pines D0-D7 para transmitir los datos, como
hemos explicado en la pgina anterior.

El propsito principal del modo de LCD de 4 bits es de ahorrar los valiosos pines de E/S del microcontrolador.
Slo los 4 bits ms altos (D4-D7) se utilizan para la comunicacin, mientras que los dems pueden quedarse
desconectados. Cada dato se enva al LCD en dos pasos - primero se envan 4 bits ms altos (normalmente
por las lneas D4-D7), y luego los 4 bits ms bajos. La inicializacin habilita que el LCD conecte e interprete
los bits recibidos correctamente.

Pocas veces se leen los datos del LCD (por lo general se transmiten del microcontrolador al LCD) as que, con
frecuencia, es posible guardar un pin de E/S de sobra. Es simple, basta con conectar el pin L/E a Tierra. Este
ahorro del pin tiene su precio. Los mensajes se visualizarn normalmente, pero no ser posible leer la
bandera de ocupado ya que tampoco es posible leer los datos del visualizador. Afortunadamente, hay una
solucin simple. Despus de enviar un carcter o un comando es importante dar al LCD suficiente tiempo para
hacer su tarea. Debido al hecho de que la ejecucin de un comando puede durar aproximadamente 1.64mS,
el LCD tarda como mximo 2mS en realizar su tarea.
Inicializar el visualizador LCD
Al encender la fuente de alimentacin, el LCD se reinicia automticamente. Esto dura aproximadamente
15mS. Despus de eso, el LCD est listo para funcionar. Asimismo, el modo de funcionamiento est
configurado por defecto de la siguiente manera:
1. Visualizador est borrado
2. Modo
DL =1 - Bus de datos de 8 bits
N =0 - Datos se visualizan en una lnea
F =0 - Formato fuente de caracteres es 5 x 8 pxeles
3. Visualizador/Cursor encendido/apagado
D =0 - Visualizador apagado
U =0 - Cursor apagado
B =0 - Parpadeo del cursor apagado
4. Introduccin de caracteres
ID =1 Direcciones visualizadas se incrementan automticamente en 1
S =0 Desplazamiento del visualizador desactivado
Por lo general, el reinicio automtico se lleva a cabo sin problemas. En la mayora de los casos, pero no
siempre! Si por cualquier razn, el voltaje de alimentacin no llega a su m-ximo valor en 10mS, el
visualizador se pone a funcionar de manera completamente imprevisible. Si la unidad de voltaje no es capaz
de cumplir con las condiciones o si es necesario proporcionar un funcionamiento seguro, se aplicar el
proceso de inicializacin. La inicializacin, entre otras cosas, reinicia de nuevo al LCD, al habilitarle un
funcionamiento normal.

Hay dos algoritmos de inicializacin. Cul se utilizar depende de si la conexin al microcontrolador se realiza
por el bus de datos de 4 o 8 bits. En ambos casos, despus de inicializacin slo queda especificar los
comandos bsicos y despus, ser posible enviar los mensajes al visualizador LCD.
Refirase a la Figura que sigue para el procedimiento de inicializacin por el bus de datos de 8 bits:
Esto no es un error! En este algoritmo el mismo valor se enva sucesivamente tres veces al visualizador LCD
enva sucesivamente.
El procedimiento de inicializacin por el bus de datos de 4 bits:
Vamos a hacerlo en mikroBasic...
' En mikroBasic for PIC, basta con escribir slo una funcin para
realizar todo el
' proceso de la inicializacin del LCD. Antes de llamar esta funcin es
necesario
' delarar los bits LCD_D4-LCD_D7, LCD_RS y LCD_EN.

. . .
sub procedure Lcd_I ni t ' Inicializar el LCD

. . .
EJEMPLOS PRCTICOS

El proceso de crear un proyecto nuevo es muy simple. Seleccione la opcin New Project del men
Project como se muestra en la Figura de la derecha.

Aparecer una ventana que le guiar a travs del proceso de creacin de un proyecto nuevo. La
ventana de entrada de este programa contiene una lista de acciones a realizar para crear un
proyecto nuevo. Pulse el botn Next.
El proceso de creacin de un proyecto nuevo consiste en cinco pasos:
1. Seleccione el tipo de microcontrolador a programar. En este caso se trata del PIC16F887.
2. Seleccione la frecuencia de reloj del microcontrolador. En este caso el valor seleccionado es
8 MHz.
3. Seleccione el nombre y la ruta del proyecto. En este caso, el nombre del proyecto es
First_Project. Est guardado en la carpeta C:\My projects. Al nombre del proyecto se le
asigna automticamente la extensin .mbppi. Se crear en el proyecto el archivo fuente con
el mismo nombre (First_Project .mbas).
4. Si el nuevo proyecto consiste de varios archivos fuente, se necesita especificarlos y pulse
sobre el botn Add para incluirlos. En este ejemplo no hay archivos fuente adicionales.
5. Por ltimo, se necesita confirmar todas las opciones seleccionadas. Pulse sobre Finish.
Despus de crear el proyecto, aparecer una ventana blanca en la que debe escribir el programa. Vea la
siguiente figura:

Una vez creado el programa, es necesario compilarlo en un cdigo .hex. Seleccione una de las opciones para
compilar del men Project:
Para crear un archivo .hex, seleccione la opcin Build (Ctrl+F9) del men Project o pulse
sobre el icono Build de la barra de herramientas Project.
Por medio de la opcin Build All Projects (Shift+F9) se compilan todos los archivos del
proyecto, libreras (si el cdigo fuente contiene alguna de ellas) y los archivos def para el
microcontrolador utilizado.
La opcin Build + Program (Ctrl+F11) es importante ya que permite al compilador
mikroBasic PRO for PIC cargar automticamente el programa en el microcontrolador
despus de la compilacin. El proceso de la programacin se realiza por medio del
programador PICFlash.
Todos los errores encontrados durante la compilacin aparecern en la ventana Messages. Si no hay errores
en el programa, el compilador mikroBasic PRO for PIC generar los correspondientes archivos de salida.
4.3 EJEMPLO 1
Escribir cabecera, configurar pines de E/S, util izar la funcin Delay
El nico propsito de este programa es de encender varios diodos LED en el puerto PORTB. Utilice este
ejemplo para examinar cmo es un programa real. La siguiente figura muestra el esquema de conexin,
mientras que el programa se encuentra en la siguiente pgina.

Al encender la fuente de alimentacin, cada segundo, el diodo LED en el puerto PORTB emite luz, lo que
indica que el microcontrolador est conectado correctamente y que funciona normalmente.

En este ejemplo se muestra cmo escribir una cabecera correctamente. Lo mismo se aplica a todos los
programas descritos en este libro. Para no repetir, en los siguientes ejemplos no vamos a escribir la
cabecera. Se considera estar en el principio de cada programa, marcada como Cabecera.

Para hacer este ejemplo ms interesante, vamos a habilitar que los LEDs conectados al puerto PORTB
parpadeen. Hay varios modos de hacerlo:
1. Tan pronto como se encienda el microcontrolador, todos los LEDs emitirn la luz por un
segundo. La funcin Delay se encarga de eso en el programa. Slo se necesita ajustar la
duracin del tiempo de retardo en milisegundos.
2. Despus de un segundo, el programa entra en el bucle for, y se queda all hasta que la
variable k sea menor que 20. La variable se incrementa en 1 despus de cada iteracin.
Dentro del bucle for, el ciclo de trabajo es 5:1 (500mS:100mS). Cualquier cambio de estos
estados lgicos hace todos los LEDs parpadear.
3. Al salir del bucle for, el estado lgico del puerto POTRB cambia (0xb 01010101) y el
programa entra en el bucle infinito while y se queda all hasta que 1=1 (bucle infinito). El
estado lgico del puerto PORTB se invierte cada 200mS.

4.4 EJEMPLO 2
Utilizar instrucciones en ensamblador y el oscilador interno LFINTOSC...
En realidad, esto es una continuacin del ejemplo anterior, pero se ocupa de un problema un poco ms
complicado... El propsito es hacer los LEDs en el puerto PORTB parpadear lentamente. Se puede realizar al
introducir un valor suficiente grande para el parmetro del tiempo de retardo en la funcin Delay. No obstante,
hay otra manera ms eficiente para ejecutar el programa lentamente. Acurdese de que este microcontrolador
tiene un oscilador incorporado LFINTOSC que funciona a una frecuencia de 31kHz. Ahora lleg la hora de
darle una oportunidad.

El programa se inicia con el bucle do-while y se queda all por 20 ciclos. Despus da cada iteracin, llega el
tiempo de retardo de 100ms, indicado por un parpadeo relativamente rpido de los LEDs en el puerto PORTB.
Cuando el programa salga de este bucle, el microcontrolador se inicia al utilizar el oscilador LFINTOSC como
una fuente de seal de reloj. Los LEDs parpadean ms lentamente aunque el programa ejecuta el mismo
bucle do-while con un tiempo de retardo 10 veces ms corto.

Con el propsito de hacer evidentes algunas situaciones potencialmente peligrosas, se activan los bits de
control por medio de las instrucciones en ensamblador. Dicho de manera sencilla, al entrar o salir una
instruccin en ensamblador en el programa, el compilador no almacena los datos en un banco actualmente
activo de la RAM, lo que significa que en esta seccin de programa, la seleccin de bancos depende del
registro SFR utilizado. Al volver a la seccin de programa escrito en Basic, los bits de control RP0 y RP1
deben recuperar el estado que tenan antes de introducir la secuencia en ensamblador. En este caso se utiliza
la variable auxiliar saveBank para guardar el estado de estos dos bits.
'Cabecera *********************************************
program exampl e_2 ' Nombre de programa
dim k as byte ' Variable k es de tipo byte
dim saveBank as byte ' Variable saveBank es de tipo byte
mai n: ' Inicio del programa
k = 0 ' Valor inicial de la variable k
ANSEL = 0 ' Todos los pines de E/S se configuran como
digitales
ANSELH = 0
PORTB = 0 ' Todos los pines del puerto PORTB se ponen a 0
TRI SB = 0 ' Pines del puerto PORTB se configuran como salidas

do
PORTB = not PORTB ' Invertir el estado lgico del puerto PORTB
Del ay_ms( 100) ' Tiempo de retardo de 100mS
k = k+1 ' Incrementar k en 1
loop until k=20 ' Quedarse en bucle hasta que k<20

k=0 ' Reiniciar variable k
saveBank = STATUS and %01100000 ' Guardar el estado de los bits RP0 y
RP1
' (bits 5 y 6 del registro STATUS)
asm ' Inicio de una secuencia en ensamblador
bsf STATUS, RP0 ' Seleccionar el banco de memoria que contiene el
bcf STATUS, RP1 ' registro OSCCON
bcf OSCCON, 6 ' Seleccionar el oscilador interno LFINTOSC
bcf OSCCON, 5 ' de frecuencia de 31KHz
bcf OSCCON, 4
bsf OSCCON, 0 ' Microcontrolador utiliza oscilador interno
end asm ' Final de la secuencia en ensamblador

STATUS = STATUS and %10011111 ' Bits RP0 y RP1 recuperan el estado
original
STATUS = STATUS or saveBank

do
PORTB = not PORTB ' Invertir el estado lgico del puerto PORTB
Del ay_ms( 10) ' Tiempo de retardo de 10 mS
k = k+1 ' Incrementar k en 1
loop until k=20 ' Quedarse en el bucle hasta que k<20

st ay_her e: goto st ay_her e ' Bucle infinito

end. ' Final de programa
Usted ha notado que la seal de reloj ha sido cambiado al vuelo. Para asegurarse de eso, quite el cristal de
cuarzo antes de encender al microcontrolador. El microcontrolador no podr empezar a funcionar porque la
Palabra de Configuracin cargada en el programa requiere proporcionar el cristal de cuarzo. Al quitar el cristal
ms tarde durante el funcionamiento, no pasar nada, o sea, eso no afectar nada al microcontrolador.
4.5 EJEMPLO 3
Timer0 como un contador, declarar variables nuevas, utilizar smbolos,
utilizar rels...
En cuanto a los ejemplos anteriores, el microcontrolador ha ejecutado el programa sin haber sido afectado de
ninguna forma por su entorno. En la prctica, hay pocos dispositivos que funcionen de esta manera (por
ejemplo, un simple controlador de luz de nen). Los pines de entrada se utilizan tambin en este ejemplo. En
la siguiente figura se muestra un esquema, mientras que el programa est en la siguiente pgina. Todo sigue
siendo muy simple. El temporizador TMR0 se utiliza como un contador. La entrada del contador est
conectada a un botn de presin, as que cada vez que se presiona el botn, el temporizador Timer0 cuenta
un pulso. Cuando el nmero de pulsos coincida con el nmero almacenado en el registro TEST, un uno lgico
(5V) aparecer en el pin PORTD.3. Este voltaje activa un rel electromecnico, y por eso este bit se le
denomina REL en el programa.
En este ejemplo, el registro TEST almacena el nmero 5. Por supuesto, eso puede ser cualquier nmero
obtenido al calcular o definido como una constante. Adems, el microcontrolador puede activar algn otro
dispositivo en vez de rel, mientras que el sensor se puede utilizar en vez del botn de presin. Este ejemplo
muestra una de las aplicaciones ms comunes del microcontrolador en la industria; al realizar una cosa el
suficiente nmero de veces, otra cosa debe estar encendida o apagada.

' Cabecera ******************************************************
program exampl e_3 ' Nombre del programa
symbol RELAY = PORTD. 3 ' Pin del puerto PORTD.3 es denominado REL
dim TEST as byte ' Variable TEST es de tipo byte
mai n: ' Inicio del programa
TEST = 5 ' Constante TEST = 5
ANSEL = 0 ' All I/O pins are configured as digital
ANSELH = 0
PORTA = 0 ' Reiniciar el puerto PORTA
TRI SA = 0xFF ' Todos los pines de E/S se configuran como
digitales
PORTD = 0 ' Reiniciar el puerto PORTD
TRI SD = %11110111 ' Pin RD3 se configura como una salida, mientras
que los
' dems se configuran como entradas
OPTI ON_REG. 5 = 1 ' Contador TMR0 recibe los pulsos por el pin RA4
OPTI ON_REG. 3 = 1 ' Valor del pre-escalador es 1:1
TMR0 = 0 ' Reiniciar el temporizador/contador TMR0

while 1
if TMR0 = TEST then ' Coincide el nmero en el temporizador con la
constante TEST?
RELAY = 1 ' Nmeros coinciden. Poner el bit RD3 a uno
(salida REL)
end if
wend ' Quedarse en el bucle infinito

end. ' Final de programa
Slo un smbolo (REL) se utiliza aqu. Se le asigna el tercer pin del puerto PORTD en la declaracin.
symbol RELAY = PORTD. 3 ' Smbolo REL = PORTD.3
4.6 EJEMPLO 4
Uti l izar los temporizadores Timer0, Timer1 y Timer2. Util izar interrupciones, declarar
nuevos procedimientos...
Al analizar los ejemplos anteriores, es probable que se haya fijado en la desventaja de proporcionar tiempo de
retardo por medio de la funcin Delay. En estos casos, el microcontrolador se queda esttico y no hace nada.
Simplemente espera que transcurra una cierta cantidad de tiempo. Tal prdida de tiempo es un lujo
inaceptable, por lo que se deber aplicar otro mtodo.
Se acuerda usted del captulo de los temporizadores? Se acuerda de lo de interrupciones? Este ejemplo los
conecta de una manera prctica. El esquema se queda inalterada, y el desafo sigue siendo presente. Es
necesario proporcionar un tiempo de retardo suficiente largo para darse cuenta de los cambios en el puerto.
Para este propsito se utiliza el temporizador TMR0 con el pre-escalador asignado. Siempre que se genere
una interrupcin con cada desbordamiento en el registro del temporizador, la variable cnt se aumenta
automticamente en 1 al ejecutarse cada rutina de interrupcin. Cuando la variable llega al valor 50, el puerto
PORTB se incrementa en 1. Todo el procedimiento se lleva a cabo entre bastidores, lo que habilita al
microcontrolador hacer otra tarea.

' Cabecera******************************************************
program exampl e_4a ' Inicio del programa
dim cnt as byte ' Definir la variable cnt como un byte

sub procedure interrupt ' Este subprocedimiento determina qu se lo que
se
' debe hacer cuando se genere una interrupcin
cnt = cnt + 1 ' Interrupcin causa que la cnt se incremente en
1
TMR0 = 96 ' El valor inicial se devuelve en el
temporizador TMR0
I NTCON = 0x20 ' Bit T0IE se pone a 1, el bit T0IF se pone a 0
end sub ' Final de la rutina de interrupcin

mai n: ' Inicio del programa
OPTI ON_REG = 0x84 ' Pre-escalador se le asigna al temporizador
TMR0
ANSEL = 0 ' Todos los pines de E/S se configuran como
digitales
ANSELH = 0
TRI SB = 0 ' Todos los pines de puerto PORTB se configuran
como salidas
PORTB = 0x0 ' Reiniciar el puerto PORTB
TMR0 = 96 ' Temporizador T0 cuenta de 96 a 255
I NTCON = 0xA0 ' Habilitada interrupcin TMR0
cnt = 0 ' A la variable cnt se le asigna un 0

while 1 ' Bucle infinito
if cnt = 50 then ' Incrementar el puerto PORTB despus 50
interrupciones
PORTB = PORTB + 1 ' Incrementar nmero en el puerto PORTB en 1
cnt = 0 ' Reiniciar la variable cnt
end if
wend

end. ' Final de programa

Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una interrupcin.
'Cabecera******************************************************
program exampl e_4b ' Nombre del programa
dim cnt as byte ' Definir la variable cnt

sub procedure interrupt ' Definir el subprocedimiento de interrupcin
cnt = cnt +1 ' Interrupcin causa que la cnt se incremente en
1
PI R1. TMR1I F = 0 ' Reiniciar el bit TMR1IF
TMR1H = 0x80 ' El valor inicial se devuelve en los registros
TMR1L = 0x00 ' del temporizador TMR1H y TMR1L
end sub ' Final de la rutina de interrupcin

mai n: ' Inicio del programa
ANSEL = 0 ' Todos los pines de E/S se configuran como
digitales
ANSELH = 0
PORTB = 0xF0 ' Valor inicial de los bits del puerto PORTB
TRI SB = 0 ' Los pines del puerto PORTB se configuran como
salidas
T1CON = 1 ' Configurar el temporizador TMR1
PI R1. TMR1I F = 0 ' Reiniciar el bit TMR1IF
TMR1H = 0x80 ' Poner el valor inicial para el temporizador
TMR1
TMR1L = 0x00
PI E1. TMR1I E = 1 ' Habilitar la interrupcin al producirse un
desbordamiento
cnt = 0 ' Reiniciar la variable cnt
I NTCON = 0xC0 ' Interrupcin habilitada (bits GIE y PEIE)

while 1 ' Bucle infinito
if cnt = 76 then ' Cambiar el estado del puerto PORTB despus de
76 interrupciones
PORTB = not PORTB ' Nmero en el puerto PORTB est invertido
cnt = 0 ' Reiniciar la variable cnt
end if
wend

end. ' Final de programa

En este caso, una interrupcin se habilita despus de que se produzca un desbordamiento en el registro del
temporizador TMR1 (TMR1H, TMR1L). Adems, la combinacin de los bits que vara en el puerto POTRB
difiere de la en el ejemplo anterior.
'Cabecera******************************************************
program exampl e_4c ' Nombre del programa
dim cnt as byte ' Definir la variable cnt como un byte

sub procedure Repl ace ' Def i ni r el pr ocedi mi ent o Reempl azar
PORTB = not PORTB ' Def i ni r el nuevo pr ocedi mi ent o Reempl azar
end sub ' Procedimiento invierte el estado del puerto

sub procedure interrupt ' Definir el subprocedimiento de interrupcin
if PI R1. TMR2I F then ' Si el bit TMR2IF = 1,
cnt = cnt +1 ' Incrementar variable la cnt en 1
PI R1. TMR2I F = 0 ' Reiniciar el bit y
TMR2 = 0 ' Reiniciar el registro TMR2
end if
end sub ' Final de la rutina de interrupcin

mai n: ' Inicio del programa
cnt = 0 ' Reiniciar la variable cnt
ANSEL = 0 ' Todos los pines de E/S se configuran como
digitales
ANSELH = 0
PORTB = %10101010 ' Estado lgico en los pines del puerto PORTB
TRI SB = 0 ' Todos los pines del puerto PORTB se configuran
como salidas
T2CON = 0xFF ' Configurar el temporizador T2
TMR2 = 0 ' Valor inicial del registro del temporizador
TMR2
PI E1. TMR2I E = 1 ' Interrupcin habilitada
I NTCON = 0xC0 ' Bits GIE y PEIE se ponen a 1

while 1 ' Bucle infinito
if cnt > 30 then ' Cambiar el estado del puerto PORTB despus de
ms de 30 interrupciones
Repl ace ' Subprocedimiento Reemplazar invierte el estado
del puerto PORTB
cnt = 0 ' Reset variable cnt
end if
wend

end. ' Final de programa

En este ejemplo, una interrupcin ocurre despus de que se produce un desbordamiento en el registro del
temporizador TMR2. Para invertir el estado lgico de los pines del puerto se utiliza el procedimiento
Reemplazar, que normalmente no pertenece al lenguaje mikroBasic.
4.7 EJEMPLO 5
Uti l izar el temporizador perro - guardin
Este ejemplo muestra cmo NO se debe utilizar el temporizador perro-guardin. Un comando utilizado para
reiniciar este temporizador se omite a propsito en el bucle del programa principal, lo que habilita al
temporizador perro guardin ganar la batalla del tiempo y reiniciar al microcontrolador. Por consiguiente, el
microcontrolador se va a reiniciar sin parar, lo que indicar el parpadeo de los LEDs del puerto PORTB.

'Cabecera ******************************************************
program exampl e_5 ' Nombre de programa
mai n: ' Inicio del programa
OPTI ON_REG = 0x0E ' Pre-escalador se le asigna al temporizador WDT
(1:64)
asm CLRWDT ' Comando en ensamblador para reiniciar el
temporizador WDT
end asm
PORTB = 0x0F ' Valor inicial del registro PORTB
TRI SB = 0 ' Todos los pines del puerto PORTB se configuran como
salidas
Del ay_ms( 300) ' Tiempo de retardo de 30mS
PORTB = 0xF0 ' Valor del puerto PORTB diferente del inicial
while 1 ' Bucle infinito. El programa se queda aqu hasta que
el
wend ' temporizador WDT reinicie al microcontrolador
end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perro-guardin al
seleccionar la opcin Tools/mE Programmer/Watchdog Timer - Enabled.

4.8 EJEMPLO 6
Mdulo CCP1 como generador de seal PWM
Este ejemplo muestra el uso del mdulo CCP1 en modo PWM. Para hacer las cosas ms interesantes, la
duracin de los pulsos en la salida P1A (PORTC,2) se puede cambiar por medio de los botones de presin
simblicamente denominados OSCURO y CLARO. La duracin ajustada se visualiza como una
combinacin binaria en el puerto PORTB. El funcionamiento de este mdulo est bajo el control de las
funciones pertenecientes a la librera especializada PWM. Aqu se utilizan las tres de ellas:
1. PWM1_init tiene el prototipo: sub procedure PWM1_I ni t ( const f r eq as longint)
El parmetro freq ajusta la frecuencia de la seal PWM expresada en hercios. En este
ejemplo equivale a 5kHz.
2. PWM1_Start tiene el prototipo: sub procedure PWM1_St ar t ( )
3. PWM1_Set_Duty tiene el prototipo: sub
procedure PWM1_Set _Dut y( dim dut y_r at i o as byte)
El parmetro duty_ratio ajusta la duracin de pulsos en una secuencia de pulsos.
La librera PWM tambin contiene la funcin PWM_Stop utilizada para deshabilitar este modo. Su prototipo
es: sub procedurePWM1_St op( )

' Cabecera ******************************************************
program exampl e_6 ' Nombre de programa
dim cur r ent _dut y, ol d_dut y, ol dst at e as byte ' Definir las variables
current_duty
' old_duty y oldstate
mai n: ' Inicio del programa
ANSEL = 0 ' Todos los pines de E/S se confguran como digitales
ANSELH = 0
PORTA = 255 ' Estado inicial del puerto PORTA
TRI SA = 255 ' Todos los pines del puerto PORTA se configuran como
entradas
PORTB = 0 ' Estado inicial del puerto PORTB
TRI SB = 0 ' Todos los pines del puerto PORTB se configuran como
salidas
PORTC = 0 ' Estado inicial del puerto PORTC
TRI SC = 0 ' Todos los pines del puerto PORTC se configuran como
salidas
PWM1_I ni t ( 5000) ' Inicializacin del mdulo PWM (5 KHz)
cur r ent _dut y = 16 ' Valor inicial de la variable current_duty
ol d_dut y = 0 ' Reiniciar la variable old_duty
PWM1_St ar t ( ) ' Inicializacin del mdulo PWM1

while 1 ' Bucle infinito
if ol dst at e and But t on( PORTA, 0, 1, 1) then ' Si se presiona el botn
conectado al RA0
cur r ent _dut y = cur r ent _dut y + 1 ' incrementar el valor de la
variable current_duty
if But t on( PORTA, 0, 1, 1) then
ol dst at e = 255
end if
end if

if ol dst at e and But t on( PORTA, 1, 1, 1) then ' Si se presiona el botn
conectado al RA1
cur r ent _dut y = cur r ent _dut y - 1 ' decrementar el valor de la
variable current_duty
if But t on( PORTA, 1, 1, 1) then
ol dst at e = 255
end if
end if

if ol d_dut y <> cur r ent _dut y then ' Si current_duty y old_duty
no son iguales
PWM1_Set _Dut y( cur r ent _dut y) ' ajustar un nuevo valor a
PWM,
ol d_dut y = cur r ent _dut y ' guardar el nuevo valor
PORTB = ol d_dut y ' y visualizarlo en el
puerto PORTB
end if

Del ay_ms( 200) ' Tiempo de retardo 200mS
wend

end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa:
PWM
Button
4.9 EJEMPLO 7
Uti l izar el convertidor A/D
El convertidor A/D del microcontrolador PIC16F887 se utiliza en este ejemplo. Hace falta decir que todo es
pan comido? Una seal analgica variable se aplica al pin AN2, mientras que el resultado de la conversin de
10 bits se muestra en los puertos POTRB y PORTD (8 bits menos significativos en el puerto PORTD y 2 bits
ms significativos en el puerto PORTB). La Tierra (GND) se utiliza como voltaje de referencia bajo Vref-,
mientras que VCC se utiliza como voltaje de referencia positivo.
Si se utiliza el voltaje variable como Vref+(refirase a la lnea punteada), se habilita estirar y encojer la escala
de medicin.

En otras palabras, el convertidor A/D siempre genera un resultado binario de 10 bits, lo que significa que
reconoce 1024 niveles de voltaje en total (210=1024). La diferencia entre dos niveles de voltaje no es siempre
la misma. Cunto menor sea la diferencia entre Vref+y Vref-, tanto menor ser la diferencia entre dos de 1024
niveles. Como hemos visto, el convertidor A/D es capaz de detectar pequeos cambios de voltaje.
'Cabecera******************************************************
program exampl e_7 ' Nombre de programa
dim t emp_r es as word ' Variable temp_res es de tipo word
mai n: ' Inicio del programa
ANSEL = 0x0C ' Pin AN2 se configura como analgico
TRI SA = 0xFF ' Todos los pines del puerto PORTA se configuran
como entradas
ANSELH = 0 ' Los dems pines se configuran como digitales
TRI SB = 0x3F ' Pines del puerto PORTB, RB7 y RB6 se configuran
como salidas
TRI SD = 0 ' Todos los pines del PORTD se configuran como
salidas
ADCON1. B4 = 0 ' Voltaje de referencia positivo es VCC.

while 1 ' Bucle infinito
t emp_r es = ADC_Read( 2) ' Resultado de la conversin A/D es copiado a
temp_res
PORTD = t emp_r es ' 8 bits menos significativos se mueven al
puerto PORTD
PORTB = t emp_r es >> 2 ' 2 bits ms significativos se mueven a los
bits RB6 y RB7
wend

end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera ADC en la ventana Library
Manager antes de compilar el programa:
ADC
4.10 EJEMPLO 8
Uti l izar memoria EEPROM
Este ejemplo muestra cmo escribir y leer la memoria EEPROM incorporada. El programa funciona de la
siguiente manera. El bucle principal lee constantemente el contenido de localidad de la memoria EEPROM en
la direccin 5. Luego el programa entra en el bucle infinito en el que el puerto PORTB se incrementa y se
comprueba el estado de entradas del puerto PORTA.2. En el momento de presionar el botn denominado
MEMO, un nmero almacenado en el puerto PORTB ser guardado en la memoria EEPROM en la direccin
5, directamente ledo y visualizado en el puerto PORTD en forma binaria.

'Cabecera******************************************************
program exampl e_8 ' Nombre de programa
mai n: ' Inicio del programa
ANSEL = 0 ' Todos los pines de E/S se configuran como
digitales
ANSELH = 0
PORTB = 0 ' Valor inicial del puerto PORTB
TRI SB = 0 ' Todos los pines del puerto PORTB se configuran
como salidas
PORTD = 0 ' Valor inicial del puerto PORTB
TRI SD = 0 ' Todos los pines del puerto PORTD se configuran
como salidas
TRI SA = 0xFF ' Todos los pines del puerto PORTA se configuran
como entradas
PORTD = EEPROM_Read( 5) ' Leer la memoria EEPROM en la direccin 5

while 1 ' Bucle infinito
PORTB = PORTB + 1 ' Incrementar el puerto PORTB en 1
Del ay_ms( 100) ' Tiempo de retardo de 100mS
while not PORTA. B2 ' Quedar en este bucle hasta que el botn est
pulsado
if not PORTA. B2 then
EEPROM_Wr i t e( 5, PORTB) ' Si se pulsa el botn MEMO, guardar el
puerto PORTB
PORTD = EEPROM_Read( 5) ' Leer el dato escrito
end if
wend
wend

end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera EEPROM en la ventana
Library Manager antes de compilar el programa:
EEPROM
Para comprobar el funcionamiento de este programa, basta con pulsar el botn MEMO y apagar el
microcontrolador. Despus de reiniciar el dispositivo, el programa visualizar en el puerto PORTD el valor
guardado en la memoria EEPROM en la direccin 5. Acurdese de que en el momento de escribir, el valor fue
visualizado en el puerto PORTB.
4.11 EJEMPLO 9
Contador de cuatro dgitos LED, multiplexin
En este ejemplo el microcontrolador funciona como un contador de dos dgitos. La variable i se incrementa
(suficiente lentamente para ser visible) y su valor se visualiza en un visualizador de cuatro dgitos LED (9999-
0). El punto es habilitar una conversin de un nmero binario en un decimal y partirlo en cuatro dgitos (en
miles, centenas, decenas y unidades). Como los segmentos del visualizador LED se conectan en paralelo, es
necesario asegurar que alternen rpidamente para tener una impresin de que emiten la luz simultneamente
(multiplexin por divisin en tiempo).

En este ejemplo, el temporizador TMR0 est encargado de la multiplexin por divisin en tiempo, mientras
que la funcin mask convierte un nmero binario a formato decimal.

'Cabecera******************************************************
program exampl e_9 ' Nombre de programa
dim shi f t er , por t d_i ndex as byte ' Variables shifter y portd_index son
de tipo byte
di gi t , number as word ' Variables digit y number son de tipo
word
por t d_ar r ay as word[ 4] ' Matriz portd_array tiene 4 miembros
de tipo word
sub function mask ( dim numas Word) as Word ' Subrutina para enmascarar
select case num' utilizada para convertir
case 0 r esul t = $3F ' nmeros binarios en la
case 1 r esul t = $06 ' combinacin de bits apropiada
case 2 r esul t = $5B ' que se visualizar en el LED
case 3 r esul t = $4F
case 4 r esul t = $66
case 5 r esul t = $6D
case 6 r esul t = $7D
case 7 r esul t = $07
case 8 r esul t = $7F
case 9 r esul t = $6F
end select ' Final de la sentencia Case
end sub ' Final de la subrutina

sub procedure interrupt ' Inicio de la rutina de interrupcin
PORTA = 0 ' Apagar todos los visualizadores de 7 segmentos
PORTD = por t d_ar r ay [ por t d_i ndex] ' Enviar el valor apropiado al
puerto PORTD
PORTA = shi f t er ' Encender el visualizador apropiado de 7
segmentos
shi f t er = shi f t er << 1 ' Mover shifter al siguiente dgito

if ( shi f t er > 8) then
shi f t er = 1
end if

I nc( por t d_i ndex) ' Incrementar portd_index

if ( por t d_i ndex > 3) then
por t d_i ndex = 0 ' Encender el primero, apagar el cuarto
visualizador de 7 segmentos
end if

TMR0 = 0 ' Reiniciar el valor del TIMER0
T0I F_bi t = 0 ' Borrar la bandera de interrupcin del Timer0
end sub ' Final de la rutina de interrupcin

mai n: ' Inicio del programa
ANSEL = 0 ' Configurar los pines analgicos como pines de E/S
digitales
ANSELH = 0
OPTI ON_REG = $80 ' Configuracin del Timer0 (Timer0 funciona como
temporizador
' con el pre-escalador)
di gi t = 0 ' Valor inicial de la variable digit
por t d_i ndex = 0 ' Encender el primer visualizador LED
shi f t er = 1 ' Valor inicial de la variable shifter
TMR0 = 0 ' Borrar el Timer0
I NTCON = $A0 ' Habilitar interrupcin con los bits GIE y T0IE
PORTA = 0 ' Borrar el PORTA
TRI SA = 0 ' Configurar el PORTA como salida
PORTD = 0 ' Borrar el PORTD
TRI SD = 0 ' Configurar el PORTD como salida
number = 6789 ' Un valor inicial en el visualizador LED

while TRUE ' Bucle infinito
di gi t = number / 1000 ' Extraer miles
por t d_ar r ay[ 3] = mask( di gi t ) ' y almacenarlo en la matriz PORTD
di gi t = ( number / 100) mod 10 ' Extraer centenas
por t d_ar r ay[ 2] = mask( di gi t ) ' y almacenarlo en la matriz PORTD
di gi t = ( number / 10) mod 10 ' Extraer decenas
por t d_ar r ay[ 1] = mask( di gi t ) ' y almacenarlo en la matriz PORTD
di gi t = number mod 10 ' Extraer unidades
por t d_ar r ay[ 0] = mask( di gi t ) ' y almacenarlo en la matriz PORTD

Del ay_ms( 1000) ' Retardo de un segundo
I nc( number ) ' Incrementar nmero

if ( number > 9999) then ' Empezar a contar de cero
number = 0
end if
wend

end. ' Final de programa
4.12 EJEMPLO 10
Uti l izar el visualizador LCD
Este ejemplo muestra cmo utilizar un visualizador LCD alfanumrico. Las libreras de funciones simplifican
este programa.

Dos mensajes escritos en dos lneas aparece en el visualizador:
mikroElektronika
LCD example
Dos segundos ms tarde, el segundo mensaje se susituye por el voltaje presente en la entrada del convertidor
A/D (el pin RA2). Por ejemplo:
mikroElektronika
voltage:3.141V
En un dispositivo real se puede visualizar temperatura actual o algn otro valor medido en vez de voltaje.

Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa:
ADC
LCD
'Cabecer a******************************************************
program exampl e_10 ' Nombre de programa

dim LCD_RS as sbit at RB4_bi t ' Conexiones del mdulo Lcd
LCD_EN as sbit at RB5_bi t
LCD_D4 as sbit at RB0_bi t
LCD_D5 as sbit at RB1_bi t
LCD_D6 as sbit at RB2_bi t
LCD_D7 as sbit at RB3_bi t
LCD_RS_Di r ect i on as sbit at TRI SB4_bi t
LCD_EN_Di r ect i on as sbit at TRI SB5_bi t
LCD_D4_Di r ect i on as sbit at TRI SB0_bi t
LCD_D5_Di r ect i on as sbit at TRI SB1_bi t
LCD_D6_Di r ect i on as sbit at TRI SB2_bi t
LCD_D7_Di r ect i on as sbit at TRI SB3_bi t ' Final de las conexiones del
mdulo Lcd
dim t ext as string [ 16] ' Variable text es de tipo string
dim ch, adc_r d as word ' Variables ch y adc_rd son de tipo word
dim t l ong as l ongwor d ' Variable tlong es de tipo longword
mai n: ' Inicio del programa
TRI SB = 0 ' Todos los pines del puerto PORTB se
configuran como salidas
PORTB = 0xFF
I NTCON = 0 ' Todas las interrupciones deshabilitadas
ANSEL = 0x04 ' Pin RA2 se configura como una entrada
analgica
TRI SA = 0x04
ANSELH = 0 ' Los dems pines se configuran como digitales
Lcd_I ni t ( ) ' Inicializacin del visualizador LCD
Lcd_Cmd( _LCD_CURSOR_OFF) ' Comando LCD (apagar el cursor)
Lcd_Cmd( _LCD_CLEAR) ' Comando LCD (borrar el LCD)

t ext = " mi kr oEl ekt r oni ka" ' Definir el primer mensaje
Lcd_Out ( 1, 1, t ext ) ' Escribir el primer mensaje en la primera
lnea
t ext = " LCD exampl e" ' Definir el segundo mensaje
Lcd_Out ( 2, 1, t ext ) ' Definir el segundo mensaje en la segunda
lnea
ADCON1 = 0x80 ' Voltaje de referencia para la conversin A/D
es VCC
TRI SA = 0xFF ' Todos los pines del puerto PORTA se
configuran como entradas
Del ay_ms( 2000)
t ext = " Vol t age=" ' Definir el tercer mensaje

while 1 ' Bucle infinito
adc_r d = ADC_Read( 2) ' Conversin A/D. Pin RA2 es una entrada.
Lcd_Out ( 2, 1, t ext ) ' Escribir el resultado en la segunda lnea
t l ong = adc_r d * 5000 ' Convertir el resultado en milivoltios
t l ong = t l ong / 1023 ' 0..1023 -> 0-5000mV
ch = ( t l ong / 1000) mod 10 ' Extraer voltios (miles de milivoltios)
' del resultado
Lcd_Chr ( 2, 9, 48+ch) ' Escribir resultado en formato ASCII
Lcd_Chr _CP( ". " ) ' Escribir el punto decimal
ch = ( t l ong / 100) mod 10 ' Extraer centenas de milivoltios
Lcd_Chr _CP( 48+ch) ' Escribir resultado en formato ASCII
ch = ( t l ong / 10) mod 10 ' Extraer decenas de milivoltios
Lcd_Chr _CP( 48+ch) ' Escribir resultado en formato ASCII
ch = t l ong mod 10 ' Extraer unidades de milivoltios
Lcd_Chr _CP( 48+ch) ' Escribir resultado en formato ASCII
Lcd_Chr _CP( "V" ) ' Escribir etiqueta para el voltaje "V"
Del ay_ms( 1) ' Retardo de 1mS
wend

end. ' Final de programa
4.13 EJEMPLO 11
Comunicacin serial RS232
Este ejemplo muestra cmo utilizar el mdulo EUSART del microcontrolador. La conexin entre el
microcontrolador y una PC se establece de acuerdo con el estndar de comunicacin RS-232. El programa
funciona de la siguiente manera. Cada byte recibido por medio de la comunicacin serial se visualiza al utilizar
los LEDs conectados al puerto PORTB y despus se devuelve automticamente al transmisor. La manera
ms fcil es comprobar el funcionamiento del dispositivo en la prctica al utilizar un programa estndar de
Windows denominado Hyper Terminal.

' Cabecera******************************************************
program exampl e_11 ' Nombre de programa
dim i as byte ' Variable es de tipo byte
mai n: ' Inicio de programa
UART1_I ni t ( 19200) ' Inicializar el mdulo USART
' 8 bi t s, t asa de baudi os 19200, no hay bi t de par i dad. . . )
while 1 ' Bucle infinito
if UART1_Dat a_Ready( ) then ' Si se ha recibido un dato
i = UART1_Read( ) ' leerlo
UART1_Wr i t e( i ) ' y enviarlo atrs
end if
wend

end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera UART en la ventana Library
Manager antes de compilar el programa:
UART
4.14 EJEMPLO 12
Medicin de temperatura por medio del sensor DS1820. Uso del protocolo 1-wire ...
La medicin de temperatura es una de las tareas ms frecuentes realizadas por el microcontrolador. En este
ejemplo, se utiliza un sensor DS1820 para medir. Es capaz de medir en el rango de 55 C a 125 C con
exactitud de 0.5 C. Para transmitir los datos al microcontrolador se utiliza un tipo especial de la comunicacin
serial denominado 1-wire. Debido al hecho de que estos sensores son simples de utilizar y con una amplia
gama de aplicaciones, las funciones almacenadas en la librera One_Wire ponen en marcha y gobiernan
estos sensores.

Esta librera contiene en total tres funciones:
Ow_Reset se utiliza para reiniciar el sensor;
Ow_Read se utiliza para recibir los datos del sensor; y
Ow_Write se utiliza para enviar los comandos al sensor.
Este ejemplo muestra la ventaja de utilizar libreras con las funciones listas para ser utilizadas.
Concretamente, no tiene que examinar la documentacin proporcionada por el fabricante para utilizar el
sensor. Basta con copiar las funciones apropiadas en el programa. Si le interesa saber cmo se declaran,
basta con pulsar sobre alguna de ellas y seleccionar la opcin Help.
' Cabecera******************************************************
program exampl e_12 ' Nombre de programa

dim LCD_RS as sbit at RB4_bi t ' Conexiones del mdulo LCD
LCD_EN as sbit at RB5_bi t
LCD_D4 as sbit at RB0_bi t
LCD_D5 as sbit at RB1_bi t
LCD_D6 as sbit at RB2_bi t
LCD_D7 as sbit at RB3_bi t
LCD_RS_Di r ect i on as sbit at TRI SB4_bi t
LCD_EN_Di r ect i on as sbit at TRI SB5_bi t
LCD_D4_Di r ect i on as sbit at TRI SB0_bi t
LCD_D5_Di r ect i on as sbit at TRI SB1_bi t
LCD_D6_Di r ect i on as sbit at TRI SB2_bi t
LCD_D7_Di r ect i on as sbit at TRI SB3_bi t ' Final de conexiones del mdulo
LCD

' Aj ust ar l a const ant e TEMP_RESOLUTI ON a l a r esol usi n cor r espondi ent e
del sensor :
' DS18x20 utilizado: 18S20: 9 (ajustes por defecto pueden ser 9,10,11 o
12); 18B20: 12

const TEMP_RESOLUTI ON as byte = 9 ' Constante TEMP_RESOLUTION es de tipo
byte

dim t ext as char[ 9] ' Variable text es de tipo char
t emp as word ' Variable temp es de tipo word
sub procedure Di spl ay_Temper at ur e( dim t emp2wr i t e as word )
const RES_SHI FT = TEMP_RESOLUTI ON - 8
dim t emp_whol e as byte ' Variable temp_whole rd fr tipo byte
t emp_f r act i on as word ' Variable temp_fraction es de tipo
word
t ext = " 000. 0000"

if ( t emp2wr i t e and 0x8000) then ' Comprobar si la temperatura es
negativa
t ext [ 0] = "- "
t emp2wr i t e = not t emp2wr i t e + 1
end if

t emp_whol e = word( t emp2wr i t e >> RES_SHI FT) ' Extraer temp_whole

if ( t emp_whol e div 100 ) then ' Convertir temp_whole en caracteres
t ext [ 0] = t emp_whol e div 100 + 48
else
t ext [ 0] = "0"
end if

t ext [ 1] = ( t emp_whol e div 10) mod 10 + 48 ' Extraer dgito de
decenas
t ext [ 2] = t emp_whol e mod 10 + 48 ' Extraer dgito de
unidades
t emp_f r act i on = word( t emp2wr i t e << ( 4- RES_SHI FT) ) ' Extraer
temp_fraction
t emp_f r act i on = t emp_f r act i on and 0x000F ' y convertirlo en
t emp_f r act i on = t emp_f r act i on * 625 ' unsigned int
t ext [ 4] = word( t emp_f r act i on div 1000) + 48 ' Extraer dgito de
miles
t ext [ 5] = word( ( t emp_f r act i on div 100) mod 10 + 48) ' Extraer dgito
de centenas
t ext [ 6] = word( ( t emp_f r act i on div 10) mod 10 + 48) ' Extraer dgito
de decenas
t ext [ 7] = word( t emp_f r act i on mod 10) + 48 ' Extraer dgito de
unidades
Lcd_Out ( 2, 5, t ext ) ' Visualizar
temperatura en el Lcd

end sub

mai n: ' Inicio de programa
ANSEL = 0 ' Configurar pines analgicos como digitales de E/S
ANSELH = 0

t ext = " 000. 0000"
Lcd_I ni t ( ) ' Inicializar el Lcd
Lcd_Cmd( _LCD_CLEAR) ' Borrar el Lcd
Lcd_Cmd( _LCD_CURSOR_OFF) ' Apagar el cursor
Lcd_Out ( 1, 1, " Temper at ur e: ")

Lcd_Chr ( 2, 13, 178) ' Visualizar el carcter de grado, 'C' para
centgrados
' Distintos visualizadores LCD tienen diferentes cdigos de caracteres
para el grado
Lcd_Chr ( 2, 14, " C") ' si ve la letra griega Alfa, introduzca 178 en vez de
223

while 1 ' Leer la temperatura en el bucle principal
Ow_Reset ( PORTE, 2) ' Seal de reinicio de Onewire
Ow_Wr i t e( PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM
Ow_Wr i t e( PORTE, 2, 0x44) ' Ejecutar el comando CONVERT_T
Del ay_us( 120)

Ow_Reset ( PORTE, 2)
Ow_Wr i t e( PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM
Ow_Wr i t e( PORTE, 2, 0xBE) ' Ejecutar el comando READ_SCRATCHPAD

t emp = Ow_Read( PORTE, 2)
t emp = ( Ow_Read( PORTE, 2) << 8) + t emp

Di spl ay_Temper at ur e( t emp) ' Formatear y visualizar el resultado en el
LCD

Del ay_ms( 520) ' Retardo de 520 ms
wend
end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa:
One_Wire
LCD
4.15 EJEMPLO 13
Generacin de sonido, librera de sonido...
Las seales de audio se utilizan con frecuencia cuando se necesita llamar la atencin de usuario para hacer
algo, confirmar que alguno de los botones se ha pulsado, avisar que se ha llegado hasta los valores mnimos
o mximos etc. Pueden ser una simple seal de pitido as como melodas de una duracin ms larga o ms
corta. En este ejemplo se muestra cmo generar un sonido por medio de funciones que pertenecen a la
librera Sound.

Adems de estas funciones, la funcin Button que pertenece a la misma librera se utiliza para probar los
botones de presin.
' Cabecera******************************************************
program exampl e_13 ' Nombre de programa

sub procedure Tone1( )
Sound_Pl ay( 659, 250) ' Frecuencia = 659Hz, duracin = 250ms

end sub

sub procedure Tone2( )
Sound_Pl ay( 698, 250) ' Frecuencia = 698Hz, duracin = 250ms
end sub

sub procedure Tone3( )
Sound_Pl ay( 784, 250) ' Frecuencia = 784Hz, duracin = 250ms
end sub

sub procedure Mel ody( ) ' Tocar una meloda divertida 1
Tone1( ) Tone2( ) Tone3( ) Tone3( )
Tone1( ) Tone2( ) Tone3( ) Tone3( )
Tone1( ) Tone2( ) Tone3( )
Tone1( ) Tone2( ) Tone3( ) Tone3( )
Tone1( ) Tone2( ) Tone3( )
Tone3( ) Tone3( ) Tone2( ) Tone2( ) Tone1( )
end sub

sub procedure ToneA( ) ' Tonos utilizados en la funcin Melody2
Sound_Pl ay( 880, 50)
end sub

sub procedure ToneC( )
Sound_Pl ay( 1046, 50)
end sub

sub procedure ToneE( )
Sound_Pl ay( 1318, 50)
end sub

sub procedure Mel ody2( ) ' Tocar Melody2
dim count er as byte
for count er = 9 to 1 step - 1
ToneA( )
ToneC( )
ToneE( )
next count er
end sub

mai n: ' Inicio de programa

ANSEL = 0 ' Configurar pines analgicos como digitales de E/S
ANSELH = 0

C1ON_bi t = 0 ' Deshabilitar los comparadores
C2ON_bi t = 0

TRI SB = 0xF0 ' Configurar los pines RB7..RB4 como entradas y RB3 como
salida

Sound_I ni t ( PORTD, 3)
Sound_Pl ay( 880, 5000)

while TRUE ' Bucle infinito
if ( But t on( PORTB, 7, 1, 1) ) then ' Si se presiona PORTB.7 tocar Tone1
Tone1( )
while ( RB7_bi t <> 0)
nop ' Esperar que se suelte el botn
wend
end if

if ( But t on( PORTB, 6, 1, 1) ) then ' Si se presiona PORTB.6 tocar Tone1
Tone2( )
while ( RB6_bi t <> 0)
nop ' Esperar que se suelte el botn
wend
end if

if ( But t on( PORTB, 5, 1, 1) ) then ' Si se presiona PORTB.5 tocar Tone1
Mel ody2( )
while ( RB5_bi t <> 0)
nop ' Esperar que se suelte el botn
wend
end if

if ( But t on( PORTB, 4, 1, 1) ) then ' Si se presiona PORTB.4 tocar Tone1

Mel ody( )
while ( RB4_bi t <> 0)
nop ' Esperar que se suelte el botn
wend
end if
wend

end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa:
Button
Sound
4.16 EJEMPLO 14
Uti l izar el visualizador LCD grfico
Un LCD grfico (GLCD) proporciona un mtodo avanzado para visualizar mensajes. Mientras que un LCD de
caracteres puede visualizar slo caracteres alfanumricos, el LCD grfico puede visualizar los mensajes en
forma de dibujos y mapas de bits. El LCD grfico utilizado con ms frecuencia tiene una resolucin de pantalla
de 128x64 pxeles. El contraste de un GLCD se puede ajustar por medio del potencimetro P1.

Aqu, el GLCD visualiza un camin cuyo mapa de bits se almacena en el archivo truck_bmp.mbas.

'Cabecera******************************************************

program exampl e_14 ' Nombre de programa

dim GLCD_Dat aPORT as byte at PORTD

dim GLCD_CS1 as sbit at RB0_bi t ' Conexiones del mdulo Glcd
GLCD_CS2 as sbit at RB1_bi t
GLCD_RS as sbit at RB2_bi t
GLCD_RWas sbit at RB3_bi t
GLCD_EN as sbit at RB4_bi t
GLCD_RST as sbit at RB5_bi t

dim GLCD_CS1_Di r ect i on as sbit at TRI SB0_bi t
GLCD_CS2_Di r ect i on as sbit at TRI SB1_bi t
GLCD_RS_Di r ect i on as sbit at TRI SB2_bi t
GLCD_RW_Di r ect i on as sbit at TRI SB3_bi t
GLCD_EN_Di r ect i on as sbit at TRI SB4_bi t
GLCD_RST_Di r ect i on as sbit at TRI SB5_bi t ' Final de conexiones del
mdulo Glcd

dim count er as byte
someText as char[ 18]

sub procedure Del ay2S( ) ' Subfuncin de retardo de 2 segundos

Del ay_ms( 2000)
end sub

mai n: ' Inicio de programa
ANSEL = 0 ' Configurar pines analgicos como digitales de E/S

ANSELH = 0
Gl cd_I ni t ( ) ' Inicializar el Glcd
Gl cd_Fi l l ( 0x00) ' Borrar el Glcd
while TRUE ' Bucle infinito
Gl cd_I mage( @t r uck_bmp) ' Dibujar imagen
Del ay2S( ) del ay2S( )

Gl cd_Fi l l ( 0x00) ' Borrar el Glcd

Gl cd_Box( 62, 40, 124, 63, 1) ' Dibujar la caja
Gl cd_Rect angl e( 5, 5, 84, 35, 1) ' Dibujar el rectngulo
Gl cd_Li ne( 0, 0, 127, 63, 1) ' Dibujar la lnea

Del ay2S( )
count er = 5

while ( count er <= 59) ' Dibujar lneas horizontales y verticales
Del ay_ms( 250)
Gl cd_V_Li ne( 2, 54, count er , 1)
Gl cd_H_Li ne( 2, 120, count er , 1)
Count er = count er + 5
wend

Del ay2S( )

Gl cd_Fi l l ( 0x00) ' Borrar el GLCD

Gl cd_Set _Font ( @Char act er 8x7, 8, 7, 32) ' Seleccionar la fuente
"Character8x7"
Gl cd_Wr i t e_Text ( " mi kr oE", 1, 7, 2) ' Escribir la cadena

for count er = 1 to 10 ' Dibujar los crculos
Gl cd_Ci r cl e( 63, 32, 3*count er , 1)
next count er
Del ay2S( )

Gl cd_Box( 10, 20, 70, 63, 2) ' Dibujar la caja

Del ay2S( )

Gl cd_Fi l l ( 0xFF) ' Llenar el Glcd
Gl cd_Set _Font ( @Char act er 8x7, 8, 7, 32) ' Cambiar de la fuente
someText = "8x7 Font "
Gl cd_Wr i t e_Text ( someText , 5, 0, 2) ' Escribir la cadena
del ay2S( )

Gl cd_Set _Font ( @Syst em3x5, 3, 5, 32) ' Cambiar de la fuente
someText = "3X5 CAPI TALS ONLY"
Gl cd_Wr i t e_Text ( someText , 60, 2, 2) ' Escribir la cadena
del ay2S( )

Gl cd_Set _Font ( @f ont 5x7, 5, 7, 32) ' Cambiar de la fuente
someText = "5x7 Font "
Gl cd_Wr i t e_Text ( someText , 5, 4, 2) ' Escribir la cadena
del ay2S( )

Gl cd_Set _Font ( @Font Syst em5x7_v2, 5, 7, 32) ' Cambiar de la fuente
someText = "5x7 Font ( v2) "
Gl cd_Wr i t e_Text ( someText , 5, 6, 2) ' Escribir la cadena
del ay2S( )
wend
end. ' Final de programa
truck_bmp.mbas file:
module bi t map ' Mdulo con el cdigo de mapa de bits

const t r uck_bmp as byte[ 1024] =
( 0, 0, 0, 0, 0, 248, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 9,
9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 13, 253, 13, 195, 6, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 255, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 240, 240, 240, 240, 224, 224, 240, 240, 240, 240, 240, 224, 19
2, 192, 22
4, 240, 240, 240, 240, 240, 224, 192, 0, 0, 0, 255, 255, 255, 255, 255, 195, 195, 195, 195,
195, 195,
195, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 240, 79, 224, 255, 96, 96, 96, 32, 32, 32, 32, 32
, 32, 32, 3
2, 32, 32, 32, 32, 32, 64, 64, 64, 64, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255
, 255, 0, 0
, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 2
55, 255, 1
29, 129, 129, 129, 129, 129, 129, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 1, 248, 8, 8, 8, 8
, 8, 8, 8, 8
, 8, 8, 8, 8, 8, 8, 16, 224, 24, 36, 196, 70, 130, 130, 133, 217, 102, 112, 160, 192, 96, 96, 3
2, 32, 160
, 160, 224, 224, 192, 64, 64, 128, 128, 192, 64, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
63, 96, 96, 96, 224, 96, 96, 96, 96, 96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 96, 99, 99, 99, 99
, 99, 96, 9
6, 96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 9
6, 96, 96,
96, 96, 96, 96, 64, 64, 64, 224, 224, 255, 246, 1, 14, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 130,
67, 114, 6
2, 35, 16, 16, 0, 7, 3, 3, 2, 4, 4, 4, 4, 4, 4, 4, 28, 16, 16, 16, 17, 17, 9, 9, 41, 112, 32, 67, 5,
240, 126,
174, 128, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 127, 127, 127
, 127, 255
, 255, 247, 251, 123, 191, 95, 93, 125, 189, 189, 63, 93, 89, 177, 115, 243, 229, 207, 27, 6
3, 119, 25
5, 207, 191, 255, 255, 255, 255, 255, 255, 255, 255, 127, 127, 127, 127, 127, 127, 127, 12
7, 255, 25
5, 255, 127, 127, 125, 120, 120, 120, 120, 120, 248, 120, 120, 120, 120, 120, 120, 248, 24
8, 232, 14
3, 0, 0, 0, 0, 0, 0, 0, 0, 128, 240, 248, 120, 188, 220, 92, 252, 28, 28, 60, 92, 92, 60, 120, 2
48, 248, 9
6, 192, 143, 168, 216, 136, 49, 68, 72, 50, 160, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 192, 248, 2
48, 248, 2
48, 252, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 2
46, 239, 2
08, 246, 174, 173, 169, 128, 209, 208, 224, 247, 249, 255, 255, 252, 220, 240, 127, 255, 2
23, 255, 2
55, 255, 255, 255, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 2
55, 255, 2
55, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 2
55, 255, 2
55, 255, 254, 255, 190, 255, 255, 253, 240, 239, 221, 223, 254, 168, 136, 170, 196, 208, 2
28, 230, 2
48, 127, 126, 156, 223, 226, 242, 242, 242, 242, 242, 177, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 3,
3, 3, 7, 7, 7, 7, 7, 15, 15, 15, 7, 15, 15, 15, 7, 7, 15, 14, 15, 13, 15, 47, 43, 43, 43, 43, 43, 4
7, 111, 23
9, 255, 253, 253, 255, 254, 255, 255, 255, 255, 255, 191, 191, 239, 239, 239, 191, 255, 19
1, 255, 25
5, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25
5, 255, 25
5, 255, 255, 255, 255, 255, 255, 127, 127, 127, 127, 255, 255, 191, 191, 191, 191, 255, 25
4, 255, 25
3, 255, 255, 255, 251, 255, 255, 255, 127, 125, 63, 31, 31, 31, 31, 31, 31, 63, 15, 15, 7, 7,
3, 3, 3, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3,
11, 11, 11
, 11, 7, 3, 14, 6, 6, 6, 2, 18, 19, 19, 3, 23, 21, 21, 17, 1, 19, 19, 3, 6, 6, 14, 15, 15, 7, 15, 15
, 15, 11, 2
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

i mpl ement s

end. ' Final del mdulo
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera GLCD en la ventana Library
Manager antes de compilar el programa. Asimismo, es necesario incluir el documento Bitmap.mbas en el
proyecto.
4.17 EJEMPLO 15
Uti l izar el panel tctil...
Un panel tctil es un panel fino, autoadhesivo y transparente, colocado sobre la pantalla de un LCD grfico. Es
muy sensible a la presin as que un suave toque provoca algunos cambios en la seal de salida. Hay
diferentes tipos de paneles tctiles. El ms sencillo es el panel tctil resistivo.

Un panel tctil est compuesto por dos lminas rgidas, formando una estructura de sndwich que tiene
capas resistivas en sus caras internas. La resistencia de estas capas no excede normalmente de 1K. Los
lados opuestos de las lminas disponen de los contactos para acceder a un cable plano.

El procedimiento para determinar las coordenadas de la posicin del panel que ha sido presionado se puede
dividir en dos pasos. El primero es determinacin de la coordenada X, y el segundo es de determinar la
coordenada Y de la posicin.
Para determinar la coordenada X, es necesario conectar el contacto izquierdo en la superficie A a la masa
(tierra) y el contacto derecho a la fuente de alimentacin. Esto permite obtener un divisor de voltaje al
presionar el panel tctil. El valor de voltaje obtenido en el divisor se puede leer en el contacto inferior de la
superficie B. El voltaje variar en el rango de 0V al voltaje suministrado por la fuente de alimentacin y
depende de la coordenada X. Si el punto est prximo al contacto izquierdo de la superficie A, el voltaje estar
prximo a 0V.

Para la determinacin de la coordenada Y, es necesario conectar el contacto inferior de la superficie B a masa
(tierra), mientras que el contacto superior se conectar a la fuente de alimentacin. En este caso, el voltaje se
puede leer en el contacto izquierdo de la superficie A.

Para conectar un panel tctil al microcontrolador es necesario crear un circuito para el control del panel tctil.
Por medio de este circuito, el microcontrolador conecta los contactos adecuados del panel tctil a masa y a la
voltaje de alimentacin (como describimos anteriormente) para determinar las coordenadas X y Y. El contacto
inferior de la superficie B y el contacto izquierdo de la superficie A estn conectados al convertidor A/D del
microcontrolador. Las coordenadas X e Y se determinan midiendo el voltaje en los respectivos contactos. El
software consiste en mostrar un men en una pantalla LCD grfica, conmutar de encendido a apagado del
panel tctil (control del panel tctil) y leer los valores del convertidor A/D que representan realmente las
coordenadas X e Y de la posicin.

Una vez determinadas las coordenadas, es posible decidir qu es lo que deseamos que haga el
microcontrolador. En este ejemplo se explica cmo conmutar entre encendido y apagado dos pines digitales
del microcontrolador, conectados a los LEDs A y B.

En este ejemplo se utilizan las funciones que pertenecen a las libreras Glcd y ADC.
Teniendo en cuenta que la superficie del panel tctil es ligeramente mayor que la del LCD grfico, en caso de
requerir una mayor precisin en la determinacin de las coordenadas, es necesario incluir el software de
calibracin del panel tctil.
'Cabecera******************************************************

program exampl e_15 ' Nombre de programa

dim GLCD_Dat aPORT as byte at PORTD ' Conexiones del mdulo Glcd

dim GLCD_CS1 as sbit at RB0_bi t
GLCD_CS2 as sbit at RB1_bi t
GLCD_RS as sbit at RB2_bi t
GLCD_RWas sbit at RB3_bi t
GLCD_EN as sbit at RB4_bi t
GLCD_RST as sbit at RB5_bi t

dim GLCD_CS1_Di r ect i on as sbit at TRI SB0_bi t
GLCD_CS2_Di r ect i on as sbit at TRI SB1_bi t
GLCD_RS_Di r ect i on as sbit at TRI SB2_bi t
GLCD_RW_Di r ect i on as sbit at TRI SB3_bi t
GLCD_EN_Di r ect i on as sbit at TRI SB4_bi t
GLCD_RST_Di r ect i on as sbit at TRI SB5_bi t ' Conexiones del mdulo Glcd

dim x_coor d, y_coor d,
x_coor d128, y_coor d64 as longint ' Almacenar la posicin de las
coordenadas x e y

sub function Get X( ) as word ' Leer la coordenada X

PORTC. 0 = 1 ' DRIVEA = 1 (electrodo izquierdo (LEFT)
conectado, electrodo
' derecho (RIGHT) conectado, electrodo
superior (TOP) desconectado)
PORTC. 1 = 0 ' DRIVEB = 0 (electrodo inferior (BOTTOM)
desconectado)
Del ay_ms( 5)
r esul t = ADC_Read( 0) ' LEER-X (BOTTOM)

end sub

sub function Get Y( ) as word ' Leer la coordenada Y

PORTC. 0 = 0 ' DRIVEA = 0 (electrodo izquierdo (LEFT)
desconectado, electrodo
' derecho (RIGHT) desconectado, electrodo
superior (TOP) conectado)
PORTC. 1 = 1 ' DRIVEB = 1 (electrodo inferior (BOTTOM)
conectado)


Del ay_ms( 5)
r esul t = ADC_Read( 1) ' LEER-X (LEFT)
end sub

mai n: ' Inicio de programa

PORTA = 0x00
TRI SA = 0x03 ' RA0 y RA1 son entradas analgicas
ANSEL = 0x03
ANSELH = 0 ' Configurar otros pines analgicos como digitales de E/S

PORTC = 0
TRI SC = 0 ' Pines del puerto PORTC se configuran como salida

Gl cd_I ni t ( ) ' Glcd_Init_EP5
Gl cd_Set _Font ( @f ont 5x7, 5, 7, 32) ' Seleccionar el tamao de fuente 5x7
Gl cd_Fi l l ( 0) ' Borrar el GLCD

Gl cd_Wr i t e_Text ( " TOUCHPANEL EXAMPLE", 10, 0, 1)
Gl cd_Wr i t e_Text ( " MI KROELEKTRONI KA", 17, 7, 1)

Gl cd_Rect angl e( 8, 16, 60, 48, 1) ' Visualizar 'dos botones' en el GLCD:
Gl cd_Rect angl e( 68, 16, 120, 48, 1)
Gl cd_Box( 10, 18, 58, 46, 1)
Gl cd_Box( 70, 18, 118, 46, 1)
Gl cd_Wr i t e_Text ( " BUTTON1", 14, 3, 0)
Gl cd_Wr i t e_Text ( " RC6 OFF", 14, 4, 0)
Gl cd_Wr i t e_Text ( " BUTTON2", 74, 3, 0)
Gl cd_Wr i t e_Text ( " RC7 OFF", 74, 4, 0)

while TRUE ' Leer X-Y y convertirlo en la resolucin de 128x64 pxeles

x_coor d = Get X( )
y_coor d = Get Y( )
x_coor d128 = ( x_coor d * 128) / 1024
y_coor d64 = 64 - ( ( y_coor d *64) / 1024)

' Si BUTTON1 ha sido seleccionado:
if ( ( x_coor d128 >= 10) and ( x_coor d128 <= 58) and ( y_coor d64 >= 18) and
( y_coor d64 <= 46) ) then
if( PORTC. 6 = 0) then
PORTC. 6 = 1
Gl cd_Wr i t e_Text ( "RC6 ON " , 14, 4, 0)
else
PORTC. 6 = 0
Gl cd_Wr i t e_Text ( "RC6 OFF" , 14, 4, 0)
end if
end if

' Si BUTTON2 ha sido seleccionado:
if ( ( x_coor d128 >= 70) and ( x_coor d128 <= 118) and ( y_coor d64 >= 18) and
( y_coor d64 <= 46) ) then
if( PORTC. 7 = 0) then
PORTC. 7 = 1
Gl cd_Wr i t e_Text ( "RC7 ON " , 74, 4, 0)
else
PORTC. 7 = 0
Gl cd_Wr i t e_Text ( "RC7 OFF" , 74, 4, 0)
end if
end if

Del ay_ms( 100)
wend ' Mientras verdadero

end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa.
GLCD
ADC
C_Stdlib
4.18 EJEMPLO 16
Uti l izar el teclado 4x4
Un teclado representa un conjunto de botones de presin conectados de tal manera que formen 'filas' y
'columnas', as reduciendo el nmero de los pines de E/S necasarios para su conexin. En este ejemplo
utilizaremos un teclado con 16 botones de presin organizados en cuatro filas y columnas. La librera Keypad
4x4 contiene todas las funciones necesarias para leer este teclado as como para inicializar el puerto al que
est conectado. Para demostrar el funcionamiento del teclado 4x4, el mensaje ser visualizado en un LCD.

'Cabecera******************************************************

program exampl e_16 ' Nombre de programa
dim kp, cur X, cur Y as byte
dim keypadPORT as byte at PORTD ' Esta variable debe estar definida en
todos los proyectos por
' medio de la librera Keypad. As se define el puerto utilizado
para conectar el teclado

dim LCD_RS as sbit at RB4_bi t ' Conexiones del mdulo Lcd
LCD_EN as sbit at RB5_bi t
LCD_D4 as sbit at RB0_bi t
LCD_D5 as sbit at RB1_bi t
LCD_D6 as sbit at RB2_bi t
LCD_D7 as sbit at RB3_bi t
LCD_RS_Di r ect i on as sbit at TRI SB4_bi t
LCD_EN_Di r ect i on as sbit at TRI SB5_bi t
LCD_D4_Di r ect i on as sbit at TRI SB0_bi t
LCD_D5_Di r ect i on as sbit at TRI SB1_bi t
LCD_D6_Di r ect i on as sbit at TRI SB2_bi t
LCD_D7_Di r ect i on as sbit at TRI SB3_bi t ' Final de conexiones del mdulo
LCD

mai n: ' Inicio de programa
cur X=1 ' Memorizar de la posicin del cursor en el
visualizador LCD 2x16
cur Y=1
ANSEL = 0 ' Configurar pines analgicos como digitales ed E/S
ANSELH = 0
TRI SB = 0
PORTB = 0xFF
Keypad_I ni t ( ) ' Inicializar el teclado en el puerto PORTC
Lcd_I ni t ( ) ' Inicializar el LCD en el puerto PORTB,
Lcd_Cmd( _LCD_CLEAR) ' Borrar el visualizador

while t r ue ' Esperar que alguna tecla se presione y suelte

kp = 0
while kp = 0
kp = Keypad_Key_Cl i ck( )
Del ay_ms( 10)
wend

select case kp ' Preparar el valor comoo salida
case 1 kp = " 1"
case 2 kp = " 2"
case 3 kp = " 3"
case 4 kp = " A"
case 5 kp = " 4"
case 6 kp = " 5"
case 7 kp = " 6"
case 8 kp = " B"
case 9 kp = " 7"
case 10 kp = "8"
case 11 kp = "9"
case 12 kp = "C"
case 13 kp = "*"
case 14 kp = "0"
case 15 kp = "#"
case 16 kp = "D"
end select

if ( cur Y > 16) then ' Cambiar de posicin del cursor
if ( cur X = 1) then
Lcd_Cmd( _LCD_SECOND_ROW)
cur X = 2
cur Y = 1
else
Lcd_Cmd( _LCD_FI RST_ROW)
cur X = 1
cur Y = 1
end if
end if

Lcd_Chr _CP( kp) ' Visualizar en el LCD
I nc( cur Y)
wend

end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa.
Keypad4x4
LCD

Apndice A: Es hora de di vertirse
Un microcontrolador se parece a un genio en la botella, y no se necesita saber mucho para utilizarlo. Para
crear un dispositivo controlado por un microcontrolador, se necesita una PC, un programa para compilar y un
dispositivo para transmitir el cdigo de la PC al microcontrolador mismo. Aunque este proceso parece muy
lgico, con frecuencia surgen las dudas, no por que es complicado, sino por un gran nmero de variaciones. A
ver...
A.1 VAMOS A EMPEZAR...
A.2 COMPILACIN DE PROGRAMA
A.3 SER UN FINAL FELIZ?
A.4 SISTEMAS DE DESARROLLO
A.1 VAMOS A EMPEZAR...
Los programas especializados para Windows (compiladores) se utilizan para escribir un programa para el
microcontrolador. Este libro describe el programa denominado mikroBasic PRO for PIC. La ventaja principal
de este programa son las herramientas adicionales instaladas para facilitar el proceso de desarrollo.

Si tiene experiencia en escribir programas, entonces sabe que se trata de escribir todas las instrucciones en
el orden en el que se deben ejecutar por el microcontrolador y observar las reglas de programa. En otras
palabras, slo tiene que seguir su idea al escribir el programa. Esto es todo!

A.2 COMPILACIN DE PROGRAMA

El microcontrolador no entiende los lenguajes de alto nivel de programacin, de ah que sea necesario
compilar el programa en lenguaje mquina. Basta con pulsar slo una vez sobre el icono apropiado dentro del
compilador para crear un documento nuevo con extensin .hex. En realidad, es el mismo programa, pero
compilado en lenguaje mquina que el microcontrolador entiende perfectamente. Este programa se le
denomina con frecuencia un cdigo HEX y forma una secuencia de nmeros hexadecimales aparentemente
sin significado. Una vez compilado, el programa se debe cargar en el microcontrolador. Usted necesita un
hardware apropiado para hacerlo posible - un programador.
PROGRAMAR LOS MICROCONTROLADORES
Como hemos mencionado, para habilitar cargar un cdigo hex en el microcontrolador es necesario
proporcionar un dispositivo especial, denominado el programador, con software apropiado. Un gran nmero
de programas y circuitos electrnicos utilizados con este propsito se pueden encontrar en internet. El
procedimiento es bsicamente el mismo para todos ellos y se parece a lo siguiente:
1. Coloque el microcontrolador en el zcalo apropiado del programador;
2. Utilice un cable adecuado para conectar el programador a una PC;
3. Abra el cdigo hex dentro de software del programador, ajuste varios parmetros, y pulse
sobre el icono para transmitir el cdigo. Pocos segundos despus, una secuencia de ceros y
unos se va a programar en el microcontrolador.
Slo ha quedado instalar el microcontrolador programado en el dispositivo destino. Si es necesario hacer
algunos cambios en el programa, el procedimiento anterior se puede repetir un nmero ilimitado de veces.
A.3 SER UN FINAL FELIZ?
Esta seccin describe en breve el uso del compilador mikroBasic PRO for PIC y del software de
programacin (programador) PIC flash. Todo es muy simple...

Usted ya tiene instalado el mikroBasic PRO for PIC, verdad? Al iniciarlo, abra un proyecto nuevo y un
documento nuevo con extensin .mbas dentro del mismo. Escriba su programa...

De acuerdo. El programa ha sido escrito y probado con el simulador. No ha informado de ningn error
durante el proceso de compilacin en el cdigo hex? Parece que todo funciona perfecto...
El programa ha sido compilado con xito. Slo queda cargarlo en el microcontrolador. Ahora necesita el
programador PICflash que est compuesto por software y hardware. Inicie el programa PICFlash.
La configuracin es simple y no hacen falta explicaciones adicionales (tipo de microcontrolador, frecuencia de
oscilador de reloj etc.). Lo que queda hacer es lo siguiente:
Conecte la PC con el hardware del programador por un cable USB;
Coloque el microcontrolador en el zcalo apropiado del programador;
Cargue el cdigo HEX utilizando el comando: File a Load HEX; y
Pulse sobre el botn Write dentro de la ventana principal del programa PICflash y espere...

Esto es todo! El microcontrolador est programado y todo est listo para su funcionamiento. Si no est
satisfecho, haga algunos cambios en el programa y repita el procedimiento. Hasta cundo? Hasta quedar
satisfecho...
A.4 SISTEMAS DE DESARROLLO
Un dispositivo que puede simular cualquier dispositivo en la fase de prueba, es denominado un sistema de
desarrollo. Aparte del hardware del programador, unidad de alimentacin, zcalo del microcontrolador, el
sistema de desarrollo dispone de los componentes para activar los pines de entrada y monitorear los pines de
salida. La versin ms simple tiene cada pin conectado a su respectivo botn de presin y un LED. Una
versin de calidad alta tiene los pines conectados a los visualizadores LED, visualizadores LCD, sensores de
temperatura u otros componentes por los que puede estar compuesto un dispositivo destino a ser
programado.

Si es necesario, todos estos mdulos perifricos pueden estar conectados al microcontrolador por medio de
los puentes. Esto permite probar el programa entero en la prctica an durante el proceso de desarrollo,
porque el microcontrolador no sabe o no le interesa si su entrada est activada por un botn de presin o un
sensor incorporado en un dispositivo real. Teniendo en cuenta que el compilador (en su PC) y el hardware del
programador (en su sistema de desarrollo) colaboran perfectamente, el proceso de compilar un programa y
programar el microcontrolador se lleva a cabo en un simple paso - al pulsar sobre el icono apropiado dentro
del compilador. Desde este momento, cualquier cambio en el programa afectar inmediatamente al
funcionamiento de los componentes apropiados en la placa.

Es hora de divertirse?

También podría gustarte