# Microcontroladores PICs

Los PIC16F87X son una familia de microcontroladores PIC es la versión mejorada del caballo de batalla PIC16F84. Consta de los siguientes modelos que varían de acuerdo a prestaciones, cantidad de terminales y encapsulados:
* PIC16F873
* PIC16F874
* PIC16F876
* PIC16F877
Esta familia es de las que tienen memoria tipo Flash, lo que nos permite reprogramarlos las veces que sea necesario sin necesidad de usar ningún otro dispositivo más que el propio programador. Este aspecto es muy importante a la hora del diseño de un dispositivo para evitar pérdida de tiempo en borrar los µC y volver a programarlos.

## Características Principales

Las caracterisiticas principales que hacen de esta familia un poco más potente que otras son:
* Conversor Analógico/Digital de 10 bits
* Set de 35 instrucciones
* 3 Temporizadores + Watchdog Timer o Perro Guardián
* 2 módulos PWM
* Protocolos de Comunicaciones USART, PSP e I²C

### Detalle por modelo

| Modelo | Memoria de Programa | Memoria de Programa | Datos SRAM (bytes) | EEPROM (bytes) | Entradas / Salidas | Canales A/D | PWM | MSSP | MSSP | USART | Comparadores |
| Modelo | Bytes | Cant. de Palabras de instrucciones | Datos SRAM (bytes) | EEPROM (bytes) | Entradas / Salidas | Canales A/D | PWM | SPI | I²C Maestro | USART | Comparadores |
| 16F873A | 7,2 kB | 4096 | 192 | 128 | 22 | 5 | 2 | Si | Si | Si | Si |
| 16F874A | 7,2 kB | 4096 | 192 | 128 | 33 | 8 | 2 | Si | Si | Si | Si |
| 16F876A | 14,3 kB | 8192 | 368 | 256 | 22 | 5 | 2 | Si | Si | Si | Si |
| 16F877A | 14,3 kB | 8192 | 368 | 256 | 33 | 8 | 2 | Si | Si | Si | Si |

## Distribución de Terminales

En las Figuras a continuación se ven los distintos encapsulados en que vienen los diferentes modelos pertenecientes a esta familia. Cada uno de esos pines o terminales tienen más de un uso dependiendo de como se los configure excepto los terminales VDD y VSS que son los encargados de alimentar a estos µC.

## Estructura interna de los PIC

A fin de comprender que es lo que hacen internamente estos PIC es necesario conocer los principios de la estructura interna. En la Figura a continuación se muestra el diagrama de bloques de la estructura interna los 16F87X. En ella se ve que cada prestación que nos ofrecen los µC están encerradas en un bloque distinto y todos ellos comunicados mediante un bus.
Se describirá como configurar cada uno de esos bloques y para qué podemos usar a cada uno. Lo interesante de estos PIC es que si algún bloque no se utiliza este no consume potencia por lo que podemos ir “prendiendo” al bloque sólo en el momento de usarlo para evitar desaprovechar energía del sistema de alimentación.

## Consideraciones generales

Como fue nombrado en la introducción, el set de instrucciones de estos µC es reducido, con lo que facilita la programación de los mismos. Para la familia de los 16F87X existen 35 instrucciones, con las que se puede hacer lo mismo o más que con esos antiguos µP de 105 instrucciones. Para la programación de estos dispositivos se pueden elegir varios lenguajes, por ejemplo ensamblador, C, etc.
Los µC tienen un espacio de memoria que varía según las familias y según el modelo dentro de cada familia. Es allí donde se guarda el programa que creamos. Dado que el µC solo interpreta lenguaje de máquina, es decir, estados lógicos de 1 ó 0, sería por demás de complicado programar con este lenguaje; es por eso que existe un compilador, que transforma el ensamblador que escribimos en lenguaje “entendible” por el μC.
Una vez compilado el programa escrito, tenemos el archivo hexadecimal con el cual se programa al µC, para esto es necesario una interfaz programadora capaz de entender los datos hexadecimales que la computadora (PC) entrega y pasarlos al µC.
Para crear el ensamblador es necesario ya tener pensado y diagramado lo que necesitemos que haga el µC; para esto usaremos bosquejos de circuitos, diagramas de flujo, pseudo-código, modelos matemáticos, y toda clase de observaciones relevantes para el correcto funcionamiento y desempeño del μC. Una vez diagramada la función del µC, solo nos resta diseñar el circuito externo con todos los detalles y escribir el programa.

