Adc y usart pic16 f887
-
Upload
derlis-hernandez-lara -
Category
Engineering
-
view
424 -
download
4
Embed Size (px)
Transcript of Adc y usart pic16 f887

INSTITUTO POLITÉCNICO NACIONAL
CENTRO DE INVESTIGACIÓN EN COMPUTACIÓN
1° EVALUACIÓN
Microprocesadores
MCIC
Hernández Lara Derlis
Aplicación de los periféricos de un microcontrolador, uso del TMR0, ADC y USART de un PIC16F.
Profesor:
Dr. Alfonso Gutiérrez Aldana
MÉXICO, D.F. MAYO 2014

Derlis Hernández Lara
2
Conociendo los microcontroladores PIC16F
En este trabajo se describe la práctica realizada para la primera evaluación de la materia
de microprocesadores. Se vio durante el curso correspondiente a este periodo, como
configurar y utilizar algunos de los periféricos más usados de un PIC, como los son el
TMR0, el ADC y el USART.
Introducción:
Se está trabajando con el PIC16F887 en específico, este es un microcontrolador de 8
bits de mediano rango, con 40 terminales y con una arquitectura Harvard lo que indica
que tiene dos memorias, una para datos y una de programa, además utiliza instrucciones
RISC (del inglés Reduced Instruction Set Computer, en español Computador con
Conjunto de Instrucciones Reducidas).
TMR0
El microcontrolador PIC16F887 dispone de tres temporizadores/contadores
independientes, denominados Timer0, Timer1 y Timer2.
El temporizador Timer0 tiene una amplia gama de aplicaciones en la práctica. Sólo unos
pocos programas no lo utilizan de alguna forma. Es muy conveniente y fácil de utilizar
en programas o subrutinas para generar pulsos de duración arbitraria, en medir tiempo o
en contar los pulsos externos (eventos) casi sin limitaciones.
Es un módulo que sirve como contador o como temporizador de 8 bits.
Funcionando como temporizador el TMR0 es un registro donde se puede almacenar un
valor y este se va incrementando de 1 en 1 con los ciclos de instrucción, es decir, con
cada ciclo se incrementa en 1 el TMR0, cuando la cuenta llega a 255 y pasa a 0 (cero) se
produce una interrupción por desborde del TMR0, recordando que en un registro de 8
bits el valor más alto que se puede almacenar es 255 y que si se incrementa estando en
255 pasa a cero, y es a esto a lo que se le denomina desborde.
El TMR0 puede funcionar de dos maneras; como contador de eventos o como
temporizador. Para seleccionar de qué manera queremos que funcione utilizamos el bit
T0CS del registro OPTION_REG.
Cuando se selecciona TMR0 como contador de eventos, mediante el pin T0SE se indica
porque flanco, de subida o bajada, en la señal aplicada en el pin correspondiente, se
desea incrementar el contador.
La señal que lleva al TMR0 se puede preescalar mediante un divisor, este divisor se
puede asignar tanto al WDT como al TMR0 mediante el bit PSA del OPTION_REG. El
valor del rango del divisor viene determinado por los bits PS2:PS0 según la tabla
correspondiente.
El TMR0 es capaz de realizar una interrupción cada vez que pasa de 255 a 0, para
permitirla hay que poner a 1 el bit T0IE del registro INTCON y el flag (bandera) de la
interrupción es el T0IF del registro INTCON.

