Yo estoy usando una de baja potencia PIC16LF1554 junto con un nRF24l01+ transceptor de 2,4 GHz.
Durante el encendido, el PIC intentar inicializar el módulo de RF antes de que el suministro se ha alcanzado el mínimo requerido y no se realizará a menos de insertar un retraso. Algo como esto
void main()
{
// 4x PLL, 8MHz internal oscillator = 32MHz clock
OSCCON = 0xF0;
// wait for HFINTOSC to stabilise
while (OSCSTATbits.HFIOFR == 0);
while (OSCSTATbits.HFIOFS == 0);
// configure TRIS, APFCON etc.
// (removed for clarity)
// **** necessary delay ****
__delay_ms(500);
// initialise RF transceiver
NRF_Setup();
// main loop
while (1)
{
// ... whatever ...
}
}
No acabo de entender por qué esto es así porque el RF tiene un requisito mínimo de 1.9 V y, de acuerdo a la hoja de datos del PIC requiere de 2.5 V para el HFINTOSC a estabilizar, así que pensé que debería estar bien. (El nRF24l01+ es independiente breakout board, que tiene otros componentes de apoyo, así que tal vez que afecta a las cosas).
Así, mientras que este funciona bien y, obviamente, el retraso no tiene ningún impacto en la aplicación final, yo aún no le gusta la idea de tener que escribir código arbitrario retraso y mi sensación sería probar algo un poco más determinista. El 500ms es probablemente una exageración y yo podría empíricamente encontrar algo más corto, pero que no se siente como un enfoque sólido.
Así que, ¿hay alguna manera fácil de medir lo que el VDD es como rampas durante el encendido, ya sea en el código o con componentes externos, en ausencia de un voltaje de referencia? O tal vez ese no es el problema que estoy viendo y el retraso es necesario por otra razón?
EDITAR En caso de que sea pertinente, estos son los parámetros de configuración
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled. SWDTEN bit is ignored.)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled. SBOREN bit is ignored.)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), 1.9V trip point selected.)
#pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)