## Circuitería Externa Mínima

El circuito externo necesario para que el μC sea capaz de leer el programa grabado en él solo necesita dos aspectos fundamentales: el reloj y la alimentación, lo demás es a medida que necesitemos entradas y/o salidas adecuando cada una de ellas con circuitería externa.
El reloj se usa para darle una base de tiempo al µC, se puede usar una resistencia y un condensador o algo más confiable como un cristal de cuarzo piezoeléctrico (Algunos modelos de µC tienen relojes internos incorporados, pero son de otras familias). Usando cristales podemos estar seguros de la frecuencia de oscilación del µC, lo cual es útil para calcular tiempos de ejecuciones de las instrucciones, temporizaciones precisas, etc.
Todos los PIC de la familia 16F87X tienen dos terminales llamados OSC1 y OSC2, en ellos van conectados los terminales del cristal; a su vez, se conectan dos capacitores entre masa y estos terminales, para completar el circuito de oscilación.
En cuanto a la alimentación, esta no debe superar los 5 V ± 5% y se debe tener en cuenta que existe un terminal llamado MCLR (master-clear o reset), que debe estar con valor lógico 1 para que el µC pueda leer el programa.
Con estas consideraciones de la circuitería externa indispensable estamos en condiciones de ya, por lo menos, asegurarnos que el μC ejecutará el programa que grabamos en él.

### El Reloj

Los PIC 16F87X disponen de un ciclo de instrucción igual a cuatro ciclos del reloj principal, es decir que si tenemos un programa de 1000 instrucciones y un cristal de 10 MHz. El tiempo que le demandará al μC leer y ejecutar todo el programa (asumiendo que todas las instrucciones tardan un ciclo de instrucción) es de 400 μS pues: $T={1000*4 \over {10MHz}}=400\mu S$.
Dependiendo del modelo específico del μC se tiene una frecuencia máxima de trabajo. En la familia 16F87X la máxima frecuencia del reloj externo es de 20 MHz. es decir que el tiempo mínimo necesario para leer y ejecutar cada instrucción es de 400 ns.
Un ciclo de instrucción equivale a 4 ciclos de reloj. Esto es porque con el primer ciclo de reloj el μC busca en su memoria a la instrucción a leer, en el segundo ciclo se carga en la memoria principal, el tercer ciclo es el encargado de ejecutarla propiamente dicho y el último y cuarto ciclo limpia la memoria para volver a buscar la siguiente instrucción y así sucesivamente.

### La alimentación

Los μC de la familia 16F87X se alimentan con 5 VCC pero con 3,5 V también funcionan consumiendo un poco más de corriente. La corriente máxima que puede circular por el terminal VDD (donde se conecta el positivo de la fuente de 5 V) es de 250 mA y por cada salida no se debe hacer circular más de 25 mA. Estos datos son los de la hoja de datos de Microchip®.
Dado que la capacidad de entregar corriente del μC es bastante reducida, se suelen usar transistores o relés para comandar circuitos o artefactos de potencia. La potencia que puede disipar como máximo el μC es de 1 W y se calcula mediante la siguiente formula:
$\,\!P_{disipada}=V_{DD}(I_{DD}-\Sigma I_{OH})+\Sigma [(V_{DD}-V_{OH})I_{OH}]+\Sigma (V_{OL}I_{OL})$
donde:
* $V_{DD}$ es la tensión suministrada por la fuente de alimentación.
* $I_{OH}$ es la corriente suministrada por las salidas del PIC en estado alto.
* $V_{OL}$ es la corriente absorbida por las salidas del PIC en estado bajo.
* $V_{OH}$ es la tensión entregada por los terminales en estado alto.
* $V_{OH}$ es la tensión presente en los terminales en estado bajo.

