Está en la página 1de 19

Universidad Nacional de Quilmes

Sistemas Digitales

Sistemas Digitales

Trabajo Práctico final

Implementación de un entorno de desarrollo


para proyectos con microcontroladores

Desarrollo: Guillermo Carrera


Legajo 4213
Fecha: Julio de 2005.

Guillermo H. Carrera – 4213 Hoja 1 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Consigna.

Desarrollar e implementar un entorno de programación y grabado de un microcontrolador.


Particularmente se aplicara lo desarrollado para implementar el uso de un conversor A/D externo y la
comunicación bi direccional entre un microcontrolador y una PC de escritorio.

Utilidad.

Tanto el software como el hardware desarrollado incrementarán las herramientas a disposición de la


Universidad Nacional de Quilmes, las cuales podrán brindarse como alternativas de los kits de
desarrollo ya utilizados en la universidad. Por lo tanto la finalidad del proyecto se basa en brindar a los
estudiantes un paquete de herramientas con su funcionamiento verificado, de modo tal que cada
alumno que pretenda utilizar un microcontrolador, pueda utilizar este informe a modo de “manual de
uso” para abordar cada proyecto en la instancia de programación y no tener que desarrollar desde el
inicio los entornos de grabación y programación, ni tampoco el hardware necesario.

Objetivos mínimos propuestos.

1) Elección del microcontrolador


Investigación para la elección del microcontrolador apropiado.
Recopilación de información técnica y análisis de factibilidad de uso.

2) Elección del entorno de programación del microcontrolador.


Investigación sobre el entorno de programación más adecuado para el proyecto.
Obtención del software a utilizar.
Utilización del software para adquirir el manejo del mismo.

3) Elección del software y hardware para el grabado del microcontrolador.


Investigación sobre el esquema software-hardware más conveniente para el proyecto.
Obtención del software a utilizar.
Montaje del hardware para el grabado del microcontrolador.

4) Verificación del funcionamiento del paquete completo de programación del microcontrolador


Realización de programas a modo de ejemplo para verificar y adoptar el modo de funcionamiento de los entornos de
programación y grabado.
- Rutinas I/O, Timmers, Conversores, Comunicación RS232, etc
Comprobación del funcionamiento del hardware para grabación y aplicación del microcontrolador.

5) Elección del conversor analógico digital


Investigación para la elección del conversor apropiado.
Determinación del uso de un único conversor de dos canales, dos conversores de un canal o un conversor y el conversor
interno del microcontrolador.
Recopilación de información técnica y análisis de factibilidad de uso.

6) Comunicación microcontrolador-conversor
Investigación sobre el esquema I²C
Implementación de la comunicación microcontrolador-conversor

7) Actuación PWM
Investigación sobre aplicación PWM del microcontrolador
Implementación del PWM

8) Comunicación microcontrolador-PC
Investigación para la elección del esquema de comunicación más adecuado.

Guillermo H. Carrera – 4213 Hoja 2 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Implementación de la comunicación microcontrolador-PC.


1) Elección del microcontrolador

Existe una gran diversidad de microcontroladores. Quizá la clasificación más importante sea entre
microcontroladores de 4, 8, 16 ó 32 bits. Aunque las prestaciones de los microcontroladores de 16 y 32
bits son superiores a los de 4 y 8 bits, la realidad es que los microcontroladores de 8 bits dominan el
mercado y los de 4 bits se resisten a desaparecer. La razón de esta tendencia es que los
microcontroladores de 4 y 8 bits son apropiados para la gran mayoría de las aplicaciones, lo que hace
absurdo emplear micros más potentes y consecuentemente más caros.
También los modernos microcontroladores de 32 bits van afianzando sus posiciones en el mercado,
siendo las áreas de más interés el procesamiento de imágenes, las comunicaciones, las aplicaciones
militares, los procesos industriales y el control de los dispositivos de almacenamiento masivo de datos.
A la hora de escoger el microcontrolador a emplear en un diseño concreto hay que tener en cuenta
multitud de factores, como la documentación y herramientas de desarrollo disponibles y su precio, la
cantidad de fabricantes que lo producen y por supuesto las características del microcontrolador (tipo de
memoria de programa, número de temporizadores, interrupciones, etc.):
Antes de seleccionar un microcontrolador es imprescindible analizar los requisitos de la aplicación:

• Procesamiento de datos: puede ser necesario que el microcontrolador realice cálculos críticos en
un tiempo limitado. En ese caso debemos asegurarnos de seleccionar un dispositivo
suficientemente rápido para ello. Por otro lado, habrá que tener en cuenta la precisión de los
datos a manejar: si no es suficiente con un microcontrolador de 8 bits, puede ser necesario acudir
a microcontroladores de 16 ó 32 bits, o incluso a hardware de coma flotante. Una alternativa más
barata y quizá suficiente es usar librerías para manejar los datos de alta precisión. -

• Entrada Salida: para determinar las necesidades de Entrada/Salida del sistema es conveniente
dibujar un diagrama de bloques del mismo, de tal forma que sea sencillo identificar la cantidad y
tipo de señales a controlar. Una vez realizado este análisis puede ser necesario añadir periféricos
hardware externos o cambiar a otro microcontrolador más adecuado a ese sistema.