Derlis Hernández Lara
3
ADC
La conversión analógica-digital (CAD) consiste en la transcripción de señales
analógicas en señales digitales, con el propósito de facilitar su
procesamiento (codificación, compresión, etc.) y hacer la señal resultante (la digital)
más inmune al ruido y otras interferencias a las que son más sensibles las señales
analógicas.
Un ADC en un microcontrolador mide el voltaje V en un pin (que tendrá que estar
declarado como entrada con el correspondiente registro TRISA) y lo convierte en un
número. El voltaje se mide con referencia a un voltaje mínimo, Vref(-) , y a un voltaje
máximo, Vref (+). Normalmente Vref- suele ser Vss=GND=0V y Vref+ = Vcc = 5V,
pero pueden usarse otros voltajes de referencia.
La resolución del ADC es una característica fundamental y nos dice el número de
niveles con los que cubrimos el intervalo [0,1]. Por ejemplo, en los PIC solemos tener
una resolución de 10 bits, que representan 2^10=1024 niveles. El intervalo real [0,1) se
aplicaría al intervalo [0,1023]. Si asumimos un rango de 5V, tendremos que la
resolución de cada nivel es de r=5/1024 V=4.88 mV. Según la documentación de
Microchip (esto puede variar para otros microcontroladores) cualquier voltaje entre [0 y
r] (o por debajo de 0, lo que corresponde a V<Vref-) se cuantificaría en el nivel 0.
Entre r y 2r tendríamos una salida de nivel 1. Así hasta llegar a nivel 1023 que
cuantificaría voltajes por encima de 1023r = 1023x 5/1024 = 4.995V. Como se ve,
voltajes por debajo de Vref- o por encima de Vref+ son posibles y se cuantifican como
nivel mínimo 0 o máximo, 1023. Niveles por debajo de 0V o por encima de la tensión
de alimentación (normalmente 5V) pueden ser dañar el PIC.
Aunque un PIC puede tener del orden de 8-12 posibles canales (pines) de entrada
analógica, solo tiene normalmente un único módulo ADC, lo que significa que no
podemos tomar medidas simultáneas de varios canales. Si es necesario, lo que podemos
hacer es ir conectando (seleccionando) los sucesivos canales al ADC para ir midiendo
sus voltajes.
El proceso de una conversión ADC se divide en un tiempo de adquisición Ta (durante el
cual un condensador interno se carga al voltaje exterior) y un tiempo de conversión Tc
(durante el cual se desconecta el pin exterior y se cuantifica el voltaje del condensador).
Para el PIC16F887 no hay que preocuparse por programar una rutina para el tiempo,
porque ya cuenta con la electrónica necesaria para hacerlo, solo hay que preguntar por
la bandera que indica que ya acabo el proceso de adquisición y utilizar el valor
guardado de la conversión.
El tiempo de conversión Tc depende fundamentalmente del número de bits del
conversor. La unidad básica es el llamado Tad, aproximadamente el tiempo necesario
para ganar un bit adicional. La conversión total tarda entre 11 y 14 Tad (contando con la
descarga final del condensador para estar listo para otra medida. El reloj del ADC se
debe ajustar (como una fracción del oscilador principal) para que dicho Tad no sea
inferior a un valor mínimo especificado en los datasheet. Por ejemplo para la familia
PIC18F252/452 el Tad mínimo es de 1.6 usec y Tc = 14 Tad. En cambio para la familia
PIC18F2520/4520 tenemos un Tad mínimo de 0.75 usec y un Tc = 11 Tad.

Derlis Hernández Lara
4
USART
Cuando se ha logrado implementar cualquier protocolo de comunicación entre una PC y
un microcontrolador se puede decir que una gran cantidad de aplicaciones están a la
puerta, entre las cuales se pueden nombrar monitoreo, control digital, impresión de
datos en papel, impresión en pantalla de datos inmediatos, etc. Los protocolos más
comúnmente implementados en microcontroladores y PC son: RS232, IP, Paralelo, etc.
El microcontrolador PIC16F887 tiene incluido dentro de su estructura interna un
módulo USART (Transmisor receptor universal síncrono asíncrono) que es la
abreviación de “universal syncchronous asynchronous receiver transmitter” en ingles
también es conocido como SCI (“serial comunications interface”) y es uno de los más
comúnmente usados para la implementación de puertos seriales, la configuración
asíncrona full dúplex es una de las más populares de la USART porque es usada para
interfaces con el puerto serie de las PC usando el protocolo RS-232.
La función principal del módulo USART es enviar y recibir datos de forma serial, esta
operación puede ser dividida en dos categorías, transmisión síncrona y transmisión
asíncrona. La operación síncrona usa una línea de datos y una de reloj mientras que la
asíncrona solo usa la línea de datos, para este periodo del curso solo se analizó la
transmisión asíncrona.
Modo asíncrono:
La comunicación asíncrona es la que generalmente se utiliza entre un microcontrolador
y una PC. Para la comunicación serie con la PC se utiliza el estándar “no retorno a cero”
(NRZ) en la forma conocida como 8-N-1 que quiere decir 8 bits de datos, sin paridad y
un bit de parada tal como se muestra en la figura 1.
Figura 1. Cronograma del protocolo RS-232.
Línea libre se define como un estado lógico alto o uno. El inicio de la transmisión de
datos (Bit de inicio) se define como un estado lógico bajo o cero. Los bits son enviados
enseguida del bit de inicio, enviando en primer lugar el bit menos significativo, después
de los bits de datos se envía el bit de parada que es un estado lógico alto o uno. El
periodo T depende de la velocidad de transmisión y es ajustado de acuerdo a las
necesidades de transmisión. En la figura 2 se muestra un conector RS-232 y en la tabla
1 los nombres de cada pin.

Derlis Hernández Lara
5
Figura 2. Conector DB9 estándar.
Tabla 1. Nombres de los pines del conector DB9.
La interface física que ese utiliza comúnmente para conectar un microcontrolador con la
PC se muestra en la figura 3. El circuito MAX232 realiza la tarea de generar de acuerdo
a los valores lógicos entregados por le microcontrolador los niveles necesarios de
voltaje para la comunicación RS-232.
Figura 3. Conexión física para la comunicación RS-232.

Derlis Hernández Lara
6
Para implementar la comunicación serial entre una PC y un microcontrolador en la
etapa experimental se suele utilizar el programa Hyper Terminal como se muestra en la
figura 4.
Figura 4. Configuración y elección del puerto disponible a utilizar.
Una vez que se ha establecido la comunicación entre Hyper Terminal y el
microcontrolador se puede programar la aplicación deseada en cualquier software como
Matlab, Labview, Visual basic, etc.
DESARROLLO:
Realizar un programa y circuito correspondiente que digitalice dos canales analógicos y
los envié a la PC para dibujar lo que se está captando con ayuda de algún software.
Enviar 500 muestras por segundo (mps).
1° Para la parte de la transmisión serial es importante enviar los datos con una
velocidad estándar y exacta por lo que se utiliza un cristal comercial de 3686400 Hz.
2° Por lo que el tiempo de ejecución de una instrucción es:
3° Se envían 4 bytes, luego entonces 500*4=2000 mps y además cada muestra es de 10
bits, luego entonces 2000*10=20000 bps (bits por segundo). Por lo que se puede utilizar
cualquier velocidad de transmisión estándar mayor a 20000 bps, como pueden ser

Derlis Hernández Lara
7
38400 bps, 115200 bps, 230400 bps, etc. Para este caso se utiliza una velocidad de
transmisión estándar de 115200 bps, para poder observar bien la simulación en la
herramienta MPLAB y para asegurar que no haya pérdida de datos.
4° Ahora para saber en cuanto tiempo se envían las 500 muestras:
5° Sabiendo que TMR0 solo puede contar hasta 255, hay que seleccionar el
preescalador que permita contar esta cantidad, si se quiere enviar 2000 bits cada 2 ms:
2000/8=250, por lo que con el preescalador 1:8 es suficiente.
6° Para saber cuántos ciclos hay que contar:
Usando la escala 1:8, 1843/8=230 y como TMR0 cuenta 256, 256-230=26, se debe
inicializar TMR0 en 26, esto se puede ajustar para obtener el menor error posible.
8° Con los valores obtenidos ya se puede configurar el TMR0 encargado de contar que
se envíen los 4 bytes a la PC cada 2 ms. Este temporizador se configura para que
empiece a contar (la primera vez no importa el tiempo que se tarde), y cada 230
instrucciones aumenta en uno su valor, así al cabo de 8 conteos habrá ejecutado las 1843
instrucciones que se necesitan para este caso. Se programa generando una interrupción
cada que se enciende la bandera de fin de conteo. A continuación se muestra su
configuración en lenguaje ensamblador:
Los registros asociados al TMR0 son:
INTCON y el OPTION_REG.
El bit T0CS (OPTION 5) a 1 trabaja con un oscilador externo, 0 utiliza la
Fosc/4.
El bit T0SE (OPTION 4) en modo contador a 1 flanco descendente, 0 flanco
ascendente.
El bit PSA (OPTION 3) 0 preescaler al temporizador, 1 preescaler al WDT.
Cuando se desborda el TMR0, se activa el bit 2 de INTCON (T0IF) y si el T0IE
está activado el T0IF generara interrupción y se debe borrar por software cuando
se atienda la interrupción.
Para este caso, OPTION_REG=1101 0010=D2 (hex).

Derlis Hernández Lara
8
Observe que en el programa en lugar de inicializar TMR0 en 26, se hizo en 27, esto se
hizo para obtener el menor error posible, al inicializarlo en 27 y agregar 5 instrucciones
de no operación se obtiene un tiempo de 1.999783 ms que es lo más cercano a los 2ms
que se están buscando (figura 5).
Figura 5. Tiempo del TMR0 y número de instrucciones realizadas.
9° Una vez que ya se tiene el tiempo de envió requerido, es hora de mandar datos a la
PC mediante el periférico USART.
Para la transmisión de datos:

Derlis Hernández Lara
9
Se inicializa el registro generador de Baud Rate (velocidad de transmisión
deseada) SPBRG con el valor apropiado, si se usa una velocidad alta el bit
BGRH debe estar en 1. Para lo cual se usa la siguiente expresión:
Para este caso:
Se habilita el puerto serie asíncrono limpiando el bit SYNC y se pone a 1 el bit
SPEN (serial port enable).
Se carga el dato en el registro TXREG (después de esto se inicializa la
transmisión).
Habilitar la transmisión poniendo a 1 el bit TXE.
En el código anterior se configura el periférico USART para la transmisión serial de
datos. Después se realiza esta configuración junto con el TMR0, se configura el USART
en la inicialización antes de la interrupción, y ya dentro de la interrupción se envían los
4 bytes cada 2ms aproximadamente como se ve en la figura 6, se realiza una prueba
enviando “U”, que después será remplazada por la adquisición del ADC.

Derlis Hernández Lara
10

Derlis Hernández Lara
11
Figura 6. Envió de datos por el USART cada 2ms.
10° Una vez establecido el TMR0 y el USART, solo falta habilitar el ADC, para enviar
la conversión de dos señales analógicas a la PC, se enviaran 500 mps cada 2ms a una
velocidad de transmisión de 115200 bps.
Para configurar el ADC:
Configurar pines como entradas analógicas, seleccionar o no voltajes de
referencia (VCFG), etc.
Una vez configurado, habilitar el ADC (ADON=1).
Escoger canal (bits CHS) a usar (el pin dado se conecta al condensador).
Esperar (delay) Ta mientras se carga el condensador.
Lanzar la conversión (GO=1).
Esperar a completar a que la conversión concluya (GO=0).
Extraer el resultado de ADRESH: ADRESL.
Si hemos terminado con el ADC, apagarlo para reducir consumo.

Derlis Hernández Lara
12
Ahora implementando el ADC dentro del TMR0 para que la conversión y el envió se
haga dentro de los 2 ms establecidos:

Derlis Hernández Lara
13

Derlis Hernández Lara
14
11° Para poder ver las señales enviadas por el microcontrolador a la PC se puede usar
un osciloscopio o capturarlas y graficarlas en Matlab por ejemplo.
Programa ocupado para la adquisición de datos con Matlab:

Derlis Hernández Lara
15

Derlis Hernández Lara
16

Derlis Hernández Lara
17
Como al inicio de la lectura del puerto no se sabe que byte se leerá, se implementó un
algoritmo en el cual pueden existir dos casos, que lea el byte con los bits menos
significativos (caso 2), o el de los bits más significativos (caso 1).
Para determinar en que caso se toma la lectura, primero se obtienen los bytes pares e
impares respecto a su posición y se guardan en su respectivo arreglo, se tomaron los
últimos 5 bits de cada byte y se dividió entre 2, si el residuo de los impares es cero
entonces la lectura se tomó en el caso 2 por que el byte de los bits menos significativos
solo ocupa los 2 primeros bits y por lo tanto los otros 8 bits son ceros, de lo contrario
será el caso 1.
Una vez establecido el inicio de la lectura, se utiliza el arreglo de la lectura del puerto y
se concatenan los pares de bytes, es decir los primeros 2 bytes, luego los siguientes 2 y
así sucesivamente, como el nuevo dato es de 16 bits, se recortan los últimos 6 porque la
resolución del ADC es solo de 10 bits y se crea un nuevo arreglo con datos de 10 bits
cada uno, por último se separan los datos pares e impares respecto a su posición en el
arreglo y se establece que los pares corresponden a un canal y los impares al otro canal
y se mandan a graficar por separado.
Si la lectura callo en el caso 2, es decir empezó la lectura del puerto con el byte menos
significativo, se descarta el primer byte y se realiza el mismo procedimiento pero a
partir del segundo byte de la lectura y hasta el penúltimo.
Conclusiones:
Con la elaboración de la presente práctica se desarrollaron las habilidades necesarias
para poder analizar y configurar aspectos básicos a la hora de usar un microcontrolador
y sus diferentes periféricos, se aplicaron los conceptos de contador, transmisión serial,
convertidor analógico digital, etc., además de cómo poder recibir datos en la PC y
visualizarlos con ayuda de alguna herramienta de software como por ejemplo Matlab.
Referencias:
“PICmicro Mid-Range MCU Family Reference Manual”, Microchip rev/DS33023A,
December 1997.
“PIC16F887 Data sheet” Microchiop rev/30292c, 2001
“MAX232 Data sheet”, Texas Instruments, 2003.