### Circuito de Reset Externo

Los μC tienen un terminal llamado MCLR o master-clear el cual debe estar en “1” lógico para que se lean y ejecuten las instrucciones. En esta parte describiremos como resetear a los μC, es decir hacerlos que empiece a leer el programa grabado en ellos desde el principio. Una de las técnicas más sencillas es implementar el reset con el circuito de la figura a continuación:
(Este circuito no cumple la recomendación de Microchip Tecnology, que advierte que se necesita colocar una resistencia aproximadamente de 100 ohmios al pin de Reset, ya que no es recomendable colocar DIRECTAMENTE a 5 V ó a 0 V el pin de Reset).
En este circuito se ve que el terminal MCLR está siempre con valor lógico “1” lo cual habilita al μC a leer y ejecutar las instrucciones. El pulsador es el pulsador de Reset, es decir al presionarlo se conecta la resistencia (generalmente de 10 KΩ) entre VDD y VSS, con lo cual la caída de tensión sobre el terminal MCLR es 0 v y así fijamos el “0” lógico necesario para frenar las ejecuciones de las instrucciones. Cuando se suelta el pulsador, el terminal MCLR vuelve a estar en “1” y así arranca nuevamente a leer el programa desde el principio, es decir desde la primera instrucción grabada en él

#### Mejorando el Circuito de Reset

Es claro que el pulsador no es instantáneo y producto de los golpeteos de este, el circuito anterior se cierra y abre varias veces hasta quedar completamente en un estado. Es por esto que el circuito de reset se mejora notablemente con el circuito de la figura siguiente:
En el circuito de arriba, la resistencia de 100 Ω limita la corriente entrante al μC a unos 500 μA, más que suficientes para asegurar un “1” lógico en el terminal MCLR. El diodo es el encargado de proteger al μC de posibles sobretensiones sobre el terminal MCLR. Una vez que se presiona el pulsador se pone la resistencia de 10 KΩ por medio del diodo a masa, asegurando un “0” lógico para obtener el reset querido, lo importante de esto es que una vez que se suelta el capacitor hace de amortiguador de los golpeteos mecánicos del pulsador y así se evitan los resets involuntarios.
También resulta muy efectivo una red pasa altos, para independizarnos del tiempo en que se presione el pulsador, es decir, con el primer toque al pulsador el μC se resetea y comienza a leer el programa desde el principio sin importar si todavía estamos presionando el pulsador o ya se soltó.
Estas técnicas de reset son muy efectivas, pero no son todas. Existen infinidades de circuitos y posibilidades para provocar el reset externo en los μC adecuándose a la necesidad o al criterio de diseño del circuito y su función especifica.

## Registros Internos de la familia 16F87X

Todos los μC de la firma Microchip® cuentan con registros internos (la mayoría de estos son de escritura-lectura) los cuales nos permiten configurar cada bloque para que funcione de acuerdo a nuestras necesidades.
Para las familia 16F87X estos registros son de 8 bits y podemos acceder a cada uno de ellos, o bien a todo el registro. También existen algunos registros particulares de 16 bits pero físicamente son dos registros de 8 unidos.
Para cada μC existen tres bloques bien diferenciados de memoria. Estos son:
* Memoria de programa: Lugar físico donde se guarda el programa.
* Memoria de datos: Lugar físico donde se guardan datos, EEPROM
* Memoria de registros: Lugar físico de los registros que controlan cada módulo.
La Memoria de registros es la parte de la memoria se encuentran los registros que manejan a cada modulo del μC y también existen registros no definidos o bien a definirse por el programador para cualquier uso (variables, constantes, acumuladores auxiliares, etc.) estos registros de propósito general también son de 8 bits y se definen asignándoles un nombre y una dirección.
Para la familia 16F87X la memoria de registros está dividida en 4 bancos como se muestra en los mapas de registros de las siguientes figuras (Observese que la distribución de los registros de los modelos 16F873 y 16F874 es la misma y pasa lo propio entre los modelos 16F876 y 16F877).