• Memoria: para detectar las necesidades de memoria de nuestra aplicación debemos separarla en
memoria volátil (RAM), memoria no volátil (ROM, EPROM, etc.) y memoria no volátil
modificable (EEPROM).

• Ancho de palabra: el criterio de diseño debe ser seleccionar el microcontrolador de menor ancho
de palabra que satisfaga los requerimientos de la aplicación. Usar un microcontrolador de 4 bits
supondrá una reducción en los costes importante, mientras que uno de 8 bits puede ser el más
adecuado si el ancho de los datos es de un byte. Los microcontroladores de 16 y 32 bits, debido a
su elevado coste, deben reservarse para aplicaciones que requieran sus altas prestaciones
(Entrada/Salida potente o espacio de direccionamiento muy elevado).

• Diseño de la placa: la selección de un microcontrolador concreto condicionará el diseño de la


placa de circuitos. Debe tenerse en cuenta que quizá usar un microcontrolador barato encarezca el
resto de componentes del diseño.

Guillermo H. Carrera – 4213 Hoja 3 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Los microcontroladores más populares son:

8048 (Intel). Es el padre de los microcontroladores actuales, el primero de todos. Su precio,


disponibilidad y herramientas de desarrollo hacen que todavía sea muy popular.

8051 (Intel y otros). Es sin duda el microcontrolador más popular. Fácil de programar, pero potente.
Está bien documentado y posee cientos de variantes e incontables herramientas de desarrollo.

80186, 80188 y 80386 EX (Intel). Versiones en microcontrolador de los populares microprocesadores


8086 y 8088. Su principal ventaja es que permiten aprovechar las herramientas de desarrollo para PC.

68HC11 (Motorola y Toshiba). Es un microcontrolador de 8 bits potente y popular con gran cantidad
de variantes.

683xx (Motorola). Surgido a partir de la popular familia 68k, a la que se incorporan algunos
periféricos. Son microcontroladores de altísimas prestaciones.

PIC (MicroChip). Familia de microcontroladores que gana popularidad día a día. Fueron los primeros
microcontroladores RISC.

Es preciso resaltar en este punto que existen innumerables familias de microcontroladores, cada una de
las cuales posee un gran número de variantes.

En el caso particular de este proyecto la elección del microcontrolador se encontró influenciada por el
uso en el entorno laboral de quién suscribe, de la familia de microcontroladores PIC. Por lo tanto casi a
modo de necesidad se optó por utilizar un microcontrolador PIC, para adquirir experiencia con este
tipo de microprocesadore. Por lo cual el proceso de elección tuvo su curso en sentido opuesto, es decir
en lugar de enumerar las prestaciones que debía cumplir el microprocesador y en base a ello
seleccionar el más adecuado, se tomó el PIC16F873A, que es el que utilizado en dicho entorno laboral,
y se verificó si el mismo cumplía los requisitos necesarios. Ampliando el estadio actual de la industria
nacional, puede verificarse que los microcontroladores PIC son los mas utilizados.
Los detalles más importantes que hacen que la familia de microcontroladores PIC sea la más utilizada
hoy en día son los siguientes:
- Sencillez de manejo: Tienen un juego de reducido de instrucciones (35).
- Buena información, fácil de conseguir y económica.
- Precio: Su coste es comparativamente inferior al de sus competidores.
- Poseen una elevada velocidad de funcionamiento. Buen promedio de parámetros: velocidad,
consumo, tamaño, alimentación, código compacto, etc.
- Herramientas de desarrollo sencillas y de bajo costo. Muchas herramientas software se pueden
obtener libremente a través de Internet desde Microchip (http://www.microchip.com).
- Existe una gran variedad de herramientas hardware que permiten grabar, depurar, borrar y comprobar
el comportamiento de los PIC.

En la hoja de datos anexa como 16F873.pdf del CD adjunto al informe, puede encontrarse el manual
de uso de la familia de microcontroladores 16F8XX, en el cual se encontrará completa información
sobre el funcionamiento y utilizacion del mismo.

Guillermo H. Carrera – 4213 Hoja 4 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Algunas de las características más relevantes son las que se detallan a continuación:

• Velocidad de operación 20 MHz


• 8K x 14 words de memoria programable FLASH
368 x 8 bytes de RAM
256 x 8 bytes de EEPROM Data Memory
• Pinout compatible con PIC16C73B/74B/76/77
• 14 fuentes de interrupción
• Modo de direccionamiento directo, indirecto y relativo
• Watchdog Timer (WDT)
• In-Circuit Serial Programming(ICSP)
• In-Circuit Debugging
• Timer0: 8-bit timer/counter con prescaler
• Timer1: 16-bit timer/counter con prescaler
• Timer2: 8-bit timer/counter con prescaler y postscaler
• Dos módulos Capture, Compare o PWM
• Conversor 10-bit A/D multi-channel
• Synchronous Serial Port (SSP) con SPI(Master mode)
y I2C(Master/Slave)
• Universal Synchronous Asynchronous Receiver
Transmitter (USART/SCI)
• Parallel Slave Port (PSP)

2) Elección del entorno de programación del microcontrolador.

