#include <p32xxxx.h>
#include <plib.h>
// *-------------------------------------------------------------------------*
// Cristal de 8MHz.-
// SYSCLK = 80 MHz (8MHz Cristal/ FPLLIDIV * FPLLMUL / FPLLODIV)
// FPLLDIV 1:2, PLLMULT x20, PLLODIV 1:1. -> 80MHz
// FPBDIV 1:1 -> 80MHz
#pragma config FPLLODIV=DIV_1, FPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPBDIV=DIV_1
#pragma config FWDTEN=OFF, FCKSM=CSDCMD, POSCMOD=XT, FNOSC=PRIPLL
#pragma config CP=OFF, BWP=OFF
// *-------------------------------------------------------------------------*
#include "HardwareProfileSkP32.h"
// *-------------------------------------------------------------------------*
void vConfigADC(void);
// *-------------------------------------------------------------------------*
void __ISR(_ADC_VECTOR,ipl4) ISR_ADC(void){
INTClearFlag(INT_AD1);
PORTToggleBits(PORT_LED1,PIN_LED1);
}
// *-------------------------------------------------------------------------*
// *-------------------------------------------------------------------------*
int main(){
mJTAGPortEnable(0); // JTAG des-habilitado
SYSTEMConfigPerformance(GetSystemClock()); // Activa pre-cache.-
DelayMs(100);
vConfigADC();
PORTSetPinsDigitalOut(PORT_LED1, PIN_LED1);
PORTSetBits(PORT_LED1,PIN_LED1);
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
INTEnableInterrupts();
while(1){
DelayMs(300);
PORTToggleBits(PORT_LED3,PIN_LED3);
}
}
// *-------------------------------------------------------------------------*
void vConfigADC(void){
AD1CON1=0; // Off
AD1CON1bits.SIDL=0; // Encendido en modo IDLE
AD1CON1bits.FORM=0; // Data Output Format: Entero 16-bits
AD1CON1bits.SSRC=7; // Auto-conversion
AD1CON1bits.CLRASAM=0; // Operacion Normal
AD1CON1bits.ASAM=1; // Comenzar muestreo inmediantamente completada la conversion
AD1CON2bits.VCFG=0; // Vdd/Vss
AD1CON2bits.OFFCAL=0; // Apagada calibracion de offset
AD1CON2bits.CSCNA=0; // Scan off
AD1CON2bits.SMPI=0b1111; // Interrupcion por cada 16 conversiones
AD1CON2bits.BUFM=0; // Buffer 16-bits
AD1CON2bits.ALTS=0; // Usar siempre MUXA
AD1CON3bits.ADRC=0; // ADC Clock desde PBCLK
AD1CON3bits.SAMC=1; // Auto Sample Time = 1*Tad
AD1CON3bits.ADCS=2; // Tad = TPB • 2 • (ADCS<7:0> + 1) = 75ns (13Mhz) (minimo 65ns)
// Tc=13*Tad = 1us (1MHz)
AD1CHSbits.CH0SA=0; // MUXA +ve -> CH0
AD1CHSbits.CH0NA=0; // MUXA -ve -> Vr-
AD1PCFG=0xFFFF;
AD1PCFGbits.PCFG0 = 0; // AN0 as Analog
AD1CON1bits.ADON = 1; // Encender modulo
INTSetVectorPriority(INT_ADC_VECTOR, INT_PRIORITY_LEVEL_4);
INTSetVectorSubPriority(INT_ADC_VECTOR, INT_SUB_PRIORITY_LEVEL_1);
INTClearFlag(INT_AD1);
INTEnable(INT_AD1, INT_ENABLED);
}