1
UNIVERSIDAD DE OVIEDO
Características generales en el PIC16F877
Ocho canales de conversión.
Cinco pines E/S de PORTA y los tres de PORTE.
Convierte la señal analógica en un número digital de 10 bits.
Tensión de referencia seleccionable por software.
Puede ser VDD o la tensión aplicada en los pines RA2 y/o RA3.
Posibilidad de seguir funcionando cuando el PIC está en modo SLEEP.
Hay 11 registros asociados a este periférico.
Definición de pines de entrada
TRISA – PORTA – TRISE - PORTE
Manejo de interrupciones
INTCON – PIE1 – PIR1
Control del conversor A/D
ADCON0 – ADCON1 – ADRESH - ADRESL
2
UNIVERSIDAD DE OVIEDO
Estructura interna
RA0/AN0
000 Convertidor
RA1/AN1
001
CHS2:CHS0 A/D
010
RA2/AN2/VREF-
011
RA3/AN3/VREF+
100 VAIN (Input Voltage)
RA5/AN4
101
RE0/AN5
110
RE1/AN6 PCFG3:PCFG0
111 VDD
RE2/AN7
VREF+
PCFG3:PCFG0
VREF-
VSS
3
UNIVERSIDAD DE OVIEDO
Registro ADCON0 (1Fh)
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON
bit 7-6 ADCS1:ADCS0: Selección del reloj para la conversión A/D
00 = fOSC / 2 01 = fOSC / 8 10 = fOSC / 32 11 = fRC
bit 5-3 CHS2:CHS0: Selección del canal de conversión
000 = Canal 0 001 = Canal 1 010 = Canal 2 011 = Canal 3
100 = Canal 4 101 = Canal 5 110 = Canal 6 111 = Canal 7
bit 2 GO/DONE: Estado de la conversión
Si ADON=1:
1 = Conversión en progreso 0 = Conversión finalizada
bit 0 ADON: Bit de encendido del convertidor A/D
1 = Módulo A/D encendido 0 = Módulo A/D apagado
4
UNIVERSIDAD DE OVIEDO
Registro ADCON1 (9Fh)
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
bit 7 ADFM: Selección de formato del resultado
1 = Ajuste a la derecha 0 = Ajuste a la izquierda
bit 3-0 PCFG3:PCFG0: Configuración de las entradas al módulo A/D
PCFG3: AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0
PCFG0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0
0000 A A A A A A A A
0001 A A A A VREF+ A A A
0010 D D D A A A A A
0011 D D D A VREF+ A A A
0100 D D D D A D A A
0101 D D D D VREF+ D A A
011x D D D D D D D D
1000 A A A A VREF+ VREF- A A
1001 D D A A A A A A
1010 D D A A VREF+ A A A
1011 D D A A VREF+ VREF- A A
1100 D D D A VREF+ VREF- A A
1101 D D D D VREF+ VREF- A A
1110 D D D D D D D A
1111 D D D D VREF+ VREF- D A
5
UNIVERSIDAD DE OVIEDO
Registro INTCON (0Bh , 8Bh , 10Bh , 18Bh)
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit 7 GIE: Habilitación global de interrupciones
bit 6 PEIE: Habilitación de interrupciones de periféricos
Registro PIE1 (8Ch)
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit 6 ADIE: Habilitación de la interrupción del convertidor A/D
Registro PIR1 (0Ch)
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit 6 ADIF: Flag de la interrupción del convertidor A/D
1 = Conversión A/D completada. 0 = Conversión A/D aún no completada.
6
UNIVERSIDAD DE OVIEDO
Pasos en una conversión A/D
1. Configurar el módulo A/D.
- Definir entradas analógicas y tensión de referencia. (ADCON1)
- Seleccionar el canal de la conversión. (ADCON0)
- Seleccionar el reloj de la conversión. (ADCON0)
- Encender el módulo A/D. (ADCON0)
2. Configurar la interrupción por conversión A/D.
- Bajar el flag ADIF. (PIR1)
- Habilitar la interrupción del convertidor A/D. (PIE1)
- Habilitar las interrupciones de los periféricos. (INTCON)
- Habilitar la máscara global de interrupciones. (INTCON)
3. Esperar a que transcurra el tiempo de adquisición.
- Tiempo necesario para capturar el valor analógico a convertir.
- Los valores típicos del tiempo de adquisición son del orden de 20µs.
7
UNIVERSIDAD DE OVIEDO
4. Comenzar la conversión.
- Poner a “1” el bit GO/DONE. (ADCON0)
No activar este bit a la vez que se enciende el convertidor A/D
5. Esperar a que se complete la conversión A/D.
a) Controlando cuándo el bit GO/DONE se pone a “0”.
b) Esperando a que llegue la interrupción del convertidor.
6. Leer el resultado de la conversión.
- Disponible en los registros ADRESH:ADRESL.
- Bajar el flag ADIF si se están usando interrupciones.
7. Llevar a cabo la siguiente conversión.
- Volver al paso 1 ó 2, según convenga.
- Espera mínima antes de empezar la siguiente adquisición: 2·T AD.
TAD: Tiempo necesario para la conversión de un bit.
8
UNIVERSIDAD DE OVIEDO
Tiempo de adquisición
Tiempo necesario para cargar el condensador de mantenimiento (C HOLD).
VDD
RS ANX RIC 1K SS RSS
VA
CPIN IFUGAS CHOLD
5pF ±500nA 120pF
VSS
Máxima impedancia recomendada para la fuente: 10K.
En estas condiciones, TACQ 20µs.
Mientras no se complete la conversión, no empieza otra adquisición.
Esperar TACQ : a) tras una conversión; b) tras seleccionar un nuevo canal;
c) tras encender el módulo A/D.
9
UNIVERSIDAD DE OVIEDO
Tiempo de conversión
La conversión de 10 bits dura 12·TAD.
Tciclo ÷ TAD TAD TAD TAD TAD TAD TAD TAD TAD TAD TAD TAD
b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
Comienza la conversión Se carga ADRES
Se pone GO/DONE a “0”
Se abre SS (típ. 100ns) Se levanta el flag ADIF
CHOLD conectado a entrada analógica
GO/DONE 1
TAD configurable en ADCON0 (reloj de la conversión).
TAD=2·TOSC - TAD=8·TOSC - TAD=32·TOSC - TAD=2µs÷6µs (típ. 4µs)
Para un funcionamiento correcto se necesita un valor mínimo de T AD=1,6µs.
10
UNIVERSIDAD DE OVIEDO
Función de transferencia
La primera transición tiene lugar cuando la tensión analógica de
entrada alcanza el valor VREF- + (VREF+ - VREF-)/1024 1LSb.
FFh
FEh
FDh
FCh
04h
03h
02h
01h (VREF-) (VREF+)
00h
1023 LSb
1022 LSb
1024 LSb
1021 LSb
3 LSb
2 LSb
4 LSb
1 LSb
11
UNIVERSIDAD DE OVIEDO
Conversión A/D en el compilador C de CCS
Configuración del módulo conversor A/D
setup_adc (modo);
modo: ADC_OFF (ADCON0 00h)
ADC_CLOCK_DIV_2 (ADCON0 01h)
ADC_CLOCK_DIV_8 (ADCON0 41h)
ADC_CLOCK_DIV_32 (ADCON0 81h)
ADC_CLOCK_INTERNAL (ADCON0 C1h)
Definición de entradas analógicas
setup_adc_ports (valor);
valor: NO_ANALOGS (ADCON1 86h)
ALL_ANALOG (ADCON1 80h)
ANALOG_RA3_REF (ADCON1 81h)
A_ANALOG (ADCON1 82h)
A_ANALOG_RA3_REF (ADCON1 83h)
RA0_RA1_RA3_ANALOG (ADCON1 84h)
RA0_RA1_ANALOG_RA3_REF (ADCON1 85h)
12
UNIVERSIDAD DE OVIEDO
Definición de entradas analógicas (cont.)
setup_adc_ports (valor);
valor: ANALOG_RA3_RA2_REF (ADCON1 88h)
ANALOG_NOT_RE1_RE2 (ADCON1 89h)
ANALOG_NOT_RE1_RE2_REF_RA3 (ADCON1 8Ah)
ANALOG_NOT_RE1_RE2_REF_RA3_RA2 (ADCON1 8Bh)
A_ANALOG_RA3_RA2_REF (ADCON1 8Ch)
RA0_RA1_ANALOG_RA3_RA2_REF (ADCON1 8Dh)
RA0_ANALOG (ADCON1 8Eh)
RA0_ANALOG_RA3_RA2_REF (ADCON1 8Fh)
Selección del canal analógico
set_adc_channel (canal);
canal: 0 (AN0) 4 (AN4)
1 (AN1) 5 (AN5)
2 (AN2) 6 (AN6)
3 (AN3) 7 (AN7)
13
UNIVERSIDAD DE OVIEDO
Lectura del resultado
valor = read_adc ();
valor: Entero de 16 bits según la directiva #device adc= empleada.
La influencia de dicha directiva se recoge en la siguiente tabla
#device 8 bits 10 bits 11 bits 16 bits
adc=8 00-FF 00-FF 00-FF 00-FF
adc=10 x 0-3FF x x
adc=11 x x 0-7FF x
adc=16 0-FF00 0-FFC0 0-FFE0 0-FFFF
El fichero 16f877.h incluye como primera directiva #device PIC16F877.
Es necesario incluir información del tipo de conversor A/D. Por ello los
ficheros C que usen este módulo deberán comenzar por
#include “16f877.h”
#device adc=10
14
UNIVERSIDAD DE OVIEDO
Ejemplo W 10000010
setup_adc_ports (A_ANALOG);
Banco 1
ADCON1 W
Banco 0
setup_adc (ADC_CLOCK_INTERNAL); W ADCON0
W W & 00111000
set_adc_channel (3); W W | 11000001
ADCON0 W
delay_us (20); W ADCON0
W W & 11000111
W W | 00011000
valor = read_adc ();
ADCON0 W
setup_adc (ADC_OFF); GO/DONE 1
Espera a GO/DONE=0
W ADRESH
TEMP W
Banco 1
W ADRESL
W ADCON0 Banco 0
W W & 00111000 REGL W Comentario
W TEMP
ADCON0 W REGH W
15
UNIVERSIDAD DE OVIEDO
Registro ADCON1 (9Fh)
ADFM
1 - - - PCFG3
0 PCFG2
0 PCFG1
1 PCFG0
0
bit 7 ADFM: Selección de formato del resultado
1 = Ajuste a la derecha 0 = Ajuste a la izquierda
bit 3-0 PCFG3:PCFG0: Configuración de las entradas al módulo A/D
PCFG3: AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0
PCFG0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0
0000 A A A A A A A A
0001 A A A A VREF+ A A A
0010 D D D A A A A A
0011 D D D A VREF+ A A A
0100 D D D D A D A A
0101 D D D D VREF+ D A A
011x D D D D D D D D
1000 A A A A VREF+ VREF- A A
1001 D D A A A A A A
1010 D D A A VREF+ A A A
1011 D D A A VREF+ VREF- A A
1100 D D D A VREF+ VREF- A A
1101 D D D D VREF+ VREF- A A
1110 D D D D D D D A
1111 D D D D VREF+ VREF- D A
16
UNIVERSIDAD DE OVIEDO
Registro ADCON0 (1Fh)
ADCS1
1 ADCS0
1 CHS2
0 CHS1
1 CHS0
1 GO/DONE
0 - ADON
1
bit 7-6 ADCS1:ADCS0: Selección del reloj para la conversión A/D
00 = fOSC / 2 01 = fOSC / 8 10 = fOSC / 32 11 = fRC
bit 5-3 CHS2:CHS0: Selección del canal de conversión
000 = Canal 0 001 = Canal 1 010 = Canal 2 011 = Canal 3
100 = Canal 4 101 = Canal 5 110 = Canal 6 111 = Canal 7
bit 2 GO/DONE: Estado de la conversión
Si ADON=1:
1 = Conversión en progreso 0 = Conversión finalizada
bit 0 ADON: Bit de encendido del convertidor A/D
1 = Módulo A/D encendido 0 = Módulo A/D apagado
17
UNIVERSIDAD DE OVIEDO
El código ensamblador recogido en este ejemplo supone que valor es una
variable de tipo long int y que se ha llevado a cabo una conversión A/D de
10 bits, para lo cual el código C deberá comenzar como se indica:
#include "16F877.h"
#device ADC=10 // Selecciona conversión A/D de 10 bits
Si no se incluye la directiva #device ADC=10, el compilador considera
que se debe hacer una conversión A/D de 8 bits. En este caso, y
considerando ahora que valor es una variable de tipo int, el código
ensamblador que se genera difiere del visto.
setup_acd_ports (A_ANALOG); valor = read_adc(); El contenido
W 00000010 GO/DONE 1 de valor se
obtiene de
Banco 1 Ajusta resultado Espera GO/DONE=0
un solo
ADCON1 W de conversión W ADRESH
registro:
Banco 0 a la izquierda REG W ADRESH
(ajuste a la
izda)
18
UNIVERSIDAD DE OVIEDO