### El registro W

El registro auxiliar de trabajo W (working register) es un registro de 8 bits con un espacio físico en la memoria principal del μC. Este registro es totalmente escribible “desde el exterior” y se puede leer en cualquier momento ya que se puede acceder a él desde cualquier banco de memoria. Por medio de este registro cargamos valores a los distintos registros del μC, es decir, primero se pone un valor en el registro W y luego se copia el valor del registro W al registro que queramos. No se puede cargar un valor directamente a otro registro que no sea W.

### El registro STATUS

Como existen registros de control en los 4 bancos disponibles para los 16F87X y 2 bancos para los 16F8X, hay que tener bien en claro que para modificarlos o asignarles algún valor hay que seleccionar el banco correspondiente. Generalmente se trabaja en el banco 0, pero no por eso podemos decir que los otros no se utilizan. Además el banco 0 es el predeterminado cuando se enciende el μC.
Cuando el μC se enciende, cada registro tiene asignado un valor, en general es el valor 0, pero no todos. Para profundizar en esto se puede consultar la tabla de valores iniciales de registros publicada por Microchip® en la hoja de datos de cada μC. La descripción específica de cada registro se hará cuando sea necesario utilizarlo.
El registro de estado (STATUS) nos proporciona continuamente información mediante los bits del 0 al 2 de los resultados de operaciones matemáticas, desbordes de contadores, etc. El bit 3 está asociado con el WDT que se comentará más adelante. Seteando los bits 5 y 6 podemos seleccionar el banco de memoria correspondiente para trabajar con los registros necesarios y el bit 7 se usa para establecer que parte de cada banco está seleccionado. A Continuación se muestra el registro STATUS de la familia 16F87X:

## Set de Instrucciones y Sintaxis

Los 16F87X cuentan con 35 instrucciones, las cuales están divididas entre instrucciones orientadas a registros, orientadas a bits y orientadas a control. Por medio de estas, se crea el programa en lenguaje assembler respetando la sintaxis necesaria para cada una.

### Instrucciones Orientadas a bits

Este grupo de instrucciones actúa directamente sobre un bit específico de cualquier registro. Con ellas es posible escribir o leer un bit para luego tomar decisiones de acuerdo al resultado.
| Sintaxis | Descripción | Ciclos de Instrucción |
| BCF f,b | Pone en "0" el bit b del registro f | 1 |
| BSF f,b | Pone en "1" el bit b del registro f | 1 |
| BTFSS f,b | Lee el bit b del registro f y salta la instrucción siguiente si está en “1” | 1 (2 si salta) |
| BTFSC f,b | Lee el bit b del registro f y salta la instrucción siguiente si está en “0” | 1 (2 si salta) |

### Instrucciones Orientadas a Registros

Este tipo de instrucciones maneja registros directamente, es decir, con estas instrucciones vamos a poder asignarle valores a cada registro, operar matemáticamente con ellos, operar con lógica booleana entre ellos, etc.
| Sintaxis | Descripción | Ciclos de Instrucción |
| ADDWF f,d | Suma el contenido del registro W con el de f | 1 |
| ANDWF f,d | Realiza la operación lógica AND entre el contenido del registro W con el de f | 1 |
| CLRF f | Borra el contenido del registro f | 1 |
| CLRW | Borra el contenido del registro W | 1 |
| COMF f,d | Niega el valor del registro f | 1 |
| DECF f,d | Decrementa en una unidadel contenido del registro f | 1 |
| DECFSZ f,d | Decrementa en una unidad el contenido del registro f y salta la instrucción siguiente si es cero. | 1 (2 si salta) |
| INCF f,d | Incrementa en una unidadel contenido del registro f | 1 |
| INCFSZ f,d | Incrementa en una unidad el contenido del registro f y salta la instrucción siguiente si es cero. | 1 (2 si salta) |
| IORWF f,d | Realiza la operación lógica OR entre el contenido del registro W con el de f | 1 |
| MOVF f,d | Mueve el contenido del registro f | 1 |
| MOVWF f | Mueve el contenido del registro W al registro f | 1 |
| NOP | No realiza ninguna operación | 1 |
| RLF f,d | Rota el contenido del registro f hacia la izquierda a través del carry bit | 1 |
| RRF f,d | Rota el contenido del registro f hacia la derecha a través del carry bit | 1 |
| SUBWF f,d | Resta el contenido del registro W al registro f | 1 |
| SWAPF f,d | Intercambia los cuatro primeros bits con los cuatro últimos del registro f | 1 |
| XORWF f,d | Realiza la operación lógica XOR entre el contenido del registro W con el de f | 1 |
* Todas las operaciones se guardan en:
** El registro W si d=0
** El registro f si d=1
* Para el caso de RLF y RRF el bit opuesto al rotado se pone en 0