Como condición inicial para le elección del software de programación se tuvo en cuenta la necesidad
de programar en un lenguaje de alto nivel y en particular en lenguaje C que es el más difundido para
este tipo de aplicaciones. La necesidad de utilizar un lenguaje de alto nivel radica en las
complicaciones que pueden surgir sobre todo en la implementación de las rutinas de comunicación con
distintos periféricos. Dada la complejidad de dichas rutinas, se consideró que el uso del lenguaje
ensamblador podría acarrear muchas complicaciones.
Siguiendo los lineamientos de la elección del microcontrolador, se intentó implementar el uso del
entorno de programación utilizado en el entorno laboral de quien suscribe, de ese modo se comenzó a
investigar y utilizar el software PicAntIDE.

El software PicAntIDE en su versión 5.1 incluye un compilador en C (BoostC compiler), con lo cual
no se necesita más que la instalación del mismo para poder programar y compilar en lenguaje C. Tal es
así que se comenzaron a programar e implementar pequeñas rutinas de manejo de puertos. Pero el
problema que se presentó con dicho software, es que el mismo no posee un emulador integrado para
poder simular el funcionamiento del PIC y así poder verificar el programa realizado.
Luego de varios intentos fallidos de agregar al paquete un emulador y no obtener los resultados
esperados, se opto por utilizar otro entorno de programación.
El siguiente entorno investigado fue el Mplab. El atractivo de utilizar dicho entorno se basa en que es
el software desarrollado por Microchip, empresa que desarrolla la familia de microcontroladores PIC,
y además por ser el más difundido dentro de los entornos de programación de microcontroladores.
En el caso del entorno MPLAB, la principal dificultad radica en que solo la última versión del paquete,
posee integrado un compilador en C. Cabe aclarar que la última versión del software no tiene
distribución gratuita, por lo cual es muy complicado poder utilizar el mismo si no se cuanta con la
licencia correspondiente.

Guillermo H. Carrera – 4213 Hoja 5 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Teniendo en cuenta lo anterior se optó por utilizar una versión anterior, de distribución gratuita, a la
cual se le puede agregar un compilador en C. La versión anterior que se puede obtener en la página
oficial de Microchip es la versión 7.10. Dicha versión de MPLAB se encuentra adjunta al informe en
el CD correspondiente bajo el nombre MPLAB710. En el CD también se encuentra una guía de
introducción al entorno (MPLAB tutorial.pdf) donde se detalla el proceso de instalación del mismo y
los pasos a seguir para realizar los primeros proyectos, además de un patch de actualización del
programa (ver “guía para uso de entorno microcontroladores”).

El siguiente paso fue la elección del compilador de lenguaje C a utilizar, para ello se buscó en Internet
cuales eran los compiladores más difundidos que soporta el MPLAB 7.10, llegando a la determinación
de elegir entre dos compiladores a saber:

- CC5X Versión 3.2


- CCSC Versión 3.216

Si bien ambos compiladores pueden utilizarse en el entorno MPLAB, se optó por utilizar el CCSC que
se diferencia del CC5X al poseer mayor cantidad de funciones propias y librarías a incluir.
Por ejemplo, para el caso de las comunicaciones vía I²C y SPI, el compilador CCSC incluye funciones
propias de lectura, escritura y configuración de los periféricos.
El compilador CCSC no es de distribución gratuita, de todos modos se adjunta al informe en el CD
correspondiente.
La instalación del mismo no es sencilla y debido a la difusión de algunos “parches” se deben seguir los
pasos indicados en la guía para uso de entorno microcontroladores anexa a este informe.
El compilador CCSC posee una completa bibliografía sobre el uso de sus funciones internas, en el CD
adjunto se brinda el manual del compilador bajo el nombre CCSC manual.pdf donde se puede
encontrar una guía completa sobre el uso del compilador, el uso de sus funciones específicas así como
también ejemplos de aplicación.

3) Elección del software y hardware para el grabado del microcontrolador.

