Soy nuevo en el mundo de los microcontroladores y estoy usando un controlador dsPIC33EP256MC506 y una placa de desarrollo dsPICDEM -2 MCLV para un proyecto. Estoy tratando de leer el valor del potenciómetro que está en la placa de desarrollo, pero tengo problemas. Solo quiero poder ejecutar el programa y mover, girar el potenciómetro y ver cómo el programa genera el valor. Sé que tengo que usar los puertos ADC de alguna manera para hacer esto, pero no estoy exactamente seguro de cómo usarlo. La documentación tampoco ha sido muy útil sobre cómo hacer esto en el programa. Si alguien puede dirigirme a la documentación que usa ADC para controlar el potenciómetro o ayudarme a comenzar con esto, sería genial.
Además, ¿alguien sabe dónde se mostrará este valor? Para mí, tiene sentido que se muestre en la pestaña de resultados de Variables, pero no parece que haya ningún valor para ninguna variable.
Microcontrolador: dsPIC33EP256MC506
Placa de desarrollo: dsPICDEM -2 MCLV
Programador / Depurador: REAL ICE
Compilador: MPLAB X - XC16
Gracias de nuevo!
#include <p33Exxxx.h>
/****************************CONFIGURATION****************************/
_FOSCSEL(FNOSC_FRC);
_FOSC(FCKSM_CSECMD & POSCMD_XT & OSCIOFNC_OFF & IOL1WAY_OFF);
_FWDT(FWDTEN_OFF);
_FPOR(ALTI2C1_ON & ALTI2C2_ON);
_FICD(ICS_PGD1 & JTAGEN_OFF);
void initAdc1(void);
void Delay_us(unsigned int);
int ADCValue, i;
int main(void)
{
// Configure the device PLL to obtain 40 MIPS operation. The crystal frequency is 8 MHz.
// Divide 8 MHz by 2, multiply by 40 and divide by 2. This results in Fosc of 80 MHz.
// The CPU clock frequency is Fcy = Fosc/2 = 40 MHz.
PLLFBD = 38; /* M = 40 */
CLKDIVbits.PLLPOST = 0; /* N1 = 2 */
CLKDIVbits.PLLPRE = 0; /* N2 = 2 */
OSCTUN = 0;
/* Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0x3) */
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(0x01);
while (OSCCONbits.COSC != 0x3);
while (_LOCK == 0); /* Wait for PLL lock at 40 MIPS */
initAdc1();
while(1)
{
AD1CON1bits.SAMP = 1; // Start sampling
Delay_us(10); // Wait for sampling time (10 us)
AD1CON1bits.SAMP = 0; // Start the conversion
while (!AD1CON1bits.DONE); // Wait for the conversion to complete
ADCValue = ADC1BUF0; // Read the ADC conversion result
}
}
void initAdc1(void) {
/* Set port configuration */
ANSELA = ANSELB = ANSELC = ANSELE = 0x0000;
//ANSELBbits.ANSB5 = 1; // Ensure AN5/RB5 is analog
ANSELBbits.ANSB0 = 1;
ANSELAbits.ANSA0 = 1;
// A0 and B0 are inputs
TRISAbits.TRISA0 = 1;
TRISBbits.TRISB0 = 1;
/* Initialize and enable ADC module */
AD1CON1 = 0x0000;
AD1CON2 = 0x0000;
AD1CON3 = 0x000F;
AD1CON4 = 0x0000;
AD1CHS0 = 0x0000;
// 0000 0000 0000 0101
AD1CHS123 = 0x0000;
AD1CSSH = 0x0000;
AD1CSSL = 0x0000;
AD1CON1bits.ADON = 1;
Delay_us(20);
}
void Delay_us(unsigned int delay)
{
for (i = 0; i < delay; i++)
{
__asm__ volatile ("repeat #39");
__asm__ volatile ("nop");
}
}