### Instrucciones Orientadas a Control

Este juego de instrucciones nos permite controlar algunos registros y funciones específicas. También estas instrucciones se utilizan para guardar algún valor determinado en un registro o hacer operaciones matemáticas y lógicas entre un registro y un valor cualquiera que no necesariamente esté guardado en un registro, es decir un valor literal.
| Sintaxis | Descripción | Ciclos de Instrucción |
| ADDLW k | Suma el valor k al registro W | 1 |
| ANDLW k | Realiza la operación lógica AND entre el valor k y el registro W | 1 |
| CALL k | Llamada a la subrutina k | 2 |
| CLRWDT | Limpia el WD-Timer | 1 |
| GOTO k | Salto incondicional a la etiqueta k | 2 |
| IORLOW k | Realiza la operación lógica OR entre el valor k y el registro W | 1 |
| MOVLW k | Guarda en el registro W el valor k | 1 |
| RETFIE | Retorno de una interrupción | 2 |
| RETLW | Retorno de una subrutina con el valor k en el registro W | 2 |
| RETURN | Retorno de una subrutina | 2 |
| SLEEP | Se pone el PIC en estado de reposo (dormido) | 1 |
| SUBLW k | Resta el valor k al registro W | 1 |
| XORLW | Realiza la operación lógica XOR entre el valor k y el registro W | 1 |

## Ejemplo: encender y apagar un LED

Para comprender lo visto hasta ahora, realizaremos un proyecto completo. Es decir, circuito y programa. El ejemplo propuesto es más que simple y por supuesto que no se utilizaría un PIC para este desarrollo en la vida real, pero nos servirá para comprender la sintaxis y el orden de las directivas.
La idea es conectar un LED por medio de una resistencia limitadora de corriente a un terminal de salida de un PIC16F873 para que este encienda al presionar un pulsador y se apague al soltarlo.

### Circuito Propuesto

Abajo se muestra el circuito completo para este ejemplo: alimentación de 5 V entre VDD y masa, el cristal con sus condensadores completando el circuito de reloj y el circuito de reset mejorado discutido anteriormente. A esto se le agrega un pulsador que será el encargado de dar la orden para encender y apagar el LED y, claro, el LED de salida con sus resistencia limitadora.

### Programa

Para crear el programa que se grabará en el PIC usaremos el MPLAB que es el entorno de desarrollo que nos ofrece Microchip. Es recomendable leer el artículo MPLAB para aquellos que no estén familiarizados con él.
Básicamente este sencillo ejemplo se puede modelar con el siguiente pseudo-código:

#### Ensamblador

Pasado el pseudo-código a lenguaje ensamblador y usando las directivas del MPLAB se hace necesario crear el siguiente archivo .asm:

##### Comentarios al Programa

Es fácil deducir que el símbolo ; nos deja escribir comentarios, es decir el compilador no lee los caracteres ingresados después de este. Inicio, Comienzo, apaga y prende son etiquetas que nos ayudan a identificar una dirección de memoria de programa. Estas tampoco son tenidas en cuenta por el compilador y se reemplazan por la dirección de memoria correspondiente.
Además se pueden observar las directivas comentadas, instrucciones, literales, configuración de registros, etc. Por ejemplo, la directiva INCLUDE tal como está usada pega en nuestro programa la definición estándar de las direcciones de cada registro del PIC.