La gran cantidad de información que se obtiene en internet evidencia la gran cantidad de placas que
existen para el grabado de los PIC. En su mayoría se trata de empresas que venden el kit de desarrollo
la placa de grabación y el software (programmer) que generalmente es compatible con Mplab. De ese
modo puede utilizarse el entorno Mplab para todas las tareas necesarias de desarrollo que son
programación, compilado, simulación y grabación.
Lamentablemente, por lo investigado, es dificultoso conseguir un programmer de distribución gratuita
que además brinde la posibilidad de acceder al diseño de la placa de grabación (sin tener que
comprarla). Planteado el problema, se optó por utilizar un programmer en forma individual al entorno
Mplab, con lo que se concluyó en la utilización del software Icprog y una placa de grabación que cuyo
funcionamiento se detalla a continuación:
(Extracto de http://www.pablin.com.ar/electron/circuito/mc/ppp/index.htm)

El funcionamiento del circuito es muy simple: los pines del puerto paralelo 2, 3, 5 y 10 (Ver figura 1)
permiten interconectar el circuito con la PC. El pin 2 es el encargado de traer los datos (desde la PC
hacia el integrado). El pin 3 es el envío de los pulsos de reloj (desde la PC hacia el integrado). En tanto
el pin 10 permite a la PC leer los datos desde el programador. El pin 5, por último, es el encargado de
controlar la tensión de programación (Vpp) necesaria para leer o escribir en un PIC.
La tensión de programación VPP es necesaria para indicarle al PIC que deseamos leerlo o programarlo.
Si en este pin (que es compartido con la entrada de RESET del micro) ponemos masa, el PIC sufre un

Guillermo H. Carrera – 4213 Hoja 6 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

reset, si ponemos el pin en alto (5v) el PIC trabaja normalmente mientras que si ponemos el pin a 12v
el PIC se inicializa en modo programación, quedando dos de los pines de E/S destinados a datos
(SDA) y reloj (SCL).
El integrado 74LS04 está formado internamente por seis buffers inversores. Estos permiten por un lado
obtener niveles TTL a su salida y por el otro no cargar de forma excesiva al puerto. Se colocan las
compuertas en serie para obtener a la salida el mismo nivel de entrada, sin invertir. Las resistencias de
1K dan seguridad al sistema para evitar que circule corriente excesiva.
El control de la tensión de programación lo efectúa el transistor NPN. Estando el pin 5 del puerto
paralelo a masa (en 0) tendremos al transistor abierto por lo que la corriente proveniente de +V (12v)
pasará por el diodo LED el cual no encenderá y se portará como un diodo común polarizado en directa,
pasará por la resistencia limitadora de corriente del LED la cual no ofrecerá mucha resistencia y será
inyectada al PIC en su terminal MCLR/VPP. Poniendo en 1 el bit que controla el pin 5 del puerto
paralelo, en cambio, el transistor se cierra y hace circular masa hacia el PIC haciendo, además,
encender el LED al quedar a masa el otro extremo de la resistencia limitadora de corriente.
La placa a disposición de la universidad se diferencia de la representada en la figura 1 ya que en la
misma se le agregó un transformador 220/12V y un circuito rectificador para poder conectar la misma
a la red de alimentación de 220V 50Hz.

Figura 1 - Diagrama del circuito a utilizar para el grabado de PIC’s

4) Verificación del funcionamiento del paquete completo de programación del


microcontrolador

Una vez definido el paquete de desarrollo se realizaron pequeños programas utilizando las funciones
internas del compilador C para verificar el funcionamiento del entorno, de ese modo con rutinas cortas
de manejo de puertos I/O, Timmers, interrupciones, etc. Se puede lograr un fluido manejo del entorno
de programación y simulación.
Las rutinas aplicadas no están incluidas en este informe dada la sencillez de las mismas, pero cada una
de las aplicaciones puede apreciarse en el código del proyecto final, donde se utilizan funciones de
comunicación con los periféricos, manejo de los puertos, timmers e interrupciones.
Al realizar dichas implementaciones, se pude verificar el correcto funcionamiento del entorno
desarrollado. Un resumen del manejo del entorno puede encontrarse en la “ guía de uso de entorno de
desarrollo de microcontroladores” anexa.

Guillermo H. Carrera – 4213 Hoja 7 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Por otro lado en el manual del compilador C, puede encontrarse una detallada explicación de las
funciones internas del compilador, acompañado por buena cantidad de ejemplos que ayudan a reforzar
los conceptos.

5) Elección del conversor analógico digital

Como objetivo del proyecto se había planteado el uso de un conversor externo para aumentar la
presición de las lecturas. Se partió de la base que el conversor interno del PIC es de 10 bits, con lo que
una condición fundamental era que el conversor tenga una resolución mayor a 10 bits, por ejemplo 12,
14 o 16. Por otro lado la idea inicial fue realizar una comunicación con el conversor vía I²C, si bien ese
protocolo de comunicación no es el más indicado para un dispositivo maestro con un solo esclavo, se
optó por esa comunicación por la enseñanza didáctica que se podría haber obtenido de la aplicación.
Otra de las condiciones que se impuso fue que el conversor fuera de la línea Microchip, simplemente
por el hecho de utilizar un esquema Microprocesador-perisférico de una misma marca para llevar
cierta correlación entre la bibliografía y la información que se pudiera conseguir de cada componente.
Siguiendo las imposiciones anteriores se seleccionó el conversor MCP3221, el cual cumple con todas
las condiciones, además de poseer varios canales eliminando así la necesidad de utilizar el conversor
A/D interno del micro.
El problema surgió al intentar adquirir dicho conversor, ya que el representante en argentina de
Microchip (Cika) no lo poseía en stock y el representante para Latinoamérica (Ibars) aplica costos de
envío sustancialmente elevados.
En siguiente correo resume lo anterior

----- Original Message -----


From: Iris Feliciano
To: laboratorio@sicaelec.com
Cc: Lourdes.Ibars@ibars.com
Sent: Wednesday, April 06, 2005 11:11 AM
Subject: FW: ask about MCP3221 / consulta sobre MCP3221

