PIC Microcontrollers - Programming in C - Free Online Book - Mikroelektronik - Spanish PDF
PIC Microcontrollers - Programming in C - Free Online Book - Mikroelektronik - Spanish PDF
PIC Microcontrollers - Programming in C - Free Online Book - Mikroelektronik - Spanish PDF
Products
Publications
Solutions
Kits
Easy Buy
Support
Downloads
Enter keywords
PIC Books
Book: PIC
Microcontrollers Programming in C
Book Overview
What are microcontrollers, anyway? Electronics built into one single chip capable of
controlling a small submarine, a crane, an elevator Its up to you to decide what you want
them to do and dump a program with the appropriate instructions into the chip. You're
probably wondering what you need for it? Just a PC, a program for compiling and a simple
device to transfer your code from the PC to the chip itself. Is it complicated? Absolutely not!
Table of Contents
This book is available for browsing and reading online, absolutely free of charge. To read book free online follow next links:
English
Chapter 1: World of Microcontrollers
Chapter 2: Programming Microcontrollers
Chapter 3: PIC16F887 Microcontroller
EasyPIC v7 is the seventh generation
of our famous PIC development
board. It is the product of accumulated
knowledge over the past 10 years, and
its state of the art of design,
functionality and quality. Board comes
with PIC18F45K22 device. [more
info]
Featured Compilers
mikroC PRO for PIC
Chapter 4: Examples
Appendix A: It is Time for Fun
Espaol
Capitulo 1 - El mundo de los microcontroladores
Capitulo 2 - Programacin de los microcontroladores
Capitulo 3 - Microcontrolador PIC16F887
Capitulo 4 - Ejemplos
Apndice A: Es hora de divertirse
Reader reviews
"One the best books that explain Microcontroller in amazing approach" by Agbawi ,Mohammed A.
"One the best books that explain Microcontroller in amazing approach, it is really valuable for beginners to study and expert as reference. I
like the new approach of 3D illustration pics which is really look nice and so attractive for illustration. Keep going..."
Popular PIC micocontrollers are
loved by hobbyists and 8-bit geeks.
mikroC helps you bring your ideas to
life easy as never before. [more info]
"This book is excellent and is a very practical way of taking theory" by Vaughn Martin
"This book is excellent and is a very practical way of taking theory and showing how it is useful when put to practice in many really great
applications. The colors are wonderful and the illustration is about the best I have ever seen in nay technical book. I teach technical writing at
a major university so I ought to know."
Disclaimer
The content published in mikroElektronikas online books is subject to copyright and must not be reproduced in any form without an explicit written
permission released from the editorial of mikroElektronika. The book was prepared with due care and attention, however the publisher doesnt accept
any responsibility neither for the exactness of the information published therein, nor for any consequences of its application.
We deliver our products to all countries in the world using following shipping options:
DHL Express: $25.00 USD for up to 5 Kgs, usually arrives in 2-4 business days.*
Post Office: $25.00 USD, no weight limit, usually arrives in 7-12 business days.
All credit card and personal details
* - Please contact your local DHL office about delivery service and possible additional charges.
$24.00 USD
Related Links:
Products
News
Forums
Distributors
About Us
Legal Information
Product Archive
171
Copyright 19982012. MikroElektronika. All rights reserved. All trade and/or services marks mentioned are the property of their respective owners.
Contact Us
Products
Solutions
Kits
Easy Buy
Support
Downloads
Enter keywords
La situacin actual en el campo de los microcontroladores se ha producido gracias al desarrollo de la tecnologa de fabricacin de los
circuitos integrados. Este desarrollo ha permitido construir las centenas de miles de transistores en un chip. Esto fue una condicin previa
para la fabricacin de un microprocesador. Las primeras microcomputadoras se fabricaron al aadirles perifricos externos, tales como
memoria, lneas de entrada/salida, temporizadores u otros. El incremento posterior de la densidad de integracin permiti crear un circuito
integrado que contena tanto al procesador como perifricos. As es cmo fue desarrollada la primera microcomputadora en un solo chip,
denominada ms tarde microcontrolador.
1.1
1.2
1.3
1.4
Introduccin
NMEROS, NMEROS, NMEROS...
DETALLES IMPORTANTES
MICROCONTROLADORES PIC
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.
Featured Compilers
mikroC PRO for PIC
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.
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).
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.
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.
Cabe destacar que es necesario utilizar slo dos dgitos binarios para representar a todos los nmeros decimales de 0 a 3. Por
consiguiente, para representar los nmeros de 0 a 7 es necesario utilizar tres dgitos binarios, para representar los nmeros de 0 a 15 cuatro dgitos etc. Dicho de manera sencilla, el mayor nmero binario que se puede representar utilizando n dgitos se obtiene al elevar la
base 2 a la potencia n. Luego, al resultado se le resta 1. Por ejemplo, si n=4:
24 - 1 = 16 - 1 = 15
Por consiguiente, al utilizar 4 dgitos binarios, es posible representar los nmeros decimales de 0 a 15, que son 16 valores diferentes en
total.
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. Asimismo, hay cero (0) positivo y negativo (refirase a la tabla de la derecha). La siguiente
pregunta sera: Cmo es posible saber de qu nmero se trata? Por ejemplo, si ponemos el nmero 10000001, es -1 o 129? No se
preocupe, de eso se encarga el compilador. sta es la razn por la que se declaran variables al escribir el programa. Bueno, de eso vamos
a hablar a continuacin.
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).
Un nibble o un cuarteto representa una mitad de byte. Dependiendo de la mitad del nmero en cuestin (izquierda o derecha), se les
denomina nibbles altos o bajos, respectivamente.
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).
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 que 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)
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.
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
Un registro o una celda de memoria es un circuito electrnico que puede memorizar el estado de un byte.
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.
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 (1020mA). 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
UNIDAD DE MEMORIA
La unidad de memoria es una parte del microcontrolador utilizada para almacenar los datos. La manera ms fcil de explicarlo es
compararlo con un armario grande con muchos cajones. Si marcamos los cajones claramente, ser fcil acceder a cualquiera de sus
contenidos al leer la etiqueta en la parte delantera del cajn.
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
La memoria programable una sola vez permite descargar un programa en el chip, pero como dice su nombre, una sola vez. Si se detecta
un error despus de descargarlo, lo nico que se puede hacer es descargar el programa correcto en otro chip.
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 microconroladores se fabrican con tecnologa flash hoy en da. Si usted va a comprar un
microcontrolador, ste es en definitiva la opcin perfecta!
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 microconrolador
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.
Decodificador de instrucciones es la parte que descodifica las instrucciones del programa y acciona otros
circuitos basndose en esto. El conjunto de instrucciones que es diferente para cada familia de microcontrolador
expresa las capacidades de este circuito;
Unidad lgica aritmtica (Arithmetical Logical Unit - ALU) realiza todas las operaciones matemticas y
lgicas sobre datos; y
Acumulador o registro de trabajo. Es un registro SFR estrechamente relacionado con el funcionamiento de la
ALU. Es utilizado para almacenar todos los datos sobre los que se debe realizar alguna operacin (sumar, mover).
Tambin almacena los resultados preparados para el procesamiento futuro. Uno de los registros SFR, denominado
Registro Status (PSW), est estrechamente relacionado con el acumulador. Muestra el estado de un nmero
almacenado en el acumulador (el nmero es mayor o menor que cero etc.) en cualquier instante dado.
BUS
El bus est formado por 8, 16 o ms cables. Hay dos tipos de buses: el bus de direcciones y el bus de datos. El bus de direcciones consiste
en tantas lneas como sean necesarias para direccionar la memoria. Se utiliza para transmitir la direccin de la CPU a la memoria. El bus
de datos es tan ancho como los datos, en este caso es de 8 bits o lneas de ancho. Se utiliza para conectar todos los circuitos dentro del
microcontrolador.
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:
Una de las cosas ms importantes en cuanto a la comunicacin en serie es el Protocolo que debe ser estrictamente observado. Es un
conjunto de reglas que se aplican obligatoriamente para que los dispositivos puedan interpretar correctamente los datos que intercambian
mutuamente. Afortunadamente, los microcontroladores se encargan de eso automticamente, as que el trabajo de programador/usuario es
reducido a la escritura y lectura de datos.
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
instrucciones. Por consiguiente, si el sistema utiliza el cristal de
cuarzo con una frecuencia de 20 MHZ, el tiempo de ejecucin de
una instruccin de programa no es 50 nS, sino 200, 400 o 800 nS
dependiendo del tipo del microcontrolador.
CIRCUITO DE ALIMENTACIN
Hay que mencionar dos cosas dignas de atencin con relacin al circuito de la fuente de alimentacin de microcontroladores:
Brown out es un estado potencialmente peligroso que ocurre al apagar el microcontrolador o en caso de que el
voltaje de la fuente de alimentacin salga de unos mrgenes debido al ruido elctrico. Como el microcontrolador
dispone de varios circuitos que funcionan a niveles de voltaje diferentes, ese estado puede causar un
comportamiento descontrolado. Para evitarlo, el microcontrolador normalmente tiene un circuito incorporado para el
brown out reset. El circuito reinicia inmediatamente el microcontrolador si el voltaje de alimentacin cae por debajo
del lmite.
El pin de reset (reinicio), marcado frecuentemente con MCLR (Master Clear Reset), sirve para el reinicio externo
del microcontrolador al aplicar un cero (0) o un uno (1) lgico dependiendo del tipo del microcontrolador. En caso de
que el circuito brown out no est incorporado, un simple circuito externo para el brown out reset se puede conectar
al pin MCLR.
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.
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.
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 pre-escalador y/o la interrupcin.
La figura anterior describe el uso de una interrupcin en el funcionamiento del temporizador. Al asignarle un pre-escalador 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.
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.
ARQUITECTURA INTERNA
Todos los microcontroladores actuales utilizan uno de dos modelos bsicos de arquitectura denominados Harvard y von-Neumann.
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 si 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)
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, mientras que la otra contiene informa cin sobre CUL dato
se debe realizar). Sin embargo, esto no es una frmula rgida, sino el caso ms frecuente. En los microcontroladores
que utilizan una arquitectura Harvard, el bus de la palabra de programa es ms ancho que un byte, lo que permite
que cada palabra de programa est compuesto por una instruccin y un dato. En otras palabras, una localidad de
memoria - una instruccin de programa.
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:
RISC (Reduced Instruction Set Computer) - Computadora con Juego de Instrucciones Reducidas
En este caso la idea es que el microcontrolador reconoce y ejecuta slo operaciones bsicas (sumar, restar, copiar etc...) Las operaciones
ms complicadas se realizan al combinar stas (por ejemplo, multiplicacin se lleva a cabo al realizar adicin sucesiva). Es como intentar
explicarle a alguien con pocas palabras cmo llegar al aeropuerto en una nueva ciudad. Sin embargo, no todo es tan oscuro. Adems, el
microcontrolador es muy rpido as que no es posible ver todas las acrobacias aritmticas que realiza. El usuario slo puede ver el
resultado final de todas las operaciones. Por ltimo, no es tan difcil explicar dnde est el aeropuerto si se utilizan las palabras adecuadas
tales como: a la derecha, a la izquierda, el kilmetro etc.
CISC (Complex Instruction Set Computer) - Computadoras con un juego de instrucciones complejo
CISC es opuesto a RISC! Los microcontroladores diseados para reconocer ms de 200 instrucciones diferentes realmente pueden realizar
muchas cosas a alta velocidad. No obstante, uno debe saber cmo utilizar todas las posibilidades que ofrece un lenguaje tan rico, lo que no
es siempre tan fcil...
RAM
[bytes]
Frecuencia
de reloj.
[MHz]
Resolucin
del
convertidor
A/D
Familia
ROM
[Kbytes]
PIC10FXXX
0.375 0.75
16 - 24
6-8
4-8
0-2
0-1
PIC12FXXX
0.75 1.5
25 - 38
4-8
0-3
0-1
Pines
Entradas
A/D
Comparadores
Temporizadores
de 8/16 bits
Comunicacin
serial
Salidas
PWM
Otros
1x 8
1x 8
EEPROM
PIC16FXXX
0.75 - 3
25 134
14 44
20
0-3
0-2
1x 8
EEPROM
PIC16HVXXX
1.5
25
18 20
20
1x 8
Vdd =
15V
1.75 3.5
PIC12HVXXX
1.75
PIC16FXXX
PIC16HVXXX
64 128
20
0-4
10
1 - 2 x 8 1 x 16
0-1
EEPROM
64
20
0-4
10
1 - 2 x 8 1 x 16
0-1
1.75 - 14
64 368
14 64
20
0 - 13
8 or 10
0-2
1 - 2 x 8 1 x 16
0-3
1.75 3.5
64 128
14 20
20
0 - 12
10
2 x 8 1 x 16
4 - 128
256 3936
18 80
32 - 48
4 - 16
10 or 12
0-3
0-2x 82-3x
16
USB2.0
CAN2.0 USART
I2C SPI
0-5
PIC18FXXJXX
8 - 128
1024 3936
28 100
40 - 48
10 - 16
10
0-2x 82-3x
16
USB2.0 USART
Ethernet I2C
SPI
2-5
PIC18FXXKXX
8 - 64
768 3936
28 44
64
10 - 13
10
1 x 8 3 x 16
Todos los microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir que su memoria de programa est conectada a la
CPU por ms de 8 lneas. Hay microcontroladores de 12, 14 y 16 bits, dependiendo 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 las 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 el porqu...
JUEGO DE INSTRUCCIONES
El juego de instrucciones para los microcontroladores 16F8XX incluye 35 instrucciones en total. La razn para un nmero tan reducido de
instrucciones yace en la arquietectura RISC. Esto quiere decir que las instrucciones son bien optimizadas desde el aspecto de la velocidad
operativa, la sencillez de la arquitectura y la compacidad del cdigo. Lo malo de la arquitectura RISC es que se espera del programador que
haga frente a estas instrucciones. Por supuesto, esto es relevante slo si se utiliza el lenguaje ensamblador para la programacin. Este libro
se refiere a la programacin en el lenguaje de alto nivel C, lo que significa que la mayor parte del trabajo ya fue hecho por alguien ms. As,
slo se tienen que utilizar instrucciones relativamente simples.
DESCRIPCIN
OPERACIN
BANDERA
CLK
MOVLW k
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
Intercambiar de nibbles en f
f(7:4),(3:0) ->
f(3:0),(7:4)
1, 2
SWAPF f,d
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
1
1
SUBLW k
Restar W de literal
k-W -> W
C, DC, Z
SUBWF f,d
Restar W de f
f-W -> d
C, DC, Z
ANDLW k
W AND k -> W
ANDWF f,d
AND W con f
W AND f -> d
IORLW k
W OR k -> W
1, 2
1, 2
1, 2
IORWF f,d
OR inclusivo de W con f
W OR f -> d
1, 2
XORWF f,d
W XOR k -> W
1, 2
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
BCF f,b
0 -> f(b)
1, 2
BSF f,b
1 -> f(b)
1, 2
BTFSC f,b
Skip if f(b) = 0
1 (2)
BTFSS f,b
Skip if f(b) = 1
1 (2)
f -> d
DECFSZ f,d
1 (2)
1, 2,
3
INCFSZ f,d
1 (2)
1, 2,
3
GOTO k
k -> PC
CALL k
RETURN
TOS -> PC
RETLW k
RETFIE
NOP
No operacin
CLRWDT
TO, PD
SLEEP
TO, PD
Otras instrucciones
1
*1 Si un registro de E/S est modificado, el valor utilizado ser el valor presentado en los pines del microcontrolador.
*2 Si la instruccin se ejecuta en el registro TMR y si d=1, el pre-escalador ser borrado.
*3 Si la instruccin se ejecuta en el registro TMR y si d=1, el pre-escalador ser borrado.
Arquitectura de los microcontroladores PIC de 8 bits. Cules de estos mdulos pertenecern al microcontrolador, depender del tipo de
microcontrolador.
table of contents | next chapter
Related Links:
Products
News
Forums
Distributors
About Us
Legal Information
Product Archive
Copyright 19982012. MikroElektronika. All rights reserved. All trade and/or services marks mentioned are the property of their respective owners.
Contact Us
Products
Solutions
Kits
Easy Buy
Support
Downloads
Enter keywords
Usted seguramente sabe que no es suficiente slo conectar el microcontrolador a los otros componentes y encender una fuente de
alimentacin para hacerlo funcionar, verdad? Hay que hacer algo ms. Se necesita programar el microcontrolador. Si cree que esto es
complicado, est equivocado. Todo el procedimiento es muy simple. Basta con leer el texto para entender de lo que estamos hablando.
Featured Compilers
LENGUAJE ENSAMBLADOR
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).
HEste 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.
Incluso una sola operacin en el programa escrito en ensamblador consiste en muchas instrucciones, hacindolo
muy largo y difcil de manejar.
Cada tipo de microcontrolador tiene su propio conjunto de instrucciones que un programador tiene que conocer para
escribir un programa
Un programador tiene que conocer el hardware del microcontrolador para escribir un programa
Programa escrito en C (El mismo programa compilado al cdigo ensamblador):
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 lgicas, desplazamiento etc.). Las caractersticas de C pueden
ser muy tiles al programar los microcontroladores. Adems, C est estandarizado (el estndar ANSI), es muy portable, as que el mismo
cdigo se puede utilizar muchas veces en diferentes proyectos. Lo que lo hace accesible para cualquiera que conozca este lenguaje sin
reparar en el propsito de uso del microcontrolador. C es un lenguaje compilado, lo que significa que los archivos fuentes que contienen el
cdigo C se traducen a lenguaje mquina por el compilador. Todas estas caractersticas hicieron al C uno de los lenguajes de programacin
ms populares.
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.
A continuacin vamos a presentar a los elementos principales del lenguaje mikroC desarrollado por Mikroelektronika. Este lenguaje es muy
similar al C estndar, no obstante en determinados aspectos difiere del ANSI estndar en algunas caractersticas. Algunas de estas
diferencias se refieren a las mejoras, destinadas a facilitar la programacin de los microcontroladores PIC, mientras que las dems son la
consecuencia de la limitacin de la arquitectura del hardware de los PIC. Aqu vamos a presentar caractersticas especficas del lenguaje
mikroC en la programacin de los microcontroladores PIC. El trmino C se utilizar para referirse a las caractersticas comunes de los
lenguajes C y mikroC.
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 temperatura y visualizar los resultados en un LCD. El proceso de
medicin se realiza por un sensor que convierte temperatura en voltaje. El microcontrolador utiliza el convertidor A/D para convertir este
voltaje (valor analgico) en un nmero (valor digital) que luego se enva al LCD por medio de varios conductores. En consecuencia, el
programa se divide en cuatro partes, de las que cada una corresponde a una accin especfica:
Y ahora, su primer programa real! La figura muestra la estructura de programa, sealando las partes en las que consiste.
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.
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 el porqu... Con frecuencia es necesario mejorar, modificar, actualizar, simplificar un programa... No es posible interpretar incluso
los programas simples sin utilizar los comentarios.
DESCRIPCIN
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
TAMAO (NMERO DE
BITS)
RANGO DE VALORES
*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
char
int
TAMAO (NMERO DE
BITS)
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 a
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
0x11
11
-152
011
0b11
//
//
//
//
//
formato
formato
formato
formato
formato
0.
-1.23
23.45e6
2e-5
3E+10
.09E34
//
//
//
//
//
//
=
=
=
=
=
=
0.0
-1.23
23.45 * 10^6
2.0 * 10^-5
3.0 * 10^10
0.09 * 10^34
59 // entero
'p' // carcter ASCII 'p'
Una secuencia de caracteres es denominada cadena (string). Las cadenas estn encerradas entre comillas dobles, por ejemplo:
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.
El compilador mikroC reconoce 33 palabras clave:
MIKROC - PALABRAS CLAVE
absolute
data
if
return
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
typedef
temperatura_V1
Presin
no_corresponder
dat2string
SuM3
_vtexto
7temp
%ms_alto
if
j23.07.04
nombre de variable
//
//
//
//
//
//
//
//
//
//
//
OK
OK
OK
OK
OK
OK
NO
NO
NO
NO
NO
------
no
no
no
no
no
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):
Si hay varias variables con el mismo valor inicial asignado, el proceso se puede simplificar:
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
enum motor_de_ascensor {PARADA,INICIO,NORMAL,MXIMO};
Velocidad_de_ascensor = NORMAL; // Velocidad_de_ascensor = 2
typedef unsigned int positivo; // positivo es un sinnimo para el tipo sin signo int
positivo a,b;
// Variables a y b son de tipo positivo
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.
El mbito de variables locales est limitado por el bloque encerrado entre llaves {} en el que han sido declaradas. Por ejemplo, si estn
declaradas en el principio del cuerpo de funcin (igual que en la funcin main) su mbito est entre el punto de declaracin y el fin de esa
funcin. Refirase al ejemplo anterior. A las variables locales declaradas en main() no se les puede acceder desde la Funcin_1 y al revs.
Un bloque compuesto es un grupo de declaraciones y sentencias (que pueden ser bloques tambin) encerradas entre llaves. Un bloque
puede ser una funcin, una estructura de control etc. Una variable declarada dentro de un bloque se considera local, o sea, existe slo
dentro del bloque. Sin embargo, las variables declaradas fuera del mbito todava son visibles.
Aunque las constantes no pueden ser modificadas en el programa, siguen las mismas reglas que las variables. Esto significa que son
visibles dentro de su bloque a excepcin de las constantes globales (declaradas fuera de cualquier funcin). Las constantes se declaran
normalmente en el inicio del cdigo fuera de cualquier funcin (como variables globales).
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:
int cnt = 0;
void hello();
void hello(){ // Modificaciones que afectan a la
.
// cnt en File_1 son visibles aqu
.
.
}
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.
int
a =
b =
c =
c =
a,b,c;
5;
4;
a + b;
c%2;
//
//
//
//
//
//
//
//
OPERADOR
OPERACIN
Adicin
Resta
Multiplicacin
Divisin
Resto de la divisin
Declarar 3 enteros a, b, c
Inicializar a
Inicializar b
c = 9
c = 1. Esta operacin se utiliza con frecuencia
para comprobar la paridad. En este caso, el
resultado es 1 lo que significa que la variable
es un nmero imparo
OPERADORES DE ASIGNACIN
Hay dos tipos de asignacin en el lenguaje C:
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
EJEMPLO
DESCRIPCIN
++a
--b
--
int
a =
c =
b =
a++
b--
a, b, c;
b = 5;
1 + a++; // c = 6
++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
==
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.
OPERADORES
ASOCIATIVIDAD
Alta
() [] -> .
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
Baja
int
a =
b =
res
res
a, b, res;
10;
100;
= a*(a + b); // resultado = 1100
= a*a + b;
// resultado = 200
La autoconversin se realiza asimismo en las operaciones de asignacin. El resultado de la expresin de la derecha del operador de la
asignacin siempre se convierte en el tipo de la variable de la izquierda del operador. Si el resultado es de tipo de la prioridad ms alta, se
descarta o se redondea para coincidir con el tipo de la variable. Al convertir un dato real en un entero, siempre se descartan los nmeros
que siguen al punto decimal.
int x;
// A la variable x se le asigna el tipo integer (un entero)
x = 3;
// A la variable x se le asigna el valor 3
x+ = 3.14; // El valor 3.14 se agrega a la variable x al
// realizar la operacin de asignacin
/* El resultado de la adicin es 6 en vez de 6.14, como era de esperar.
Para obtener el resultado esperado sin descartar los nmeros que siguen al
punto decimal, se debe declarar x como un punto flotante. */
Para realizar una conversin explcita, antes de escribir una expresin o una variable hay que especificar el tipo de resultado de operacin
entre parntesis.
if(expresin) operacin;
Si el resultado de la expresin encerrada entre parntesis es verdadero (distinto de 0) la operacin se realiza y el programa contina con la
ejecucin. Si el resultado de la expresin es falso (0), la operacin no se realiza y el programa contina inmediatamente con la ejecucin.
Como hemos mencionado, la otra forma combina tanto el operador if como el else:
Si el resultado de la expresin es verdadero (distinto de 0), se realiza operacin1, de lo contrario se realiza la operacin2. Despus de
realizar una de las operaciones, el programa contina con la ejecucin.
La sentencia if-else se parece a lo siguiente:
if(expresin)
operacin1
else
operacin2
Si operacin1 u operacin2 est compuesta, escriba una lista de sentencias encerradas entre llaves. Por ejemplo:
if(expresin) {
... //
... // operacin1
...} //
else
operacin2
El operador if-else se puede sustituir por el operador condicional '?:':
Si el valor de la expresin1 es distinto de 0 (verdadero), el resultado de la expresin entera ser equivalente al resultado obtenido de la
expresin2. De lo contrario, si la expresin1 es 0 (falso), el resultado de la expresin entera ser equivalente al resultado obtenido de la
expresin3. Por ejemplo:
Operador Switch
A diferencia de la sentencia if-else que selecciona entre dos opciones en el programa, el operador switch permite elegir entre varias
opciones. La sintaxis de la sentencia switch es:
case constante2:
operacin2 // El grupo de operadores se ejecuta si
...
// el selector y la constante2 son equivalentes
break;
...
default:
operacin_esperada // El grupo de operadores que se ejecuta si
...
// ninguna constante equivale al selector
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:
while(expresin){
comandos
...
}
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:
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
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:
do
operacin
while (cambiar_condicin);
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;
do {
//
//
//
//
//
//
Condicin
Visualizar hello en el LCD
Retardo de 1000 ms
Borrar el LCD
Retardo de 500ms
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 utiliza para salir de las sentencias switch si la condicin
case es verdadera. En este ejemplo, Esperar est parpadeando en la pantalla LCD hasta que el programa detecte un uno lgico en el pin
0 del puerto PORTA.
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 (:).
...
if(CO2_sensor) goto aire acondicionado; //
...
//
//
//
...
Aire acondicionado:
//
//
...
//
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:
Para leer o modificar un elemento de matriz del ejemplo anterior, basta con introducir su ndice encerrado entre corchetes:
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
// los miembros de la matriz profundidad
// de sonda son de tipo int
for(i=0;i<(MUESTRAS_DE_AGUA/2);i++){ // Bucle se ejecuta 2 veces
temp = profundiad_de_sonda [i];
// temp se utiliza para guardar un valor
// temporalmente
profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i];
profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp;
}
// Aqu tenemos: profundidad_de_sonda [MUESTRAS_DE_AGUA] = {1987,1,25,24}
}
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.
En la declaracin de esta matriz nmero_de_filas y nmero_de_columnas representan el nmero de filas y columnas en las que consiste
una tabla, respectivamente. Vea la siguiente matriz bidimensional:
int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas
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;
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:
{0,5,10};
v contiene la direccin de voltio[0]
voltio[1] = 2
tab[2] = 1 (tab[0] + 1)
voltio[2] = 2
v contiene la direccin de voltio[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;
..
};
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 automticamente esta funcin y no es posible llamarla por otra
funcin. La sintaxis de esta funcin es la siguiente:
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:
Cada funcin debe ser declarada apropiadamente para poder interpretarla correctamente durante el proceso de compilacin. La declaracin
contiene los siguientes elementos:
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;
// Devolver el valor contenido en r
return (2*x - y); // Devolver el valor de la expresin 2*x-y
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).
La funcin puede contener ms de una sentencia return. En este caso, al ejecutar la primera sentencia return, la funcin devuelve el valor
correspondiente y se detiene la ejecucin de la funcin.
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:
tipo de resultado
nombre de funcin
tipos de parmetros
un punto y coma (;)
El prototipo de la funcin main no necesita ser declarado.
float resultado,a,b; //
//
int time = 100;
//
a = 10.54;
b = 5.2;
resultado = f(a,b); //
pausa_1(tiempo);
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.
// Declaracin de variables
// Bandera de bit indica que se ha hecho una permutacin
while(permut!=0) {
// Quedarse en el bucle hasta reinicar la bandera
permut = 0;
// Bandera reiniciada
for(i=0;i<SIZE-1;i++) { // Comparar y oredenar los miembros de la
// matriz (dos a dos)
if(sequence [i] > sequence[i+1]){
temp = sequence [i];
sequence[i] = sequence[i+1];
sequence[i+1] = temp;
permut = 1; // Se ha hecho una permutacin, bandera de bit
//se pone a uno
}
}
}
return sequence[SIZE-1]; // Devolver el valor del ltimo miembro
} // que es al mismo tiempo el miembro con el mximo valor
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*);
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]'.
FUNCIONES
#include
#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.
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"
TRISB = 0; // todos los pines del puerto PORTB se configuran como salidas
PORTB = 0; // todos los pines del PORTB se ponen a 0
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:
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;
//
//
//
bit bg = 0; //
bit bg;
bg = 0;
//
Una o ms instrucciones en ensamblador estn insertadas en el programa escrito en C, utilizando el comando asm:
asm
{
instrucciones en ensamblador
...
}
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.
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++ ;
// Al producirse una interrupcin
// la cnt se incrementa en 1
PIR1.TMR1IF = 0; // Poner a 0 el bit TMR1IF
}
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 que
C_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
- 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
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...
El ltimo paso - la instalacin del controlador (driver)!
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!
Desgraciadamente, una descripcin detallada de todas las opciones disponibles de este IDE nos tomara mucho tiempo. Por eso vamos a
describir slo lo ms importante del compilador mikroC PRO for PIC. De todos modos, para obtener ms informacion presione el botn de
Ayuda (Help) [F1].
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 en circuito - In Circuit Debugger) permite ejecutar el programa paso a paso y proporcionar un
acceso al contenido actual de todos los registros de un microcontrolador real.
El simulador no utiliza los dispositivos reales para simular el funcionamiento del microcontrolador, as que algunas operaciones no pueden
ser reproducidas (por ejemplo, interrupcin). De todos modos, resulta ms rpido depurar un programa por medio de un simulador. Adems,
no se requiere ningn dispositivo destino.
Note que es posible modificar cualquier configuracin en cualquier momento mientras se edita el programa. No se olvide de recompilar y
reprogramar su dispositivo despus de modificar una configuracin.
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.
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.
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.
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.
Para visualizar esta ventana es necesario seleccionar la opcin View/Debug Windows/Watch Values. Entonces usted puede hacer una lista
de registros/variables que quiere monitorear y la manera de visualizarlos.
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...).
TERMINAL USART
El terminal USART representa una sustitucin para la estndar Windows Hyper Terminal. Se puede utilizar para controlar el funcionamiento
del microcontrolador que utiliza la comunicacin USART. Tales microcontroladores estn incorporados en un dispositivo destino y
conectados al conector RS232 de la PC por medio de un cable serial.
La ventana USART terminal dispone de opciones para configurar la comunicacin serial y visualizar los datos enviados/ recibidos.
EDITOR EEPROM
Al seleccionar la opcin EEPROM Editor del men Tools, aparecer una ventana como se muestra en la siguiente figura. As es cmo
funciona la memoria EEPROM del microcontrolador. Si quiere cambiar de su contenido despus de cargar el programa en el
microcontrolador, sta es la forma correcta de hacerlo. El nuevo contenido es un dato de un tipo especfico (char, int o double), primero debe
seleccionarlo, introducir el valor en el campo Edit Value y pulsar sobre Edit. Luego, pulse sobre el botn Save para guardarlo como un
documento con extensin .hex. Si la opcin Use EEPROM in Project est activa, los datos se cargarn automticamente en el
microcontrolador durante el proceso de la programacin.
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.
previous chapter | table of contents | next chapter
Related Links:
Products
News
Forums
Distributors
About Us
Legal Information
Product Archive
Copyright 19982012. MikroElektronika. All rights reserved. All trade and/or services marks mentioned are the property of their respective owners.
Contact Us
Products
Solutions
Kits
Easy Buy
Support
Downloads
Enter keywords
Featured Compilers
mikroC PRO for PIC
3 temporizadores/contadores
independientes
Temporizador perro guardin
Mdulo comparador analgico con
Dos comparadores analgicos
Referencia de voltaje fija (0.6V)
Referencia de voltaje programable en el chip
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 CPU cuenta con slo 35 instrucciones simples. Cabe decir que para poder programar otros microcontroladores
en lenguaje ensamblador es necesario saber ms de 200 instrucciones
El tiempo de ejecucin es igual para casi todas las instrucciones y tarda 4 ciclos de reloj. La frecuencia del
oscilador se estabiliza por un cristal de cuarzo. Las instrucciones de salto y de ramificacin tardan ocho ciclos de
reloj en ejecutarse. Esto significa que si la velocidad de operacin del microcontrolador es 20 MHz, el tiempo de
ejecucin de cada instruccin ser 200nS, o sea, el programa ejecutar 5millones de instrucciones por segundo!
MEMORIA
El PIC16F887 tiene tres tipos de memoria: ROM, RAM y EEPROM. Como cada una tiene las funciones, caractersticas y organizacin
especficas, vamos a presentarlas por separado.
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.
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.
PORTC = 0b01100011
...
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?
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.
Cabe tener en mente que el dato se apila circularmente. Esto significa que despus de que se apile ocho veces, la novena vez se
sobrescribe el valor que se almacen al apilar el dato por primera vez. La dcima vez que se apile, se sobrescribe el valor que se almacen
al apilar el dato por segunda vez etc. Datos sobrescritos de esta manera no se pueden recuperar. Adems, el programador no puede
acceder a estos registros para hacer escritura/lectura. No hay ningn bit de estado para indicar el estado de desbordamiento o
subdesbordamiento de pila. Por esta razn hay que tener un especial cuidado al escribir un programa.
Vamos a hacerlo en mikroC...
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 vector), pero en este caso slo hay uno. En consecuencia, la primera parte da la rutina de interrupcin consiste en
detectar la fuente de interrupcin.
Por fin, al reconocer la fuente de interrupcin y al terminar de ejecutar la rutina de interrupcin el microcontrolador alcanza la instruccin
RETFIE ,
toma la direccin de la pila y contina con la ejecucin de programa desde donde se interrumpi.
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.
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.
RP0
BANCO ACTIVO
Banco 0
Banco 1
Banco 2
Banco 3
DC - Digit carry/borrow bit (bit de acarreo/prstamo de dgito) cambia al sumar o al restar si ocurre un
"desbordamiento" o un "prstamo" en el resultado.
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.
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.
1 - Incrementa en flanco descendente en el pin TOCKI.
0 - Incrementa en flanco ascendente en el pinTOCKI.
temporizador o al WDT.
1 - Pre - escalador se le asigna al WDT.
0 - Pre - escalador se le asigna al temporizador Timer0.
PS2, PS1, PS0 Prescaler Rate Select bits (bit selector del valor del divisor de frecuencia)
El valor del divisor de frecuencia se selecciona al combinar estos tres bits. Como se muestra en la siguiente tabla, el valor del divisor de
frecuencia se le asigna al temporizador (Timer0) o al temporizador perro guardin (WDT).
PS2
PS1
PS0
TMR0
WDT
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...
al WDT (1:128)
WDT
exceder 32.768 microsegundos (128x256)
WDT
exceder 32.768 microsegundos (128x256)
WDT
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:
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.
1 - Habilita las interrupciones no enmascaradas.
0 - Deshabilita las interrupciones no enmascaradas.
PEIE - Peripheral Interrupt Enable bit (bit de habilitacin de interrupciones perifricas) es similar al bit GIE,
sin embargo controla interrupciones habilitadas por los perifricos. Eso significa que no influye en interrupciones
causadas por el temporizador Timer0 o por el cambio del estado en el puerto PORTB o por el cambio en el pin
RB0/INT.
1 - Habilita las interrupciones perifricas no enmascaradas.
0 - Deshabilita las interrupciones perifricas no enmascaradas.
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.
1 - Habilita interrupciones por Timer0.
0 - Deshabilita interrupciones por Timer0.
INTE - RB0/INT External Interrupt Enable bit (bit de habilitacin de la interrupcin externa en RB0) controla
interrupciones causadas por el cambio del estado lgico en el pin de entrada RB0/INT (interrupcin externa).
1 - Habilita interrupciones externas INT.
0 - Deshabilita interrupciones externas INT.
RBIE - RB Port Change Interrupt Enable bit (bit de habilitacin de interrupciones por cambios en el puerto
PORTB). Cuando se configuran como entradas, los pines en el puerto PORTB pueden causar una interrupcin al
cambiar el estado lgico (no importa si se produce bajada o subida de tensin, lo que importa es que se produce un
cambio). Este bit determina si una interrupcin va a ocurrir.
1 - Habilita interrupciones por cambio en el puerto PORTB.
0 - Deshabilita interrupciones por cambio en el puerto PORTB.
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.
1 - En el registro del Timer0 ha ocurrido desbordamiento (esta bandera debe volverse a 0 por software).
0 - En el registro del Timer0 no ha ocurrido desbordamiento.
INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupcin externa en INT) detecta el cambio
en el estado lgico en el pin INT.
1 - Ha ocurrido una interrupcin externa por INT (esta bandera debe volverse a 0 por software)
0 - No ha ocurrido una interrupcin externa por INT.
RBIF - RB Port Change Interrupt Flag bit (bit de bandera de interrupcin por cambio en el puerto RB)
detecta cualquier cambio del estado lgico de alguno de los pines de entrada en el puerto PORTB.
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.
// El pin PORTB.4 se configura como una entrada sensible al cambio del estado lgico.
void initMain() {
ANSEL = ANSELH = 0;
PORTB = 0;
TRISB = 0b00010000;
RBIE = 1;
IOCB4 = 1;
GIE = 1;
...
...
...
//
//
//
//
//
//
//
//
//
//
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).
1 - Habilita la interrupcin ADC.
0 - Deshabilita la interrupcin ADC.
RCIE - EUSART Receive Interrupt Enable bit (bit de habilitacin de interrupciones de recepcin
del EUSART).
1 - Habilita la interrupcin de recepcin del EUSART.
0 - Deshabilita la interrupcin de recepcin del EUSART.
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).
1 - Habilita la interrupcin del MSSP.
0 - Deshabilita la interrupcin del MSSP.
CCP1IE - CCP1 Interrupt Enable bit (bit de habilitacin de la interrupcin del mdulo 1 de
Comparacin/Captura/PWM - CCP1) permite generar una peticin de interrupcin en el mdulo CCP1 utilizado para
procesamiento de la seal PWM.
TMR2IE - TMR2 to PR2 Match Interrupt Enable bit (bit de habilitacin de la interrupcin de
igualdad entre TMR2 y PR2)
1 - Habilita la interrupcin de igualdad entre TMR2 y PR2.
0 - Deshabilita la interrupcin de igualdad entre TMR2 y PR2.
TMR1IE - TMR1 Overflow Interrupt Enable bit (bit de habilitacin de la interrupcin de desbordamiento del
temporizador Timer1) habilita generar una peticin de interrupcin despus de cada desbordamiento en el registro
del temporizador Timer1, o sea el contador se pone a cero.
1 - Habilita la interrupcin de desbordamiento del temporizador Timer1.
0 - Deshabilita la interrupcin de desbordamiento del temporizador Timer1.
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Registro PIE2
El registro PIE2 tambin contiene varios bits de habilitacin de interrupciones.
OSFIE - Oscillator Fail Interrupt Enable bit (bit de habilitacin de la interrupcin de fallo en el
oscilador)
1 - Habilita la interrupcin de fallo en el oscilador.
0 - Deshabilita la interrupcin de fallo en el oscilador.
C2IE - Comparator C2 Interrupt Enable bit (bit de habilitacin de la interrupcin del comparador
C2)
1 - Habilita la interrupcin del comparador C2.
0 - Deshabilita la interrupcin del comparador C2.
C1IE - Comparator C1 Interrupt Enable bit (bit de habilitacin de la interupcin del comparador
C1)
1 - Habilita la interrupcin del comparador C1
0 - Deshabilita la interrupcin del comparador C1.
EEIE - EEPROM Write Operation Interrupt Enable bit (bit de habilitacin de la interrupcin de
escritura en la memoria EEPROM)
1 - Habilita la interrupcin de escritura en la memoria EEPROM.
0 - Deshabilita la interrupcin de escritura en la memoria EEPROM.
BCLIE - Bus Collision Interrupt Enable bit (bit de habilitacin de la interrupcin de colisin de
bus)
1 - Habilita la interrupcin de colisin de bus.
0 - Deshabilita la interrupcin de colisin de bus.
ULPWUIE - Ultra Low-Power Wake-up Interrupt Enable bit (bit de habilitacin de la interrupcin
para salir del modo de ultra bajo consumo - la reactivacin)
1 - Habilita la interrupcin para salir del modo de ultra bajo consumo.
0 - Deshabilita la interrupcin para salir del modo de ultra bajo consumo.
CCP2IE - CCP2 Interrupt Enable bit (bit de habilitacin de la interrupcin del mdulo 2 de
Comparacin/Captura/PWM (CCP2)
1 - Habilita la interrupcin del CCP2.
0 - Deshabilita la interrupcin del CCP2.
/* El comparador C2 se configura para utilizar los pines RA0 y RA2 como entradas. Al producirse
un cambio en la salida del comparador, el pin de salida PORTB.1 cambia el estado lgico en la
rutina de interrupcin.*/
void interrupt() {
PORTB.F1 = ~PORTB.F1 ;
PIR2.C2IF = 0;
}
void main() {
TRISB = 0;
//
//
//
//
//
//
//
PORTB.F1 = 1;
//
ANSEL = 0b00000101;;
//
//
ANSELH = 0;
//
CM2CON0.C2CH0 = CM2CON0.C2CH1 = 0; //
//
PIE2.C2IE = 1;
//
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)
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)
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)
1 - El bfer de transmisin del EUSART est vaco. El bit se pone a cero al esribir un dato en el registro TXREG.
0 - El bfer de transmisin del EUSART est lleno.
SSPIF - Master Synchronous Serial Port (MSSP) Interrupt Flag bit (bit de bandera de la
interrupcin de puerto serie sncrono maestro)
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 I 2 C). El bit debe ponerse a cero por software antes de volver de la rutina de servicio de
interrupciones)
0 - No se ha cumplido ninguna condicin de ocurrir una interrupcin del MSSP.
CCP1IF - CCP1 Interrupt Flag bit (bit de bandera de la interrupcin del mdulo 1 de
Comparacin/Captura/PWM (CCP1).
1 - Se ha cumplido la condicin de la interrupcin del CCP1 (CCP1 es una unidad para captar, comparar y generar una seal
PWM). Dependiendo del modo de operacin (modo captura o modo comparacin), se produce una captura o la igualdad en la
comparacin. En ambos casos, el bit debe volverse a cero por software. El bit no se utiliza en el modo PWM.
0 - No se ha cumplido la condicin de la interrupcin del CCP1.
TMR2IF - Timer2 to PR2 Interrupt Flag bit (bit de bandera de la interrupcin de igual dad entre
el temporizador Timer2 y el registro PR2)
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).
0 - No se ha producido igualdad con el valor del TMR2 y el valor del PR2.
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)
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.
0 - El oscilador del sistema funciona correctamente.
C2IF - Comparator C2 Interrupt Flag bit (bit de bandera de la interrupcin del comparador C2)
1 - La salida del comparador analgico C2 ha sido cambiada (el bit C2OUT). El bit debe ponerse a cero por software.
0 - La salida del comparador analgico C2 no ha sido cambiada.
C1IF - Comparator C1 Interrupt Flag bit (bit de bandera de la interrupcin del comparador C1)
1 - La salida del comparador analgico C1 ha sido cambiada (el bit C1OUT). El bit debe ponerse a cero por software.
0 - La salida del comparador analgico C1 no ha sido cambiada.
EEIF - EE Write Operation Interrupt Flag bit (bit de bandera de la interrupcin de la operacin de
escritura en la memoria EEPROM)
1 - La operacin de escritura en la memoria EEPROM se ha completado. El bit debe ponerse a cero por software.
0 - La operacin de escritura en la memoria EEPROM no se ha completado o todava no se ha iniciado.
BCLIF - Bus Collision Interrupt Flag bit (bit de bandera de la interrupcin de colisin de bus en
el MSSP)
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.
0 - No se ha producido colisin de bus en el MSSP.
ULPWUIF - Ultra Low-power Wake-up Interrupt Flag bit (bit de bandera de la interrupcin para
salir del modo de ultra bajo consumo - la reactivacin)
1 - Se ha cumplido la condicin de salir del modo de ultra bajo consumo. El bit debe ponerse a cero por software.
0 - No se ha cumplido la condicin de salir del modo de ultra bajo consumo.
//
//
//
//
//
//
//
PIE2.ULPWUIE = 1;
// Habilitar la interrupcin por el mdulo ULPWU
INTCON.GIE = INTCON.PEIE = 1; // Habilitar todas las interrupciones
asm SLEEP;
// Pasar al modo de bajo consumo
...
...
Registro PCON
El registro PCON contiene solamente dos bits de banderas utilizados para diferenciar entre un Power-on reset (POR), un Brown-out reset
(BOR), un reinicio por el temporizador perro guardin (WDT) y un reinicio externo por el pin MCLR.
ULPWUE - Ultra Low-Power Wake-up Enable bit (bit de habilitacin para salir del modo de ultra
bajo consumo - la reactivacin)
1 - Se habilita salir del modo de ultra bajo consumo.
0 - No se habilita salir del modo de ultra bajo consumo.
SBOREN - Software BOR Enable bit (bit de habilitacin del BOR por software)
1 - Se habilita Brown-out reset.
0 - Se deshabilita Brown-out reset.
BOR - Brown-out Reset Status bit (bit de estado Brown - out reset)
1 - No se ha producido Brown - out reset.
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.
El registro PCLATH se borra con cada reinicio.
En el lenguaje ensamblador, el valor del contador de programa est marcado con PCL y se refiere slo a los ocho
bits. Usted debe tener cuidado al utilizar la instruccin "ADDWF PCL" . Esto es una instruccin de salto que especifica
la localidad destino al aadir un nmero a la direccin actual. Se utiliza con frecuencia para saltar a la tabla de
bsqueda o a la tabla de ramificacin de programa y leerlas. Un problema surge si la direccin actual es de tal
tamao que al sumar se produce un cambio en un bit que pertenece al byte superior del registro PCLATH.
La ejecucin de una instruccin sobre el registro PCL causa simultneamente la sustitucin de los bits del contador
de programa por los contenidos en el registro PCLATH. De todos modos, el registro PCL puede acceder slo a 8
bits inferiores del resultado de la instruccin, pues el siguiente salto ser completamente incorrecto. La solucin a
este problema es poner estas instrucciones en las direcciones que terminan en xx00h. De esta manera se habilitan
los saltos de programa hasta 255 localidades. Si se ejecutan los saltos ms largos por medio de esta instruccin, el
registro PCLATH debe ser incrementado por 1 cada vez que se produce desbordamiento en el registro PCL.
Al llamar una subrutina o al ejecutarse un salto (instrucciones CALL y GOTO ), el microcontrolador es capaz de
proporcionar solamente direccionamiento de 11 bits. Similar a la RAM que est dividida en bancos, la ROM est
dividida en las cuatro pginas de 2K cada una. Las instrucciones dentro de estas pginas se ejecutan
regularmente. Dicho de manera sencilla, como el procesador est proporcionado con una direccin de 11 bits del
programa, es capaz de direccionar cualquier localidad dentro de 2KB. La siguiente figura muestra el salto a la
direccin del subprograma PP1.
Sin embargo, si una subrutina o una direccin de salto no est en la misma pgina que la localidad de salto, se deben proporcionar dos bits
superiores que faltan al escribir en el registro PCLATH. La siguiente figura muestra el salto a la direccin de la subrutina PP2.
En ambos casos, cuando la subrutina llega a las instrucciones RETURN , RETLW o RETFIE (vuelta al programa principal), el microcontrolador
continuar con la ejecucin de programa desde donde se interrumpi, ya que la direccin de retorno se empuja y se guarda en la pila que
consiste en registros de 13 bits, como hemos mencionado.
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.
// El pin PORTA.2 se configura como una entrada digital. Todos los dems pines del puerto
// PORTA son salidas digitales
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como digitales
PORTA = 0;
// Todos los pines del puerto PORTA se ponen a cero
TRISA = 0b00000100; // Todos los pines del puerto PORTA excepto el
// PORTA.2 se configuran como salidas
...
UNIDAD ULPWU
El microcontrolador se utiliza generalmente en los dispositivos que funcionan peridicamente y completamente independiente utilizando una
fuente de alimentacin de batera. En tal caso, el consumo de corriente mnimo es una de las prioridades. Los ejemplos tpicos de tales
aplicaciones son: termmetros, sensores de deteccin del fuego y similar. Es conocido que al reducir frecuencia de reloj se reduce el
consumo de corriente, pues una de las soluciones ms convenientes a este problema es bajar la frecuencia de reloj, o sea utilizar el cristal
de cuarzo de 32KHz en vez de el de 20MHz.
Al poner el microcontrolador en el modo de reposo es otro paso en la misma direccin. An ha quedado
el problema de salir de este modo y poner el microcontrolador en modo normal de funcionamiento. Es
obviamente necesario tener una seal externa en alguno de los pines. Esta seal debe ser generada
por componentes electrnicos adicionales, lo que resulta en un consumo de energa ms alto del
dispositivo completo...
La solucin perfecta sera que el microcontrolador saliera del modo de reposo peridicamente por si
mismo, lo que no es imposible. El circuito que lo habilita se muestra en la figura a la izquierda.
El principio de funcionamiento es simple:
Un pin se configura como salida y se le lleva un uno lgico (1). Esto causa una carga del capacitor. Inmediatamente despus, el mismo pin
se configura como entrada. El cambio de estado lgico habilita una interrupcin y el microcontrolador entra en modo de reposo. Slo ha
quedado esperar que se descargue el capacitor por la corriente de fuga fluyendo por el pin de entrada. Despus de la descarga, se produce
una interrupcin y el microcontrolador contina con la ejecucin de programa en modo normal. Todo el procedimiento se repite.
En teora, esto es una solucin perfecta. El problema es que todos los pines capaces de
causar una interrupcin son digitales y tienen una corriente de fuga relativamente alta cuando
el voltaje sobre ellos no est cerca de los valores lmites de Vdd (1) o VSS (0). En este caso, el
Similar al puerto PORTA, un uno lgico (1) en el registro TRISB configura el pin apropiado en el puerto PORTB y al revs. Los seis pines de
este puerto se pueden comportar como las entradas analgicas (AN). Los bits del registro ANSELH determinan si estos pines sern
configurados como entradas analgicas o entradas/salidas digitales:
RB0 = AN12 (determinado por el bit ANS12 del registro ANSELH)
RB1 = AN10 (determinado por el bit ANS10 del registro ANSELH)
RB2 = AN8 (determinado por el bit ANS8 del registro ANSELH)
RB3 = AN9 (determinado por el bit ANS9 del registro ANSELH)
RB4 = AN11 (determinado por el bit ANS11del registro ANSELH)
RB4 = AN11 (determinado por el bit ANS11del registro ANSELH)
Cada bit de este puerto tiene una funcin adicional relacionada a algunas unidades perifricas integradas, que vamos a describir en los
siguientes captulos.
Este puerto dispone de varias caractersticas por las que se distingue de otros puertos y por las que sus pines se utilizan con frecuencia:
Todos los pines del puerto PORTB tienen las resistencias pull-up integradas, que los hacen perfectos para que se
conecten con los botones de presin (con el teclado), interruptores y optoacopladores. Con el propsito de conectar
las resisitencias a los puertos del microcontrolador, el bit apropiado del registro WPUB debe estar a uno.*
Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias "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.
Gracias a estas caractersticas, los pines del puerto PORTB se utilizan con frecuencia para comprobar los botones de presin en el teclado
ya que detectan cada apretn de botn infaliblemente. Por eso, no es necesario examinar todas las entradas una y otra vez.
Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1), slo se necesita esperar una peticin de interrupcin que
aparece al apretar un botn. Ms tarde, se comprueba cul botn fue activado al combinar ceros y unos en las entradas.
Vamos a hacerlo en 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;
// Todos los pines del puerto PORTB se ponen a cero
TRISB = 0b00000010; // Todos los pines del puerto PORTB excepto PORTB.1
// se configuran como salidas
RBPU = 0;
// Se habilitan las resistencias pull-up
WPUB1 = 1;
IOCB1 = 1;
RBIE = GIE = 1;
...
//
//
//
//
PIN RB0/INT
El pin RB0/INT es la nica fuente verdadera de la interrupcin externa. Se puede configurar de manera que reaccione al borde ascendente
de seal (transicin de cero a uno) o al borde descendente de seal (transicin de uno a cero). El bit INTEDG del registro OPTION_REG
selecciona la seal apropriada.
Como hemos visto, los voltajes aplicados a los pines del zcalo del programador son los mismos que los utilizados durante la programacin
ICSP.
Todas las funciones adicionales del puerto PORTC se describen en los siguientes captulos.
/* El pin PORTE.0 se configura como una entrada analgica mientras que los dems tres
pines del mismo puerto se configuran como digitales */
...
ANSEL = 0b00100000; // El pin PORTE.0 se configura como analgico
ANSELH = 0;
// Todos los pines de E/S se configuran como digitales
TRISE = 0b00000001; // Todos los pines del puerto PORTE excepto el
// PORTE.0 se configuran como salidas
PORTE = 0;
// Todos los bits del puerto PORTE se ponen a cero
...
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:
Al disear un dispositivo, seleccione un puerto por el que el microcontrolador comunicar al entorno perifrico. Si
usted utiliza slo entradas/salidas digitales, seleccione cualquier puerto. Si utiliza alguna de las entradas analgicas,
seleccione los puertos apropiados que soportan tal configuracin de los pines (AN0-AN13).
Cada pin del puerto se puede configurar como salida o como entrada. Los bits de los registros TRISA,TRISB,
TRISC, TRISD y TRISE determinan cmo se com portarn los pines apropiados de los puertos PORTA, PORTB,
PORTC, PORTD y PORTE. Simplemente...
Si utiliza alguna de las entradas analgicas, primero es necesario poner a uno los bits apropiados de los registros
ANSEL y ANSELH en el principio de programa.
Si utiliza resistencias o botones de presin como una fuente de seal de en trada, conctelos a los pines del puerto
PORTB, ya que tienen las resistencias pull-up. El uso de estos registros est habilitado por el bit RBPU del registro
OPTION_REG, mientras que la instalacin de las resistencias individuales est habilitada por los bits del registro
WPUB.
Con frecuencia se necesita responder tan pronto como los pines de entrada cambien su estado lgico. Sin embargo,
no es necesario escribir un programa para comprobar el estado lgico de los pines. Es mucho ms simple conectar
estas entradas a los pines del puerto PORTB y habilitar que ocurra una interrupcin con cada cambio de voltaje.
Los bits de los registros IOCB e INTCON se encargan de eso.
El microcontrolador PIC16F887 dispone de tres temporizadores/contadores independientes, denominados Timer0, Timer1 y Timer2. En este
captulo se presenta una descripcin detallada de los mismos.
Temporizador/contador de 8 bits;
Pre-escalador de 8 bits (lo comparte con el temporizador perro guardin);
Fuente de reloj interna o externa programable;
Generacin de interrupcin por desbordamiento; y
Seleccin del flanco de reloj externo programable.
La siguiente figura muestra el esquema del temporizador Timer0 con todos los bits que determinan su funcionamiento. Estos bits se
almacenan en el registro OPTION_REG.
Registro OPTION_REG
RBPU - PORTB Pull-up enable bit (resistencia Pull Up del puerto PORTB)
0 - Resistencias pull-up del puerto PORTB estn deshabilitadas.
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)
0 - Interrupcin por flanco ascendente en el pin INT (0-1).
1 - Interrupcin por flanco descendente en el pin INT (1-0).
T0CS - TMR0 Clock Select bit (bit selector de tipo de reloj para el Timer0)
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)
0 - Incrementa en flanco descendente en el pin TMR0.
1 - Incrementa en flanco ascendente en el pin TMR0.
PS2, PS1, PS0 - Prescaler Rate Select bit (bit selector del valor del divisor de frecuencias)
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.
void interrupt() {
cnt++;
TMR0 = 155;
INTCON = 0x20;
}
//
//
//
//
Rutina de interrupcin
Interrupcin causa el incremento de cnt por 1
Temporizador (o contador) Timer0 devuelve su valor inicial
Bit T0IE est a 1, bit T0IF est a 0
//
//
//
//
//
//
//
//
//
//
void main() {
OPTION_REG = 0x04;
TMR0 = 155;
INTCON = 0xA0;
...
...
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.
De manera similar, al cambiar de asignacin del pre-escalador del WDT al Timer0, es necesario ejecutar la
siguiente secuencia de instrucciones, tambin escritas en ensamblador:
BANKSEL TMR0
CLRWDT
BANKSEL OPTION_REG
MOVLW b'11110000'
ANDWF OPTION_REG,W
IORLW b'00000011'
El modo de temporizador se selecciona por el bit TOSC del registro OPTION_REG (TOSC: 0=temporizador,
1=contador).
Cuando se asigna el pre-escalador al temporizador/contador se debe poner a cero el bit PSA del registro
OPTION_REG. El valor del divisor de frecuencias se configura al utilizar los bits PS2-PS0 del mismo registro.
Al utilizar una interrupcin, los bits GIE y TMR0IE del registro INTCON deben estar a uno.
Paso 2: Medir y contar
Para medir tiempo:
La polaridad de pulsos a contar en el pin RA4 se selecciona por el bit TOSE del registro OPTION_REG (T0SE:
0=pulsos positivos, 1=pulsos negativos).
Varios pulsos se pueden leer del registro TMR0. El pre-escalador y la interrupcin se utilizan de la misma forma que
en el modo de temporizador.
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:
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.
FRECUENCIA
C1
C2
32 kHz
33 pF
33 pF
LP
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.
La interrupcin por desbordamiento en el registro del temporizador Timer1 puede estar habilitada. Si el bit T1SYNC
se pone a 1, tales interrupciones se producirn en el modo de reposo tambin.
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...
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.
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.
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 frecuencia de 32.768 kHz)
0 - Oscilador LP est apagado.
T1SYNC - Timer1 External Clock Input Synchronization Control bit (Bit de control de sincronizacin de la seal de entrada) habilita la
sincronizacin de la entrada del oscilador LP o de la entrada del pin T1CKI con el reloj interno del microcontrolador. Este bit se ignora al
contar los pulsos desde el oscilador principal (el bit TMR1CS = 0).
1 - Cuenta los pulsos por el pin T1CKI (por el flanco ascendente 0-1)
0 - Cuenta los pulsos del reloj interno del microcontrolador
TMR1ON - Timer1 On bit (TMR activo, hace entrar o no en funcionamiento el Timer1).
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.
Los pulsos que vienen del oscilador de cuarzo primero pasan por el pre-escalador cuyo valor puede ser modificado al combinar los bits
T2CKPS1 y T2CKPS0. La salida del preescalador se utiliza para incrementar el registro TMR2 empezando por 00h. Los valores del TMR2 y
del PR2 se comparan constantemente y el registro TMR2 va incrementndose hasta alcanzar el valor del registro PR2. Cuando se igualan
los valores de los registros, lo que ser registrado por el comparador, el TMR2 se reinicia a 00h automticamente. El postescalador del
temporizador Timer2 se incrementa y su salida se utiliza para generar una interrupcin si est habilitada.
Los ambos registros TMR y PR2 son de lectura y escritura. El conteo se puede detener al poner a 0 el bit TMR2ON, lo que resulta en un
ahorro de energa.
El momento de reinicio del TMR2 se puede utilizar para determinar la velocidad de transmisin en baudios de la comunicacin serie
sncrona.
Varios bits del registro T2CON estn en control del temporizador Timer2.
Registro T2CON
TOUTPS3 - TOUTPS0 - Timer2 Output Postcaler Select bits (bits de seleccin del rango del divisor del post-escalador para el Timer2) se
utilizan para determinar el valor del post-escalador segn la siguiente tabla:
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
1:16
TMR2ON Timer2 On bit - (bit de activacin del TIMR2) hace entrar en funcionamiento el temporizador Timer2.
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 post-escalador 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
Una parte central de este circuito es un registro CCPR1 de 16 bits que consiste en registros CCPR1L y CCOR1H. Se utiliza para capturar y
comparar sus valores con los nmeros almacenados en el registro del temporizador Timer1 (TMR1H y TMR1L).
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.
Cada
Cada
Cada
Cada
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::
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
MOVWF
XX
CCP1CON
...
ASM {
BANKESEL CCP1CON
CLRF CCP1CON
MOVLW XX
MOVWF CCP1CON
}
...
//
//
//
//
//
Para poner el mdulo CCP1 en este modo de funcionamiento, se deben cumplir dos condiciones:
El otro ejemplo, comn en la prctica, es el uso de seales PWM en un circuito para generar seales de forma de onda arbitraria como una
onda sinusoidal. Vea la siguiente figura:
Los dispositivos que funcionan segn este principio se utilizan con frecuencia en la prctica como variadores de frecuencia ajustable que
controlan motores elctricos (velocidad, aceleracin, desaceleracin etc.)
La Figura anterior muestra el diagrama de bloques del mdulo CCP1 puesto en el modo PWM. Para generar un pulso de forma arbitraria en
el pin de salida, es necesario ajustar el perodo de pulsos (frecuencia) y la duracin de pulsos.
PERODO 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
Si el perodo de PWM (T) es conocido, es fcil determinar la frecuencia de seal F, porque estos dos valores estn relacionados por la
ecuacin F=1/T.
1.22
4.88
19.53
78.12
156.3
208.3
16
Registro PR2
FFh
FFh
FFh
3Fh
1Fh
17h
Notas adicionales:
El pin de salida se va a poner a 1 constantemente, si por error el ancho de pulso generado es ms largo que el
perodo de PWM.
En esta aplicacin, no se puede utilizar el post-escalador del temporizador Timer2 para generar perodos de PWM
largos.
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
153.85KHZ
200.0KHZ
1.22KHZ
4.90KHZ
19.61KHZ
76.92KHZ
16
65h
65h
65h
19h
0Ch
09h
Resolucin mxima
/* En este ejemplo, el mdulo PWM est inicializado y ajustado para producir una secuencia
de pulsos de ciclo de trabajo del 50%. Para este propsito, se utilizan las funciones
PWM1_Init(), PWM1_Start() y PWM1_Set_Duty(). Todas las funciones las contiene la librera
PWM del mikroC PRO for PIC. Slo es necesario copiarlas al programa */
unsigned short duty_c;
void initMain() {
ANSEL = ANSELH = 0;
PORTC = TRISC = 0;
PWM1_Init(5000);
}
void main() {
initMain();
duty_c = 127;
// Valor inicial del ciclo de trabajo
PWM1_Start();
// Iniciar el mdulo PWM1
PWM1_Set_Duty(duty_c); // Ajustar el ciclo de trabajo de PWM al 50%
...
...
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
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 a nivel alto.
Pines P1B y P1D estn activos a nivel alto.
Modo PWM
MDULO CCP2
Con exclusin de los nombres diferentes de los registros y de los bits, este mdulo es una muy buena copia del mdulo CCP1 puesto en
modo normal. La nica diferencia significativa entre ellos es el funcionamiento en modo de comparacin del mdulo CCP2. La diferencia se
refiere a la seal de reinicio del temporizador T1. Concretamente, si el convertidor A/D est habilitado, al igualarse los valores de los
registros TMR1 y CCPR2, la seal de reinicio del temporizador T1 iniciar automticamente la conversin A/D. Similar al mdulo anterior,
este circuito tambin est bajo el control de los bits del registro de control. Esta vez es el registro CCP2CON.
Registro CCP2CON
DC2B1, DC2B0 - PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de trabajo de PWM) - Se utilizan slo en modo
PWM y representan dos bits menos significativos de un nmero de 10 bits. Este nmero determina el ciclo de trabajo de la seal PWM. Los
dems 8 bits se almacenan en el registro CCPR2L.
CCP2M3 - CCP2M0 - 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.
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
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:
Poner a cero el bit de bandera de interrupcin TMR2IF en el registro PIR1
Ajustar el valor de divisin de frecuencia del temporizador Timer2 por los bits
T2CKPS1 y T2CKPS0 del registro T2CON.
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:
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.
MODO DE MEDIO-PUENTE
En cuanto al modo de medio-puente, la seal PWM es una salida en el pin P1A, mientras que a la vez la seal complementaria PWM es
una salida en el pin P1B. Estos pulsos activan a los controladores MOSFET en modo de Medio-Puente que habilitan/deshabilitan el flujo de
corriente por el dispositivo.
En este modo es muy peligroso encender los controladores MOSFET simultneamente (el cortocircuito producido en aquel momento sera
fatal). Para evitarlo, es necesario proporcionar un tiempo muerto entre encender y apagar los controladores. Este tiempo muerto est
marcado con 'td' (time delay) en la siguiente figura. El problema se resuelve al utilizar los bits PDC0-PDC6 del registro PWM1CON.
Como se muestra en la siguiente figura, el modo de medio-puente se puede utilizar para activar los controladores MOSFET en la
configuracin Puente completo:
MODO PUENTE-COMPLETO
Todos los cuatro pines se utilizan como salidas en el modo Puente completo. En la prctica, este modo es utiliza con frecuencia para activar
los motores, lo que proporciona un control simple y completo de velocidad y direccin de rotacin. Hay dos configuraciones de este modo:
Full Bridge-Forward (puente completo con salida directa) y Full Bridge-Reverse (puente completo con salida inversa).
Un uno lgico (1) aparece en el pin P1A (pin est activo a nivel alto);
Secuencia de pulsos aparece en el pin P1D; y
Un cero lgico (0) en los pines P1B y P1C (pines estn activos a nivel bajo).
La siguiente figura muestra el estado de los pines P1A-P1D durante un ciclo PWM completo:
Un uno lgico (1) aparece en el pin P1C (pin est activo a nivel alto);
Secuencia de pulsos aparece en el pin P1B; y
Un cero lgico (0) aparece en los pines P1A y P1D (pines estn activos a nivel bajo).
Registro PWM1CON
STRC PWM Restart Enable bit (Bit de habilitacin del reinicio automtico del PWM)
1 - Despus de un apagado automtico, el mdulo PWM se reinicia automticamente, y el bit ECCPASE del
registro ECCPAS se pone a cero.
0 - Para iciar el mdulo PWM despus de un apagado automtico, el bit ECCPASE debe ponerse a cero por
software.
PDC6 - PDC0 PWM Delay Count bits (Bits de configuracin del tiempo muerto en el modo PWM) - El nmero binario de
7 dgitos determina el nmero de ciclos de in strucciones (4Tosc) aadidos como tiempo muerto al activar los pines de entrada PWM.
Registro PSTRCON
STRSYNC - Steering Sync bit (bit de sincronizacin de direccin) determina el momento de la direccin de los pulsos de PWM:
1 - La direccin ocurre despus de que el registro PSTRCION haya sido cambiado, slo si se ha completado la
forma de onda del PWM.
0 - La direccin ocurre despus de que el registro PSTRCION haya sido cambiado. La seal PWM en la salida del
pin ser cambiada inmediatamente sin reparar en si el ciclo anterior ha sido completado. Este procedimiento es til
cuando es necesario detener la transmisin de una seal PWM del pin.
STRD - Steering Enable bit D (bit D de habilitacin de direccin) determina la funcin del pin P1D.
1 - El pin P1D tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRC Steering Enable bit C (bit C de habilitacin de direccin) determina la funcin del pin P1C.
1 - El pin P1C tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTD.
1 - El pin P1B tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRA - Steering Enable bit A (bit A de habilitacin de direccin) determina la funcin del pin P1A.
1 - El pin P1A tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTC.
Registro ECCPAS
ECCPASE - ECCP Auto-Shutdown Event Status bit (bit de estado del apagado automtico) indica si ha ocurrido el apagado
automtico del mdulo CCP (estado de Apagado):
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
El mdulo Transmisor/Receptor Universal
Sncrono/Asncrono mejorado (Enhanced Universal
Synchronous Asynchronous Receiver Transmitter EUSART) es un perifrico de comunicacin serie
de entrada/salida. Asimismo es conocido como
Interfaz de comunicacin serie (Serial
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:
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:
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.
DETECCIN DE DIRECCIN
Cuando el bit ADDEN del registro RCSTA est a uno, el modulo EUSART es capaz de recibir slo los datos de 9 bits, mientras que se
ignoran todos los datos de 8 bits. Aunque parece una restriccin, este modo habilita la comunicacin serial entre varios microcontroladores.
El principio de funcionamiento es muy simple. El dispositivo maestro enva un dato de 9 bits que representa la direccin de un
microcontrolador esclavo. No obstante, todos deben tener el bit ADDEN puesto a uno, ya que de esta manera se habilita la deteccin de
direccin. Todos los microcontroladores esclavos que comparten la misma lnea de transmisin, reciben este dato (direccin) y verifican
automticamente si coincide con su propia direccin. El software, en el que ocurre la coincidencia de direccin, debe deshabilitar la
deteccin de direccin, poniendo a cero el bit ADDEN.
El dispositivo maestro sigue enviando los datos de 8 bits al microcontrolador. Todos los datos que pasan por la lnea de transmisin sern
recibidos slo por el mdulo EUSART direccionado. Una vez recibido el ltimo byte, el microcontrolador esclavo debe poner a uno el bit
ADDEN para habilitar de nuevo la deteccin de direccin.
Registro TXSTA
CSRC - Clock Source Select bit - (bit de seleccin de la fuente de reloj) determina la fuente del reloj. Se utiliza slo en modo
sincrnico.
1 - Transmisin habilitada.
0 - Transmisin deshabilitada.
SYNC - EUSART Mode Select bit (Bit de seleccin del modo EUSART)
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.
Registro RCSTA
SPEN - Serial Port Enable bit (bit de habilitacin del puerto serie)
1 - Puerto serie habilitado. Los pines RX/DT y TX/CK se configuran automticamente como entrada y salida,
respectivamente.
0 - Puerto serie deshabilitado.
RX9 - (bit de habilitacin del modo de 9 bits en recepcin):
1 - Recepcin habilitada.
0 - Recepcin deshabilitada.
Modo sncrono:
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 BRG /
EUSART
de 8 bits /asncrono
de 8 bits / asncrono
de 16 bits / asncrono
de 16 bits / asncrono
Fosc / [4 (n + 1)]
de 8 bits / sncrono
Fosc / [4 (n + 1)]
de 16 bits / sncrono
Fosc / [4 (n + 1)]
SYNC
BRG1G
BRGH
0
0
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:
Registro BAUDCTL
ABDOVF - Auto-Baud Detect Overflow bit (bit de desbordamiento de auto-deteccin de la velocidad de transmisin) se utiliza slo
en modo asncrono durante la deteccin de la velocidad de transmisin.
1 - Modo de auto-activacin habilitado. El receptor espera a que el flanco descendente aparezca en el pin
RC7/RX/DT para que el microcontrolador se despierte del modo de reposo.
0 - Modo de auto-activacin habilitado. El receptor funciona normalmente.
ABDEN - Auto-Baud Detect Enable bit (bit de habilitacin de auto-deteccin de velocidad de transmisin) se utiliza slo en modo
asncrono.
Delay_ms(100);
UART1_Write_Text("Start");
while (1) {
if (UART1_Data_Ready()) {
uart_rd = UART1_Read();
UART1_Write(uart_rd);
}
}
Bucle infinito
Si el dato se ha recibido,
lea el dato recibido
y envelo atrs por el UART
De lo contrario, si el microcontrolador a ser programado est integrado en un dispositivo ms complejo (por ejemplo en una PC), deber
funcionar como un dispositivo esclavo. Como tal, un esclavo siempre tiene que esperar a que un dispositivo maestro enve la solicitud de
transmisin de datos.
MODO SPI
El modo SPI permite la transmisin y recepcin simultnea de datos de 8 bits al utilizar tres lneas de entrada/salida
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.
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...
// perifrico Seleccin_de_chip
sbit Chip_Select_Direction at TRISC0_bit; // Bit TRISC0 define el pin RC0 como entrada o salida
unsigned int value;
// Dato a ser enviado es de tipo unsigned int
void main() {
ANSEL = ANSELH = 0;
TRISB0_bit = TRISB1_bit = 1;
Chip_Select = 0;
Chip_Select_Direction = 0;
SPI1_Init();
SPI1_Write(value);
...
//
//
//
//
//
//
Paso 2.
El dato se mueve al registro SSPSR y el contenido del registro SSPBUF no se borra.
Modo I 2 C
El modo I 2 C (Bus de circuito inter-integrado) es adecuado para ser utilizado cuando el microcontrolador debe intercambiar los datos con un
circuito integrado dentro de un mismo dispositivo. stos son con frecuencia otros microcontroladores, o los circuitos integrados
especializados y baratos que pertenecen a la nueva generacin de as llamados "perifricos inteligentes" (memorias, sensores de
temperatura, relojes de tiempo real etc.)
Similar a la comunicacin serie en modo SPI, la transmisin de datos en modo I2C es sncrona y bidireccional. Esta vez slo dos pines se
utilizan para transmisin de datos. stos son los pines de SDA (Datos seriales) y SCL (Reloj serial). El usuario debe configurar estos pines
como entradas o salidas por los bits TRISC.
Al observar las reglas particulares (protocolos), este modo habilita conectar simultneamente de una manera simple hasta 112 diferentes
componentes al utilizar slo dos valiosos pines de E/S. Vamos a ver cmo funciona el sistema:
El reloj, necesario para sincronizar el funcionamiento de ambos dispositivos, siempre es generado por un dispositivo maestro (un
microcontrolador) y su frecuencia directamente afecta a la velocidad de transmisin de datos. Aunque hay un protocolo que permite como
mximo una frecuencia de reloj de 3,4 MHz (as llamado bus I2C de alta velocidad), este libro cubre slo el protocolo utilizado con ms
frecuencia, con una frecuencia de reloj limitada a 100 KHz. La frecuencia mnima no est limitada.
Cuando los componentes maestro y esclavo estn sincronizados por el reloj, el maestro siempre inicia cada intercambio de datos. Una vez
que el mdulo MSSP se ha habilitado, espera que ocurra una condicin de arranque (Start condition). El dispositivo maestro primero enva
el bit de arranque (est a cero) por el pin SDA, luego la direccin de 7 bits del dispositivo esclavo seleccionado, y por ltimo, el bit que
requiere al dispositivo escribir (0) o leer (1) el dato enviado. En otras palabras, los ocho bits se desplazan al registro SSPSR despus de
ocurrir una condicin de arranque. Todos los dispositivos esclavos que comparten la misma lnea de transmisin recibirn simultneamente
el primer byte, pero slo el que contiene la direccin coincidente recibir el dato entero.
Una vez que el primer byte se ha enviado (slo se transmiten datos de 8 bits), el maestro se pone en modo de recepcin y espera el
reconocimiento del dispositivo receptor acerca de la direccin coincidente.
Si el dispositivo esclavo enva un bit de reconocimiento (1) la transmisin de datos continuar hasta que el dispositivo maestro
(microcontrolador) enve el bit de parada (Stop).
Esto es una explicacin simple de cmo se comunican dos componentes. Este microcontrolador es capaz de controlar las situaciones ms
complicadas cuando estn conectados 1024 diferentes componentes (direccin de 10 bits), compartidos por varios dispositivos maestros
diferentes. Por supuesto, estos dispositivos se utilizan pocas veces en la prctica por lo que no es necesario hablar de ellos detalladamente.
La siguiente figura muestra el diagrama de bloques del mdulo MDSSP en modo I 2 C.
En una operacin I 2 C con el mdulo MSSP intervienen seis registros. Algunos de ellos se muestran en la Figura anterior.
SSPCON
SSPCON2
SSPSTAT
SSPBUF
SSPSR
SSPADD
Registro SSPSTAT
1 - Lectura de dato.
0 - Escritura de dato.
Modo IC en modo esclavo
1 - Transmisin en progreso.
0 - Transmisin no est en progreso.
UA - Update Address bit (bit de activacin de direccin) se utiliza slo en modo I 2 C de 10 bits.
Registro SSPSTAT
1 - Colisin detectada. En el registro SSPBUF se ha escrito cuando no se han cumplido las condiciones para iniciar
una transmisin.
0 - No hay colisin.
SSPOV Receive Overflow Indicator bit (bit detector de desbordamiento en recepcin)
1 - Se recibe un nuevo byte cuando el registro SSPBUF an mantiene los datos ante riores. 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
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
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
1 - Habilita interrupcin cuando una direccin de llamada general es recibida en el SSPST (0000h).
0 - Deshabilita direccin de llamada general.
ACKSTAT - Acknowledge Status bit (bit de estado de reconocimiento)
Slo en modo de transmisin maestro IC
1 - No reconocimiento.
0 - Reconocimiento.
ACKEN - Acknowledge Sequence Enable bit (bit de habilitacin de secuencia de reconocimiento)
En modo de recepcin maestro IC
1 - Indica una secuencia de reconocimiento en los pines SDA y SCL y transmite el bit ACKDT. Automticamente
borrado por hardware.
0 - Secuencia de reconocimiento en reposo.
RCEN - Receive Enable bit (bit de habilitacin de recepcin)
Slo en modo maestro IC
1 - Indica una condicin de Parada en los pines SDA y SCL. Luego, este bit es automticamente borrado por
hardware.
0 - Condicin de Parada en reposo.
RSEN - Repeated START Condition Enabled bit (bit de habilitacin de repetir condicin de Arranque)
Slo en modo maestro IC
1 - Indica repeticin de condicin de Arranque en los pines SDA y SCL. Luego, este bit es automticamente borrado
por hardware.
0 - Condicin de repeticin de Arranque en reposo.
SEN - START Condition Enabled/Stretch Enabled bit (bit de habilitacin de condicin de Arranque)
Slo en modo maestro IC
1 - Indica condicin de Arranque en los pines SDA y SCL. Luego, este bit es automticamente borrado por
hardware.
0 - Condicin de Arranque en reposo.
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.
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.
La transmisin de datos termina al poner a uno el bit SEN del registro SSPCON2. Ocurre la condicin de parada (STOP), lo que habilita que
el pin SDA reciba una secuencia de pulsos:
Inicio - Direccin - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento - Parada!
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:
//
//
//
//
//
//
//
//
//
Poner a uno el bit RSEN del registro SSPCON2 para habilitar la recepcin.
El bit SSPIF indica con su estado lgico la recepcin de datos. Despus de leer los datos del registro SSPBUF, el
bit ACKEN del registro SSPCON2 debe ponerse a uno para habilitar el envo del bit de reconocimiento.
La condicin de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro SSPCON para informar al
dispositivo Esclavo que la transmisin se acab.
Aparte de disponer de un gran nmero de lneas digitales de E/S utilizadas para la comunicacin con los perifricos, el PIC16F887 contiene
14 entradas analgicas. Debido a stas, el microcontrolador no slo puede reconocer si un pin es llevado a bajo o alto (0 o +5V), sino que
puede medir con precisin el voltaje y convertirlo en un valor numrico, o sea, en formato digital.
El convertidor genera un resultado binario de 10 bits utilizando el mtodo de aproximaciones sucesivas y almacena
los resultados de conversin en los registros ADC (ADRESL y ADRESH);
Dispone de 14 entradas analgicas separadas;
El convertidor A/D convierte una seal de entrada analgica en un nmero binario de 10 bits;
La resolucin mnima o calidad de conversin se puede ajustar a diferentes necesidades al seleccionar voltajes de
referencia Vref- y Vref+.
CONVERTIDOR A/D
Aunque a primera vista parece muy complicado utilizar un convertidor A/D, en realidad es muy simple. De hecho resulta ms simple utilizar
un convertidor A/D que los temporizadores o mdulos de comunicacin serie.
El funcionamiento del convertidor A/D est bajo el control de los bits de cuatro registros:
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.
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 (2 10 - 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
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/AN10
11
RB4/AN11
12
RB0/AN12
13
CVref
Vref = 0.6V
RB5/AN13
GO/DONE - A/D Conversion Status bit (bit de estado de la conversin A/D) determina el estado actual de de la conversin:
//
//
//
//
//
//
//
//
//
Registro ADCON1
ADFM - A/D Result Format Select bit (bit de seleccin del formato del resultado de la conversin A/D)
1 - Resultado de conversin est justificado a la derecha. No se utilizan los seis bits ms significativos del registro
ADRESH.
0 - Resultado de conversin est justificado a la izquierda. No se utilizan los seis bits menos significativos del
registro ADRESL.
VCFG1 - Voltage Reference bit (bit de configuracin de voltaje de referencia) selecciona la fuente de voltaje de referencia bajo que se
necesita para el funcionamiento del convertidor A/D.
1 - Voltaje de referencia bajo se aplica al pin Vref0 - Voltaje de alimentacin Vss se utiliza como una fuente de voltaje de referencia bajo.
VCFG0 - Voltage Reference bit (bit de configuracin de voltaje de referencia) selecciona la fuente de voltaje de referencia alto que se
necesita para el fucionamiento del convertidor A/D.
Escribir un uno lgico (1) a un bit del registro TRIS, lo que resulta en configurar el pin apropiado como una entrada.
Escribir un uno lgico (1) a un bit del registro ANSEL, lo que resulta en configurar el pin apropiado como una
entrada analgica.
Paso 2 - Configuracin del mdulo de la conversin A/D:
Es necesario comprobar en el bucle de programa si el bit GO/DONE est a cero o esperar que se produzca una
interrupcin (deber estar anteriormente habilitada).
Paso 7 - Lectura del resultado de la conversin A/D:
COMPARADOR ANALGICO
Aparte del convertidor A/D, hay otro mdulo, que hasta hace poco ha sido incorpodo slo en los circuitos integrados que pertenecen a los
llamados componentes analgicos. Debido al hecho de que casi no hay ningn dispositivo automtico complejo que en cierto modo no
utilice estos circuitos, dos comparadores de alta calidad, junto con los componentes adicionales estn integrados en el microcontrolador y
conectados a sus pines.
Cmo funciona un comparador? Bsicamente, el comparador analgico es un amplificador que compara la magnitud de voltajes en dos
entradas. Dispone de dos entradas y una salida. Dependiendo de cul voltaje de entrada es ms alto (valor analgico), un cero lgico (0) o
un uno lgico (1) (valores digitales) ser la salida.
Cuando
un nivel
Cuando
un nivel
el voltaje analgico en Vin - es ms alto que el voltaje anlogo en Vin+, la salida del comparador estar a
digital bajo.
el voltaje analgico en Vin+ es ms alto que el voltaje anlogo en Vin-, la salida del comparador estar a
digital alto.
El microcontrolador PIC16F887 dispone de dos de estos comparadores de voltaje cuyas entradas estn conectadas a los pines de E/S RA0RA3, 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:
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:
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.
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.
C2ON - Comparator C2 Enable bit (bit de habilitacin del comparador C2) habilita el comparador C2.
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
1 - Salida del comparador C2 est sincronizada con un flanco ascendente de seal de reloj del temporizador Timer1
0 - Salida del comparador es una seal asncrona.
Registro VRCON
VREN Comparator C1 Voltage Reference Enable bit (bit de habilitacin de la fuente de voltaje de referencia del comparador C1)
Para seleccionar el modo apropiado, se deben configurar los estados de los bits de los registros CM1CON0 y
CM2CON0. La interrupcin debe estar deshabilitada durante el cambio de modo.
Paso 2 - Configurar la fuente de voltaje de referencia Vref interna (slo si se utiliza). En el registro VRCON es necesario realizar lo
siguiente:
Seleccionar una de dos gamas de voltaje por medio del bit VRR.
Configurar el voltaje de referencia Vref necesario por medio de los bits VR3 - VR0.
Poner a uno el bit VROE si es necesario.
Habilitar la fuente de voltaje de referencia Vref al poner a uno el bit VREN.
Frmula utilizada para calcular el voltaje de referencia
VRR = 1 (gama baja)
CVref = ([VR3:VR0]/24)VLADDER
VRR = 0 (gama alta)
CVref = (VLADDER/4) + ([VR3:VR0]VLADDER/32)
Vladder = Vdd or ([Vref+] - [Vref-]) or Vref+
Habilitar una interrupcin al poner a uno los bits CMIE (registro PIE), PEIE y GIE (registro INTCON ).
Leer los bits C1OUT y C2OUT del registro CMCON.
Leer la bandera de bit CMIF del registro PIR. Despus de haber sido puesto a uno, este bit se pone a cero por
software.
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:
El HFINTOSC es un oscilador interno de alta frecuencia calibrado a 8MHz. El microcontrolador puede utilizar una seal de reloj generada a
esta frecuencia o despus de haber sido dividida en el pre-escalador.
El LFINTOSC es un oscilador interno de baja frecuencia calibrado a 31 kHz. Sus pulsos de reloj se utilizan para funcionamiento de los
temporizadores de encendido y perro guardin, asimismo puede utilizarse como fuente de seal de reloj para el funcionamiento de todo el
microcontrolador.
El bit System Clock Select (bit de seleccin del reloj del sistema - SCS) del registro OSCCON determina si una fuente de seal de reloj del
microcontrolador ser interna o externa.
Registro OSCCON
El registro OSCCON 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.
IRCF1
IRCF0
FRECUENCIA
OSC.
8 MHz
HFINTOSC
4 MHz
HFINTOSC
2 MHz
HFINTOSC
HFINTOSC
1 MHz
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.
Las ventajas del funcionamiento del oscilador externo en modo EC son las siguientes:
La fuente de reloj externa independiente est conectada al pin de entrada OSC1. El pin OSC2 est disponible como
pin de E/S de propsito general;
Es posible sincronizar el funcionamiento del microcontrolador con los dems componentes incorporados en el
dispositivo;
En este modo el microcontrolador se pone a funcionar inmediatamente despus de encenderlo. No se requiere
esperar para estabilizar la frecuencia.
Al deshabilitar temporalmente la fuente de reloj externa, se detiene el funcionamiento del dispositivo, dejando todos
los datos intactos. Despus de reiniciar el reloj externo, el dispositivo sigue funcionando como si no hubiera pasado
nada.
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.
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.
f = frecuencia [Hz];
T = R * C = constante de tiempo [s];
R = resistencia elctrica []; y
C = capacitancia del condensador [F].
1. El oscilador interno de alta frecuencia HFINTOSC est conectado al post-escalador (divisor de frecuencias). Est calibrado de fbrica y
funciona a 8 Mhz. Al utilizar el post-escalador, este oscilador puede producir una seal de reloj a una de siete frecuencias. La seleccin de
frecuencia se realiza dentro del software utilizando los pines IRCF2, IRCF1 y IRCF0 del registro OSCCON.
El HFINTOSC est habilitado al seleccionar una de siete frecuencias (entre 8 Mhz y 125 kHz) y poner a uno el bit de la fuente de reloj del
sistema (SCS) del registro OSCCON. Como se muestra en la siguiente figura , todo el procedimiento se realiza por medio de los bits del
registro OSCCON.
2. El oscilador de baja frecuencia LFINTOSC no est calibrado de fbrica y funciona a 31 kHz. Est habilitado al seleccionar la frecuencia
(bits del registro OSCCON) y poner a uno el bit SCS del mismo registro.
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.
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
TUN3
TUN2
TUN1
TUN0
FRECUENCIA
Mxima
0
0
Calibrada
Mnima
La EEPROM es un segmento de memoria separado, que no pertenece a la memoria de programa (ROM), tampoco a la memoria de datos
(RAM). Aunque a estas localidades de memoria no se les puede acceder fcil y rpidamente, su propsito es insustituible. Los datos
almacenados en la EEMPROM estn permanentemente guardados incluso al apagar la fuente de alimentacin, y pueden ser cambiados en
cualquier momento. Por estas caractersticas excepcionales cada byte de la EEPROM se considera valioso.
Registro EECON1
Paso
Paso
Paso
Paso
1:
2:
3:
4:
El siguiente ejemplo muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje ensamblador:
BSF STATUS,RP1
BCF STATUS,RP0
MOVF ADDRESS,W
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
;
;
;
;
;
;
;
;
;
Acceder al banco 2
Mover la direccin al registro W
Escribir la direccin
Acceder al banco 3
Seleccionar la EEPROM
Leer los datos
Acceder al banco 2
Dato se almacena en el registro 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
MOVF ADDRESS,W
MOVWF EEADR
MOVF DATA,W
;
;
;
;
Banco 2
Mover la direccin a W
Escribir la direccin
Mover los datos a W
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
BCF INCON,GIE
;
;
;
;
;
MOVLW 55h
MOVWF EECON2
MOVLW AAh
MOVWF EECON2
BSF EECON1,WR
BSF INTCON,GIE
BCF EECON1,WREN
; Interrupciones habilitadas
; Escritura a la EEPROM deshabilitada
W = EEPROM_Write(ADDRESS, W);
// El ejemplo muestra cmo utilizar la librera EEPROM en el compilador mikroC PRO for PIC.
char ii; // La variable ii utilizada en el bucle
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);
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.
Aparte de este reinicio "controlado" que ocurre al encender una fuente de alimentacin, hay dos tipos de reinicio denominados Black-out y
Brown-out que pueden producirse durante el funcionamiento del microcontrolador as como al apagar una fuente de alimentacin.
REINICIO BLACK-OUT
El reinicio black out ocurre al apagar una fuente de alimentacin
correctamente. El microcontrolador no tiene tiempo para hacer nada
imprevisible puesto que el voltaje cae muy rpidamente por debajo de su
valor mnimo. En otras palabras, se apaga la luz, las cortinas bajan y el
espectculo ha terminado!
REINICIO BROWN-OUT
Cuando el voltaje de la fuente de alimentacin cae lentamente (un ejemplo
tpico es descarga de bateras, aunque el microcontrolador experimentara
unas cadas mucho ms rpidas como un proceso lento) los componentes
internos detienen su funcionamiento gradualmente y ocurre el as llamado
reinicio 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
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.
previous chapter | table of contents | next chapter
Related Links:
Products
News
Forums
Distributors
About Us
Legal Information
Product Archive
Copyright 19982012. MikroElektronika. All rights reserved. All trade and/or services marks mentioned are the property of their respective owners.
Contact Us
Products
Solutions
Kits
Easy Buy
Support
Downloads
Capitulo 4: Ejemplos
Enter keywords
El propsito de este captulo es de proporcionar la informacin bsica que necesita saber para ser capaz de utilizar microcontroladores con
xito en la prctica. Por eso, este captulo no contiene ningn programa muy elaborado, tampoco dispone de un esquema de dispositivo con
soluciones extraordinarias. Por el contrario, los siguientes ejemplos son la mejor prueba de que escribir un programa no es un privilegio ni
cosa de talento, sino una habilidad de poner las piezas juntas del rompecabezas al utilizar directivas. Tenga la seguridad de que el diseo
y el desarrollo de los dispositivos generalmente siguen al mtodo probar-corregir-repetir. Por supuesto, cunto ms ahonde sobre el tema,
ms se complica, ya que tanto los nios como los arquitectos de primera lnea, ponen las piezas juntas del rompecabezas.
Featured Compilers
mikroC PRO for PIC
Alimentacin;
Seal de reinicio; y
Seal de reloj.
Como se muestra en la figura anterior, se trata de circuitos simples, pero no tiene que ser siempre as. Si el dispositivo destino se utiliza
para controlar las mquinas caras o para mantener funciones vitales, todo se vuelve mucho ms complicado.
ALIMENTACIN
Aunque el PIC16F887 es capaz de funcionar a diferentes voltajes de alimentacin, no es recomendable probar la ley de Murphy. Lo ms
SEAL DE REINICIO
Para que un microcontrolador pueda funcionar apropiadamente, un uno lgico (VCC) se debe colocar en el pin de reinicio. El botn de
presin que conecta el pin MCLR a GND no es necesario. Sin embargo, este botn casi siempre est proporcionado ya que habilita al
microcontrolador volver al modo normal de funcionamiento en caso de que algo salga mal. Al pulsar sobre el botn RESET, el pin MCLR se
lleva un voltaje de 0V, el microcontrolador se reinicia y la ejecucin de programa comienza desde el principio. Una resistencia de 10k se
utiliza para impedir un corto circuito a tierra al presionar este botn.
SEAL DE RELOJ
A pesar de tener un oscilador incorporado, el microcontrolador no puede funcionar sin componentes externos que estabilizan su
funcionamiento y determinan su frecuencia (velocidad de operacin del microcontrolador). Dependiendo de los elementos utilizados as
como de las frecuencias el oscilador puede funcionar en cuatro modos diferentes:
Cristal de cuarzo
Al utilizar el cristal de cuarzo para estabilizar la frecuencia, un oscilador incorporado funciona a una frecuencia determinada, y no es
afectada por los cambios de temperatura y de voltaje de alimentacin. Esta frecuencia se etiqueta normalmente en el encapsulado del
cristal. Aparte del cristal, los condensadores C1 y C2 deben estar conectados como se muestra en el siguiente esquema. Su capacitancia no
es de gran importancia. Por eso, los valores proporcionados en la siguiente tabla se deben tomar como recomendacin y no como regla
estricta.
Resonador cermico
Un resonador cermico es ms barato y muy similar a un cuarzo por la funcin y el modo de funcionamiento. Por esto, los esquemas que
muestran su conexin al microcontrolador son idnticos. No obstante, los valores de los condensadores 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.
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.
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 de detectar el primer pulso producido por un rebote de
contacto. Esta solucin es ms cara (interruptor SPDT), pero el problema es resuelto.
Aparte de estas soluciones de hardware, hay tambin una simple solucin de software. Mientras el programa prueba el estado de circuito
lgico de un pin de entrada, si detecta un cambio, hay que probarlo una vez ms despus de un cierto tiempo de retardo. Si el programa
confirma el cambio, esto significa que un interruptor/botn de presin ha cambiado de posicin. Las ventajas de esta solucin son obvias:
es gratuita, se borran los efectos del rebote de contacto y se puede aplicar a los contactos de una calidad ms baja tambin.
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.
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
Hay un lmite de corriente nominal, o sea, lmite de corriente mxima especificada para cada LED que no se deber exceder. Si eso sucede,
el diodo emitir luz ms intensiva, pero slo por un perodo corto de tiempo.
VISUALIZADOR LED
Bsicamente, un visualizador LED no es nada ms que varios diodos LED moldeados en la misma caja
plstica. Hay varios tipos de los visualizadores y algunos de ellos estn compuestos por varias docenas de
diodos incorporados que pueden visualizar diferentes smbolos. No obstante, el visualizador utilizado con
ms frecuencia es el visualizador de 7 segmentos. Est compuesto por 8 LEDs. Los siete segmentos de un
dgito estn organizados en forma de un rectngulo para visualizar los smbolos, mientras que el segmento
adicional se utiliza para el propsito de visualizar los puntos decimales. Para simplificar la conexin, los
nodos y los ctodos de todos los diodos se conectan al pin comn as que tenemos visualizadores de
nodo comn y visualizadores de ctodo comn, respectivamente. Los segmentos estn etiquetados con
letras de a a g y dp, como se muestra en la siguiente figura. Al conectarlos, cada diodo LED se trata por
separado, lo que significa que cada uno dispone de su propia resistencia para limitar la corriente.
Aqu le presentamos unas cosas importantes a las que debe prestar atencin al comprar un visualizador LED:
Como hemos mencionado, dependiendo de si nodos o ctodos estn conectados al pin comn, tenemos
visualizadores de nodo comn y visualizadores de ctodo comn. Visto de afuera, parece que no hay ninguna
diferencia entre estos visualizadores, pues se le recomienda comprobar cul se va a utilizar antes de instalarlo.
Cada pin del microcontrolador tiene un lmite de corriente mxima que puede recibir o dar. Por eso, si varios
visualizadores estn conectados al microcontrolador, es recomendable utilizar as llamados LEDs de Bajo consumo
que utilizan solamente 2mA para su funcionamiento.
Los segmentos del visualizador estn normalmente etiquetados con letras de a a g, pero no hay ninguna regla
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.
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.
DGITOS A
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 (fototransistores, 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, dao y funcionamiento inestable de los dispositivos electrnicos en
la prctica. Los optoacopladores utilizados con ms frecuencia son aqullos con foto-transistores en sus salidas. En los optoacopladores
con la base conectada al pin 6 interno (tambin hay optoacopladores sin ella), la base puede quedarse desconectada.
La red R/C representada por una lnea quebrada en la figura anterior indica una conexin opcional de la base de transistores dentro del
optoacoplador, que reduce los efectos de ruidos al eliminar los pulsos muy cortos.
VISUALIZADOR LCD
Este componente est especficamente fabricado para ser utilizado con los microcontroladores, lo que significa que no se puede activar por
los circuitos integrados estndar. Se utiliza para visualizar los diferentes mensajes en un visualizador de cristal lquido miniatura. El modelo
descrito aqu es el ms utilizado en la prctica por su bajo precio y grandes capacidades. Est basado en el microcontrolador HD44780
(Hitachi) integrado y puede visualizar mensajes en dos lneas con 16 caracteres cada una. Puede visualizar todas las letras de alfabeto,
letras de alfabeto griego, signos de puntuacin, smbolos matemticos etc. Tambin es posible visualizar smbolos creados por el usuario.
Entre otras caractersticas tiles es el desplazamiento automtico de mensajes (a la izquierda y a la derecha), aparicin del cursor,
retroiluminacin LED etc.
FUNCIN
NMERO
NOMBRE
ESTADO
LGICO
DESCRIPCIN
Tierra
Vss
0V
Alimentacin
Vdd
+5V
Contraste
Vee
0 - Vdd
RS
0
1
Control de
funcionamiento
Datos / comandos
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
Pantalla LCD
Una pantalla LCD puede visualizar dos lneas con 16 caracteres cada una. Cada carcter consiste en 5x8 o 5x11 pxeles. Este libro cubre
un visualizador de 5x8 pxeles que es utilizado con ms frecuencia.
El contraste del visualizador depende del voltaje de alimentacin y de si los mensajes se visualizan en una o dos lneas. Por esta razn, el
voltaje variable 0-Vdd se aplica al pin marcado como Vee. Un potencimetro trimer se utiliza con frecuencia para este propsito. Algunos de
los visualizadores LCD tienen retroiluminacin incorporada (diodos LED azules o verdes). Al utilizarlo durante el funcionamiento, se debe de
conectar una resistencia en serie a uno de los pines para limitar la corriente (similar a diodos LED).
Si no hay caracteres visualizados o si todos los caracteres estn oscurecidos al encender el visualizador, lo primero que se debe hacer es
comprobar el potencimetro para ajustar el contraste. Est ajustado apropiadamente? Lo mismo se aplica si el modo de funcionamiento ha
sido cambiado (escribir en una o en dos lneas).
Memoria LCD
El visualizador LCD dispone de tres bloques de memoria:
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:
Las direcciones de las localidades de memoria CGROM corresponden a los caracteres ASCII. Si el programa que se est actualmente
ejecutando llega al comando enviar el carcter P al puerto, el valor binario 0101 0000 aparecer en el puerto. Este valor es el equivalente
ASCII del carcter P. Al escribir este valor en un LCD, se visualizar el smbolo de la localidad 0101 0000 de la CGROM. En otras palabras,
se visualizar el carcter P. Esto se aplica a todas las letras del alfabeto (minsculas y maysculas), pero no se aplica a los nmeros.
Como se muestra en el mapa anterior, las direcciones de todos los dgitos se desplazan por 48 en relacin con sus valores (direccin del
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
Adems de los caracteres estndar, el visualizador LCD puede visualizar smbolos definidos por el usuario. Esto puede ser cualquier
smbolo de 5x8 pxeles. La memoria RAM denominada CGRAM de 64 bytes lo habilita.
Los registros de memoria son de 8 bits de anchura, pero slo se utilizan 5 bits ms bajos. Un uno lgico (1) en cada registro representa un
punto oscurecido, mientras que 8 localidades agrupados representan un carcter. Esto se muestra en la siguiente figura:
Los smbolos estn normalmente definidos al principio del programa por una simple escritura de ceros y unos de la memoria CGRAM as
RS = 1 - Los bits D0 - D7 son direcciones de los caracteres a visualizar. El procesador LCD direcciona un carcter
del mapa de caracteres y lo visualiza. La direccin DDRAM especifica la localidad en la que se va a visualizar el
carcter. Esta direccin se define antes de transmitir el carcter o la direccin del carcter anteriormente transmitido
ser aumentada automticamente.
RS = 0 - Los bits D0 - D7 son los comandos para ajustar el modo del visualizador.
En la siguiente tabla se muestra una lista de comandos reconocidos por el LCD:
COMANDO
RS
RW
D7
D6
D5
D4
D3
D2
D1
D0
TIEMPO DE
EJECUCIN
Borrar el visualizador
1.64mS
1.64mS
Modo de entrada
I/D
40uS
Activar/desactivar el visualizador
40uS
Desplazar el cursor/visualizador
D/C
R/L
40uS
DL
Modo de funcionamiento
Direccin CGRAM
40uS
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
Direccin CGRAM
40uS
40uS
D 1 = Visualizador encendido
0 = Visualizador apagado
U 1 = Cursor activado
0 = Cursor desactivado
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.
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:
/* En mikroC for PIC, basta con escribir slo una funcin para realizar todo el proceso
de la inicializacin del LCD. Antes de llamar esta funcin es necesario declarar los
bits LCD_D4-LCD_D7, LCD_RS y LCD_EN. */
...
Lcd_Init(); // Inicializar el LCD
...
EJEMPLOS PRCTICOS
El proceso de crear un proyecto nuevo es muy simple. Seleccione la opcin New Project del men Project como se muestra en la
Figura de la derecha.
Aparecer una ventana que le guiar a travs del proceso de creacin de un proyecto nuevo. La ventana de entrada de este programa
contiene una lista de acciones a realizar para crear un proyecto nuevo. Pulse el botn Next.
Una vez creado el programa, es necesario compilarlo en un cdigo .hex. Seleccione una de las opciones para compilar del men Project:
Para crear un archivo .hex, seleccione la opcin Build (Ctrl+F9) del men Project o pulse sobre el icono Build de la
barra de herramientas Project.
Por medio de la opcin Build All Projects (Shift+F9) se compilan todos los archivos del proyecto, libreras (si el
cdigo fuente contiene alguna de ellas) y los archivos def para el microcontrolador utilizado.
La opcin Build + Program (Ctrl+F11) es importante ya que permite al compilador mikroC PRO for PIC cargar
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.
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".
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.
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. Cuando el programa salga de este bucle, el
microcontrolador se inicia al utilizar el oscilador LFINTOSC como una fuente de seal de reloj. Los LEDs parpadean ms lentamente
aunque el programa ejecuta el mismo bucle do-while con un tiempo de retardo 10 veces ms corto.
Con el propsito de hacer evidentes algunas situaciones potencialmente peligrosas, se activan los bits de control por medio de las
instrucciones en ensamblador. Dicho de manera sencilla, al entrar o salir una instruccin en ensamblador en el programa, el compilador no
almacena los datos en un banco actualmente activo de la RAM, lo que significa que en esta seccin de programa, la seleccin de bancos
depende del registro SFR utilizado. Al volver a la seccin de programa escrito en C, los bits de control RP0 y RP1 deben recuperar el estado
que tenan antes de la aventura en ensamblador. En este programa, el problema se resuelve al utilizar la variable auxiliar saveBank, lo que
guarda el estado de estos dos bits.
/* Cabecera *********************************************/
int k = 0;
char saveBank;
void main() {
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
TRISB = 0;
do {
PORTB = ~PORTB;
Delay_ms(100);
k++;
}
while(k<20);
k=0;
// Reiniciar variable k
saveBank = STATUS & 0b01100000; // Guardar el estado de los bits RP0 y RP1
asm {
bsf
bcf
bcf
bcf
bcf
bsf
}
STATUS,RP0
STATUS,RP1
OSCCON,6
OSCCON,5
OSCCON,4
OSCCON,0
//
//
//
//
//
//
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.
/*Cabecera****************************************************/
void main() {
char TEST = 5;
// Constante TEST = 5
enum salidas {REL = 3}; // Constante RELAY = 3
ANSEL = 0;
ANSELH = 0;
PORTA = 0;
TRISA = 0xFF;
PORTD = 0;
TRISD = 0b11110111;
//
//
//
//
OPTION_REG.F5 = 1;
OPTION_REG.F3 = 1;
TMR0 = 0;
do {
if (TMR0 == TEST)
(PORTD.RELAY = 1);
}
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.
/*Cabecera******************************************************/
unsigned cnt;
void interrupt() {
cnt++;
TMR0 = 96;
INTCON = 0x20;
}
void main(){
OPTION_REG = 0x84;
ANSEL = 0;
ANSELH = 0;
TRISB = 0;
PORTB = 0x0;
TMR0 = 96;
INTCON = 0xA0;
cnt = 0;
do {
if (cnt == 400) {
PORTB = PORTB++;
cnt = 0;
}
} while(1);
como salidas
Reiniciar el puerto PORTB
Temporizador T0 cuenta de 96 a 255
Habilitada interrupcin TMR0
A la variable cnt se le asigna un 0
//
//
//
//
Bucle infinito
Incrementar el puerto PORTB despus 400 interrupciones
Incrementar nmero en el puerto PORTB en 1
Reiniciar la variable cnt
Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una interrupcin.
/*Cabecera******************************************************/
unsigned short cnt;
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 {
if (cnt == 76) {
PORTB = ~PORTB;
cnt = 0;
}
} while (1);
Bucle infinito
Cambiar el estado del puerto PORTB despus de 76 interrupciones
Nmero en el puerto PORTB est invertido
Reiniciar la variable cnt
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******************************************************/
unsigned short cnt;
void Reemplazar() {
PORTB = ~PORTB;
}
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ;
PIR1.TMR2IF = 0;
TMR2 = 0;
}
}
// main
void main() {
cnt = 0;
ANSEL = 0;
ANSELH = 0;
PORTB = 0b10101010;
TRISB = 0;
T2CON = 0xFF;
//
//
//
//
Si el bit TMR2IF = 1,
Incrementar variable la cnt en 1
Reiniciar el bit y
Reiniciar el registro TMR2
TMR2 = 0;
PIE1.TMR2IE = 1;
INTCON = 0xC0;
while (1) {
if (cnt > 30) {
//
//
//
//
//
Reemplazar();
cnt = 0;
Bucle infinito
Cambiar el estado del puerto PORTB despus de
ms de 30 interrupciones
Funcin Reemplazar invierte el estado del puerto PORTB
Reiniciar la variable cnt
}
}
}
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.
/*Cabecera******************************************************/
void main() {
OPTION_REG = 0x0E;
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.
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:
/*Cabecera******************************************************/
// Definir las variables ciclo_de_trabajo_actual,
// ciclo_de trabajo_anterior
unsigned short ciclo_de_trabajo_actual;
unsigned short ciclo_de trabajo_anterior;
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) {
if (Button(&PORTA, 0,1,1))
ciclo_de_trabajo_actual++ ;
if (Button(&PORTA, 1,1,1))
ciclo_de_trabajo_actual-- ;
Bucle infinito
Si se presiona el botn
incrementar el valor de
Si se presiona el botn
decrementar el valor de
if (old_duty != ciclo_de_trabajo_actual) {
// ciclo_de trabajo_anterior no son iguales
PWM1_Set_Duty(ciclo_de_trabajo_actual);
ciclo_de trabajo_anterior = ciclo_de_trabajo_actual;
PORTB = ciclo_de trabajo_anterior;
}
Delay_ms(200); // Tiempo de retardo de 200mS
conectado al RA0
la variable current_duty
conectado al RA1
la variable current_duty
// Si ciclo_de_trabajo_actual y
// ajustar un nuevo valor a PWM,
// Guardar el nuevo valor
// y visualizarlo en el puerto PORTB
}
}
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de
compilar el programa:
PWM
Button
4.9 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******************************************************/
unsigned int temp_res;
void main() {
ANSEL = 0x0C;
TRISA = 0xFF;
// como entradas
ANSELH = 0;
TRISB = 0x3F;
// como salidas
TRISD = 0;
ADCON1.F4 = 1 ;
do {
temp_res = ADC_Read(2);
PORTD = temp_res;
PORTB = temp_res >> 2;
} while(1);
//
//
//
//
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.
/*Cabecera******************************************************/
void main() {{
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
TRISB = 0;
// 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).
En este ejemplo, el temporizador TMR0 est encargado de la multiplexin por divisin en tiempo, mientras que la funcin mask convierte un
nmero binario a formato decimal.
/*Cabecera******************************************************/
unsigned short mask(unsigned short num);
unsigned short digit_no, digit10, digit1, digit, i;
void interrupt() {
if (digit_no == 0) {
PORTA = 0;
// Apagar ambos visualizadores
PORTD = digit1; // Colocar mscara para visualizar unidades en el
// puerto PORTD
PORTA = 1;
// Encender el visualizador para las unidades (LSD)
digit_no = 1;
}else{
PORTA = 0;
// Apagar ambos visualizadores
PORTD = digit10; // Colocar mscara para visualizar decenas en el
// puerto PORTD
PORTA = 2;
digit_no = 0;
}
TMR0 = 0;
INTCON = 0x20;
}
void main() {
OPTION_REG = 0x80;
TMR0 = 0;
INTCON = 0xA0;
PORTA = 0;
TRISA = 0;
// como salidas
PORTD = 0;
TRISD = 0;
// como salidas
do {
for (i = 0; i<=99; i++) {
digit = i % 10u;
digit1 = mask(digit);
digit = (char)(i / 10u)
digit10 = mask(digit);
Delay_ms(1000);
}
} while (1);
// Contar de 0 a 99
// Preparar la mscara para visualizar unidades
% 10u;
// Preparar la mscara para visualizar decenas
// Bucle infinito
}
mask.c
/*Cabecera******************************************************/
unsigned
switch
case
case
case
case
case
case
case
case
case
case
}
}
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.
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*****************************************************/
// Conexiones del mdulo LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Final de las conexiones del mdulo LCD
// Declarar variables
unsigned char ch;
unsigned int adc_rd;
char *text;
long tlong;
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);
ADCON1 = 0x82;
TRISA = 0xFF;
Delay_ms(2000);
text = "voltage:";
while (1) {
adc_rd = ADC_Read(2);
// Conversin A/D. Pin RA2 es una entrada.
Lcd_Out(2,1,text);
// Escribir el resultado en la segunda lnea
tlong = (long)adc_rd * 5000; // Convertir el resultado en milivoltios
tlong = tlong / 1023;
// 0..1023 -> 0-5000mV
ch = tlong / 1000;
// Extraer voltios (miles de milivoltios)
// del resultado
Lcd_Chr(2,9,48+ch);
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10;
Lcd_Chr_CP(48+ch);
ch = (tlong / 10) % 10;
Lcd_Chr_CP(48+ch);
ch = tlong % 10;
Lcd_Chr_CP(48+ch);
Lcd_Chr_CP('V');
Delay_ms(1);
}
}
4.13 EJEMPLO 11
Comunicacin serial RS-232
Este ejemplo muestra cmo utilizar el mdulo EUSART del microcontrolador. La conexin a una PC se habilita por medio del estndar de
comunicacin RS-232. El programa funciona de la siguiente manera. Cada byte recibido por medio de la comunicacin serial se visualiza al
utilizar los LEDs conectados al puerto PORTB y despus se devuelve automticamente al transmisor. Si ocurre un error en recepcin, se lo
indicar al encender el diodo LED. La manera ms fcil es comprobar el funcionamiento del dispositivo en la prctica al utilizar un programa
estndar de Windows denominado Hyper Terminal.
/*Cabecera******************************************************/
unsigned short i;
void main() {
UART1_Init(19200); // Inicializar el mdulo USART
// (8 bits, tasa de baudios 19200, no hay bit
// de paridad...)
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:
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******************************************************/
// Conexiones del mdulo
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at
sbit LCD_EN_Direction at
sbit LCD_D4_Direction at
sbit LCD_D5_Direction at
sbit LCD_D6_Direction at
sbit LCD_D7_Direction at
LCD
TRISB4_bit;
TRISB5_bit;
TRISB0_bit;
TRISB1_bit;
TRISB2_bit;
TRISB3_bit;
Extraer
Extraer
Extraer
Extraer
dgito
dgito
dgito
dgito
de
de
de
de
miles
centenas
decenas
unidades
Lcd_Init();
//
Lcd_Cmd(_LCD_CLEAR);
//
Lcd_Cmd(_LCD_CURSOR_OFF); //
Lcd_Out(1, 1, " Temperatura:
Inicializar el LCD
Borrar el LCD
Apagar el cursor
");
reinicio de Onewire
el comando SKIP_ROM
el comando CONVERT_T
el comando SKIP_ROM
el comando READ_SCRATCHPAD
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.
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
}
void Melody1() { //
Tone1(); Tone2();
Tone1(); Tone2();
Tone1(); Tone2();
Tone1(); Tone2();
Tone1(); Tone2();
Tone3(); Tone3();
Componer
Tone3();
Tone3();
Tone3();
Tone3();
Tone3();
Tone2();
}
void ToneA() { // Tono A
Sound_Play( 880, 50);
}
void ToneC() { // Tono C
Sound_Play(1046, 50);
}
void ToneE() { // Tono E
Sound_Play(1318, 50);
}
void Melody2() { // Componer una meloda divertida 2
unsigned short i;
for (i = 9; i > 0; i--) {
ToneA(); ToneC(); ToneE();
}
}
void main() {
ANSEL = 0;
ANSELH = 0;
TRISB = 0xF0;
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. Sin embargo, al aadir un comentario delante de la directiva
#define COMPLETE_EXAMPLE se deshabilita visualizar algunas imgenes de la secuencia. Si se comenta (o si se borra) esta directiva, las
sentencias entre las directivas #ifdef COMPLETE_EXAMPLE y #endif no sern compiladas, as que no se ejecutarn.
/*Cabecera******************************************************/
//Declaraciones----------------------------------------------------------------const code char truck_bmp[1024]; // Declarar la constante definida en truck_bmp.c
// para utilizarla en este archivo
//--------------------------------------------------------final-de-declaraciones
// Conexiones del mdulo Glcd
char GLCD_DataPort at PORTD;
sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS at RB2_bit;
sbit GLCD_RW at RB3_bit;
sbit GLCD_EN at RB4_bit;
sbit GLCD_RST at RB5_bit;
sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction at TRISB2_bit;
sbit GLCD_RW_Direction at TRISB3_bit;
sbit GLCD_EN_Direction at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// Final de conexiones del mdulo Glcd
void delay2S(){
Delay_ms(2000);
}
void main() {
unsigned short ii;
char *someText;
/* Esta directiva define un macro denominado COMPLETE_EXAMPLE. Ms tarde en el
programa, la directiva ifdef prueba si este macro est definido. Si se borra esta
lnea o si se transforma en un comentario, las secciones del cdigo entre las
directivas ifdef y endif no sern compiladas. */
#define COMPLETE_EXAMPLE // Poner esta lnea como un comentario si quiere
// visualizar la versin corta de la secuencia
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
Glcd_Init();
// Inicializar el GLCD
Glcd_Fill(0x00); // Borrar el GLCD
while(1) {
Glcd_Write_Text("mikroE", 1, 7, 2);
for (ii = 1; ii <= 10; ii++)
Glcd_Circle(63,32, 3*ii, 1);
delay2S();
// Escribir la cadena
// Dibujar los crculos
// Dibujar la caja
// Cambiar de la fuente
// Escribir la cadena
// Cambiar de la fuente
// Escribir la cadena
// Cambiar de la fuente
// Escribir la cadena
// Cambiar de la fuente
// Escribir la cadena
}
truck_bmp.c:
/*Cabecera*****************************************************/
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
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.
El procedimiento para determinar las coordenadas de la posicin del panel que ha sido presionado se puede dividir en dos pasos. El
primero es determinacin de la coordenada X, y el segundo es de determinar la coordenada Y de la posicin.
Para determinar la coordenada X, es necesario conectar el contacto izquierdo en la superficie A a la masa (tierra) y el contacto derecho a la
fuente de alimentacin. Esto permite obtener un divisor de voltaje al presionar el panel tctil. El valor de voltaje obtenido en el divisor se
puede leer en el contacto inferior de la superficie B. El voltaje variar en el rango de 0V al voltaje suministrado por la fuente de alimentacin
y depende de la coordenada X. Si el punto est prximo al contacto izquierdo de la superficie A, el voltaje estar prximo a 0V.
Para la determinacin de la coordenada Y, es necesario conectar el contacto inferior de la superficie B a masa (tierra), mientras que el
contacto superior se conectar a la fuente de alimentacin. En este caso, el voltaje se puede leer en el contacto izquierdo de la superficie A .
Para conectar un panel tctil al microcontrolador es necesario crear un circuito para el control del panel tctil. Por medio de este circuito, el
microcontrolador conecta los contactos adecuados del panel tctil a masa y a la voltaje de alimentacin (como describimos anteriormente)
para determinar las coordenadas X y Y. El contacto inferior de la superficie B y el contacto izquierdo de la superficie A estn conectados al
convertidor A/D del microcontrolador. Las coordenadas X e Y se determinan midiendo el voltaje en los respectivos contactos. El software
consiste en mostrar un men en una pantalla LCD grfica, conmutar de encendido a apagado del panel tctil (control del panel tctil) y leer
los valores del convertidor A/D que representan realmente las coordenadas X e Y de la posicin.
Una vez determinadas las coordenadas, es posible decidir qu es lo que deseamos que haga el microcontrolador. En este ejemplo se
explica cmo conmutar entre encendido y apagado dos pines digitales del microcontrolador, conectados a los LEDs A y B.
En este ejemplo se utilizan las funciones que pertenecen a las libreras Glcd y ADC.
Teniendo en cuenta que la superficie del panel tctil es ligeramente mayor que la del LCD grfico, en caso de requerir una mayor precisin
en la determinacin de las coordenadas, es necesario incluir el software de calibracin del panel tctil.
/* Cabecera ***************************************************/
void main() {
PORTA = 0x00;
TRISA = 0x03; // RA0 y RA1 son entradas analgicas
ANSEL = 0x03;
ANSELH = 0;
// Configurar otros pines AN como digitales de E/S
PORTC = 0 ;
// Todos los pines del puerto PORTC estn a 0 (incluyendo los
// pines RC6 y RC7)
TRISC = 0 ;
Glcd_Box(70,18,118,46,1);
// Visualizar los mensajes en los botones
Glcd_Write_Text(msg3,14,3,0);
Glcd_Write_Text(msg5,14,4,0);
Glcd_Write_Text(msg4,74,3,0);
Glcd_Write_Text(msg6,74,4,0);
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 BUTTON1 ha sido presionado
if ((x_coord128 >= 10) && (x_coord128
(y_coord64 <= 46)) {
if(PORTC.F6 == 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); //
}
}
// Si BUTTON2 ha sido presionado
if ((x_coord128 >= 70) && (x_coord128
(y_coord64 <= 46)) {
if(PORTC.F7 == 0) { // Si RC7 = 0
PORTC.F7 = 1;
//
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
previous chapter | table of contents | next chapter
Related Links:
Products
News
Forums
Distributors
About Us
Legal Information
Product Archive
Copyright 19982012. MikroElektronika. All rights reserved. All trade and/or services marks mentioned are the property of their respective owners.
Contact Us
Products
Solutions
Kits
Easy Buy
Support
Downloads
Enter keywords
Un microcontrolador se parece a un genio en la botella, y no se necesita saber mucho para utilizarlo. Para crear un dispositivo controlado
por un microcontrolador, se necesita una PC, programa para compilar y un dispositivo para transmitir el cdigo de la PC al chip mismo.
Aunque este proceso parece muy lgico, con frecuencia surgen las dudas, no por que es complicado, sino por un gran nmero de
variaciones. A ver...
A.1
A.2
A.3
A.4
VAMOS A EMPEZAR...
COMPILACIN DE PROGRAMA
PROGRAMAR EL MICROCONTROLADOR
SISTEMAS DE DESARROLLO
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!
Featured Compilers
mikroC PRO for PIC
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:
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.).
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...
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?
Related Links:
Products
News
Forums
Distributors
About Us
Legal Information
Product Archive
Copyright 19982012. MikroElektronika. All rights reserved. All trade and/or services marks mentioned are the property of their respective owners.
Contact Us