#### Lenguaje de Máquina

Al compilar el .asm obtenemos varios archivos, uno de ellos y el más importante es el que se grabgará en el PIC que contiene todas las instrucciones y directivas traducidas al lenguaje de máquina. Para este ejemplo el archivo .hex que grabaremos en el pic es:

## Palabra de Configuración

Todos los modelos de μC de Microchip® tienen un registro especial llamado CONFIGURATION WORD (palabra de configuración). Es un registro donde se eligen algunas condiciones de funcionamiento iniciales, para que el propio PIC sepa como será usado.
Es un registro cuya cantidad de bits es fija, 14 bits, pero solamente tenemos acceso a algunos de ellos y depende del modelo de PIC que estemos usando. Para los 16F87X existen 11 bits configurables en este registro.
Existen dos formas de configurar estos bits. Una de ellas es desde el MPLAB® mediante la opción CONFIGURATION BITS del menú CONFIGURE. La otra forma es mediante la directiva _ _CONFIG donde se especifica, a modo de argumentos, como queremos setear los bits correspondientes.

## Conversores Analógicos-Digital
### Entendiendo las conversiones A/D

Los conversores A/D (Analógico/Digital) que traen incorporados los μC de la familia 16F87X. Éstos, son de 10 bits y su funcionamiento es bastante simple comparados con los conversores A/D R2R, los de resistencia ponderada, etc.
Los PICs 16F874/7 vienen equipados con 8 entradas para hacer conversiones A/D, mientras que los 16F873/6 vienen con 5. Que tengan 5 u 8 entradas no quiere decir que haya 5 u 8 conversores A/D; en realidad es uno solo que se puede multiplexar en 5 u 8 entradas según el modelo. La técnica que utiliza el µC para la conversión es la de “incremento y comparación” la cual consiste en usar un registro auxiliar, compararlo con la entrada analógica y si es menor incrementarlo, volver a comparar y así hasta que el valor del registro sea lo más aproximado posible (pero sin pasarse) a la entrada analógica.
El rango de conversión de los PICs es de 0 a 5 V, pero si hubiera que hacer alguna conversión de más voltaje bastará con poner a la entrada del conversor un divisor de tensión correctamente calculado o bien trabajar con alguna tensión de referencia externa al μC.
La resolución que tiene cada bit de la conversión tiene un valor que es función de la tensión de referencia externa (en caso que la hubiere) y viene dada por: $Res={{V_{ref+}-V_{ref-}} \over 1024}$
Con lo cual, por ejemplo, si la tensión de referencia positiva (Vref+) es de 5 V y la tensión de referencia negativa (Vref -) es tierra, la resolución por cada bit es de 4,8 mV por cada bit. Este caso es cuando no se aplica una referencia externa, ya que el μC pone automáticamente la referencia en la tensión de alimentación. Una vez realizada la conversión, obtendremos un valor binario 0000000000 para 0 V y un valor binario 1111111111 para 5 V.

### Controlando el conversor A/D