Estimado Sr. Carrera:


Buenos dias, gracias por su comunicación con Ibars Electronics y por su interes en los productos de nuestra
representada Microchip Technology.
Permitame informarle que el programa de muestras implementado por Microchip está enfocado exclusivamente
al sector comercial. Siendo así, con mucho gusto procederemos a cotizarle el convertidor solicitado.
Actualmente no disponemos de este en stock pero podemos solicitarlo a la Division de Pequeñas Ordenes de
Microchip y se demora entre 5 a 7 días en que recibamos la mercancía:
MCP3221A5T-I/OT 1 a 25 piezas @ $2.41 cada pieza
Su mercancía puede ser despachada vía DHL hacia su destino por un costo de $25.00 dolares. Como forma de
pago aceptamos tarjeta de crédito Visa o Master Card.
Nuevamente agradecemos su comunicación y estaremos en espera de su respuesta para procesar su orden
según sus instrucciones.
Respetuosamente,
Iris Feliciano
Operations Assistant
Ibars Electronics Corp.
Phone: (954) 680-7989
Fax: (954) 680-6589
http://www.ibars.com

From: Guillermo Carrera [mailto:laboratorio@sicaelec.com]


Sent: Monday, April 04, 2005 12:02 PM
To: sales@ibars.com

Guillermo H. Carrera – 4213 Hoja 8 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Cc: info@ibars.com; rsaco@unq.edu.ar


Subject: ask about MCP3221 / consulta sobre MCP3221

Dear Sirs Ibars


I'm writing you from National University of Quilmes (Argentina), career of Industrial Automation and Control
Engineering.
We are developing a new project where we use a micro procesor PIC and an A/D converter by I²C. We are
trying to use Microchip devices, but we can't get in Argentina your MCP3221 converter. We asked for it to
Microchip representative in Argentina (Cika Electrónica), and they adviced us to contact straight you.
We want to purchase three units of that model. Cika said they can't ask Microchip for so low quantity, and advice
us to get them as "samples". Anyway, we are prepared to pay for them and for delivery costs.
Please, we need you advice us about steps to get them.
I would appreciate very much your cooperation, and I will be waiting for your answer.
Thank you very much in advance!
Best regards

Señores Ibars
Me comunico en representación de la Universidad Nacional de Quilmes - Ingeniería en Automatización y
Control Industrial por el siguiente motivo: Estamos desarrollando un proyecto en el cual realizaremos una
comunicación mediante un microcontrolador PIC y un conversor A/D vía I²C. En nuestro afán de utilizar
productos de la línea Microchip, se nos presenta el problema de no poder conseguir en la Argentina el
conversor MCP3221. De aquí se desprende nuestra necesidad de comunicarnos con Uds. ya que el
representante de Microchip en Argentina, Cika Electrónica, no posee el mismo y nos encomendó a ustedes.
Por tal motivo nuestro interés radica en poder adquirir 3 (tres) unidades del mencionado conversor. El personal
de Cika nos indicó que deberíamos tratar el tema como "solicitud de muestras" ya que no se pueden solicitar
envíos por tan pequeñas cantidades, no obstante queremos que tengan en cuenta que estamos dispuestos a
abonar el precio del producto y los gastos de envío de ser necesario.
Apreciaría que me indiquen que pasos debemos seguir para poder obtener los mismos.
A espera de vuestra respuesta saludo a Uds. atentamente y les adjunto los datos de nuestra Universidad.

Guillermo H. Carrera.
Estudiante. Legajo 4213.
Docentes a cargo del proyecto: Sebastián Mallo - Roberto Saco
Universidad Nacional de Quilmes - Area Automatización y Control Industrial.
Av. Calchaquí 5800 km 23.5 - Florencio Varela (CP 1888)
Buenos Aires - Argentina.
Tel: (5411) 4275-7714 Fax: (5411) 4275-7716.
http://iaci.unq.edu.ar/

Dado el elevado costo de adquisición del conversor MCP3221, se optó por seleccionar otro conversor
de la línea Microchip. Fue así que se optó por utilizar el conversor MCP3208 de Microchip, el cual
cumple las condiciones preestablecidas con la diferencia que para su comunicación utiliza el protocolo
SPI en lugar del protocolo I²C.
Dado que el microcontrolador posee un módulo de comunicación SPI, y que este tipo de comunicación
es más acorde al esquema a implementar (1 maestro – 1 esclavo), se optó por el uso de dicho conversor
En el CD adjunto, se incluye la hoja de datos con las características del conversor, las que en forma
resumida se detallan a continuación:

• 12-bit de resolución
• ± 1 LSB max DNL
• ± 2 LSB max INL (MCP3204/3208-C)
• 8 canales de entrada
• On-chip sample and hold
• interface serial SPI
• 100 ksps max. sampling

Guillermo H. Carrera – 4213 Hoja 9 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

6) Comunicación microcontrolador-conversor

Interfaz SPI

La interfaz SPI consta de cuatro señales básicas que cada una de ellas corresponde a una interconexión
de pines entre al microcontrolador y el conversor, las señales son:

