Professional Documents
Culture Documents
PIC PROGRAMACIN EN C
CON EJEMPLOS
Milan Verle
GUA PARA PRINCIPIANTES DEFINITIVA PARA LA PROGRAMACIN DE MICROCONTROLADORES PIC
DE MICROCHIP UTILIZANDO EL LENGUAJE DE PROGRAMACIN MS POPULAR DEL MUNDO - C.
Contenido
Captulo 1: El mundo de los microcontroladores .................................................................................... 9
1.1 INTRODUCCIN ......................................................................................................................................... 9
QUE PUEDEN HACER LOS MICROCONTROLADORES? .............................................................. 10
1.2 NMEROS, NMEROS, NMEROS... ................................................................................................. 13
SISTEMA DE NUMERACIN BINARIO .................................................................................................. 13
SISTEMA DE NUMERACIN HEXADECIMAL ...................................................................................... 14
CDIGO BCD ............................................................................................................................................... 15
CONVERSIN DE SISTEMAS DE NMERACIN ............................................................................... 15
MARCAR LOS NMEROS......................................................................................................................... 16
NMEROS NEGATIVOS ............................................................................................................................ 17
BIT................................................................................................................................................................... 18
BYTE .............................................................................................................................................................. 18
1.3 DETALLES IMPORTANTES ................................................................................................................... 19
CIRCUITOS LGICOS................................................................................................................................ 19
REGISTROS.................................................................................................................................................. 21
REGISTROS SFR ........................................................................................................................................ 22
PUERTOS DE ENTRADA/SALIDA (E/S) ................................................................................................ 22
UNIDAD DE MEMORIA............................................................................................................................... 24
INTERRUPCIN ........................................................................................................................................... 26
UNIDAD CENTRAL DE PROCESAMIENTO (CENTRAL PROCESSOR UNIT - CPU) ................... 26
BUS................................................................................................................................................................. 27
COMUNICACIN EN SERIE ..................................................................................................................... 27
OSCILADOR ................................................................................................................................................. 29
CIRCUITO DE ALIMENTACIN ............................................................................................................... 30
TEMPORIZADORES/CONTADORES ...................................................................................................... 30
TEMPORIZADOR PERRO GUARDIN (WATCHDOG) ....................................................................... 33
CONVERTIDOR A/D .................................................................................................................................... 34
ARQUITECTURA INTERNA ...................................................................................................................... 35
JUEGO DE INSTRUCCIONES .................................................................................................................. 37
CMO ELEGIR UN MICROCONTROLADOR? ................................................................................... 37
1.4 MICROCONTROLADORES PIC............................................................................................................. 38
JUEGO DE INSTRUCCIONES .................................................................................................................. 40
Captulo 2 - Programacin de los microcontroladores ........................................................................ 42
1.1 INTRODUCCIN
Los principiantes en electrnica creen que un microcontrolador es igual a un microprocesador. Esto no es cierto.
Difieren uno del otro en muchos sentidos. La primera y la ms importante diferencia es su funcionalidad. Para
utilizar al microprocesador en una aplicacin real, se debe de conectar con componentes tales como memoria o
componentes buses de transmisin de datos. Aunque el microprocesador se considera una mquina de
computacin poderosa, no est preparado para la comunicacin con los dispositivos perifricos que se le
conectan. Para que el microprocesador se comunique con algn perifrico, se deben utilizar los circuitos
especiales. As era en el principio y esta prctica sigue vigente en la actualidad.
Por otro lado, al microcontrolador se le disea de tal manera que tenga todas las componentes integradas en el
mismo chip. No necesita de otros componentes especializados para su aplicacin, porque todos los circuitos
necesarios, que de otra manera correspondan a los perifricos, ya se encuentran incorporados. As se ahorra
tiempo y espacio necesario para construir un dispositivo.
10
11
Saba usted que todas las personas pueden ser clasificadas en uno de 10 grupos, en los que estn
familiarizados con el sistema de numeracin binario y en los que no estn familiarizados con l. Si no entendi lo
anterior significa que todava pertenece al segundo grupo. Si desea cambiar su estado, lea el siguiente texto que
describe brevemente algunos de los conceptos bsicos utilizados ms tarde en este libro (slo para estar seguro
de que estamos hablando en los mismos trminos).
12
13
Evidentemente, se trata del mismo nmero representado en dos sistemas de numeracin diferentes. La nica
diferencia entre estas dos representaciones yace en el nmero de dgitos necesarios para escribir un nmero. Un
dgito (2) se utiliza para escribir el nmero 2 en el sistema decimal, mientras que dos dgitos (1 y 0) se utilizan
para escribir aquel nmero en el sistema binario. Ahora est de acuerdo que hay 10 grupos de gente?
Bienvenido al mundo de la aritmtica binaria! Tiene alguna idea de dnde se utiliza?
Excepto en las condiciones de laboratorio estrictamente controladas, los circuitos electrnicos ms complicados
no pueden especificar con exactitud la diferencia entre dos magnitudes (dos valores de voltaje, por ejemplo), si
son demasiado pequeos (ms pequeos que unos pocos voltios). La razn son los ruidos elctricos y
fenmenos que se presentan dentro de lo que llamamos entorno de trabajo real (algunos ejemplos de estos
fenmenos son los cambios imprevisibles de la tensin de alimentacin, cambios de temperatura, tolerancia a los
valores de los componentes etc.). Imagnese una computadora que opera sobre nmeros decimales al
tratarlos de la siguiente manera: 0=0V, 1=5V, 2=10V, 3=15V, 4=20V... 9=45V!?
Alguien dijo bateras?
Una solucin mucho ms fcil es una lgica binaria donde 0 indica la ausencia de voltaje, mientras que 1 indica
la presencia de voltaje. Simplemente, es fcil de escribir 0 o 1 en vez de no hay voltaje o hay voltaje.
Mediante el cero lgico (0) y uno lgico (1) la electrnica se enfrenta perfectamente y realiza con facilidad todas
las operaciones aritmticas. Evidentemente, se trata de electrnica que en realidad aplica aritmtica en la que
todos los nmeros son representados con slo dos dgitos y donde slo es importante saber si hay voltaje o no.
Por supuesto, estamos hablando de electrnica digital.
14
El mayor nmero que puede ser representado con 4 dgitos binarios es el nmero 1111. Corresponde al nmero
15 en el sistema decimal. En el sistema hexadecimal ese nmero se representa con slo un dgito F. Es el mayor
nmero de un dgito en el sistema hexadecimal. Se da cuenta de la gran utilidad de estas equivalencias? El
mayor nmero escrito con ocho dgitos binarios es a la vez el mayor nmero de dos dgitos en el sistema
hexadecimal. Tenga en cuenta que una computadora utiliza nmeros binarios de 8 dgitos. Acaso se trata de
una casualidad?
CDIGO BCD
El cdigo BCD (Binary-Coded Decimal - Cdigo binario decimal) es un cdigo binario utilizado para representar a
los nmeros decimales. Se utiliza para que los circuitos electrnicos puedan comunicarse con los perifricos
utilizando el sistema de numeracin decimal o bien utilizando el sistema binario dentro de su propio mundo.
Consiste en nmeros binarios de 4 dgitos que representan los primeros diez dgitos (0, 1, 2, 3...8, 9). Aunque
cuatro dgitos pueden hacer 16 combinaciones posibles en total, el cdigo BCD normalmente utiliza a las
primeras diez.
15
16
Por ejemplo, el nmero hexadecimal 10AF se puede escribir as: $10AF, 0x10AF o 10AFh. De manera similar,
NMEROS NEGATIVOS
Como ya hemos visto, para escribir un nmero negativo en matemticas, basta con aadirle el prefijo - (signo
menos). Sin embargo, en la programacin, al acabarse el proceso de la compilacin, se quedan slo los
nmeros binarios, volvindose las cosas ms complicadas. Se utilizan slo dos dgitos - 0 y 1, mientras que
todos los dems nmeros, smbolos y signos se forman por medio de las combinaciones de estos dos dgitos. En
el caso de los nmeros negativos, la solucin es la siguiente: En los nmeros negativos, el bit ms significativo
(el bit del extremo izquierdo) representa el signo del nmero (donde 0 ser positivo y 1 negativo). En el caso de
un nmero de 8 bits, para representar un valor numrico slo quedan 7 bits. De acuerdo a este tipo de
codificacin el nmero +127 es el mayor nmero positivo con signo que se puede representar con 8 bits.
17
BIT
La teora dice que un bit es la unidad bsica de informacin...Vamos a olvidarlo por un momento y demostrar qu
es eso en la prctica. La respuesta es - nada especial- un bit es un slo dgito binario. Similar a un sistema de
numeracin decimal en el que los dgitos de un nmero no tienen la misma ponderacin (por ejemplo, los dgitos
en el nmero 444 son los mismos, pero tienen los valores diferentes), el significado de un bit depende de la
posicin que tiene en nmero binario. En este caso no tiene sentido hablar de unidades, centenas etc. en los
nmeros binarios, sus dgitos se denominan el bit cero (el primer bit a la derecha), el primer bit (el segundo bit a
la derecha) etc. Adems, ya que el sistema binario utiliza solamente dos dgitos (0 y 1), el valor de un bit puede
ser 0 o 1.
No se confunda si se encuentra con un bit que tiene el valor 4, 16 o 64. Son los valores representados en el
sistema decimal. Simplemente, nos hemos acostumbrado tanto a utilizar los nmeros decimales que estas
expresiones llegaron a ser comunes. Sera correcto decir, por ejemplo, el valor del sexto bit en cualquier nmero
binario equivale al nmero decimal 64. Pero todos somos humanos y los viejos hbitos mueren difcilmente.
Adems, cmo le suena nmero uno-uno-cero-uno-cero...?
BYTE
Un byte consiste en 8 bits colocados uno junto al otro. Si un bit es un dgito, es lgico que los bytes representen
los nmeros. Todas las operaciones matemticas se pueden realizar por medio de ellos, como por medio de los
nmeros decimales comunes. Similar a los dgitos de cualquier nmero, los dgitos de un byte no tienen el mismo
significado. El bit del extremo izquierdo tiene la mayor ponderacin, por eso es denominado el bit ms
significativo (MSB). El bit del extremo derecho tiene la menor ponderacin, por eso es denominado el bit menos
significativo (LSB). Puesto que los 8 dgitos de un byte se pueden combinar de 256 maneras diferentes, el mayor
nmero decimal que se puede representar con un byte es 255 (una combinacin representa un cero).
18
Usted seguramente ha pensado alguna vez en cmo es la electrnica dentro de un circuito integrado digital, un
microcontrolador o un microprocesador. Cmo son los circuitos que realizan las operaciones matemticas
complicadas y toman decisiones? Saba que sus esquemas, aparentemente complicadas consisten en slo
unos pocos elementos diferentes, denominados circuitos lgicos o compuertas lgicas?
CIRCUITOS LGICOS
Algunas instrucciones de programa utilizadas por un microcontrolador funcionan de la misma manera que las
compuertas lgicas, pero en forma de comandos. A continuacin, vamos a explicar el principio de su
funcionamiento.
COMPUERTA Y (AND)
Una compuerta lgica Y dispone de dos o ms entradas y de una salida. En este caso la compuerta utilizada
dispone de slo dos entradas. Un uno lgico (1) aparecer en su salida slo en caso de que ambas entradas (A
Y B) sean llevadas a alto (1). La tabla a la derecha es la tabla de verdad que muestra la relacin entre las
entradas y salidas de la compuerta. El principio de funcionamiento es el mismo cuando la compuerta disponga
de ms de dos entradas: la salida proporciona un uno lgico (1) slo si todas las entradas son llevadas a alto (1).
19
Cualquier otra combinacin de voltajes de entrada proporcionar un cero lgico (0) en su salida. Utilizada en el
programa, la operacin Y lgico es realizada por una instruccin de programa, de la que vamos a hablar ms
tarde. Por ahora basta con conocer qu Y lgico en un programa se refiere a la realizacin de este tipo de
operacin sobre los bits correspondientes de dos registros diferentes.
COMPUERTA O (OR)
De manera similar, la compuerta O tambin dispone de dos o ms entradas y de una salida. Si la compuerta
dispone de slo dos entradas, es aplicable lo siguiente: la salida proporciona un uno lgico (1) si una u otra
entrada (A o B) es llevada a alto (1). En caso de que la compuerta O disponga de ms de dos entradas, es
aplicable lo siguiente: La salida proporciona un uno lgico (1) si por lo menos una entrada es llevada a alto (1). Si
todas las entradas estn a cero lgico (0), la salida estar a cero lgico (0) tambin.
COMPUERTA NO (NOT)
La compuerta lgica NO dispone de una sola entrada y una sola salida, por lo que funciona muy simplemente.
Cuando un cero lgico (0) aparezca en su entrada, la salida proporciona un uno lgico (1) y viceversa. Esto
significa que esta compuerta invierte las seales por s mismas y por eso es denominada inversor.
20
En el programa la operacin lgica NO se realiza sobre un byte. El resultado es un byte con los bits invertidos. Si
los bits de un byte se consideran nmero, el valor invertido es un complemento a ese nmero. El complemento
de un nmero es el valor que se aade al nmero hasta llegar al mayor nmero binario de 8 dgitos. En otras
palabras, la suma de un dgito de 8 nmeros y de su complemento es siempre 255.
La compuerta XOR (O EXCLUSIVA) es un poco complicada en comparacin con las dems. Representa una
combinacin de todas las compuertas anteriormente descritas. La salida proporciona un uno lgico (1) slo si sus
entradas estn en estados lgicos diferentes.
En el programa, esta operacin se utiliza con frecuencia para comparar dos bytes. La resta se puede utilizar con
el mismo propsito (si el resultado es 0, los bytes son iguales). A diferencia de la resta, la ventaja de esta
operacin lgica es que no es posible obtener los resultados negativos.
REGISTROS
21
REGISTROS SFR
A diferencia de los registros que no tienen ninguna funcin especial y predeterminada, cada microcontrolador
dispone de un nmero de registros de funciones especiales (SFR), con la funcin predeterminada por el
fabricante. Sus bits estn conectados a los circuitos internos del microcontrolador tales como temporizadores,
convertidores A/D, osciladores entre otros, lo que significa que directamente manejan el funcionamiento de estos
circuitos, o sea del microcontrolador. Imagnese ocho interruptores que manejan el funcionamiento de un circuito
pequeo dentro del microcontrolador. Los registros SFR hacen exactamente lo mismo.
En otras palabras, el estado de los bits de registros se fija dentro de programa, los registros SFR dirigen los
pequeos circuitos dentro del microcontrolador, estos circuitos se conectan por los pines del microcontrolador a
un dispositivo perifrico utilizado para... Bueno, depende de usted.
22
Una de las caractersticas ms importantes de los pines de entrada/salida (E/S) es la corriente mxima que
pueden entregar/recibir. En la mayora de los microcontroladores la corriente obtenida de un pin es suficiente
para activar un LED u otro dispositivo de baja corriente (10-20mA). Mientras ms pines de E/S haya, ms baja es
la corriente mxima de un pin. En otras palabras, todos los puertos de E/S comparten la corriente mxima
declarada en la hoja de especificacin tcnica del microprocesador.
Otra caracterstica importante de los pines es que pueden disponer de los resistores pull-up. Estos resistores
conectan los pines al polo positivo del voltaje de la fuente de alimentacin y su efecto se puede ver al configurar
el pin como una entrada conectada a un interruptor mecnico o a un botn de presin. Las ltimas versiones de
los microcontroladores tienen las resistencias pull-up configurables por software.
Cada puerto de E/S normalmente est bajo el control de un registro SFR especializado, lo que significa que cada
bit de ese registro determina el estado del pin correspondiente en el microcontrolador. Por ejemplo, al escribir un
uno lgico (1) a un bit del registro de control (SFR), el pin apropiado del puerto se configura automticamente
como salida. Eso significa que el voltaje llevado a ese pin se puede leer como 0 o 1 lgico. En caso contrario, al
escribir 0 al registro SFR, el pin apropiado del puerto se configura como salida. Su voltaje (0V o 5V) corresponde
al estado del bit apropiado del registro del puerto.
23
De manera similar, cada direccin de memoria corresponde a una localidad de memoria. El contenido de
cualquier localidad se puede leer y se le puede acceder al direccionarla. La memoria se puede escribir en la
localidad o leer.
Hay varios tipos de memoria dentro del microcontrolador:
OTP ROM (One Time Programmable ROM) - ROM programable una sola vez
24
UV EPROM (UV Erasable Programmable ROM) - ROM programable borrable por rayos
ultravioleta
El encapsulado de este microcontrolador tiene una ventana reconocible en la parte alta. Eso permite exponer la
superficie del chip de silicio a la luz de ultravioleta y borrar el programa completamente en varios minutos. Luego
es posible descargar un nuevo programa en l.
La instalacin de esta ventana es complicada, lo que por supuesto afecta al precio. Desde nuestro punto de
vista, desgraciadamente, de manera negativa...
Memoria Flash
Este tipo de memoria se invent en los aos 80 en los laboratorios de la compaa INTEL, como forma
desarrollada de la memoria UV EPROM. Ya que es posible escribir y borrar el contenido de esta memoria
prcticamente un nmero ilimitado de veces, los microcontroladores con memoria Flash son perfectos para
estudiar, experimentar y para la fabricacin en pequea escala. Por la gran popularidad de esta memoria, la
mayora de los microcontroladores se fabrican con tecnologa flash hoy en da. Si usted va a comprar un
microcontrolador, ste es en definitiva la opcin perfecta!
PROGRAMMABLE
ROM)
ROM
El contenido de la EEPROM se puede cambiar durante el funcionamiento (similar a la RAM), pero se queda
permanentemente guardado despus de la prdida de la fuente de alimentacin (similar a la ROM). Por lo tanto,
25
la EEPROM se utiliza con frecuencia para almacenar los valores creados durante el funcionamiento, que tienen
INTERRUPCIN
La mayora de programas utilizan interrupciones durante ejecucin de programa regular. El propsito del
microcontrolador generalmente consiste en reaccionar a los cambios en su entorno. En otras palabras, cuando
ocurre algo, el microcontrolador reacciona de alguna manera... Por ejemplo, al apretar el botn del mando a
distancia, el microcontrolador lo registra y responde al comando cambiando de canal, subiendo o bajando el
volumen etc. Si el microcontrolador pasar la mayora del tiempo comprobando varios botones sin parar - las
horas, los das, esto no sera nada prctico.
Por lo tanto, el microcontrolador aprendi un truco durante su evolucin. En vez de seguir comprobando algn
pin o bit, el microcontrolador deja su trabajo de esperar a un experto que reaccionar slo en caso de que
suceda algo digno de atencin.
La seal que informa al procesador central acerca de tal acontecimiento se denomina INTERRUPCIN.
26
COMUNICACIN EN SERIE
La conexin paralela entre el microcontrolador y los perifricos a travs de los puertos de entrada/salida es una
solucin perfecta para las distancias cortas - hasta varios metros. No obstante, en otros casos cuando es
necesario establecer comunicacin entre dos dispositivos a largas distancias no es posible utilizar la conexin
paralela. En vez de eso, se utiliza la conexin en serie.
Hoy en da, la mayora de los microcontroladores llevan incorporados varios sistemas diferentes para la
comunicacin en serie, como un equipo estndar. Cul de estos sistemas se utilizar en un caso concreto,
depende de muchos factores, de los que ms importantes son:
27
interpretar
correctamente
los
datos
que
intercambian
mutuamente.
Afortunadamente,
los
28
OSCILADOR
Los pulsos uniformes generados por el oscilador permiten el funcionamiento armnico y sncrono de todos los
circuitos del microcontrolador. El oscilador se configura normalmente de tal manera que utilice un cristal de
cuarzo o resonador cermico para estabilizacin de frecuencia. Adems, puede funcionar como un circuito
autnomo (como oscilador RC). Es importante decir que las instrucciones del programa no se ejecutan a la
velocidad impuesta por el mismo oscilador sino varias veces ms despacio. Eso ocurre porque cada instruccin
se ejecuta en varios ciclos del oscilador. En algunos microcontroladores se necesita el mismo nmero de ciclos
para ejecutar todas las instrucciones, mientras que en otros el tiempo de ejecucin no es el mismo para todas las
29
CIRCUITO DE ALIMENTACIN
Hay que mencionar dos cosas dignas de atencin con relacin al circuito de la fuente de alimentacin de
microcontroladores:
TEMPORIZADORES/CONTADORES
El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque no se trata de la
solucin ms simple, hay muchas razones para utilizarlo. La frecuencia del oscilador es definida con precisin y
muy estable, as que siempre genera los pulsos del mismo ancho, lo que los hace perfectos para medicin de
tiempo. Tales osciladores se utilizan en los relojes de cuarzo. Si es necesario medir el tiempo transcurrido entre
dos eventos, basta con contar los pulsos generados por este oscilador. Esto es exactamente lo que hace el
temporizador.
30
La mayora de los programas utiliza estos cronmetros electrnicos en miniatura. Generalmente son registros
SFR de 8 o 16 bits cuyo contenido se aumenta automticamente con cada pulso. Una vez que se llena el
registro, se genera una interrupcin!
Si el temporizador utiliza el oscilador de cuarzo interno para su funcionamiento, es posible medir el tiempo entre
dos eventos (el valor de registro en el momento de iniciar la medicin es T1, en el momento de finalizar la
medicin es T2, el tiempo transcurrido es igual al resultado de la resta T2 - T1). Si los registros se aumentan con
los pulsos que vienen de la fuente externa, tal temporizador se convierte en un contador.
Esto es una explicacin simple de su funcionamiento. Es un poco ms complicado en prctica.
31
Es fcil de medir los intervalos de tiempo cortos de la manera descrita anteriormente (hasta 256 microsegundos
porque es el mayor nmero que un registro puede contener). Esta obvia desventaja se puede superar de varias
maneras: al utilizar el oscilador ms lento, por medio de registros con ms bits, del pre-escalador o de la
interrupcin. Las primeras dos soluciones tienen algunas debilidades as que se recomienda utilizar el preescalador y/o la interrupcin.
32
La figura anterior describe el uso de una interrupcin en el funcionamiento del temporizador. Al asignarle un preescalador al temporizador, se producen retrasos de duracin arbitraria con mnima interferencia en la ejecucin
del programa principal.
CONTADORES
Si un temporizador se suministra por los pulsos ingresados por el pin de entrada en el microcontrolador, se
produce un contador. Evidentemente, es el mismo circuito electrnico. La nica diferencia es que los pulsos para
contar se ingresan por el pin de entrada y que su duracin (anchura) no es definida. Por eso, no se pueden
utilizar para medicin de tiempo, sino que se utilizan para otros propsitos, por ejemplo: contar los productos en
la cadena de montaje, nmero de rotaciones del eje de un motor, pasajeros etc. (dependiendo del sensor
utilizado.
33
CONVERTIDOR A/D
Las seales del mundo real son muy diferentes de las que entiende el microcontrolador (ceros y unos), as que
deben ser convertidas para que el microcontrolador pueda entenderlas. Un convertidor analgico-digital es un
circuito electrnico encargado de convertir las seales continuas en nmeros digitales discretos. En otras
palabras, este circuito convierte un nmero real en un nmero binario y se lo enva a la CPU para ser procesado.
Este mdulo se utiliza para medir el voltaje en el pin de entrada.
El resultado de esta medicin es un nmero (el valor digital) utilizado y procesado ms tarde en el programa.
34
ARQUITECTURA INTERNA
Todos
los
microcontroladores
actuales
utilizan
uno
de
dos
modelos
bsicos
de
arquitectura
Arquitectura de von-Neumann
Los microcontroladores que utilizan la arquitectura von- Neumann disponen de un solo bloque de memoria y de
un bus de datos de 8 bits. Como todos los datos se intercambian por medio de estas 8 lneas, este bus est
sobrecargado, y la comunicacin por s misma es muy lenta e ineficaz. La CPU puede leer una instruccin o
leer/escribir datos de/en la memoria. Los dos procesos no pueden ocurrir a la vez puesto que las instrucciones y
los datos utilizan el mismo bus. Por ejemplo, si alguna lnea de programa dice que el registro de la memoria RAM
llamado SUM debe ser aumentado por uno (instruccin: incf SUMA), el microcontrolador har lo siguiente:
1. Leer la parte de la instruccin de programa que especifica QU es lo que debe realizar (en este
caso es la instruccin para incrementar incf)
2. Seguir leyendo la misma instruccin que especifica sobre CUL dato lo debe realizar (en este
caso es el contenido del registro SUMA)
35
3. Despus de haber sido incrementado, el contenido de este registro se debe escribir en el registro
del que fue ledo (direccin del registro SUMA)
El mismo bus de datos se utiliza para todas estas operaciones intermedias.
ARQUITECTURA DE HARVARD
Los microcontroladores que utilizan esta arquitectura disponen de dos buses de datos diferentes. Uno es de 8
bits de ancho y conecta la CPU con la memoria RAM. El otro consiste en varias lneas (12, 14 o 16) y conecta a
la CPU y la memoria ROM. Por consiguiente, la CPU puede leer las instrucciones y realizar el acceso a la
memoria de datos a la vez. Puesto que todos los registros de la memoria RAM son de 8 bits de ancho, todos los
datos dentro del microcontrolador que se intercambian son de la misma anchura. Durante el proceso de la
escritura de programa, slo se manejan los datos de 8 bits. En otras palabras, todo lo que usted podr cambiar
en el programa y a lo que podr afectar ser de 8 bits de ancho. Todos los programas escritos para estos
microcontroladores sern almacenados en la memoria ROM interna del microcontrolador despus de haber sido
compilados a cdigo mquina. No obstante, estas localidades de memoria ROM no tienen 8, sino 12, 14 o 16
bits. 4, 6 o 8 bits adicionales representan una instruccin que especifica a la CPU qu hacer con los datos de 8
bits.
Las ventajas de este diseo son las siguientes:
Todos los datos en el programa son de un byte (8 bits) de ancho. Como un bus de datos
utilizado para lectura de programa tiene unas lneas ms (12, 14 o 16), tanto la instruccin
como el dato se pueden leer simultneamente al utilizar estos bits adicionales. Por eso, todas
las instrucciones se ejecutan en un ciclo salvo las instrucciones de salto que son de dos ciclos.
El hecho de que un programa (la ROM) y los datos temporales (la RAM) estn separados,
permite a la CPU poder ejecutar dos instrucciones simultneamente. Dicho de manera sencilla,
mientras que se realiza la lectura o escritura de la RAM (que marca el fin de una instruccin), la
siguiente instruccin se lee por medio de otro bus.
En los microcontroladores que utilizan la arquitectura de von-Neumann, nunca se sabe cunta
memoria ocupar algn programa. Generalmente, la mayora de las instrucciones de programa
ocupan dos localidades de memoria (una contiene informacin sobre QU se debe realizar,
36
JUEGO DE INSTRUCCIONES
El nombre colectivo de todas las instrucciones que puede entender el microcontrolador es llamado Juego de
Instrucciones. Cuando se escribe un programa en ensamblador, en realidad se especifican instrucciones en el
orden en el que deben ser ejecutadas. La restriccin principal es el nmero de instrucciones disponibles. Los
fabricantes aceptan cualquiera de los dos enfoques descritos a continuacin:
37
38
ROM
[Kbytes]
RAM
[bytes]
Frecuencia de
reloj. [MHz]
Pines
Entradas
A/D
Resolucin
del
convertidor
A/D
Comp
arado
res
Temporizad
ores
de
8/16 bits
Comunica
cin serial
Salidas
PWM
Ot
ros
0.375
0.75
PIC12
FXXX
16 - 24
6-8
4-8
0-2
0-1
1x8
0.75 - 1.5
25 - 38
4-8
0-3
0-1
1x8
EE
PR
OM
PIC16
FXXX
0.75 - 3
25 - 134
14 - 44
20
0-3
0-2
1x8
EE
PR
OM
PIC16
HVXX
X
1.5
25
18 - 20
20
1x8
Vd
d=
15
V
1.75 - 3.5
64 - 128
20
0-4
10
1 - 2 x 8 1 x
16
0-1
EE
PR
OM
PIC12
HVXX
X
1.75
64
20
0-4
10
1 - 2 x 8 1 x
16
0-1
PIC16
FXXX
1.75 - 14
64 - 368
14 - 64
20
0 - 13
8 or 10
0-2
1 - 2 x 8 1 x
16
USART I2C
SPI
0-3
PIC16
HVXX
X
1.75 - 3.5
64 - 128
14 - 20
20
0 - 12
10
2 x 8 1 x 16
USART I2C
SPI
4 - 128
256
3936
PIC18
FXXJX
X
8 - 128
1024
3936
PIC18
FXXK
XX
8 - 64
768
3936
18 - 80
32 - 48
4 - 16
10 or 12
0-3
0 - 2 x 8 2 3 x 16
USB2.0
CAN2.0
USART I2C
SPI
0-5
28
100
40 - 48
10 - 16
10
0 - 2 x 8 2 3 x 16
USB2.0
USART
Ethernet
I2C SPI
2-5
64
10 - 13
10
1 x 8 3 x 16
USART I2C
SPI
28 - 44
Todos los microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir que su memoria de de
la anchura del bus. La tabla anterior muestra las caractersticas principales de estas tres categoras.
Como se puede ver en la tabla de la pgina anterior, salvo los monstruos de 16 bits PIC 24FXXX y PIC
24HXXX - todos los microcontroladores tienen la arquitectura Harvard de 8 bits y pertenecen a una de los tres
grandes grupos. Por eso, dependiendo del tamao de palabra de programa existen la primera, la segunda y la
tercera categora de microcontroladores, es decir microcontroladores de 12, 14 o 16 bits. Puesto que disponen
del ncleo similar de 8 bits, todos utilizan el mismo juego de instrucciones y el esqueleto bsico de hardware
conectado a ms o menos unidades perifricas.
Los microcontroladores PIC con palabras de programa de 14 bits parecen ser la mejor opcin para los
principiantes. Aqu est por qu...
INSTRUCCIN
DESCRIPCIN
OPERACIN
BANDERA
CLK
39
*
Mover literal a W
k -> w
MOVWF f
Mover el contenido de W a f
W -> f
MOVF f,d
Mover el contenido de f a d
f -> d
CLRW
Borrar el contenido de W
0 -> W
CLRF f
Borrar el contenido de f
0 -> f
SWAPF f,d
Intercambiar de nibbles en f
1, 2
1, 2
Sumar literal a W
W+k -> W
C, DC, Z
ADDWF f,d
Sumar el contenido de W y f
W+f -> d
C, DC ,Z
SUBLW k
Restar W de literal
k-W -> W
C, DC, Z
1, 2
SUBWF f,d
Restar W de f
f-W -> d
C, DC, Z
de
ANDLW k
W AND k -> W
instru
ANDWF f,d
AND W con f
W AND f -> d
ccion
IORLW k
W OR k -> W
IORWF f,d
OR inclusivo de W con f
W OR f -> d
1, 2
XORWF f,d
W XOR k -> W
1, 2
XORLW k
OR exclusivo de W con f
W XOR f -> d
INCF f,d
Sumar 1 a f
f+1 -> f
1, 2
DECF f,d
Restar 1 a f
f-1 -> f
1, 2
RLF f,d
1, 2
RRF f,d
1, 2
COMF f,d
Complementar f
1, 2
es
para
los
micro
contr
olado
res
16F8
XX
inclu
f -> d
1, 2
1, 2
0 -> f(b)
1, 2
BSF f,b
1 -> f(b)
1, 2
ye 35
instru
BTFSC f,b
Skip if f(b) = 0
1 (2)
ccion
BTFSS f,b
Skip if f(b) = 1
1 (2)
es en
DECFSZ f,d
1 (2)
1,
3
2,
INCFSZ f,d
1 (2)
1,
3
2,
GOTO k
k -> PC
CALL k
RETURN
TOS -> PC
para
RETLW k
un
RETFIE
total.
La
raz
nm
ero
tan
redu
Otras instrucciones
NOP
No operacin
CLRWDT
TO, PD
SLEEP
TO, PD
cido
40
de instrucciones yace en la arquitectura RISC. Esto quiere decir que las instrucciones son bien optimizadas
41
Arquitectura de los microcontroladores PIC de 8 bits. Cules de estos mdulos pertenecern al microcontrolador,
depender del tipo de microcontrolador
42
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 se interpreta por la CPU como una instruccin a ser ejecutada durante el funcionamiento del
microcontrolador. Todas las instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan
colectivamente Conjunto de instrucciones. 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. En los microcontroladores PIC con las palabras de programa de 14 bits de anchura, el
conjunto de instrucciones tiene 35 instrucciones diferentes.
43
Como el proceso de escribir un cdigo ejecutable era considerablemente arduo, en consecuencia, fue creado el
primer lenguaje de programacin denominado ensamblador (ASM). Siguiendo la sintaxis bsica del
ensamblador, era ms fcil escribir y comprender el cdigo. Las instrucciones en ensamblador consisten en las
abreviaturas con significado y a cada instruccin corresponde una localidad de memoria. Un programa
denominado ensamblador compila (traduce) las instrucciones del lenguaje ensamblador a cdigo mquina
(cdigo binario).
Est programa compila instruccin a instruccin sin optimizacin. Como permite controlar en detalle todos los
procesos puestos en marcha dentro del chip, este lenguaje de programacin todava sigue siendo popular.
44
Los lenguajes de programacin de alto nivel (Basic, Pascal, C etc.) fueron creados con el propsito de superar
las desventajas del ensamblador. En lenguajes de programacin de alto nivel varias instrucciones en
ensamblador se sustituyen por una sentencia. El programador ya no tiene que conocer el conjunto de
instrucciones o caractersticas del hardware 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.
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, para cada problema hay una solucin y ste no es una excepcin gracias
a la aritmtica que permite realizar las operaciones complejas al descomponerlas en un gran nmero
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 C, 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.
Lenguaje C
El lenguaje C dispone de todas las ventajas de un lenguaje de programacin de alto nivel (anteriormente
descritas) y le permite realizar algunas operaciones tanto sobre los bytes como sobre los bits (operaciones
45
La figura anterior es un ejemplo general de lo que sucede durante la compilacin de programa de un lenguaje de
programacin de alto nivel a bajo nivel.
46
Este libro describe una aplicacin muy concreta del lenguaje de programacin C utilizado en el compilador
mikroC PRO for PIC. En este caso, el compilador se utiliza para la programacin de los microcontroladores PIC.
FASES DE COMPILACIN
El proceso de compilacin consiste en varios pasos y se ejecuta automticamente por el compilador. Por con, un
conocimiento bsico del funcionamiento puede ser til para entender el concepto del lenguaje mikroC.
El archivo fuente contiene el cdigo en mikroC que usted escribe para programar el microcontrolador. El
preprocesador se utiliza automticamente por el compilador al iniciarse el proceso de la compilacin. El
compilador busca las directivas del preprocesador (que siempre empiezan por #) dentro del cdigo y modifica el
cdigo fuente de acuerdo con las directivas. En esta fase se llevan a cabo inclusin de archivos, definicin de
constantes y macros etc., lo que facilita el proceso. Ms tarde vamos a describir estas directivas en detalle.
El analizador sintctico (parser) elimina toda la informacin intil del cdigo (comentarios, espacios en blanco).
Luego, el compilador traduce el cdigo a un archivo binario denominado archivo.mcl. El enlazador (linker)
recupera toda la informacin requerida para ejecutar el programa de los archivos externos y la agrupa en un solo
archivo (.dbg). Adems, un proyecto puede contener ms de un archivo fuente y el programador puede utilizar
funciones predefinidas y agrupadas dentro de los archivos denominados libreras. Por ltimo, el generador
.hex produce un archivo .hex. Es el archivo que se va a cargar en el microcontrolador.
El proceso entero de la compilacin que incluye todos los pasos anteriormente descritos se le
denomina building.
ESTRUCTURA DE PROGRAMA
La idea principal de escribir un programa en C es de romper un problema mayor en varios trozos ms
pequeos. Supongamos que es necesario escribir un programa para el microcontrolador para medir la
47
temperatura y visualizar los resultados en un LCD. El proceso de medicin se realiza por un sensor que convierte
Y ahora, su primer programa real! La figura muestra la estructura de programa, sealando las partes en las que
consiste.
48
La manera de escribir el cdigo en C es muy importante. Por ejemplo, C difiere entre minsculas y maysculas,
as que la funcin main() no se puede escribir MAIN() o Main(). Adems, note que dos lneas del cdigo dentro
de la funcin terminan con un punto y coma. En C todas las sentencias deben terminar con un punto y coma ;,
as el compilador puede aislarlas y traducirlas a cdigo mquina.
49
COMENTARIOS
Los comentarios son las partes del programa utilizados para aclarar las instrucciones de programa o para
proporcionar ms informacin al respecto. El compilador no hace caso a los comentarios y no los compila al
cdigo ejecutable. Dicho de manera sencilla, 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. Hay dos tipos de tales caracteres. Unos designan los comentarios largos que ocupan
varias lneas de programa marcados por la secuencia especial /*...*/, mientras que otros designan los
comentarios cortos que caben en una sola lnea //. Aunque los comentarios no pueden afectar a la ejecucin de
programa, son tan importantes como cualquier otra parte de programa. Aqu est por qu... Con frecuencia es
necesario mejorar, modificar, actualizar, simplificar un programa... No es posible interpretar incluso los
programas simples sin utilizar los comentarios.
50
DE
TAMAO (NMERO DE
BITS)
DESCRIPCIN
RANGO DE VALORES
char
Texto (caracteres)
de 0 a 255
int
Valores enteros
16
de -32768 a 32767
float
32
de
1.1754943508210-38 a
6.805647744071038
double
32
de
1.1754943508210-38 a
6.805647744071038
*Debido a las limitaciones impuestas por el hardware del microcontrolador, es imposible alcanzar una mayor
precisin de datos que la del tipo float. Por eso, el tipo double en mikroC equivale al tipo float.
Al aadir un prefijo (calificador) a cualquier tipo de dato entero o carcter, el rango de sus posibles valores
cambia, as como el nmero de los bytes de memoria necesarios. Por defecto, los datos de tipo int son con
signo, mientras que los de tipo char son sin signo. El calificador signed (con signo) indica que el dato puede ser
positivo o negativo. El prefijo unsigned indica que el dato puede ser slo positivo. Note que el prefijo es opcional.
TIPO
DATO
char
int
DE
TIPO
DE
PREFIJO
DATO
CON
TAMAO
BITS)
(NMERO
DE
RANGO DE VALORES
signed char
de -128 a 128
unsigned int
16
de 0 a 65535
short int
de 0 a 255
de -128 a 127
long int
32
de 0 a 4294967295
32
de
-2147483648
2147483647
Hexadecimal (base 16): el nmero empieza con 0x (o 0X). Los enteros hexadecimales
consisten en los dgitos (de 0 a 9) y/o las letras (A, B, C, D, E, F). Por ejemplo: 0x1A.
Decimal (base 10): el nmero consiste en los dgitos (de 0 a 9). El primer dgito no puede ser 0.
En este formato, se puede introducir el signo de nmero (+ o -). Por ejemplo: 569, -25,
+1500.
Octal (base 8): los nmeros se representan a base 8 utilizando slo 8 dgitos (de 0 a 7). Los
enteros octales empiezan con 0. Por ejemplo: 056.
Binario: cuando un entero empieza con 0b (o 0B) se representan como una serie de bits (0 y
1). Por ejemplo: 0B10011111
51
// formato decimal
0.
// = 0.0
-1.23
// = -1.23
// = 2.0 * 10^-5
3E+10
// = 3.0 * 10^10
.09E34
// = 0.09 * 10^34
59
// entero
Una secuencia de caracteres es denominada cadena (string). Las cadenas estn encerradas entre comillas
dobles, por ejemplo:
52
// a equivale a 15
Una constante tiene las mismas caractersticas que una variable excepto el hecho de que su valor asignado no
puede ser cambiado durante la ejecucin de programa. A diferencia de las variables, las constantes se
almacenan en la memoria Flash del microcontrolador para guardar el mayor espacio posible de memoria RAM.
El compilador las reconoce por el nombre y el prefijo const. En mikroC, el compilador reconoce automticamente
el tipo de dato de una constante, as que no es necesario especificar el tipo adicionalmente.
Cada variable o constante debe tener un identificador que lo distingue de otras variables y constantes. Refirase
a los ejemplos anteriores, a y A son identificadores.
Los identificadores pueden incluir cualquiera de los caracteres alfabticos A-Z (a-z), los dgitos
0-9 y el carcter subrayado '_'. El compilador es sensible a la diferencia entre minsculas y
maysculas. Los nombres de funciones y variables se escriben con frecuencia con minsculas,
mientras que los nombres de constantes se escriben con maysculas.
Los identificadores no pueden empezar con un dgito.
Los identificadores no pueden coincidir con las palabras clave del lenguaje mikroC, porque son
las palabras reservadas del compilador.
data
if
return
typedef
asm
default
inline
rx
typeid
at
delete
int
sfr
typename
auto
do
io
short
union
bit
double
long
signed
unsigned
bool
else
mutable
sizeof
using
break
enum
namespace
static
virtual
case
explicit
operator
struct
void
catch
extern
org
switch
volatile
char
false
pascal
template
while
class
float
private
this
code
for
protected
throw
const
friend
public
true
continue
goto
register
try
53
temperatura_V1
// OK
Presin
// OK
no_corresponder
// OK
dat2string
// OK
SuM3
// OK
_vtexto
// OK
7temp
%ms_alto
if
j23.07.04
Declaracin de variables
Cada variable debe ser declarada antes de ser utilizada en el programa. Como las variables se almacenan en la
memoria RAM, es necesario reservar el espacio para ellas (uno, dos o ms bytes). Al escribir un programa, usted
sabe qu tipo de datos quiere utilizar y qu tipo de datos espera como resultado de una operacin, mientras que
el compilador no lo sabe. No se olvide de que el programa maneja las variables con los nombres asignados. El
compilador las reconoce como nmeros en la memoria RAM sin conocer su tamao y formato. Para mejorar la
legibilidad de cdigo, las variables se declaran con frecuencia al principio de las funciones:
<tipo> variable;
Aparte del nombre y del tipo, a las variables se les asignan con frecuencia los valores iniciales justamente
enseguida de su declaracin. Esto no es un paso obligatorio, sino una cuestin de buenas costumbres. Se
parece a lo siguiente:
Un mtodo ms rpido se le denomina declaracin con inicializacin (asignacin de los valores iniciales):
54
Tenga cuidado de no declarar la misma variable otra vez dentro de la misma funcin.
Puede modificar el contenido de una variable al asignarle un nuevo valor tantas veces que
quiera
Al declarar una variable, siempre piense en los valores que la variable tendr que contener
durante la ejecucin de programa. En el ejemplo anterior, peso1 no se puede representar con
un nmero con punto decimal o un nmero con valor negativo.
Declaracin de constantes
Similar a las variables, las constantes deben ser declaradas antes de ser utilizadas en el programa. En mikroC,
no es obligatorio especificar el tipo de constante al declararla. Por otra parte, las constantes deben ser
inicializadas a la vez que se declaran. El compilador reconoce las constantes por su prefijo const utilizado en la
declaracin. Dos siguientes declaraciones son equivalentes:
Las constantes de enumeracin son un tipo especial de constantes enteras que hace un programa ms
comprensible al asignar los nmeros ordinales a las constantes. Por defecto, el valor 0 se asigna
automticamente a la primera constante entre llaves, el valor 1 a la segunda, el valor 2 a la tercera etc.
Es posible introducir directamente el valor de una constante dentro de la lista de enumeraciones. El incremento
se detiene al asignar un valor a un elemento de matriz, despus se reinicia a partir del valor asignado. Vea el
siguiente ejemplo:
int Velocidad_de_ascensor
55
a = 10;
// Variable a equivale a 10
b = 5;
// Variable b equivale a 5
A las variables globales se les puede acceder de cualquiera parte en el cdigo, an dentro de las funciones con
tal de que sean declaradas. El mbito de una variable global est limitado por el fin del archivo fuente en el que
ha sido declarado.
56
Clases de almacenamiento
Las clases de almacenamiento se utilizan para definir el mbito y la vida de variables, constantes y funciones
dentro de un programa. En mikroC se pueden utilizar diferentes clases de almacenamiento:
auto es una clase de almacenamiento por defecto para las variables locales, as que se utiliza
raramente. Se utiliza para definir que una variable local tiene duracin local. La clase de
almacenamiento auto no se puede utilizar con variables globales.
static es una clase de almacenamiento por defecto para las variables globales. Especifica que
una variable es visible dentro del archivo. A las variables locales declaradas con el
prefijo static se les puede acceder dentro del archivo fuente (o sea se comportan como
variables globales).
extern: la palabra clave extern se utiliza cuando el programa est compuesto por diferentes
archivos fuente. Esto le permite utilizar una variable, una constante o una funcin declarada en
otro archivo. Por supuesto, para compilar y enlazar este archivo correctamente, el mismo debe
ser incluido en su proyecto. En los siguientes ejemplos, el programa consiste en dos
archivos: File_1 y File_2. El File_1 utiliza una variable y una funcin declaradas en File_2.
File 1:
extern int cnt;
void main(){
PORTA = cnt++;
hello();
57
.
.
}
2.5 OPERADORES
Un operador es un smbolo que denota una operacin aritmtica, lgica u otra operacin particular. Dicho de
manera sencilla, varias operaciones aritmticas y lgicas se realizan por medio de los operadores. Hay ms de
40 operaciones disponibles en el lenguaje C, pero se utiliza un mximo de 10-15 de ellas en prctica. Cada
operacin se realiza sobre uno o ms operandos que pueden ser variables o constantes. Adems, cada
operacin se caracteriza por la prioridad de ejecucin y por la asociatividad.
OPERADORES ARITMTICOS
Los operadores aritmticos se utilizan en las operaciones aritmticas y siempre devuelven resultados numricos.
Hay dos tipos de operadores, los unitarios y los binarios. A diferencia de las operaciones unitarias que se
realizan sobre un operando, las operaciones binarias se realizan sobre dos operandos. En otras palabras, se
requieren dos nmeros para ejecutar una operacin binaria. Por ejemplo: a+b o a/b.
OPERADOR
OPERACIN
Adicin
Resta
Multiplicacin
Divisin
Resto de la divisin
// Inicializar a
b = 4;
// Inicializar b
c = a + b; // c = 9
c = c%2;
OPERADORES DE ASIGNACIN
Hay dos tipos de asignacin en el lenguaje C:
58
Los operadores simples asignan los valores a las variables utilizando el carcter comn '='. Por
ejemplo: a =8
Las asignaciones compuestas son especficas para el lenguaje C. Consisten en dos caracteres
como se muestra en la tabla a la derecha. Se utilizan para simplificar la sintaxis y habilitar la
ejecucin ms rpida.
EJEMPLO
OPERADOR
Expresin
Equivalente
+=
a += 8
a=a+8
-=
a -= 8
a=a-8
*=
a *= 8
a=a*8
/=
a /= 8
a=a/8
%=
a %= 8
a=a%8
// a = a + 10 = 15
EJEMPLO
DESCRIPCIN
++a
++
a++
--b
--
b--
int a, b, c;
a = b = 5;
c = 1 + a++; // c = 6
b = ++c + a
// b = 7 + 6 = 13
OPERADORES RELACIONALES
Los operadores relacionales se utilizan en comparaciones con el propsito de comparar dos valores. En mikroC,
si una expresin es evaluada como falsa (false), el operador devuelve 0, mientras que si una oracin es
evaluada como verdadera (true), devuelve 1. Esto se utiliza en expresiones tales como si la expresin es
evaluada como verdadera, entonces...
OPERADOR
DESCRIPCIN
EJEMPLO
CONDICIN DE VERACIDAD
>
mayor que
b>a
si b es mayor que a
>=
a >= 5
<
menor que
a<b
si a es menor que b
<=
a <= b
59
igual que
a == 6
si a es igual que 6
!=
desigual que
a != b
si a es desigual que b
int prop;
int var = 5;
prop = var < 10; // Expresin es evaluada como verdadera, prop = 1
OPERADORES LGICOS
Hay tres tipos de operaciones lgicas en el lenguaje C: Y (AND) lgico, O (OR) lgico y negacin - NO (NOT)
lgico. Los operadores lgicos devuelven verdadero (1 lgico) si la expresin evaluada es distinta de cero. En
caso contrario, devuelve falso (0 lgico) si la expresin evaluada equivale a cero. Esto es muy importante porque
las operaciones lgicas se realizan generalmente sobre las expresiones, y no sobre las variables (nmeros)
particulares en el programa. Por lo tanto, las operaciones lgicas se refieren a la veracidad de toda la expresin.
Por ejemplo: 1 && 0 es igual a (expresin verdadera) && (expresin falsa)
El resultado 0, o sea - Falso en ambos casos.
OPERADOR
FUNCIN
&&
||
NO
DESCRIPCIN
EJEMPLO
RESULTADO
Complemento a uno
a = ~b
b=5
a = -5
<<
Desplazamiento a la izquierda
a = b << 2
b = 11110011
a = 11001100
>>
Desplazamiento a la derecha
a = b >> 2
b = 11110011
a = 00011110
&
c=a&b
a
=
11100011
b = 11001100
c = 11000000
c=a|b
a
=
11100011
b = 11001100
c = 11101111
c=a^b
a
=
11100011
b = 11001100
c = 00101111
Note que el resultado de la operacin de desplazamiento a la derecha depende del signo de la variable. En caso
de que el operando se aplique a una variable sin signo o positiva, se introducirn los ceros en el espacio vaco
creado por desplazamiento. Si se aplica a un entero con signo negativo, se introducir un 1 para mantener el
signo correcto de la variable.
Aparte de los operadores de asignacin, dos operadores no deben estar escritos uno junto al
otro.
60
PRIORIDAD
Alta
Baja
OPERADORES
ASOCIATIVIDAD
() [] -> .
de izquierda a derecha
de derecha a izquierda
* / %
de izquierda a derecha
+ -
de izquierda a derecha
< >
de izquierda a derecha
de izquierda a derecha
== !=
de izquierda a derecha
&
de izquierda a derecha
de izquierda a derecha
de izquierda a derecha
&&
de izquierda a derecha
||
de derecha a izquierda
?:
de derecha a izquierda
de izquierda a derecha
int a, b, res;
a = 10;
b = 100;
res = a*(a + b); // resultado = 1100
res = a*a + b;
// resultado = 200
61
int x;
x = 3;
Para realizar una conversin explcita, antes de escribir una expresin o una variable hay que especificar el tipo
de resultado de operacin entre parntesis.
62
Si operacin1 u operacin2 est compuesta, escriba una lista de sentencias encerradas entre llaves. Por
ejemplo:
if(expresin) {
... //
... // operacin1
...} //
else
operacin2
Operador Switch
A
diferencia
de
la
selecciona
entre
dos
opciones
en
el
programa,
el
operador switch permite elegir entre varias opciones. La sintaxis de la sentencia switch es:
switch (selector) // Selector es de tipo char o int
{
case constante1:
operacin1 // El grupo de operadores que se ejecutan si
...
63
case constante2:
break;
...
default:
break;
}
La operacin switch se ejecuta de la siguiente manera: primero se ejecuta el selector y se compara con la
constante1. Si coinciden, las sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave
break o hasta el final de la operacin switch. Si no coinciden, el selector se compara con la constante2. Si
coinciden, las sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave break etc. Si el
selector no coincide con ninguna constante, se ejecutarn las operaciones que siguen al operador default.
Tambin es posible comparar una expresin con un grupo de constantes. Si coincide con alguna de ellas, se
ejecutarn las operaciones apropiadas:
La palabra clave de C break se puede utilizar en cualquier tipo de bloques. Al utilizar break, es posible salir de
un bloque aunque la condicin para su final no se haya cumplido. Se puede utilizar para terminar un bucle
infinito, o para forzar un bucle a terminar antes de lo normal.
BUCLES
A menudo es necesario repetir una cierta operacin un par de veces 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 se parece a lo siguiente:
64
Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la expresin llegue a ser
falsa. Si la expresin es falsa en la entrada del bucle, entonces el bucle no se ejecutar y el programa continuar
desde el fin del bucle while.
Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condicin sigue sin cambios dentro del
bucle. La ejecucin es simple en este caso ya que el resultado entre llaves es siempre verdadero (1=verdadero),
lo que significa que el programa se queda en el mismo bucle:
...
Bucle For
El bucle for se parece a lo siguiente:
for(expresin_inicial; expresin_de_condicin; cambiar_expresin) {
operaciones
...
}
La ejecucin de esta secuencia de programa es similar al bucle while, salvo que en este caso el proceso de
especificar el valor inicial (inicializacin) se realice en la declaracin. La expresin_ inicial especifica la variable
inicial del bucle, que ms tarde se compara con la expresin_ de_condicin antes de entrar al bucle. Las
operaciones dentro del bucle se ejecutan repetidamente y despus de cada iteracin el valor de la
expresin_inicial se incrementa de acuerdo con la regla cambiar_expresin. La iteracin contina hasta que la
expresin_de_condicin llegue a ser falsa.
for(k=0; k<5; k++) // La variable k se incrementa 5 veces (de 1 a 4) y
operacin
...
La operacin se ejecutar cinco veces. Luego, al comprobar se valida que la expresin k<5 sea falsa (despus
de 5 iteraciones k=5) y el programa saldr del bucle for.
Bucle Do-while
El bucle do-while se parece a lo siguiente:
65
La expresin cambiar_condicin se ejecuta al final del bucle, que significa que operacin se ejecuta como
mnimo una vez sin reparar en que si la condicin es verdadera o falsa. Si el resultado es distinto de 0
(verdadero), el procedimiento se repite.
Todos los siguientes ejemplos son equivalentes. Esta parte del cdigo visualiza "hello" en un LCD 10 veces con
un retardo de un segundo. Note que en este ejemplo se utilizan funciones predefinidas, que se encuentran en las
libreras del compilador mikroC PRO for PIC. No obstante le aconsejamos que no trate de entenderlas en detalle.
Su comportamiento general dentro del bucle se explica por medio de los comentarios.
i = 0; // Inicializacin del contador
while (i<10) {
// Condicin
// Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR);
// Borrar el LCD
Delay_ms(500);
// Retardo de 500ms
i++;
// Contador se incrementa
}
for(i=0; i<10; i++) {
Lcd_Out(1,3,"hello");
Delay_ms(1000);
// Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR);
// Borrar el LCD
Delay_ms(500);
// Retardo de 500ms
}
i = 0;
do {
Lcd_Out(1,3,"hello");
Delay_ms(1000);
// Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR);
// Borrar LCD
Delay_ms(500);
// Retardo de 500ms
i++;
// Contador se incrementa
}
while (i<10);
// Condicin
SENTENCIAS DE SALTO
SENTENCIA BREAK
A veces es necesario detener y salir de un bucle dentro de su cuerpo. La sentencia break se puede utilizar
dentro de cualquier bucle (while, for, do while) y en las sentencias switch tambin. En stas la sentencia break se
66
break;
// Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR);
// Borrar LCD
Delay_ms(500);
// Retardo de 500ms
SENTENCIA CONTINUE
La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteracin. A diferencia de la
sentencia break, el programa se queda dentro del bucle y las iteraciones continan.
SENTENCIA GOTO
La sentencia goto le permite hacer un salto absoluto al 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 un colon (:).
67
// de la variable CO2_sensor =1
// hacer salto a la lnea de programa
// Aire acondicionado
...
Aire acondicionado:
...
// en el ambiente
Los elementos de una matriz se identifican por su posicin. En C, el ndice va desde 0 (el primer elemento de
una matriz) a N-1 (N es el nmero de elementos contenidos en una matriz). El compilador tiene que saber
cuntas localidades de memoria debe alojar al declarar una matriz. El tamao de una matiz no puede ser una
variable. Por eso, se pueden utilizar dos mtodos:
// mtodo 1
int display [3]; // Declaracin de la matriz display capaz de contener 3 enteros
// mtodo 2
const DGITOS = 5;
char Matriz_nueva[DGITOS]; // Declaracin de la matriz Matriz_nueva
// capaz de contener 5 enteros
Una matriz se puede inicializar a la vez que se declara, o ms tarde en el programa. En ambos casos, este paso
se realiza al utilizar llaves:
68
El siguiente programa cambia el orden de los elementos de una matriz. Note que el ndice se puede expresar
mediante variables y operaciones bsicas.
void main() {
const MUESTRAS_DE_AGUA = 4; // Valor de la constante MUESTRAS_DE_AGUA es 4
int i, temp; // Variables i y temp son de tipo int
int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24,25,1,1987};// Todos
MATRICES BIDIMENSIONALES
Aparte de las matrices unidimensionales que se pueden interpretar como una lista de valores, el lenguaje C le
permite declarar matrices multidimensionales. En esta parte vamos a describir slo las matrices bidimensionales,
tambin denominadas tablas o matrices. Una matriz bidimensional se declara al especificar el tipo de dato de
matriz, el nombre de matriz y el tamao de cada dimensin.
69
tabla[0][1]
tabla[0][2]
tabla[0][3]
tabla[1][0]
tabla[1][1]
tabla[1][2]
tabla[1][3]
tabla[2][0]
tabla[2][1]
tabla[2][2]
tabla[2][3]
Similar a las matrices unidimesionales, es posible asignar los valores a los elementos de una tabla en la lnea de
declaracin. La asignacin debe ser realizada lnea a lnea como en el siguiente ejemplo. Como hemos visto
anteriormente, esta matriz tiene dos filas y tres columnas:
42
19
PUNTEROS
Un puntero es una variable destinada a recibir una direccin. Un puntero apunta a una localidad de memoria,
referenciada por una direccin. En C, la direccin de un objeto se puede obtener por medio un operador unitario
&. Para acceder al contenido de la memoria en una direccin especfica (tambin llamado objeto apuntado), se
utiliza un operador de indireccin (*).
tipo_de_variable *puntero;
En esta etapa, el puntero mi_puntero apunta al valor almacenado en esta localidad de memoria, o sea, a un valor
desconocido. As que, una inicializacin es muy recomendable:
puntero = &variable;
70
Los punteros son muy tiles para manejar las matrices. En este caso, un puntero se utilizar para apuntar al
primer elemento de una matriz. Debido al hecho de que es posible realizar operaciones bsicas sobre los
punteros (aritmtica de punteros), es fcil manejar los elementos de una matriz.
Fjese en la diferencia entre *v+1 y *(v+1) en el siguiente ejemplo:
*(v+1) = 2;
// voltio[1] = 2
voltio[2] = *v+1;
// tab[2] = 1 (tab[0] + 1)
*(v+2) = *(v+1);
// voltio[2] = 2
v++;
*v = 1;
// voltio[1] = 1
Los punteros tambin pueden ser declarados con el prefijo const. En este caso, su valor no
puede ser modificado despus de la inicializacin, similar a una constante.
A diferencia de C, el mikroC no admite alojamiento dinmico.
ESTRUCTURAS
Ya hemos visto cmo agrupar los elementos dentro de matrices. No obstante, al utilizar este mtodo todos los
elementos deben ser del mismo tipo. Al utilizar estructuras, es posible agrupar diferentes tipos de variables bajo
el mismo nombre. Las variables dentro de una estructura se le denominan los miembros de la estructura. Las
estructuras de datos se declaran al utilizar la siguiente sintaxis:
struct nombre_de_estructura {
tipo1_de_miembro1 miembro1;
tipo2_de_miembro2 miembro2;
tipo3_de_miembro3 miembro3;
71
struct generador {
int voltaje;
char corriente;
};
Entonces, podr definir los objetos denominados turbina en el cdigo. A cada uno de estos tres objetos
(turbinas) se le asignan las variables corriente y voltaje.
turbina_3.voltaje = 150;
turbina_3.corriente = 12;
Por supuesto, igual que al utilizar los punteros, todava se le permite realizar operaciones por medio de
operadores y sentencias definidos en las partes anteriores.
Si est familiarizado con el lenguaje C, recuerde que mikroC no admite la inicializacin de los miembros de
estructura por medio de las llaves. Por ejemplo, conjunto_1 ={15,m}; devuelve un error en mikroC.
2.8 FUNCIONES
Una funcin es una subrutina que contiene una lista de sentencias a realizar. La idea principal es dividir un
programa en varias partes utilizando estas funciones para resolver el problema inicial con ms facilidad. Adems,
las funciones nos permiten utilizar las destrezas y el conocimiento de otros programadores. Una funcin se
ejecuta cada vez que se llame dentro de otra funcin. En C, un programa contiene como mnimo una funcin, la
funcin main(), aunque el nmero de funciones es normalmente mayor. Al utilizar funciones el cdigo se hace
ms corto ya que es posible llamar una funcin tantas veces como se necesite. En C, el cdigo normalmente
consiste en muchas funciones. No obstante, en caso de que su programa sea muy corto y simple, puede escribir
todas las sentencias dentro de la funcin principal.
FUNCIN PRINCIPAL
La funcin principal main() es una funcin particular puesto que es la que se ejecuta al iniciar el programa.
Adems, el programa termina una vez completada la ejecucin de esta funcin. El compilador reconoce
72
..
.
};
Esto significa que f es una funcin que recibe un nmero real x como parmetro y devuelve 2*x-y.
La misma funcin en C se parece a lo siguiente:
// devolver el valor de r
Cada funcin debe ser declarada apropiadamente para poder interpretarla correctamente durante el proceso de
compilacin. La declaracin contiene los siguientes elementos:
73
Note que una funcin no necesita parmetros (funcin main() por ejemplo), pero debe estar entre parntesis. En
caso contrario, el compilador malinterpretara la funcin. Para hacerlo ms claro, puede sustituir el espacio en
blanco encerrado entre parntesis por la palabra clave void: main (void).
VALOR DEVUELTO
Una funcin puede devolver un valor (esto no es obligatorio) por medio de la palabra clave return. Al llegar a
return, la funcin evala un valor (puede ser una expresin) y lo devuelve a la lnea de programa desde la que
fue llamada.
return r;
Una funcin no puede devolver ms de un valor, pero puede devolver un puntero o una estructura. Tenga
cuidado al utilizar matrices y punteros. El siguiente ejemplo es un error tpico:
En realidad, el compilador reserva memoria para el almacenamiento de variables de la funcin reverse slo
durante su ejecucin. Una vez completada la ejecucin de reverse, la localidad de memoria para la variable i o
para la matriz r ya no est reservada. Esto significa que la direccin que contiene los valores de i o r[] est libre
para introducir datos nuevos. Concretamente, la funcin devuelve slo el valor &r[0], as que slo el primer
elemento de la matriz tab ser almacenado en la memoria. Las dems localidades de memoria, tales como
&tab[1], &tab[2], etc. sern consideradas por el compilador como espacios en blanco, o sea, estarn listas para
recibir los nuevos valores.
Para escribir esta funcin es necesario pasar la matriz r [] como parmetro (vea la subseccin Pasar los
parmetros).
74
Si la funcin no devuelve ningn valor, la palabra void debe ser utilizada como un tipo de resultado en la
declaracin. En este caso, la sentencia return no debe ser seguida por ninguna expresin. Puede ser omitida
como en el siguiente ejemplo:
nombre de funcin
tipos de parmetros
un punto y coma (;)
75
a = 10.54;
b = 5.2;
resultado = f(a,b);
funcinX();
Cuando se llama una funcin, el programa salta a la funcin llamada, la ejecuta, despus vuelve a la lnea desde
la que fue llamada.
76
// Declaracin de variables
permut = 1;
while(permut!=0) {
permut = 0;
// Bandera reiniciada
for(i=0;i<SIZE-1;i++) {
En este ejemplo, por medio de una funcin se realizan dos operaciones: ordena los miembros de la matriz por
valor asdendente y devuelve el mximo valor.
Para utilizar una matriz en una funcin es necesario asignar la direccin a la matriz (o a su primer miembro). Vea
el siguiente ejemplo:
float mtodo_1(int[]);
float mtodo_2(int*);
void main()
{
double promedio1, promedio2; // Declaracin de las variables promedio1
// y promedio2
int voltaje [NMERO_DE_MEDICIONES] = {7,8,3,5,6,1,9}; // Declaracin de la
77
//
float mtodo_1(int voltaje[])
{
int i, suma;
return(suma/NMERO_DE_MEDICIONES);
}
//
float mtodo_2 (int *voltaje) //Inicio de la funcin mtodo_2
{
int i, suma;
return(suma/NMERO_DE_MEDICIONES);
}
Las funciones 'mtodo_1' y 'mtodo_2' son completamente equivalentes. Las dos devuelven el valor promedio de
la matriz 'voltaje[]'. Despus de declararla, la direccin del primer miembro se puede escribir como 'voltaje' o
'&voltaje[0]'.
78
FUNCIONES
#define
#undef
#define
#ifdef
#endif
#ifndef
#if
#else
#elif
Definiciones de macro
Inclusiones de archivos
Control de compilacin
Ahora, vamos a presentar slo las directivas del preprocesador utilizadas con ms frecuencia. Sin embargo, no
es necesario saber todas ellas para programar microcontroladores. Slo tenga en cuenta que el preprocesador
es una herramienta muy poderosa para los programadores avanzados en C, especialmente para el control de
compilacin.
79
Tanque_1 = (((Dimetro/2)*(Dimetro/2)*PI)*altura;
Por medio de la directiva #undef es posible quitar una definicin de nombre de macro. As se especifica que la
substitucin que se ha definido anteriormente ya no va ocurrir en el siguiente cdigo. Esto es til cuando usted
quiere restringir la definicin slo a una parte particular del programa.
INCLUSIN DE ARCHIVOS
La directiva de preprocesador #include copia un archivo especfico en el cdigo fuente. El cdigo incluido debe
observar la sintaxis de C para ser compilado correctamente.
Hay dos formas de escribir estas directivas. En el primer ejemplo, slo el nombre de archivo se especifica, as
que el preprocesador lo buscar dentro del archivo include. En el segundo ejemplo, se especifica la ruta entera,
as que el archivo estar directamente incluido (este mtodo es ms rpido).
#include <nombre_de_archivo>
#include "C:\Ruta\nombre_de_archivo.h"
// Se especifica la localidad
// exacta del archivo
80
ADCON0.F5 = 1;
Para acceder a un bit individual, se puede utilizar '.FX' as como '.BX' (X es un entero entre 0 y 7 que representa
la posicin de bit).
TIPO SBIT
Si quiere declarar una variable que corresponde a un bit de un SFR, hay que utilizar el tipo sbit. Una variable de
tipo sbit se comporta como un puntero y se debe declarar como una variable global:
sbit Botn_PARADA at PORTA.B7; // Botn_PARADA est definido
...
void main() {
...
En este ejemplo, El Botn_PARADA es una variable declarada por el usuario, mientras que PORTA.B7 (bit 7 del
puerto PORTA) ser automticamente reconocido por el compilador.
TIPO BIT
El compilador mikroC PRO for PIC proporciona un tipo de datos bit que se puede utilizar para declarar variables.
No se puede utilizar en las listas de argumentos, punteros y los valores devueltos de funciones. Adems, no es
posible declarar e inicializar una variable de tipo bit en la misma lnea. El compilador determina el bit en uno de
los registros disponibles para almacenar las variables.
bit bf;
bit *ptr;
81
Los cdigos escritos en ensamblador pueden utilizar constantes y variables anteriormente definidos en C. Por
supuesto, como el programa entero est escrito en C, sus reglas se aplican al declarar estas constantes y
variables.
// W = maximum = 100
...
}
FUNCIN DE INTERRUPCIN
Una interrupcin detiene la ejecucin normal de un programa para ejecutar las operaciones especficas. Una lista
de sentencias a ejecutar debe estar escrita dentro de una funcin particular denominada interrupt(). La sintaxis
de una interrupcin en mikroC se parece a lo siguiente:
void interrupt() {
cnt++ ;
82
A diferencia de las funciones estndar, no es necesario declarar el prototipo de la funcin interrupt(). Adems,
como la ejecucin de esta funcin no forma parte de la ejecucin de programa regular, no se debe llamar de
ninguna parte de programa (se ejecutar automticamente dependiendo de las condiciones que el usuario ha
definido en el programa). En el siguiente captulo vamos a dar una clara explicacin de la ejecucin y definicin
de subrutinas de interrupcin.
LIBRERAS
Usted probablemente ha notado que en los ejemplos anteriores hemos utilizado algunas funciones como son
'Delay_ms', 'LCD_out', 'LCD_cmd' etc. Estas funciones estn definidas en las libreras contenidas en el
compilador mikroC.
Una librera representa un cdigo compilado, anteriormente escrito en mikroC, que contiene un conjunto de
variables y funciones. Cada librera tiene un propsito especfico. Por ejemplo, la librera LCD contiene funciones
de visualizacin de la pantalla LCD, mientras queC_math proporciona algunas funciones matemticas.
Antes de utilizar alguna de ellas en el programa, es necesario comunicrselo al compilador al marcarlas en la
lista de las libreras del compilador existentes. Si el compilador encuentra una funcin desconocida durante la
ejecucin de programa, primero va a buscar su declaracin en las libreras marcadas.
Aparte de las libreras existentes, es posible crear las libreras y luego utilizarlas en el programa. El
procedimiento de cmo crear libreras se describe en detalles en Help (Ayuda) del compilador.
El compilador mikroC incluye tres tipos de libreras:
- libreras ANSI C estndar:
LIBRARA
DESCRIPCIN
83
- libreras miscelneas:
LIBRARA
DESCRIPCIN
Button Library
Conversion Library
Sprint Library
PrintOut Library
Time Library
Trigonometry Library
Setjmp Library
DESCRIPCIN
ADC Library
CAN Library
CANSPI Library
Utilizada para las operaciones con el mdulo CAN externo (MCP2515 o MCP2510)
Utilizada para las operaciones con las tarjetas de memoria Compact Flash
EEPROM Library
EthernetPIC18FxxJ60 Library
Utilizada para las operaciones con el mdulo LCD grfico con resolucin 128x64
I2C Library
Utilizada para las operaciones con el mdulo de comunicacin serial I2C incorporado
Keypad Library
Lcd Library
Utilizada para las operaciones con las tarjetas multimedia MMC flash
Utilizada para las operaciones con los circuitos utilizando la comunicacin serial One Wire
PS/2 Library
PWM Library
RS-485 Library
Utilizada para las operaciones con los mdulos utilizando la comunicacin serial RS485
Sound Library
SPI Library
Utilizada para la comunicacin SPI de 4 bits con el LCD (de 2x16 caracteres)
UART Library
84
4. Depurar (ejecutar el programa paso a paso para asegurarse de que se ejecutan las operaciones
deseadas).
85
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?
De eso vamos a hablar ms tarde. Por ahora, basta con saber que es un software autnomo utilizado para
cargar el programa en el microcontrolador.
Una vez ms: Next, OK, Next, Next...
Una vez completada la instalacin del PICflash, el sistema operativo le preguntar a instalar otro programa
similar, un software para programar un grupo especial de los microcontroladores PIC que funcionan en modo de
bajo consumo (3.3 V). Salte este paso...
86
El controlador a instalar depende del sistema operativo utilizado. Seleccione el controlador correspondiente al
SO (sistema operativo) utilizado (por medio de abrir la carpeta correspondiente) e inicie la instalacin. Otra vez,
Next, OK, Next, Next... Bueno, todo est instalado para iniciar a programar!
87
88
89
Device (dispositivo):
Al seleccionar el tipo de microcontrolador a utilizar permite al compilador extraer el archivo de definicin (archivo
.def) asociado. El archivo de definicin de un microcontrolador contiene las informaciones especficas 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.
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.
ICD debug: Al elegir esta opcin, 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. El archivo .hex generado contiene los datos
adicionales que permiten el funcionamiento del depurador. Una herramienta denominada mikroICD (Depurador
90
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 (Lcd_Cmd, LCD_Init...) 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.
91
Al escribir un programa, no espere que termine la redaccin del programa para compilarlo. 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 (ver la prxima seccin). De este modo, resulta ms fcil solucionar los errores de
programa para no tomar un camino errneo en redactar su programa. De lo contrario, usted tendr que editar el
programa entero.
92
En el ejemplo anterior hay dos errores y una advertencia: faltan un punto y coma y una declaracin de variable
La advertencia le informa que falta el tipo del valor devuelto de la funcin main.
La compilacin le permite corregir su programa por medio de solucionar todos los errores en mikroC. 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
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. 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.
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.
Step Into - Ejecuta una sola instruccin. Cuando la instruccin es una llamada a una rutina, el
depurador har un salto a la rutina y se detendr despus de ejecutar la primera instruccin
dentro de la rutina.
93
Step Over - Se ejecuta una sola instruccin. Cuando la instruccin es una llamada a una
rutina, el depurador no har un salto a la rutina, sino que se ejecutar toda la rutina. El
depurador se detiene a la primera instruccin despus de la llamada a la rutina.
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 rutina.
94
95
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.
PROGRAMAR 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 introducir 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. A la interfaz de usuario de este software se le puede
acceder desde IDE 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...).
96
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.
97
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.
98
99
100
101
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
arquitectura RISC
102
Calibrado de fbrica
Consumo: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz) 50nA (en modo de espera)
14 canales
resolucin de 10 bits
3 temporizadores/contadores independientes
Temporizador perro guardin
Mdulo comparador analgico con
o
o
103
104
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:
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 DIP de 40 pines.
105
106
107
108
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.
MEMORIA 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.
109
MEMORIA 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 (SFR). Todos estos registros se
dividen en cuatro bancos de memoria de los que vamos a hablar ms tarde en este captulo.
A unque 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.
110
111
...
if (PORTB.0 = 1) // Comprobar si el pin RB0 est a uno
sum++ ;
...
...
...
TRISC = 0x00
PORTC = 0b01100011
...
112
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 C y el compilador como es mikroC 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 C, verdad? Es una noticia maravillosa, no lo cree?
113
114
115
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 CALL) 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.
116
saveBank = STATUS & 0b01100000; // Guardar el estado de los bits RP0 y RP1
// (bits 5 y 6 del registro STATUS)
asm {
...
...
// Cdigo ensamblador
...
}
SISTEMA 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 direccin 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
117
mikroC reconoce una rutina de interrupcin que se ejecutar como la funcin void interrupt(). El cuerpo de
la funcin, o sea, rutina de interrupcin, debe ser escrito por el usuario.
void interrupt() { // Interrupt routine
cnt++ ;
118
Registro STATUS
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.
RP1
RP0
BANCO ACTIVO
Banco 0
Banco 1
Banco 2
Banco 3
WDT.
0 - Despus de ejecutarse la instruccin SLEEP que pone al microcontrolador en el modo de bajo consumo.
119
1 - Hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
0 - No hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
Registro OPTION_REG
El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del Temporizador
0/WDT, el temporizador Timer0, la interrupcin externa y las resistencias pull-up en el puerto PORTB.
1 - Desactivadas.
0 - Activadas.
INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupcin
externa)
o
120
T0CS - TMR0 Clock Source Select bit (bit selector de tipo de reloj para el Timer0)
o
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
PSA - Prescaler Assignment bit asigna el pre-escalador (hay slo uno) al temporizador o al
WDT.
o
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
121
1:2
1:1
1:4
1:2
1:8
1:4
1:16
1:8
1:64
1:32
1:128
1:64
1:256
1:128
Para conseguir el valor del divisor de frecuencia 1:1 cuando el temporizador Timer0 cuenta pulsos, el
preescalador 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 mikroC...
/* Si el comando CLRWDT no se ejecuta,
el WDT va a reiniciar al microcontrolador cada 32.768 uS (f=4 MHz) */
void main() {
OPTION_REG = 0b00001111; // Pre-escalador est asignado al WDT (1:128)
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
...
...// El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768 microsegundos (128x256)
...
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
...
...// El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768 microsegundos (128x256)
...
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
}
122
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 bit 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.
123
Registro INTCON
El registro INTCON contiene varios bits de habilitacin y de bandera para el desbordamiento en el registro
TMR0, e interrupciones por el cambio del estado en el puerto PORTB y las interrupciones externas en el pin INT.
GIE - Global Interrupt Enable bit - (bit de habilitacin de interrupciones globales) controla
simultneamente todas las fuentes de interrupciones posibles.
o
124
T0IE - TMR0 Overflow Interrupt Enable bit (bit de habilitacin de interrupciones por el
desbordamiento del temporizador Timer0) controla interrupciones causadas por el
desbordamiento del Timer0.
o
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
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
T0IF - TMR0 Overflow Interrupt Flag bit (bit de bandera de interrupcin por el desbor
damiento del Timer0) detecta el desbordamiento en el registro del temporizador Timer0, o sea
el contador se pone a cero.
o
1 - En el registro del Timer0 ha ocurrido desbordamiento (esta bandera debe volverse a 0 por software).
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)
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).
0 - Ninguno de los pines de E/S de propsito general en el puerto PORTB ha cambiado de valor.
void initMain() {
ANSEL = ANSELH = 0;
PORTB = 0;
TRISB = 0b00010000;
RBIE = 1;
IOCB4 = 1;
125
...
...
...
Registro PIE1
El registro PIE1 contiene los bits de habilitacin de interrupciones perifricas.
ADIE - A/D Converter Interrupt Enable bit (bit de habilitacin de interrupciones del
convertidor A/D).
o
SSPIE - Master Synchronous Serial Port (MSSP) Interrupt 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
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
TMR2IE - TMR2 to PR2 Match Interrupt Enable bit (bit de habilitacin de la interrupcin
de igualdad entre TMR2 y PR2)
o
126
void interrupt()
cnt++ ;
PIR1.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
void main() {
ANSEL = ANSELH = 0;
T1CON = 1;
PIR1.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
PIE1.TMR1IE = 1;
cnt = 0;
INTCON = 0xC0;
...
Registro PIE2
El registro PIE2 tambin contiene varios bits de habilitacin de interrupciones.
127
OSFIE - Oscillator Fail Interrupt Enable bit (bit de habilitacin de la interrupcin de fallo
en el oscilador)
o
o
CCP2IE - CCP2 Interrupt Enable bit (bit de habilitacin de la interrupcin del mdulo 2 de
Comparacin/Captura/PWM (CCP2)
o
void interrupt() {
PORTB.F1 = ~PORTB.F1 ;
PIR2.C2IF = 0;
}
void main() {
TRISB = 0;
PORTB.F1 = 1;
ANSEL = 0b00000101;;
128
CON.GIE = 1;
CM2CON0.C2ON = 1;
...
...
Registro PIR1
El registro PIR1 contiene los bits de banderas de interrupcin.
ADIF - A/D Converter Interrupt Flag bit (bit de bandera de la interrupcin del convertidor
A/D)
o
o
1 - Se ha completado una conversin A/D (el bit debe volverse a 0 por software)
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
o
1 - El bfer de recepcin del EUSART est lleno. El bit se pone a cero al leer el registro RCREG.
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.
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)
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
129
TMR2IF - Timer2 to PR2 Interrupt Flag bit (bit de bandera de la interrupcin de igual dad
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).
1 - Se ha producido desbordamiento del Timer1. El bit debe ponerse a cero por software.
Registro PIR2
El registro PIR2 contiene los bits de banderas da la interrupcin.
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.
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.
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.
1 - La operacin de escritura en la memoria EEPROM se ha completado. El bit debe ponerse a cero por
software.
BCLIF - Bus Collision Interrupt Flag bit (bit de bandera de la interrupcin de colisin de
bus en el MSSP)
130
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.
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.
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.
void main() {
PORTA.F0 = 1;
ANSEL = ANSELH = 0;
TRISA = 0;
Delay_ms(1);
// Cargar el capacitor
PIR2.ULPWUIF = 0;
PCON.ULPWUE = 1;
TRISA.F0 = 1;
PIE2.ULPWUIE = 1;
...
...
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.
131
ULPWUE - Ultra Low-Power Wake-up Enable bit (bit de habilitacin para salir del modo
de ultra bajo consumo - la reactivacin)
o
SBOREN - Software BOR Enable bit (bit de habilitacin del BOR por software)
o
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
0 - Se ha producido Brown - out reset. El bit debe ponerse a uno por software despus de que se haya
producido Brown - out reset.
Si el contador de programa ha sido cambiado por software, debe tomar en cuenta lo siguiente para evitar
problemas:
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.
132
133
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.
134
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.
Por las razones prcticas, muchos pines de E/S son multifuncionales. Si un pin re aliza 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 (pin=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 = Entrada 1 = Salida.
135
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)
136
AN3
(determinado
por
el
bit
ANS3
del
registro
ANSEL)
...
...
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.
137
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 a uno de los pines del
microcontrolador. Es el pin RA0. 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).
138
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
registro
ANSELH)
AN11
(determinado
por
el
bit
ANS11del
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 y
optoacopladores. Con el propsito de conectar las resisitencias a los puertos del
microcontrolador, el bit apropiado del registro WPUB debe estar a uno.*
139
Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias "virtuales" no afectan a los
pines configurados como salidas, sino que sirven de un complemento til a las entradas. Estas resistencias estn
conectados a las entradas de los circuitos lgicos CMOS. 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.
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 termi nales
causen una interrupcin, el bit apropiado del registro IOCB debe estar a uno.
140
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 mikroC...
/* El pin PORTB.1 se configura como entrada digital. Se produce una interrupcin con cualquier
cambio de su estado lgico. Tambin tiene una resistencia pull-up. Todos los dems pines del
puerto PORTB son entradas digitales. */
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como digitales
PORTB = 0;
TRISB = 0b00000010; // Todos los pines del puerto PORTB excepto PORTB.1
// se configuran como salidas
RBPU = 0;
WPUB1 = 1;
IOCB1 = 1;
RBIE = GIE = 1;
...
141
Como hemos visto, los voltajes aplicados a los pines del zcalo del programador son los mismos que los
utilizados durante la programacin ICSP.
142
Todas las funciones adicionales del puerto PORTC se describen en los siguientes captulos.
143
RE1
AN5
AN6
(determinado
(determinado
por
por
el
el
bit
bit
ANS5
ANS6
del
del
registro
registro
ANSEL);
ANSEL);
...
ANSEL = 0b00100000; // El pin PORTE.0 se configura como analgico
ANSELH = 0;
...
144
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.
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:
145
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.
146
Registro OPTION_REG
RBPU - PORTB Pull-up enable bit (resistencia Pull Up del puerto PORTB)
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
T0CS - TMR0 Clock Select bit (bit selector de tipo de reloj para el Timer0)
o
o
0 - Los pulsos se llevan a la entrada del temporizador/contador Timer0 por el pin RA4.
1 - El temporizador utiliza los pulsos de reloj internos (Fosc/4).
T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco)
o
147
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 y el temporizador perro guardin, respectivamente.
PS2
PS1
PS0
TMR0
WDT
1:2
1:1
1:4
1:2
1:8
1:4
1:16
1:8
1:32
1:16
1:64
1:32
1:128
1:64
1:256
1:128
Cuando el bit PSA est a 0, el pre-escalador se le asigna al temporizador/contador Timer0, como se muestra en
la siguiente figura.
unsigned cnt;
void interrupt() {
// Rutina de interrupcin
148
TMR0 = 155;
INTCON = 0x20;
void main() {
OPTION_REG = 0x04;
TMR0 = 155;
INTCON = 0xA0;
...
...
// En el siguiente ejemplo, Timer0 se configura como un temporizador
// y se le asigna un pre-escalador.
OPTION_REG = 0x20;
TMR0 = 155;
INTCON = 0xA0;
...
...
Cuando el bit PSA est a 1, el pre-escalador se le asigna al temporizador perro guardin como se muestra en la
siguiente figura.
149
void main() {
OPTION_REG = 0x0E; // Pre-escalador se le asigna al WDT (1:64)
asm CLRWDT;
...
...
asm CLRWDT;
...
BANKSEL TMR0
CLRWDT
CLRF TMR0
BANKSEL OPTION_REG
CLRWDT
MOVLW b'11111000'
IORLW b'00000101'
MOVWF OPTION_REG
150
BANKSEL TMR0
CLRWDT
BANKSEL OPTION_REG
MOVLW b'11110000'
IORLW b'00000011'
MOVWF OPTION_REG
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.
151
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:
152
TMR1CS
Fosc/4
T1CKI pin
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. En caso de que se necesite un oscilador del reloj externo y el
microcontrolador PIC16F887 utilice el oscilador interno INTOSC con el pin RA6/OSC2/CLIKOUT, el temporizador
Timer1 puede utilizar el oscilador LP como una fuente de reloj.
153
LP
FRECUENCIA
C1
C2
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 porque slo una
interrupcin puede producirlo. 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 registro 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.
154
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.
Vamos a hacerlo en mikroC...
// En este ejemplo, el TMR1 est configurado como un temporizador con el valor
// del preescalador 1:8. Cada vez que ocurra un desbordamiento de los registros TMR1H y
// TMR1L, se solicitar una interrupcin.
155
void main() {
PIR1.TMR1IF = 0;
TMR1H = 0x22;
TMR1L = 0x00;
TMR1CS = 0;
INTCON = 0xC0;
TMR1ON = 1;
...
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.
156
Registro T1CON
T1GINV - Timer1 Gate Invert bit (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 con tar 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 - Timer1 Gate Enable bit (Bit de habilitacin de la compuerta del temporizador1) 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.
T1CKPS1, T1CKPS0 - Timer1 Input Clock Prescale Select bits (Bits de seleccin del preescalador de seal de
reloj del Temporizador1) determina el valor del divisor de frecuen cias asignada al temporizador Timer1.
T1CKPS1
T1CKPS0
1:1
1:2
1:4
1:8
T1OSCEN - LP Oscillator Enable Control bit (bit de habilitacin del oscilador LP del Timer1)
1 - Oscilador LP est habilitado para el reloj del Timer1 (oscilador de bajo consumo y de
157
TMR1CS - Timer TMR1 Clock Source Select bit (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)
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).
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, se configura la bandera TMR1IF y el conteo
empieza desde cero.
158
Registro T2CON
TOUTPS3 - TOUTPS0 - Timer2 Output Postcaler Select bits (bits de seleccin del rango del divisor del postescalador para el Timer2) se utilizan para determinar el valor del post-escalador segn la siguiente tabla:
TOUTPS3
TOUTPS2
TOUTPS1
TOUTPS0
1:1
1:2
1:3
1:4
1:5
1:6
1:7
1:8
1:9
1:10
1:11
1:12
1:13
1:14
1:15
159
1:16
TMR2ON Timer2 On bit - (bit de activacin del TIMR2) hace entrar en funcionamiento el temporizador Timer2.
1 - Habilita el funcionamiento del Timer2.
T2CKPS1, T2CKPS0 - Timer2 Clock Prescaler bits (seleccin del rango del divisor del preescalador del Timer2)
determina el valor del divisor de frecuencias:
T2CKPS1
T2CKPS0
1:1
1:4
1:16
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 postescalador se borran.
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...
MDULO CCP1
160
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.
Una combinacin de cuatro bits (CCP1M3 - CCP1M0) del registro de control determina cul de estos eventos
causar transmisin de dato de 16 bits. Adems, se deben cumplir los siguientes requisitos::
161
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.
En caso de que el mdulo CCP1 est en modo de captura, puede producirse una interrupcin no deseada. Para
evitarlo, antes de que ocurra un cambio en el registro de control 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
MOVLW
XX
MOVWF
CCP1CON
...
162
MOVLW XX
MOVWF CCP1CON
...
Para poner el mdulo CCP1 en este modo de funcionamiento, se deben cumplir dos condiciones:
163
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.)
164
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 DE PWM
El perodo de pulso de salida (T) se determina por 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 Timer2
165
1.22
4.88
19.53
78.12
156.3
208.3
16
Registro PR2
FFh
FFh
FFh
3Fh
1Fh
17h
Notas adicionales:
RESOLUCIN DE 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 es determinada por el registro PR2. El mximo
valor se obtiene al usar el nmero FFh.
Frecuencias y resoluciones de PWM (Fosc = 20MHz):
FRECUENCIA DE PWM
1.22KHZ
4.88KHZ
19.53KHZ
78.12KHZ
156.3KHZ
208.3KHZ
16
FFh
FFh
FFh
3Fh
1Fh
17h
Resolucin mxima
10
10
10
76.92KHZ
153.85KHZ
1.22KHZ
4.90KHZ
19.61KHZ
200.0KHZ
16
65h
65h
65h
19h
0Ch
09h
Resolucin mxima
166
void initMain() {
ANSEL = ANSELH = 0;
PORTC = TRISC = 0;
PWM1_Init(5000);
void main() {
initMain();
duty_c = 127;
PWM1_Start();
Registro CCP1CON
P1M1, P1M0 - PWM Output Configuration bits (bits de configuracin del modo PWM) - El pin P1A es la entrada
del mdulo de Captura/Comparacin en todos los modos, menos en modo PWM. Los pines P1B, P1C y P1D
actan como los pines de E/S del puerto D.
En modo PWM estos bits afectan al funcionamiento del mdulo CCP1 como se muestra en la siguiente tabla:
P1M1
P1M0
MODO
PWM con una sla salida
Por
el
pin
P1A
sale
Pines P1B, P1C y P1D son entradas/salidas del puerto D.
Configuracin
Full
(puente completo con salida directa)
Por
el
pin
Por
el
pin
Pines P1B y P1C estn inactivos.
P1D
P1D
una
Bridge
sale
sale
seal
-
una
una
seal
seal
modulada.
Forward
modulada.
modulada.
167
Por
los
pines
P1A
y
P1B
Pines P1C y P1D son entradas/salidas del puerto D.
Configuracin
Full
(puente completo con salida inversa)
Por
el
pin
P1B
Pin
P1C
Pines P1A y P1D estn inactivos.
sale
una
Bridge
sale
seal
modulada.
una
est
Reverse
seal
modulada.
activo.
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 de seleccin de modo del mdulo CCP1) determina el modo del mdulo CCP1.
CCP1M3
CCP1M2
CCP1M1
CCP1M0
MODO
No utilizado.
Modo de comparacin
El bit CCP1IF bit se pone a 1 al ocurrir una coincidencia.
No utilizado.
Modo de captura
Cada flanco descendente en el pin CCP1.
Modo de captura
Cada flanco ascendente en el pin CCP1.
Modo de captura
Cada cuarto flanco ascendente en el pin CCP1.
Modo de captura
Cada decimosexto flanco ascendente en el pin CCP1.
Modo de comparacin
La salida y el bit CCP1IF se ponen a 1 al ocurrir una coincidencia
Modo de comparacin
La salida se pone a 0 y el bit CCP1IF se pone a 1 al ocurrir una coincidencia.
Modo de comparacin
Llega la solicitud de interrupcin y el bit CCP1IF se pone a 1 al ocurrir una
coincidencia
Modo de comparacin
El bit CCP1IF se pone a 1, y los registros de temporizadores 1 o 2 se borran
al ocurrir una coincidencia
Modo PWM
Pines
P1A
y
P1C
estn
activos
Pines P1B y P1D estn activos a nivel alto.
nivel
alto.
nivel
alto.
nivel
bajo.
nivel
bajo.
Modo PWM
Pines
P1A
y
P1C
estn
activos
Pines P1B y P1D estn activos a nivel bajo.
Modo PWM
Pines
P1A
y
P1C
estn
activos
Pines P1B y P1D estn activos a nivel alto.
Modo PWM
Pines
P1A
y
P1C
estn
activos
Pines P1B y P1D estn activos a nivel bajo.
168
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 - CCP2 Mode Select bits (bits de seleccin de modo del mdulo CCP2) determina el modo
del mdulo CCP2.
CCP2M3
CCP2M2
CCP2M1
CCP2M0
MODO
No utilizado.
No utilizado.
169
No utilizado.
Modo de Captura
Cada flanco descendente en el pin CCP2.
Modo de Captura
Cada flanco ascendente en el pin CCP2.
Modo de Captura
Cada cuarto flanco ascendente en el pin CCP2.
Modo de Captura
Cada decimosexto flanco ascendente en el pin CCP2.
Modo de comparacin
La salida y el bit CCP2IF se ponen a 1 al ocurrir una coincidencia.
Modo de comparacin
La salida se pone a 0 y el bit CCP2IF se pone a 1 al ocurrir una coincidencia
Modo de comparacin
Se produce una interrupcin, el bit CCP2IF se pone a 1 y no hay cambio el
pin CCP2 pin al ocurrir una coincidencia.
Modo de comparacin
Modo PWM
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:
Ajustar el valor de divisin de frecuencia del temporizador Timer2 por los bits
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)
Configurar el pin apropiado como salida al poner a cero el bit en el registro TRIS.
170
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.
171
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:
172
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).
173
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:
Registro PWM1CON
174
STRC PWM Restart Enable bit (Bit de habilitacin del reinicio automtico del PWM)
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 in strucciones (4Tosc) aadidos como tiempo
muerto al activar los pines de entrada PWM.
Registro PSTRCON
175
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
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
176
ECCPAS2 - ECCPAS0 - ECCP Auto-Shutdown Source Select bits (Bits de seleccin de la fuente de apagado
automtico) selecciona la fuente de apagado automtico.
ECCPAS2
ECCPAS1
ECCPAS0
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.
PSSAC1
PSSAC0
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.
PSSBD1
PSSBD0
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.
EUSART
177
178
Figure below shows a common way of connecting PIC microcontroller that uses EUSART module. The RS-232
circuit is used as a voltage level converter.
179
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:
180
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 desha bilitar 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:
181
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 original 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.
182
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.
183
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.
184
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 - Transmisin deshabilitada.
SYNC - EUSART Mode Select bit (Bit de seleccin del modo EUSART)
1 - El EUSART funciona en modo sncrono.
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.
TRMT - Transmit Shift Register Status bit (bit de estado de registro de desplazamiento de transmisin)
1 - Registro TSR est vaco.
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).
185
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
SREN - Single ReceiveEnable bit (bit de habilitacin de la recepcin simple). Es utilizado slo en modo
sincrnico y en funcionamiento como Maestro.
1 - Recepcin simple habilitada.
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:
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
186
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.
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.
BITS
MODO
EUSART
BRG
FRMULA
BAUDIOS
DE
SYNC
BRG1G
BRGH
de 8 bits /asncrono
de 8 bits / asncrono
de 16 bits / asncrono
de 16 bits / asncrono
Fosc / [4 (n + 1)]
VELOCIDAD
DE
TRANSMISIN
EN
187
de 8 bits / sncrono
Fosc / [4 (n + 1)]
de 16 bits / sncrono
Fosc / [4 (n + 1)]
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:
188
189
Registro BAUDCTL
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:
Modo sncrono:
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
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.
190
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.
char uart_rd;
void main() {
ANSEL = ANSELH = 0;
C1ON_bit = C2ON_bit = 0;
UART1_Init(9600);
Delay_ms(100);
UART1_Write_Text("Start");
while (1) {
if (UART1_Data_Ready()) {
// Bucle infinito
// Si el dato se ha recibido,
uart_rd = UART1_Read();
UART1_Write(uart_rd);
}
}
}
La transmisin de datos es habilitada poniendo a uno el bit TXEN del registro TXSTA. El bit TXIF del
191
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. El valor del noveno bit ser almacena do en este registro en la recepcin de
datos de 9 bits.
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.
192
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.
MODO SPI
193
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
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 registros conectados a
los pines para recepcin, transmisin y sincronizacin.
194
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 mikroC...
/* En este ejemplo, el microcontrolador PIC (maestro) enva un byte de datos a un chip
perifrico (esclavo) por el mdulo SPI. El programa utiliza las funciones de librera
SPI SPI1_init() y SPI1_Write. */
// perifrico Seleccin_de_chip
sbit Chip_Select_Direction at TRISC0_bit; // Bit TRISC0 define el pin RC0 como entrada o salida
unsigned int value;
void main() {
ANSEL = ANSELH = 0;
Chip_Select_Direction = 0;
SPI1_Init();
SPI1_Write(value);
...
195
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 siguientes pasos
hasta que el pin SCK detecte seal de reloj.
Paso
2.
Paso
3.
El dato se desplaza hacia el pin de salida (primero se desplaza el bit ms significativo - MSB), mientras que a la
196
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 I2C
El modo I2C (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
197
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).
198
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 MDSSP en modo I2C.
199
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
200
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).
CKE - Clock Edge Select bit (bit de seleccin del flanco de reloj) selecciona el modo de sincronizacin.
CKP = 0:
CKP = 1:
R/W - Read Write bit (bit de informacin Lectura/Escritura) se utiliza slo en modo I 2C. Este bit contiene la
informacin del bit de L/E despus de la ltima direccin coin cidente. Este bit es vlido slo desde la direccin
coincidente hasta el siguiente bit de arranque, bit de parada o bit no ACK.
Modo IC en modo esclavo
1 - Lectura de dato.
0 - Escritura de dato.
201
1 - Transmisin en progreso.
0 - Transmisin no est en progreso.
UA - Update Address bit (bit de activacin de direccin) se utiliza slo en modo I2C de 10 bits.
1 - Indica que es necesario actualizar la direccin en el registro SSPADD.
Registro SSPSTAT
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 - Habilita el mdulo MSSP y configura los pines SCK, SDO, SDI y SS como una fuente de
pines del puerto serie.
0 - Deshabilita el mdulo MSSP y configura estos pines como pines del puerto de E/S.
En modo IC
202
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 IC maestro.
En modo SPI
En modo IC esclavo
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:
SSPM3
SSPM2
SSPM1
SSPM0
MODO
Modo esclavo del SPI, deshabilitado el pin de control SS, SS se puede utilizar
como pin de E/S.
No utilizado.
No utilizado.
No utilizado.
Modo esclavo I2C, direccin de 7 bits utilizada, los bits de arranque (START) y de
parada (STOP) habilitan interrupcin.
Modo esclavo I2C, direccin de 10 bits utilizada, los bits de arranque (START) y de
parada (STOP) habilitan interrupcin.
Registro SSPCON2
203
1 - No reconocimiento.
0 - Reconocimiento.
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.
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.
204
IC 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.
205
registro SSPCON2. Sin embargo, aunque est habilitado, el microcontrolador tiene que esperar cierto tiempo
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 direcciones, 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 direcciones ha ocurrido apropiadamente, todos los bytes de datos se transmiten de la misma
manera.
206
207
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:
void main(){
ANSEL = ANSELH = PORTB = TRISB = 0; // Todos los pines son digitales. Los pines del
// puerto PORTB son salidas.
I2C1_Init(100000);
I2C1_Start();
I2C1_Wr(0xA2);
208
I2C1_Wr(0xF0);
I2C1_Stop();
Delay_100ms();
I2C1_Start();
I2C1_Wr(0xA2);
I2C1_Wr(2);
I2C1_Repeated_Start();
I2C1_Wr(0xA3);
PORTB = I2C1_Rd(0u);
I2C1_Stop();
(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.
209
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.
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.
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.
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.
210
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.
211
El funcionamiento del convertidor A/D est bajo el control de los bits de cuatro registros:
212
ADCS1
ADCS0
20 Mhz
8 Mhz
4 Mhz
1 Mhz
Fosc/2
100 nS
250 nS
500 nS
2 uS
Fosc/8
400 nS
1 uS
2 uS
8 uS
Fosc/32
1.6 uS
4 uS
8 uS
32 uS
Frc
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
caractersticas de la frecuencia del dispositivo. Los valores en las celdas sombreadas estn fuera del rango
recomendado.
213
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 en tradas 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, el estado de los bits correspondientes
se leer como cero lgico (0), sin reparar en el valor del voltaje real en el pin; 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 1023 grados (210 - 1 =1023). 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 valores mximos y mnimos.
Registro ADCON0
214
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.
ADCS1
ADCS2
RELOJ
Fosc/2
Fosc/8
Fosc/32
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
CANAL
PIN
RA0/AN0
RA1/AN1
RA2/AN2
RA3/AN3
RA5/AN4
RE0/AN5
RE1/AN6
RE2/AN7
RB2/AN8
RB3/AN9
10
RB1/AN1
0
11
RB4/AN1
1
12
RB0/AN1
2
13
RB5/AN1
3
CVref
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.
215
#include <built_in.h>
unsigned int adc_rd;
void main() {
ANSEL = 0x04;
TRISA = 0xFF;
ANSELH = 0;
TRISC = 0x3F;
TRISB = 0;
do {
temp_res = ADC_Read(2); // Obtener el resultado de 10 bits de la conversin AD
PORTB = temp_res;
} while(1);
// Quedarse en el bucle
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
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.
216
0 - Voltaje de alimentacin Vdd se utiliza como una fuente de voltaje de referencia alto.
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
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 reg istro 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
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.
217
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:
218
El voltaje de referencia del comparador 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.
Aunque la idea principal era obtener el voltaje de referencia variable para el funcionamiento de mdulos
analgicos, de ese modo se obtiene un simple convertidor A/D. Este convertidor es muy til en algunas
situaciones. 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:
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.
219
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.
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)
220
C1OE Comparator C1 Output Enable bit (bit de habilitacin de salida del comparador C1)
1 - Salida del comparador C1OUT est conectada al pin C1OUT *.
* Para habilitar que el bit C1OUT aparezca en el pin, se deben cumplir dos condiciones: C1ON = 1 (el
comparador debe estar activado) y el bit correspondiente TRIS = 0 (pin se debe configurar como salida).
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.
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.
C1CH1, C1CH0 - Comparator C1 Channel Select bit (bit de seleccin de canal del comparador C1)
C1CH1
C1CH0
Registro CM2CON0
Los bits de este registro estn en control del comparador C2. Similar al caso anterior, la siguiente figura muestra
un esquema simplificado del circuito afectado por los bits de este registro.
221
C2ON - Comparator C2 Enable bit (bit de habilitacin del comparador C2) habilita el comparador C2.
1 - Comparador C2 est habilitado.
C2OUT - Comparator C2 Output bit (bit de salida del comparador C2) es la salida del comparador C2.
If C2POL = 1 (salida del comparador est invertida)
C2OE - Comparator C2Output Enable bit (bit de habilitacin de salida del comparador C2)
1 - Salida del comparador C2OUT est conectada al pin C2OUT*.
* Para habilitar que el bit C2OUT aparezca en el pin, se deben cumplir dos condiciones: C2ON = 1 (el
comparador debe estar activado) y el bit correspondiente TRIS = 0 (pin se debe configurar como salida).
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.
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.
C2CH1, C2CH0 Comparator C2 Channel Select bit (bit de seleccin de canal del comparador C2)
222
C2CH0
Registro CM2CON1
MC1OUT Mirror Copy of C1OUT bit es una copia del bit C1OUT
MC2OUT Mirror Copy of 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.
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.
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.
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
223
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.
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.
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-.
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.
(gama
baja)
(gama
alta)
CVref = ([VR3:VR0]/24)VLADDER
VRR
224
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.
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...
Un oscilador externo est instalado fuera del microcontrolador y conectado a los pines OSC1 y OSC2. Es
denominado 'externo' porque utiliza componentes externos para generar una seal de reloj y estabilizar la
frecuencia. Estos son: cristal de cuarzo, resonador cermico o circuito resistor - capacitor. El modo de
funcionamiento del oscilador se selecciona por los bits, que se envan durante la programacin, denominados
Palabra de Configuracin.
El oscilador interno consiste en dos osciladores internos separados:
225
Registro OSCCON
El registro OSCCON gobierna el microcontrolador y las opciones de seleccin de frecuencia. 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.
IRCF2
IRCF1
IRCF0
FRECUENCIA
OSC.
8 MHz
HFINTOSC
4 MHz
HFINTOSC
2 MHz
HFINTOSC
1 MHz
HFINTOSC
500 kHz
HFINTOSC
250 kHz
HFINTOSC
125 kHz
HFINTOSC
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.
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.
226
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.
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.
227
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.
228
Los modos LP, XT y HS utilizan un oscilador externo como una fuente de reloj cuya frecuencia 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.
229
230
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];
231
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.
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.
232
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.
233
234
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 interrupcin.
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.
235
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.
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.
TUN4
0
TUN3
1
TUN2
1
TUN1
1
TUN0
1
FRECUENCIA
Mxima
236
Calibrada
Mnima
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.
Registro EECON1
237
BSF STATUS,RP1
BCF STATUS,RP0
; Acceder al banco 2
MOVF ADDRESS,W
MOVWF EEADR
; Escribir la direccin
BSF STATUS,RP0
; Acceder al banco 3
238
BCF STATUS,RP0
; Acceder al banco 2
MOVF EEDATA,W
W = EEPROM_Read(ADDRESS);
Las ventajas del uso del lenguaje C se han hecho ms obvias, no lo cree?
BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON,WR1
GOTO $-1 ;
BCF STATUS,RP0
; Banco 2
MOVF ADDRESS,W
; Mover la direccin a W
MOVWF EEADR
; Escribir la direccin
MOVF DATA,W
MOVWF EEDATA
BSF STATUS,RP0
; Banco 3
BCF INCON,GIE
MOVLW 55h
MOVWF EECON2
MOVLW AAh
MOVWF EECON2
BSF EECON1,WR
239
; Interrupciones habilitadas
BCF EECON1,WREN
W = EEPROM_Write(ADDRESS, W);
void main(){
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
for(ii = 0; ii < 32; ii++)
EEPROM_Write(0x80+ii, ii);
EEPROM_Write(0x02,0xAA);
EEPROM_Write(0x50,0x55);
// de la EEMPROM
Delay_ms(1000);
PORTB = 0xFF;
PORTC = 0xFF;
Delay_ms(1000);
PORTB = 0x00;
PORTC = 0x00;
Delay_ms(1000);
PORTB = EEPROM_Read(0x02);
240
Delay_ms(250);
}
}
Aprimera 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.
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
241
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 Brownout. 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.
RUIDO ELCTRICO
242
Es un tipo especial del reinicio Brownout que ocurre en un ambiente industrial 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.
PIN MCLR
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" durante el funcionamiento normal. Si sus valores se seleccionan de manera que proporcionen un nivel
lgico alto 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 (si se utiliza un voltaje de alimentacin de 5V) 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
243
Alimentacin;
Seal de reinicio; y
Seal de reloj.
244
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).
245
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.
246
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 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 local, 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.
247
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.
Apesar 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.
248
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. Este efecto no se
percibe normalmente al utilizar estos componentes en la vida cotidiana porque el rebote ocurre demasiado rpido
para afectar a la mayora de los dispositivos elctricos. Sin embargo, pueden surgir problemas en algunos
circuitos 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
249
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.
REL
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.
250
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 lentamente
251
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:
252
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 estrictaa 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 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.
253
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 diseada 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 palabras, 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.
254
DGITOS
VISUALIZAR
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 de destruccin,
255
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.
256
NMERO
NOMBRE
ESTADO LGICO
DESCRIPCIN
Tierra
Vss
0V
Alimentacin
Vdd
+5V
Contraste
Vee
0 - Vdd
RS
0
1
D0 D7 considerados como
D0 D7 considerados como datos
R/W
0
1
0
1
Transicin de 1 a 0
D0
0/1
Bit 0 LSB
D1
0/1
Bit 1
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
Control de funcionamiento
Datos / comandos
comandos
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.
257
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:
258
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.
Esto 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:
259
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
260
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 perifrico, 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
261
Los smbolos estn normalmente definidos al principio del programa por una simple escritura 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.
262
COMANDO
RS
RW
D7
D6
D5
D4
D3
D2
D1
D0
TIEMPO
EJECUCIN
Borrar el visualizador
1.64mS
1.64mS
Modo de entrada
I/D
40uS
40uS
Desplazar el cursor/visualizador
D/C
R/L
40uS
Modo de funcionamiento
DL
40uS
Direccin CGRAM
Direccin CGRAM
40uS
Leer
la
bandera
"BUSY"(ocupado) (BF)
BF
Direccin CGRAM
Escribir en la CGRAM o en la
DDRAM
D7
D6
D5
D4
D3
D2
D1
D0
40uS
D7
D6
D5
D4
D3
D2
D1
D0
40uS
Activar/desactivar
visualizador
el
40uS
D 1 = Visualizador encendido
0 = Visualizador apagado
U 1 = Cursor activado
0 = Cursor desactivado
DE
263
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.
264
2. Modo
DL =
1
Bus
de
datos
de
8
bits
N=
0
LCD
de
una
lnea
F = 0 - Carcter de 5 x 8 puntos
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 = 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 mximo 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 completamente 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, por supuesto, visualizar los mensajes.
Refirase a la Figura que sigue para el procedimiento de inicializacin por el bus de datos de 8 bits:
265
Esto no es un error! En este algoritmo, el mismo valor se transmite tres veces en fila.
El procedimiento de inicializacin por el bus de datos de 4 bits:
266
...
Lcd_Init(); // Inicializar el LCD
...
EJEMPLOS PRCTICOS
267
Project del
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.
268
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 .mcppi. Se crear en el proyecto el archivo fuente con el mismo
nombre (First_Project .c.h).
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
Todos los errores encontrados durante la compilacin aparecern en la ventana Message. Si no hay errores en
el programa, el compilador mikroC PRO for PIC generar los correspondientes archivos de salida.
4.3 EJEMPLO 1
Escribir cabecera, configurar pines de E/S, utilizar la funcin Delay y el operador Switch
El nico propsito de este programa es de encender varios diodos LED en el puerto B. 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.
269
Al encender la fuente de alimentacin, cada segundo, el diodo LED en el puerto B 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".
270
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 operador switch monitorea el estado lgico en el puerto PORTB. Si PORTB=0xFF, su
estado se invierte en 0x00 y viceversa. Cualquier cambio de estos estados lgicos hace todos los
LEDs parpadear. El ciclo de trabajo es 5:1 (500mS:100mS).
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. El estado lgico del puerto PORTB
se invierte cada 200mS.
271
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 era 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.
272
/* Cabecera *********************************************/
int k = 0;
char saveBank;
void main() {
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
TRISB = 0;
do {
PORTB = ~PORTB;
Delay_ms(100);
k++;
// Incrementar k en 1
}
while(k<20);
k=0;
// Reiniciar variable k
saveBank = STATUS & 0b01100000; // Guardar el estado de los bits RP0 y RP1
bsf STATUS,RP0
bcf STATUS,RP1
// registro OSCCON
bcf OSCCON,6
bcf OSCCON,5
// de frecuencia de 31KHz
bcf OSCCON,4
bsf OSCCON,0
}
273
STATUS |= saveBank;
do {
PORTB = ~PORTB;
Delay_ms(10);
// Tiempo de retardo de 10 mS
k++;
// Incrementar k en 1
}
while(k<20);
4.5 EJEMPLO 3
Timer0 como un contador, declarar variables nuevas, constantes de enumeracin, 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 Timer0 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.
274
/*Cabecera****************************************************/
void main() {
char TEST = 5;
// Constante TEST = 5
ANSEL = 0;
ANSELH = 0;
PORTA = 0;
TRISA = 0xFF;
PORTD = 0;
TRISD = 0b11110111;
OPTION_REG.F3 = 1;
TMR0 = 0;
do {
if (TMR0 == TEST)
275
}
while (1);
Slo una constante de enumeracin REL se utiliza en este ejemplo. Se le asigna un valor mediante la
declaracin.
Si varios pines del puerto PORTD estn conectados a los rels, la expresin anterior se puede escribir de la
siguiente manera tambin:
A todas las constantes, precedidas por las constantes con valores asignados (REL=3 y MOTOR=6), se les
asignan automticamente los valores de las constantes precedentes, incrementados en 1. En este ejemplo, a las
constantes CALENTADOR y SURTIDOR se les asignan los valores 4 y 7, es decir (CALENTADOR=4 y
SURTIDOR=7), respectivamente.
4.6 EJEMPLO 4
Utilizar los temporizadores Timer0, Timer1 y Timer2. Utilizar interrupciones, declarar
nuevas funciones...
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 Timer0 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 400, el puerto
PORTB se incrementa en 1. Todo el procedimiento se lleva a cabo entre bastidores, lo que habilita al
microcontrolador hacer otra tarea.
276
/*Cabecera******************************************************/
unsigned cnt;
void interrupt() {
cnt++;
TMR0 = 96;
INTCON = 0x20;
void main(){
OPTION_REG = 0x84;
ANSEL = 0;
ANSELH = 0;
TRISB = 0;
// como salidas
PORTB = 0x0;
TMR0 = 96;
INTCON = 0xA0;
277
do {
// Bucle infinito
if (cnt == 400) {
}
} while(1);
Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una interrupcin.
/*Cabecera******************************************************/
void interrupt() {
cnt++ ;
PIR1.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
void main() {
ANSEL = 0;
ANSELH = 0;
PORTB = 0xF0;
TRISB = 0;
T1CON = 1;
PIR1.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
PIE1.TMR1IE = 1;
cnt = 0;
INTCON = 0xC0;
do {
// Bucle infinito
if (cnt == 76) {
278
}
} while (1);
}
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******************************************************/
void Reemplazar() {
PORTB = ~PORTB;
}
void interrupt() {
if (PIR1.TMR2IF) {
// Si el bit TMR2IF = 1,
cnt++ ;
PIR1.TMR2IF = 0;
// Reiniciar el bit y
TMR2 = 0;
}
}
// main
void main() {
cnt = 0;
ANSEL = 0;
ANSELH = 0;
PORTB = 0b10101010; // Estado lgico en los pines del puerto PORTB
TRISB = 0;
T2CON = 0xFF;
// Configurar el temporizador T2
TMR2 = 0;
PIE1.TMR2IE = 1;
// Interrupcin habilitada
INTCON = 0xC0;
while (1) {
// Bucle infinito
279
cnt = 0;
}
}
}
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 la funcin Reemplazar, que
normalmente no pertenece al lenguaje C estndar.
4.7 EJEMPLO 5
Utilizar 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.
280
/*Cabecera******************************************************/
void main() {
OPTION_REG = 0x0E; // Pre-escalador se le asigna al temporizador WDT (1:64)
asm CLRWDT;
PORTB = 0x0F;
TRISB = 0;
Delay_ms(300);
PORTB = 0xF0;
while (1);
Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perro-guardin al
seleccionar la opcin Tools/mE Programmer/Watchdog Timer - Enabled.
281
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: void Pwm1_Init(long freq);
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: void Pwm1_Start(void);
3. PWM1_Set_Duty tiene
el
prototipo: void Pwm1_Set_Duty(unsigned
short duty_ratio);
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: void Pwm1_Stop(void);
/*Cabecera******************************************************/
282
void initMain() {
ANSEL = 0;
ANSELH = 0;
PORTA = 255;
TRISA = 255;
PORTB = 0;
TRISB = 0;
PORTC = 0;
TRISC = 0;
// como salidas
PWM1_Init(5000); // Inicializacin del mdulo PWM (5KHz)
}
void main() {
initMain();
ciclo_de_trabajo_actual = 16;
ciclo_de trabajo_anterior = 0;
PWM1_Start();
while (1) {
// Bucle infinito
if (Button(&PORTA, 0,1,1))
ciclo_de_trabajo_actual++ ;
if (Button(&PORTA, 1,1,1))
ciclo_de_trabajo_actual-- ;
if (old_duty != ciclo_de_trabajo_actual) {
// Si ciclo_de_trabajo_actual y
}
Delay_ms(200); // Tiempo de retardo de 200mS
}
}
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa:
PWM
283
Button
4.9 EXAMPLE 7
Utilizar 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
el voltaje de referencia alto se aplica al pin AN3. Esto habilita que la escala de medicin se estire y encoja.
IEn 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******************************************************/
284
TRISA = 0xFF;
// como entradas
ANSELH = 0;
TRISB = 0x3F;
// como salidas
TRISD = 0;
ADCON1.F4 = 1 ;
do {
temp_res = ADC_Read(2); // Resultado de la conversin A/D es copiado a temp_res
PORTD = temp_res;
} while(1);
// Bucle infinito
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
Utilizar 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 (decimal). 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, directamente ledo
y visualizado en el puerto PORTD en forma binaria.
285
/*Cabecera******************************************************/
void main() {{
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
TRISB = 0;
286
// como salidas
PORTD = 0;
TRISD = 0;
// como salidas
TRISA = 0xFF;
// como entradas
PORTD = EEPROM_Read(5);
do {
PORTB = PORTB++;
Delay_ms(100);
if (PORTA.F2)
EEPROM_Write(5,PORTB); // Si se pulsa el botn MEMO, guardar el puerto PORTB
PORTD = EEPROM_Read(5);
do {
while (PORTA.F2);
}
}
while(1);
// Bucle infinito
Para comprobar el funcionamiento de este circuito, basta con pulsar el botn MEMO y apagar el dispositivo.
Despus de reiniciar el dispositivo, el programa visualizar el valor guardado en el puerto PORTD. Acurdese de
que en el momento de escribir, el valor fue visualizado en el puerto PORTB.
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera EEPROM en la ventana Library
Manager antes de compilar el programa:
EEPROM
4.11 EJEMPLO 9
Contador de dos 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 dos dgitos LED (99-0). El
punto es habilitar una conversin de un nmero binario en un decimal y partirlo en dos dgitos (en 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).
287
/*Cabecera******************************************************/
void interrupt() {
if (digit_no == 0) {
PORTA = 0;
PORTD = digit1;
// puerto PORTD
PORTA = 1;
digit_no = 1;
}else{
PORTA = 0;
288
digit_no = 0;
}
TMR0 = 0;
INTCON = 0x20;
void main() {
OPTION_REG = 0x80; // Ajustar el temporizador TMR0
TMR0 = 0;
INTCON = 0xA0;
PORTA = 0;
TRISA = 0;
// como salidas
PORTD = 0;
TRISD = 0;
// como salidas
do {
for (i = 0; i<=99; i++) { // Contar de 0 a 99
digit = i % 10u;
digit1 = mask(digit);
Delay_ms(1000);
}
} while (1);
// Bucle infinito
mask.c
/*Cabecera******************************************************/
289
Para que este ejemplo funcione apropiadamente, es necesario incluir el archivo mask.c en el proyecto (aparte del
archivo example9.c) en la ventana Project Manager antes de compilar el programa:
Example9.mcppi - Sources - Add File To Project
mask.c
example9.c
4.12 EJEMPLO 10
Utilizar el visualizador LCD
Este ejemplo muestra cmo utilizar un visualizador LCD alfanumrico. Las libreras de funciones simplifican este
programa, lo que significa que al final el esfuerzo para crear el software vale la pena.
Un mensaje escrito en dos lneas aparece en el visualizador:
mikroElektronika
LCD example
Dos segundos ms tarde, el mensaje en la segunda lnea cambia, y se visualiza 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.
290
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana
Library Manager antes de compilar el programa:
ADC
LCD
/*Cabecera*****************************************************/
// Declarar variables
unsigned char ch;
unsigned int adc_rd;
char *text;
long tlong;
291
void main() {
INTCON = 0;
ANSEL = 0x04;
TRISA = 0x04;
ANSELH = 0;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
text = "mikroElektronika";
Lcd_Out(1,1,text);
Lcd_Out(2,1,text);
ADCON1 = 0x82;
TRISA = 0xFF;
Delay_ms(2000);
text = "voltage:";
while (1) {
adc_rd = ADC_Read(2);
Lcd_Out(2,1,text);
ch = tlong / 1000;
// del resultado
Lcd_Chr(2,9,48+ch);
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10;
Lcd_Chr_CP(48+ch);
Lcd_Chr_CP(48+ch);
ch = tlong % 10;
Lcd_Chr_CP(48+ch);
Lcd_Chr_CP('V');
Delay_ms(1);
}
}
4.13 EJEMPLO 11
292
/*Cabecera******************************************************/
unsigned short i;
void main() {
UART1_Init(19200); // Inicializar el mdulo USART
293
while (1) {
if (UART1_Data_Ready()) { // si se ha recibido un dato
i = UART1_Read(); // leerlo
UART1_Write(i); // enviarlo atrs
}
}
}
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 de grandes capacidades,
los comandos utilizados para hacerlos funcionar y controlarlos tienen la forma de funciones almacenadas en la
librera One_Wire. En total son las siguientes tres funciones:
294
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
alguna de estas funciones en el programa. Si le interesa saber cmo se declaran, basta con pulsar sobre alguna
de ellas y seleccione la opcin Help.
/*Cabecera******************************************************/
295
// extraer temp_whole
temp_whole = temp2write >> RES_SHIFT ;
void main() {
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
Lcd_Init();
// Inicializar el LCD
296
// Borrar el LCD
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 EXAMPLE 13
Generacin de sonido, librera de sonido...
Las seales de audio se utilizan con frecuencia cuando se necesita llamar la atencin de usuario, 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 la generacin de sonido por medio de funciones que pertenecen a la librera Sound.
297
Adems de estas funciones, la funcin Button que pertenece a la misma librera se utiliza para probar los
botones de presin.
/*Cabecera******************************************************/
void Tone1() {
Sound_Play(659, 250); // Frecuencia = 659Hz, duracin = 250ms
}
void Tone2() {
Sound_Play(698, 250); // Frecuencia = 698Hz, duracin = 250ms
}
void Tone3() {
Sound_Play(784, 250); // Frecuencia = 784Hz, duracin = 250ms
}
298
void main() {
ANSEL = 0;
ANSELH = 0;
TRISB = 0xF0;
while (1) {
if (Button(&PORTB,7,1,1)) // RB7 genera Tono1
Tone1();
while (PORTB & 0x80) ;
299
}
}
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
Utilizar 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.
En este ejemplo el GLCD visualiza una secuencia de imgenes, de las que un mapa de bits representa un
camin almacenado en otro archivo denominado truck_bmp.c. Para habilitar que este programa funcione
apropiadamente, usted debe aadir este archivo como archivo fuente a su proyecto.
Las directivas del preprocesador incluidas en este ejemplo le permiten elegir si quiere visualizar toda la
secuencia de imgenes o slo una secuencia corta. Por defecto se visualizar toda la secuencia de imgenes.
300
void delay2S(){
Delay_ms(2000);
}
void main() {
unsigned short ii;
char *someText;
ANSEL = 0;
ANSELH = 0;
301
// Deshabilitar comparadores
C2ON_bit = 0;
Glcd_Init();
// Inicializar el GLCD
while(1) {
// Dibujar la imagen
delay2S(); delay2S();
#endif
Glcd_Fill(0x00);
// Borrar el GLCD
// Dibujar la caja
Glcd_Rectangle(5,5,84,35,1);
// Dibujar el rectngulo
// Dibujar la lnea
delay2S();
delay2S();
Glcd_Fill(0x00); // Borrar el GLCD
#ifdef COMPLETE_EXAMPLE
Glcd_Set_Font(Character8x7, 8, 7, 32);
Glcd_Write_Text("mikroE", 1, 7, 2);
// Escribir la cadena
// Dibujar la caja
delay2S();
302
// Cambiar de la fuente
// Escribir la cadena
delay2S();
Glcd_Set_Font(System3x5, 3, 5, 32);
// Cambiar de la fuente
// Escribir la cadena
delay2S();
Glcd_Set_Font(font5x7, 5, 7, 32);
// Cambiar de la fuente
// Escribir la cadena
delay2S();
Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32); // Cambiar de la fuente
someText = "5x7 Font (v2)";
Glcd_Write_Text(someText, 5, 6, 2);
// Escribir la cadena
delay2S();
#endif
}
}
truck_bmp.c:
/*Cabecera*****************************************************/
8,
8,
8,
8,
8,
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,
0,
9,
0,
9,
0,
9,
0,248,
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,192,192,224,
240,240,240,240,240,224,192,
0,
0,
0,255,255,255,255,255,195,
195,195,195,195,195,195,
0,
0,
0,
0,
0,
3,
0,
0,
0,
0,
0,
0,
0,255,240, 79,224,255, 96, 96, 96, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 64, 64, 64, 64,128,
0,
0,
0,
303
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,
0,
0,
0,255,255,255,255,255,
0,
0,
0,255,255,255,255,255,
0,
0,
0,255,255,255,255,255,129,
129,129,129,129,129,129,128,
0,
0,
0,
0,
0,
0,
0,
0,
0,
8,
8,
8,
8,
8,
8,
8,
8,
8,
255,255,255,255,255,
0,
0,
0,
0,255,
8,
8,
8,
0,
1,248,
8,
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, 96,
96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 64, 64,
64,224,224,255,246,
2,
2,
2,
2,
2,
2,
2,
2,
2,
0,
7,
3,
3,
2,
4,
4,
4,
4,
9,
9, 41,
4,
1, 14,
4,
6,
6,
2,
5,240,126,174,128, 56,
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,128,240,248,
0,
0,
0,
0,
0,
0,
0,
0,128,192,248,248,248,248,252,254,254,254,254,254,254,
254,254,254,254,254,255,255,255,255,255,246,239,208,246,174,173,
169,128,209,208,224,247,249,255,255,252,220,240,127,255,223,255,
255,255,255,255,255,254,254,255,255,255,255,255,255,255,254,255,
255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,
254,254,254,254,255,255,255,255,255,255,254,255,190,255,255,253,
240,239,221,223,254,168,136,170,196,208,228,230,248,127,126,156,
223,226,242,242,242,242,242,177, 32,
0,
0,
15, 15,
0,
1,
1,
3,
0,
0,
0,
0,
0,
0,
0,
3,
7,
7,
7,
7,
7, 15,
1,
1,
3,
7,
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,
304
1,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1,
3,
3,
7,
3, 14,
6,
6,
6,
0,
0,
0,
0,
0,
1, 19, 19,
3,
6,
6,
2,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
};
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 truck_bmp.c en el
proyecto.
4.17 EJEMPLO 15
Utilizar 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 del que se hablar aqu.
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 1Kohm. Los lados
opuestos de las lminas disponen de los contactos para acceder a un cable plano.
305
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.
306
// Leer la coordenada X
unsigned int GetX() {
//reading X
307
PORTC.F1 = 0;
Delay_ms(5);
return ADC_Read(0); // leer el valor de X de RA0(BOTTOM)
}
// Leer la coordenada Y
unsigned int GetY() {
//Leer la Y
PORTC.F0 = 0;
PORTC.F1 = 1;
Delay_ms(5);
return ADC_Read(1); // leer el valor de Y de RA1 (del elctrodo izquierdo LEFT)
}
void main() {
PORTA = 0x00;
TRISA = 0x03; // RA0 y RA1 son entradas analgicas
ANSEL = 0x03;
ANSELH = 0;
PORTC = 0 ;
TRISC = 0 ;
// Glcd_Init_EP5
// Borrar GLCD
Glcd_Write_Text(msg1,10,0,1);
Glcd_Write_Text(msg2,17,7,1);
308
while (1) {
// leer X-Y y convertirlo en la resolucin de 128x64 pxeles
x_coord = GetX();
y_coord = GetY();
x_coord128 = (x_coord * 128) / 1024;
y_coord64 = 64 -((y_coord *64) / 1024);
// Si RC6 = 0
PORTC.F6 = 1;
Glcd_Write_Text(msg7,14,4,0);
}
else { // Si RC6 = 1
PORTC.F6 = 0;
Glcd_Write_Text(msg5,14,4,0);
}
}
Glcd_Write_Text(msg8,74,4,0);
}
else { // Si RC7 = 1
PORTC.F7 = 0;
Glcd_Write_Text(msg6,74,4,0);
}
}
Delay_ms(100);
}
}
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
309
un dispositivo controlado por un microcontrolador, se necesita una PC, programa para compilar y un dispositivo
VAMOS A EMPEZAR...
Los programas especiales en el entorno de Windows se utilizan para escribir un programa para el
microcontrolador. Este libro describe el programa denominado mikroC 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 del lenguaje C. En otras
palabras, slo tiene que seguir su idea al escribir el programa. Esto es todo!
310
311
Una vez compilado, el programa se debe cargar en el chip. Usted necesita un hardware apropiado para hacerlo
posible - un programador.
PROGRAMAR EL MICROCONTROLADOR
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:
3. Abra el programa en 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 chip 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.
312
OK. The program has been written and tested with the simulator. It did not report any errors during the process of
compiling into the hex code? It seems that everything is under control...
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
un programador 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 y reloj
del oscilador etc.).
313
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...
314
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. Si es necesario,
todos estos 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.
Si dispone de un sistema de desarrollo, el proceso de programar y probar un programa es an ms sencillo.
Teniendo en cuenta que el compilador mikroC PRO for PIC (en su PC) y el hardware del programador PICflash
(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 Build and Program dentro del
compilador. Desde este momento, cualquier cambio en el programa afectar inmediatamente al funcionamiento
de alguno de los componentes del sistema de desarrollo.
Est de acuerdo con nosotros que es hora de divertirse?
315
316
317