Adc y usart pic16 f887

17
INSTITUTO POLITÉCNICO NACIONAL CENTRO DE INVESTIGACIÓN EN COMPUTACIÓN 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

Transcript of Adc y usart pic16 f887

Page 1: 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

Page 2: Adc y usart pic16 f887

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.

Page 3: Adc y usart pic16 f887

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.

Page 4: Adc y usart pic16 f887

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.

Page 5: Adc y usart pic16 f887

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.

Page 6: Adc y usart pic16 f887

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

Page 7: Adc y usart pic16 f887

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).

Page 8: Adc y usart pic16 f887

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:

Page 9: Adc y usart pic16 f887

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.

Page 10: Adc y usart pic16 f887

Derlis Hernández Lara

10

Page 11: Adc y usart pic16 f887

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.

Page 12: Adc y usart pic16 f887

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:

Page 13: Adc y usart pic16 f887

Derlis Hernández Lara

13

Page 14: Adc y usart pic16 f887

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:

Page 15: Adc y usart pic16 f887

Derlis Hernández Lara

15

Page 16: Adc y usart pic16 f887

Derlis Hernández Lara

16

Page 17: Adc y usart pic16 f887

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.