- MOSI (Master Output/Slave Input)


- MISO (Master Input/Slave Output)
- SCLK (Serial Clock),
- SS (Slave Selector).

La comunicación se inicia desde el dispositivo maestro (microcontrolador) al colocar en bajo la señal


en el canal SS del dispositivo esclavo. El primer pulso de reloj recibido con el SS en bajo y MOSI en
alto establece el bit de strart (ver Figura 2).
La comunicación continúa desde el dispositivo maestro escribiendo cuatro bits de configuración en el
dispositivo esclavo desde el canal MOSI. Los cuatro bits de configuración establecen el modo de
conversión del dispositivo esclavo, cada uno de ellos representa lo siguiente:

1° bit - Modo de conversión. Puede seleccionarse entre modo simple y modo diferencial.
2° a 4° bit - Selección del canal. Puede seleccionarse cualquiera de los 8 canales del conversor.
La función de cada uno de los 4 bits de configuración pueden apreciarse en resumen en la siguiente
tabla:

Configuración del conversor Figura 2 – Comunicación SPI

Guillermo H. Carrera – 4213 Hoja 10 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

El conversor muestrea la entrada analogica del canal seleccionado a partir del cuarto pulso de reloj a
partir del bit de start (ver figura 2). Una vez ingresado el bit de configuración D0, es necesario un
pulso más de reloj para completar el período de muestreo y retención. En el siguiente pulso de reloj el
conversor pone en el canal de salida MISO un bit null (0). En los proximos 12 pulsos de reloj establece
el resultado de la conversión colocando al inicio el bit más significativo en el canal MISO.

A continuación se detalla un algorítmo de lectura de dos canales analógicos de 0 a 5V que se imprimen


vía RS232.
void main()
{
long int value;
adc_init();
printf("Sampling:\r\n");
do
{
delay_ms(1000);
value = read_analog(0);
printf("\n\rCh0: ");
display_data( value );

value = read_analog(1);
printf(" Ch1: ");
display_data( value );
} while (TRUE);
}

Las funciones a utilizar pueden agregarse en el mismo algorítmo o mediante un include y son las
siguientes:
#define MCP3208_CLK PIN_B0
#define MCP3208_DOUT PIN_B1
#define MCP3208_DIN PIN_B2
#define MCP3208_CS PIN_B3

void adc_init()
{
output_high(MCP3208_CS);
}

void write_adc_byte(BYTE data_byte, BYTE number_of_bits)


{
BYTE i;
delay_us(2);
for(i=0; i<number_of_bits; ++i) {
output_low(MCP3208_CLK);
if((data_byte & 1)==0)
output_low(MCP3208_DIN);
else
output_high(MCP3208_DIN);
data_byte=data_byte>>1;
delay_us(50);
output_high(MCP3208_CLK);
delay_us(50);
}
}

BYTE read_adc_byte(BYTE number_of_bits)


{
BYTE i,data;
data=0;
for(i=0;i<number_of_bits;++i)
{
output_low(MCP3208_CLK);
delay_us(50);
shift_left(&data,1,input(MCP3208_DOUT));
output_high(MCP3208_CLK);

Guillermo H. Carrera – 4213 Hoja 11 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

delay_us(50);
}
return(data);
}

long int read_analog_mcp(BYTE channel, BYTE mode)


{
int l;
long int h;
BYTE ctrl_bits;

delay_us(200);
if(mode!=0)
mode=1;
output_low(MCP3208_CLK);
output_high(MCP3208_DIN);
output_low(MCP3208_CS);
if(channel==1)
ctrl_bits=4;
else if(channel==3)
ctrl_bits=6;
else if(channel==4)
ctrl_bits=1;
else if(channel==6)
ctrl_bits=3;
else
ctrl_bits=channel;

ctrl_bits=ctrl_bits<<1;
if(mode==1)
ctrl_bits |= 1;
else
ctrl_bits &= 0xfe;
ctrl_bits=ctrl_bits<<1;
ctrl_bits |= 1;
write_adc_byte( ctrl_bits, 7);
h=read_adc_byte(8);
l=read_adc_byte(4)<<4;
output_high(MCP3208_CS);
return((h<<8)|l);
}

long int read_analog( BYTE channel ) // Auto specifies single mode


{
return read_analog_mcp( channel, 1);
}

void convert_to_volts( long int data, char volts[6])


{
BYTE i, d, div_h, div_l;
long int temp,div;
div=0x3330;
for(i=0;i<=4;i++)
{
temp=data/div;
volts[i]=(BYTE)temp+'0';
if(i==0)
{
volts[1]='.';
i++;
}
temp=div*(BYTE)temp;
data=data-temp;
div=div/10;
}
volts[i]='\0';
}

Guillermo H. Carrera – 4213 Hoja 12 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Precauciones referentes al uso del conversor


