Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Este es el reloj:
#ifdef DEBUGGER
// Configuration settings
_FOSC(CSW_FSCM_OFF & FRC_PLL4 ); // Fosc=4x7.3728MHz, Fcy=7.3728MHz CRISTAL INTERNO!!!
unsigned long int Fcy=4*7372800/4;//Si pones PLL4 multiplicar por 4, si PLL8 multiplicar por 8
#else
_FOSC(CSW_FSCM_ON & ECIO_PLL8 ); // Fosc=8x7.3728MHz, Fcy=14.7456MHz CRISTAL EXTERNO!!!
unsigned long int Fcy=8*7372800/4;//Si pones PLL4 multiplicar por 4, si PLL8 multiplicar por 8
#endif
Este es el setup del puerto analógico:
ADCON3bits.ADCS = 30; // ADCS = 2*Tad/Tcy - 1 Tad=1us (>668ns) Tcy=68ns -> 2*1000n/68n-1= 28.41
ADCON2bits.VCFG = 0;//Voltage reference= AVdd y AVss
ADPCFG=0xFF3F; //puerto AN6(Vbat) y AN7 analógicos, resto digitales
ADCON1bits.ADON = 1; // Turn ADC ON
Y he aquí la función de lectura al adc:
unsigned int read_analog_channel(int channel)
{
ADCHS = channel; // Select the requested channel
ADCON1bits.SAMP = 1; // Start sampling
__delay32(15); // 1us delay @ 15 MIPS
ADCON1bits.SAMP = 0; // Start Converting
while (!ADCON1bits.DONE); // Should take 12 * Tad = 3.2us AQUI SE QUEDA COLGADO!!
return ADCBUF0;
}
Pues bien, el pic se queda colgado en el while.
Si en la configuración le pongo:
ADCON3bits.ADCS = 192;
en vez de 30, entonces no se cuelga, pero me sale barba mientras el pic convierte.
ADCS = 2*Tad/Tcy - 1 en mi caso en modo debugger Fcy=7.3728MHz luego Tcy=135ns, entonces con ADCS=192 me sale Tad=13us
ADEMAS si pongo ese Tad tan alto el resultado que me dá es 0xFF después de echarlo a la derecha un par de bits:
typedef unsigned char byte;
x=(byte) (read_analog_channel(6)>>2);
Me respondo a mí mismo: en la placa developer no se puede hacer correr al pic demasiado porque los cables de alimentación son demasiado largos, como mucho a 7mhz ó usar reloj interno
He visto que el multiplexor es muy lento, he tenido que cambiar el control de batería baja para hacerlo externo a pinde lectura digital 🙁
Si te gustan los dsPIC quizá te interese probar los dsPIC33EP. Funcionan a 3,3V en vez de a 5V, però le dan unas cuantas patadas en todos los sentidos.
He probado uno que controla los PWM con una resolución de 1ns 😯 , lo uso para controlar un piezo ultrasónico a frecuencias de megahercios