04 – Conversion de Analógico a Digital por Interrupción

En el post 03 de este blog expliqué como utilizar la librería ADC.h para realizar conversiones A/D mostrando el ejemplo  “tradicional”. Sin embargo, dado que el módulo A/D del microcontrolador es un periférico externo integrado a la estructura del microcontrolador (dentro del encapsulado del PIC), posee una interrupción asociada denominada ADCInterrupt que se indica por medio de la bandera ADIF del registro PIR1. En el microcontrolador, cada vez que se produce una interrupción se ejecuta un método asociado a esta o el método general interrupt high_isr().

El funcionamiento es simple, cada vez que el módulo A/D termine de realizar una conversión lo indicará poniendo en 1 la bandera ADIF, utilizaremos el método ADCInterrupt para capturar esta interrupción y evaluar el estado de la bandera. Siempre que sea posible, es conveniente utilizar interrupciones ya que es una manera mas eficiente de realizar varias actividades con el microcontrolador.

void interrupt ADCInterrupt()
{
 if(PIR1bits.ADIF)
 {
   /*Acciones a ejecutar
   .
   .
   .*/

   /*Siempre se debe colocar la bandera
   en 0 antes de salir.*/
   PIR1bits.ADIF = 0;
 }
}

Por otra parte, debemos activar la interrupción de la conversión con el parámetro ADC_INT_ON en la función OpenADC():

 OpenADC(ADC_FOSC_64 &
 ADC_RIGHT_JUST &
 ADC_16_TAD,
 ADC_CH0 &
 ADC_INT_ON &
 ADC_VREFPLUS_VDD &
 ADC_VREFMINUS_VSS,
 14);

Utilizaremos el mismo circuito:

Circuito de aplicación

El código es el siguiente:

#include <xc.h>
#include <plib/adc.h>
#include <plib/delays.h>
#include "stdlib.h"

//Bits de configuración para Fosc = 48Mhz
#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
#pragma config WDT = OFF, WDTPS = 32768
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF
#pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF

#define _XTAL_FREQ 48000000

int resultado;

void main()
{
 TRISD = 0;
 PORTD = 0;

 /*Configuración del módulo AD
 * Fosc = 64
 * Alineación = derecha
 * 16 TAD
 * Canal AN0
 * Interrupción habilitada
 * VREF+ y VREF- conectados a VDD y VSS respectivamente
 * Valor de ADCON1 = 14 (Canal AN0 analógico, el resto digitales)
 */
 OpenADC(ADC_FOSC_64 &
 ADC_RIGHT_JUST &
 ADC_16_TAD,
 ADC_CH0 &
 ADC_INT_ON &
 ADC_VREFPLUS_VDD &
 ADC_VREFMINUS_VSS,
 14);

 //Retardo de 50 Tcy
 Delay10TCYx(5);

 ADC_INT_ENABLE(); //Habilitación de la interrupción AD
 ei();

 //Iniciar la conversión
 ConvertADC();

 while(1)
 {}
}

void interrupt ADCInterrupt()
{
 if(ADIF)
 {
 //Capturando el resultado
 resultado = ReadADC();

 /*Como el resultado es de 10 bits
 * y sólo se dispone de un puerto de 8 bits
 * para mostrarlo. El resultado se convierte
 * en su equivalente de 8 bits dividiendo
 * por cuatro.
 */
 resultado = resultado / 4;

 //Mostrando el resultado
 PORTD = resultado;

 //Antes de salir se debe poner la bandera en 0
 ADIF = 0;

 //Continuar con la conversión
 ConvertADC();
 }
}

Como se puede apreciar, al bucle while(1) {} lo dejamos sin código ya que todo el proceso es controlado desde el método ADCInterrupt(), podemos entonces dejar funcionando automáticamente al módulo A/D mientras el microcontrolador se encarga de realizar otras tareas.

En el siguiente post, utilizaremos la conversión por interrupción para construir un voltímetro digital.

Acerca de jjguevara09

Me gusta la electrónica
Esta entrada fue publicada en Microcontroladores PIC y etiquetada , , , , . Guarda el enlace permanente.

Una respuesta a 04 – Conversion de Analógico a Digital por Interrupción

  1. JOSHUE GARCIA PAJUELO dijo:

    Disculpe al momento de compilar el codigo me aparece un error de declaracion de variable, debido a que podria ser aquella falta, se lo dejo aqui:

    :: advisory: (1233) Employing 18F4550 errata work-arounds:
    :: advisory: (1234) * Corrupted fast interrupt shadow registers
    :: warning: (1273) Omniscient Code Generation not available in Free mode

    C:\Program Files (x86)\Microchip\xc8\v1.37\include\pic18f4550.h:9211: error: (1098) conflicting declarations for variable “_INTCONbits” (C:\Program Files (x86)\Microchip\xc8\v1.37\include\pic18f4550.h:8963)
    (908) exit status = 1

    nbproject/Makefile-default.mk:119: recipe for target ‘dist/default/production/333.X.production.hex’ failed
    make[2]: Leaving directory ‘C:/Users/Joshue/Desktop/C mplab/333.X’
    nbproject/Makefile-default.mk:78: recipe for target ‘.build-conf’ failed
    make[1]: Leaving directory ‘C:/Users/Joshue/Desktop/C mplab/333.X’
    nbproject/Makefile-impl.mk:39: recipe for target ‘.build-impl’ failed
    make[2]: *** [dist/default/production/333.X.production.hex] Error 1
    make[1]: *** [.build-conf] Error 2
    make: *** [.build-impl] Error 2

    BUILD FAILED (exit value 2, total time: 2s)

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s