1) Dada la precisión (12 bits) del conversor, debe eliminarse toda fuente de ruido que pueda afectar a
la medición. Son prácticas aconsejables la inclusión de un filtro pasa bajos en la entrada analógica
del conversor y una correcta separación de masas analógicas y digitales.
2) Debe tenerse principal precaución de no aplicar tensión en el pin de referencia (Vref) si el chip no
está alimentado en Vdd, de ocurrir esa secuencia el conversor se “quema”. Para evitar ese
problema puede colocarse una resistencia en serie en la entrada Vref, que es de alta impedancia, de
ese modo se limita la corriente aplicada.

7) Actuación PWM

El PIC 16F873 posee dos módulos de captura, comparación o PWM, dichos módulos trabajan
analizando alguno de los dos timers del dispositivo y pueden configurarse para realizar una
comparación, conteo o PWM en base al timmer seleccionado.
Para este caso se utilizó el módulo 1 (CCP1) para implementar un PWM, dicho módulo trabaja con el
timmer2 del PIC. Para la implementación se utilizaron las siguientes funciones internas del compilador
CCSC

setup_ccp1(CCP_PWM); // Configura CCP1 como PWM


setup_timer_2(T2_DIV_BY_4, 127, 1); // período=(1/clock)*4*t2div*(period+1)=512micS=>1,95Kh
set_pwm1_duty(ct_pwm); // Setea ciclo de trabajo

A continuación se explica cada una:

a) setup_ccp1 (mode)

Esta función setea el modo de trabajo del CCP1. En modo conteo, cuenta los pulsos del timme1, en
modo comparación genera un evento en el pin de salida cuando el valor de timmer1 se iguala con el
valor inicializado en el cmódulo, y en modo PWM genera una onda cuadrada en el pin de salida.

- mode es una constante válida definida en el archivo .h correspondiente al dispositivo y puede tomar:

Anulación del mópdulo CCP: CCP_OFF


Seteo del modulo CCP como conteo: CCP_CAPTURE_FE Incrementa en pulso descendente
CCP_CAPTURE_RE Incrementa en pulso descendente
CCP_CAPTURE_DIV_4 Incrementa luego de 4 pulsos
CCP_CAPTURE_DIV_16 Incrementa luego de 16 pulsos
Seteo del módulo CCP como comparador: CCP_CMP
Seteo del módulo CCP como PWM: CCP_PWM

b) setup_timer_2 (mode, period, postscale)

El timmer2 es un contador de 8 bits, y la función setup_timmer_2 se utiliza para inicializar el modo de


funcionamiento del mismo, se debe prestar principal atención al seteo del timmer ya que de ello
depende la frecuencia del PWM

Guillermo H. Carrera – 4213 Hoja 13 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

- mode especifica la división del oscilador y puede tomar:


T2_DISABLED
T2_DIV_BY_1
T2_DIV_BY_4
T2_DIV_BY_16
- period es un entero de 0 a 255 que determina en que valor se resetea el timmer. (recordar que cuenta
8 bits)
- postscale es un número que determina cuantos reseteos del timmer deben ocurrir para que se
produzca la interrupción o evento.

c) set_pwm1_duty (value)

Esta función determina la el período que se mantiene la señal activa PWM, es decir determina el ciclo
de trabajo.

- value escribe el registro de 0 bits que determina el ciclo de trabajo del PWM. Debe tenerse en cuenta
que según la velocidad a la que trabaja el oscilador, el registro de 10 bits, puede reducirse a 8. Para
más información, referirse al página 61 de la hoja de datos del PIC16f873.

8) Comunicación microcontrolador-PC
El primer paso a realizar en una comunicación PIC-PC es la adaptación de la etapa física del canal de
comunicación.
Dado que el microcontrolador opera con niveles de tensión TTL (0-5V) y el protocolo RS-232 con niveles de ±3-
12V, se hace necesaria la inclusión de una adaptación de los niveles de tensión utilizados por el PIC.
Uno de los dispositivos más utilizados para realizar dicha adaptación de señal es el chip MAX-232. A
continuación se exponen sus principales características

Guillermo H. Carrera – 4213 Hoja 14 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

La conexión del mismo es la siguiente:

Funciones para la comunicación RS232.

El compilador CCSC brinda una gran cantidad de funciones de librerías C para el manejo de la
comunicación vía RS232. En el siguiente cuadro se listan las funciones disponibles:

En el lateral derecho de cada función se


indica la página del manual CCSC, en
donde se detalla el uso de cada una de las
funciones.

Guillermo H. Carrera – 4213 Hoja 15 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Algorítmo desarrollado.

El código utilizado para verificar el funcionamiento de los items desarrollados anteriormente es el


siguiente:
#include <16F873A.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=38400, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#include <mcp3208m1.c>
#include <stdlib.h>
#include<ctype.h>

//---- Interrupción por overflow Timer0


#INT_TIMER0
void control(void)
{
output_toggle(PIN_A5);
}