Como es sabido, todos los módulos de un PIC, tienen registros asociados para su control, en este caso, los registros asociados al conversor A/D son:
* ADRESH (completo)
* ADRESL (completo)
* ADCON0 (completo)
* ADCON1 (completo)
Como la resolución del convertidor A/D es de 10 bits y los registros del µC son de 8, se utilizan dos registros; el ADRESL y ADRESH (AD resultado Low y AD resultado High) en forma concatenada. Es decir, en uno de ellos usaremos los 8 bits completos y en el otro solo 2 bits para llegar a los 10.
Los registros ADCON0 y ADCON1 son los que nos permitirán controlar, configurar y poner en marcha al conversor y se muestran en las figuras a continuación:
Como se ve en el registro ADCON0, los bits 6 y 7 son par ajustar la frecuencia del oscilador del conversor, que está ligada directamente con la frecuencia de oscilación del μC o bien usando una red RC interna. Los bit 5 al 3 son para elegir el canal de conversión y mediante estos bit’s se realiza la multiplexación en caso de necesitar más de una entrada analógica para la conversión. El bit 2 es uno de los más importantes, ya que para iniciar la conversión hay que ponerlo en “1” y automáticamente este bit se pone en “0” cuando la conversión termina. El bit 1 no se usa y el bit 0 es para activar el módulo de conversión en general o como se dice "prender el conversor". Si este último bit estuviera en 0, por más que se ponga un “1” en el bit 2, el conversor no iniciará la conversión, ya que el módulo en general está "apagado".
El registro ADCON1 el encargado de definir que entrada o “terminal” del µC usaremos como entrada analógica, este registro se hace muy útil cuando, por ejemplo, usamos un mismo terminal del µC como salida/entrada digital y en un determinado momento queremos que ese mismo terminal nos lea un voltaje analógico externo. También es el responsable de la selección de la “justificación” del resultado de la conversión, mediante el bit 7 y de configurar cual/es serán los terminales donde aplicaremos la tensión de referencia en caso de necesitarla.

### Conversión Terminada

El tiempo que le toma al μC realizar la conversión se denomina $T_{AD}$ y nunca debe ser menor que 1,6 μs para la familia 16F87X. el tiempo $T_{AD}$ es configurado por software según la relación $T_{AD}=kT_{OSC}$ donde K es el divisor de la frecuencia del conversor. Por ejemplo, si trabajamos con $T_{OSC}$ = 1μs y en los bits 7 y 6 del registro ADCON0 ponemos 00,quedará: $T_{AD}=2T_{OSC}=2*1\mu s=2\mu s$ lo cual está dentro del rango permitido.
Una vez terminada la conversión, el resultado se almacena en los registros ADRESH y ADRESL según estén configurados en el bit 7 del registro ADCON1. La "justificación" a la derecha o izquierda es sencilla de comprender; se trata de guardar el resultado de 10 bits en dos registros de 8 bit’s c/u, ósea que se elegirá si se quieren los 8 primeros bits en el ADRESL y los dos restantes en el ADRESH o viceversa.
Generalmente la elección de la justificación está directamente emparentada con la resolución que queremos leer, es decir, si se quiere conectar un potenciómetro y según la tensión aumentar o disminuir el tiempo de parpadeo de un led, se puede justificar a la izquierda y leer como resultado de la conversión solo los 8 bits del ADRESH y descartar o despreciar los dos bits de menor peso significativo que se guardarán en el ADRESL, la figura de la derecha facilita el entendimiento de la justificación derecha o izquierda.

### Pasos necesarios para la conversión A/D

A modo de algoritmo los pasos necesarios para una correcta utilización del modulo A/D son los siguientes:
* Configurar el módulo A/D:
** Terminales de entrada analógica y de referencia.
** Seleccionar el canal adecuado.
** Seleccionar la velocidad de conversión.
** Prender el conversor: Setear el bit 0 del registro ADCON0
* Empezar la conversión: Setear el bit 2 del registro ADCON0
* Esperar que el bit 2 del registro ADCON0 se ponga a 0
* Leer el resultado en los registros ADRESH:ADRESL
En estos pasos no se tiene en cuenta que se pueden necesitar más de una conversión por distintos canales o bien que se realicen varias conversiones y luego tomar un promedio. Esta ultima técnica es muy usada cuando las variaciones de tensión son rápidas y promediando tres o cuatro conversiones se tiene así el resultado, hasta que se realice una segunda conversión.

## Referencias

* Plantilla:Ref-internet
* ANGULO USATEGUI, JOSÉ MARÍA (2006). MICROCONTROLADORES PIC. DISEÑO PRACTICO DE APLICACIONES. ISBN 978-84-481-4627-6.

## Véase también

* MPLAB
* Microchip
* PIC16F84
* PIC16F88

## Enlaces externos

* Página Oficial de Microchip
* Hoja de Datos de la familia 16F87X (Datasheet)
* Grupo de discusión de habla-hispana de Microcontroladores PICs
* Placa entrenadora Open Source para PIC16F87X de 40 pines