UNIVERSI E OVIEO 1
Características generales en el PIC16F877 Ocho canales de conversión. Cinco pines E/S de PORT 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 V o la tensión aplicada en los pines R2 y/o R3. Posibilidad de seguir funcionando cuando el PIC está en modo SLEEP. Hay 11 registros asociados a este periférico. efinición de pines de entrada TRIS PORT TRISE - PORTE Manejo de interrupciones INTCON PIE1 PIR1 Control del conversor / CON0 CON1 RESH - RESL UNIVERSI E OVIEO 2
Estructura interna R0/N0 R1/N1 R2/N2/V REF- R3/N3/V REF+ R5/N4 RE0/N5 RE1/N6 RE2/N7 000 001 010 011 100 101 110 111 V CHS2:CHS0 PCFG3:PCFG0 Convertidor / V IN (Input Voltage) V REF+ PCFG3:PCFG0 V REF- V SS UNIVERSI E OVIEO 3
Registro CON0 (1Fh) CS1 CS0 CHS2 CHS1 CHS0 GO/ONE - ON bit 7-6 CS1:CS0: Selección del reloj para la conversión / 00 = f OSC / 2 01 = f OSC / 8 10 = f OSC / 32 11 = f RC 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/ONE: Estado de la conversión Si ON=1: 1 = Conversión en progreso 0 = Conversión finalizada bit 0 ON: Bit de encendido del convertidor / 1 = Módulo / encendido 0 = Módulo / apagado UNIVERSI E OVIEO 4
Registro CON1 (9Fh) FM - - - PCFG3 PCFG2 PCFG1 PCFG0 bit 7 FM: Selección de formato del resultado 1 = juste a la derecha 0 = juste a la izquierda bit 3-0 PCFG3:PCFG0: Configuración de las entradas al módulo / PCFG3: PCFG0 N7 RE2 N6 RE1 N5 RE0 N4 R5 N3 R3 N2 R2 N1 R1 N0 R0 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 UNIVERSI E OVIEO 5
Registro INTCON (0Bh, 8Bh, 10Bh, 18Bh) GIE PEIE T0IE INTE RBIE T0IF INTF RBIF bit 7 bit 6 GIE: Habilitación global de interrupciones PEIE: Habilitación de interrupciones de periféricos Registro PIE1 (8Ch) PSPIE IE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE bit 6 IE: Habilitación de la interrupción del convertidor / Registro PIR1 (0Ch) PSPIF IF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF bit 6 IF: Flag de la interrupción del convertidor / 1 = Conversión / completada. 0 = Conversión / aún no completada. UNIVERSI E OVIEO 6
Pasos en una conversión / 1. Configurar el módulo /. - efinir entradas analógicas y tensión de referencia. (CON1) - Seleccionar el canal de la conversión. (CON0) - Seleccionar el reloj de la conversión. (CON0) - Encender el módulo /. (CON0) 2. Configurar la interrupción por conversión /. - Bajar el flag IF. (PIR1) - Habilitar la interrupción del convertidor /. (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. UNIVERSI E OVIEO 7
4. Comenzar la conversión. - Poner a 1 el bit GO/ONE. (CON0) No activar este bit a la vez que se enciende el convertidor / 5. Esperar a que se complete la conversión /. a) Controlando cuándo el bit GO/ONE se pone a 0. b) Esperando a que llegue la interrupción del convertidor. 6. Leer el resultado de la conversión. - isponible en los registros RESH:RESL. - Bajar el flag IF 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. T : Tiempo necesario para la conversión de un bit. UNIVERSI E OVIEO 8
Tiempo de adquisición Tiempo necesario para cargar el condensador de mantenimiento (C HOL ). V R S N X R IC 1K SS R SS V C PIN 5pF I FUGS ±500n C HOL 120pF V SS Máxima impedancia recomendada para la fuente: 10K. En estas condiciones, T CQ 20µs. Mientras no se complete la conversión, no empieza otra adquisición. Esperar T CQ : a) tras una conversión; b) tras seleccionar un nuevo canal; c) tras encender el módulo /. UNIVERSI E OVIEO 9
Tiempo de conversión La conversión de 10 bits dura 12 T. T ciclo T T T T T T T T T T T T b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 GO/ONE 1 Comienza la conversión Se abre SS (típ. 100ns) Se carga RES Se pone GO/ONE a 0 Se levanta el flag IF C HOL conectado a entrada analógica T configurable en CON0 (reloj de la conversión). T =2 T OSC - T =8 T OSC - T =32 T OSC - T =2µs 6µs (típ. 4µs) Para un funcionamiento correcto se necesita un valor mínimo de T =1,6µs. UNIVERSI E OVIEO 10
1 LSb 2 LSb 3 LSb 4 LSb 1021 LSb 1022 LSb 1023 LSb 1024 LSb Función de transferencia La primera transición tiene lugar cuando la tensión analógica de entrada alcanza el valor V REF- + (V REF+ - V REF- )/1024 1LSb. FFh FEh Fh FCh 04h 03h 02h 01h 00h (V REF- ) (V REF+ ) UNIVERSI E OVIEO 11
Conversión / en el compilador C de CCS Configuración del módulo conversor / setup_adc (modo); modo: C_OFF (CON0 00h) C_CLOCK_IV_2 (CON0 01h) C_CLOCK_IV_8 (CON0 41h) C_CLOCK_IV_32 (CON0 81h) C_CLOCK_INTERNL (CON0 C1h) UNIVERSI E OVIEO efinición de entradas analógicas setup_adc_ports (valor); valor: NO_NLOGS (CON1 86h) LL_NLOG (CON1 80h) NLOG_R3_REF (CON1 81h) _NLOG (CON1 82h) _NLOG_R3_REF (CON1 83h) R0_R1_R3_NLOG (CON1 84h) R0_R1_NLOG_R3_REF (CON1 85h) 12
efinición de entradas analógicas (cont.) setup_adc_ports (valor); valor: NLOG_R3_R2_REF (CON1 88h) NLOG_NOT_RE1_RE2 (CON1 89h) NLOG_NOT_RE1_RE2_REF_R3 (CON1 8h) NLOG_NOT_RE1_RE2_REF_R3_R2 (CON1 8Bh) _NLOG_R3_R2_REF (CON1 8Ch) R0_R1_NLOG_R3_R2_REF (CON1 8h) R0_NLOG (CON1 8Eh) R0_NLOG_R3_R2_REF (CON1 8Fh) set_adc_channel (canal); Selección del canal analógico canal: 0 (N0) 4 (N4) 1 (N1) 5 (N5) 2 (N2) 6 (N6) 3 (N3) 7 (N7) UNIVERSI E OVIEO 13
valor = read_adc (); Lectura del resultado valor: Entero de 16 bits según la directiva #device adc= empleada. La influencia de dicha directiva se recoge en la siguiente tabla #device adc=8 adc=10 adc=11 adc=16 8 bits 00-FF x x 0-FF00 10 bits 11 bits 16 bits 00-FF 00-FF 00-FF 0-3FF x x x 0-7FF x 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 /. Por ello los ficheros C que usen este módulo deberán comenzar por #include 16f877.h #device adc=10 UNIVERSI E OVIEO 14
Ejemplo setup_adc_ports (_NLOG); setup_adc (C_CLOCK_INTERNL); set_adc_channel (3); delay_us (20); valor = read_adc (); W 10000010 Banco 1 CON1 W Banco 0 W CON0 W W & 00111000 W W 11000001 CON0 W W CON0 W W & 11000111 W W 00011000 CON0 W setup_adc (C_OFF); UNIVERSI E OVIEO W CON0 W W & 00111000 CON0 W GO/ONE 1 Espera a GO/ONE=0 W RESH TEMP W Banco 1 W RESL Banco 0 REGL W Comentario W TEMP REGH W 15
Registro CON1 (9Fh) FM 1 - - - PCFG3 0 PCFG2 0 PCFG1 1 PCFG0 0 bit 7 FM: Selección de formato del resultado 1 = juste a la derecha 0 = juste a la izquierda bit 3-0 PCFG3:PCFG0: Configuración de las entradas al módulo / PCFG3: PCFG0 N7 RE2 N6 RE1 N5 RE0 N4 R5 N3 R3 N2 R2 N1 R1 N0 R0 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 UNIVERSI E OVIEO 16
Registro CON0 (1Fh) CS1 1 CS0 1 CHS2 0 CHS1 1 CHS0 1 GO/ONE 0 - ON 1 bit 7-6 CS1:CS0: Selección del reloj para la conversión / 00 = f OSC / 2 01 = f OSC / 8 10 = f OSC / 32 11 = f RC 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/ONE: Estado de la conversión Si ON=1: 1 = Conversión en progreso 0 = Conversión finalizada bit 0 ON: Bit de encendido del convertidor / 1 = Módulo / encendido 0 = Módulo / apagado UNIVERSI E OVIEO 17
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 / de 10 bits, para lo cual el código C deberá comenzar como se indica: #include "16F877.h" #device C=10 // Selecciona conversión / de 10 bits Si no se incluye la directiva #device C=10, el compilador considera que se debe hacer una conversión / 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 (_NLOG); valor = read_adc(); W 00000010 GO/ONE 1 Banco 1 justa resultado Espera GO/ONE=0 CON1 W de conversión W RESH Banco 0 a la izquierda REG W El contenido de valor se obtiene de un solo registro: RESH (ajuste a la izda) UNIVERSI E OVIEO 18