void main()
{
//-------------- Definición de variables
long int value_0=0,value_1=0 ; //lectura del conversor A/D
char puerto; //Entrada desde RS232
long ct_pwm; //ciclo de trabajo PWM
char escribir; //bandera para empezar a escribir
int transmitir; //variable para seguir escribiendo
char trama[4] ;
int cont=0; //cantidad de conversiones transmitidas
//-------------- Inicialización de variables
ct_pwm=0; //Rango 0 a 512
//-------------- Seteos
set_tris_a(0xb100110); // Setea modo port A
setup_ccp1(CCP_PWM); // Configura CCP1 como PWM
setup_timer_2(T2_DIV_BY_4, 127, 1); // período=(1/clock)*4*t2div*(period+1)=512micS=>1,95Kh
set_pwm1_duty(ct_pwm); // Setea ciclo de trabajo
setup_timer_0(RTCC_DIV_16); // período=clock/16/256/4 256=8 bit timer0
//-------------- Inicializaciones
adc_init(); //inicializa el conversor
enable_interrupts(INT_TIMER0); //habilita interrupción del timmer0
enable_interrupts(GLOBAL);

do
{
//------------- Lectura RS232
if(kbhit()) //Si debe leer el puerto
{
gets(trama);
escribir=trama[0];
}

//---------- Lectura del Conversor


value_0 = read_analog(0);
value_1 = read_analog(1);

//---------- Escritura RS232


if(escribir==73) //Recibe una I parea empezar a transmititr
{
ct_pwm=512;
set_pwm1_duty(ct_pwm); // Setea ciclo de trabajo

printf("p");
printf("%04lu",value_0); // Primer Canal
printf("s");
printf("%04lu",value_1); // Segundo Canal
printf("t"); // Ciclo de trabajo
printf("%03lu",ct_pwm);

Guillermo H. Carrera – 4213 Hoja 16 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

else
{
ct_pwm=0;
set_pwm1_duty(ct_pwm); // Setea ciclo de trabajo
}
//---------- Lectura del portA

if(input(PIN_A1)==1 || input(PIN_A2)==1)
{
ct_pwm=0;
set_pwm1_duty(ct_pwm);
}
} while (TRUE);
}

ARCHIVO mcp3208m1.c

#ifndef MCP3208_CS
#define MCP3208_CLK PIN_B0
#define MCP3208_DOUT PIN_B1
#define MCP3208_DIN PIN_B2
#define MCP3208_CS PIN_B4
#endif

void adc_init() //inicializa el conversor


{
output_high(MCP3208_CS);
}

void write_adc_byte(BYTE data_byte, BYTE number_of_bits) //Escribe los bits de configuración en el conversor
{
BYTE i;
delay_us(1);
for(i=0; i<number_of_bits; ++i) {
output_low(MCP3208_CLK);
if((data_byte & 1)==0)
output_low(MCP3208_DIN);
else
output_high(MCP3208_DIN);
data_byte=data_byte>>1;
delay_us(1);
output_high(MCP3208_CLK);
delay_us(1);
}
}

BYTE read_adc_byte(BYTE number_of_bits) //Lee los bits de conversión


{
BYTE i,data;
data=0;
for(i=0;i<number_of_bits;++i)
{
output_low(MCP3208_CLK);
delay_us(1);
shift_left(&data,1,input(MCP3208_DOUT));
output_high(MCP3208_CLK);
delay_us(1);
}
return(data);
}

long int read_analog(BYTE channel) //Arma una trama con los bits de configuración y los 12 bits leídos del conversor
{
int l;
long int h;
BYTE ctrl_bits;
delay_us(100);
output_low(MCP3208_CS);
output_low(MCP3208_CLK);
output_high(MCP3208_DIN);
if(channel==1)
ctrl_bits=4;
else

Guillermo H. Carrera – 4213 Hoja 17 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

ctrl_bits=channel;

ctrl_bits=ctrl_bits<<1;
ctrl_bits |= 1;
ctrl_bits=ctrl_bits<<1;
ctrl_bits |= 1;
write_adc_byte( ctrl_bits, 7);
h=read_adc_byte(8);
l=read_adc_byte(4);
output_high(MCP3208_CS);
return((h<<4)|l);
}

El funcionamiento del programa puede verificarse mediante conexión del Pic con una PC mediante
una herramienta de comunicación como por ejemplo el Hiperterminal de Windows.
Al escribir la letra “i” desde el Hiperterminal, se inicializa el proceso de conversión y se setea el PWM
al 100% del ciclo de trabajo. La trama recibida tendrá el siguiente formato:
p D1 D2 D3 D4 s D1 D2 D3 D4 t D1 D2 D3

Donde los 4 datos luego de la letra “p” representan el valor convertido del canal 0 de 0 a 4096 (12
bits), los datos seguidos por “s” los del canal 1 y los datos seguidos por “t” el valor seteado del ciclo de
trabajo de 0 a 512 (9 bits). Para verificar el funcionamiento del portA, si se pone un bajo ”0” en el pin
A1 o A2, el ciclo de trabajo pasa a 0%. También puede verificarse el funcionamiento de las
interrupciones midiendo con un osciloscopio el pin A5, donde puede observarse el toggle del mismo.
El circuito utilizado es el siguiente:

Guillermo H. Carrera – 4213 Hoja 18 de 19


Universidad Nacional de Quilmes
Sistemas Digitales

Guillermo H. Carrera – 4213 Hoja 19 de 19

También podría gustarte