Estoy usando un PIC16LF1554 de bajo consumo junto con un nRF24l01+ transceptor de 2.4GHz.
Durante el encendido, el PIC intentará inicializar el módulo de RF antes de que el suministro haya alcanzado el mínimo requerido y fallará a menos que inserte 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 entiendo muy bien por qué esto es así porque la RF tiene un requisito mínimo de 1.9V y, según la hoja de datos, el PIC requiere 2.5V para que el HFINTOSC se estabilice, así que pensé que debería estar bien. (El nRF24l01 + está en una tabla separada separada, que tiene otros componentes de soporte, por lo que tal vez eso afecte las cosas).
Entonces, aunque esto funciona bien y obviamente el retraso no tiene impacto en la aplicación final, todavía no me gusta la idea de tener que codificar un retraso arbitrario y mi instinto sería intentar algo un poco más determinista. Los 500 ms probablemente sean excesivos y empíricamente podría encontrar algo más corto, pero eso no parece un enfoque sólido.
Entonces, ¿hay alguna manera fácil de medir qué es el V DD a medida que aumenta durante el encendido, ya sea en código o con componentes externos, en ausencia de una referencia de voltaje conocida? ¿O tal vez ese no es el problema que estoy viendo y la demora es necesaria por otra razón?
EDIT En caso de que sea relevante, estos son los ajustes de CONFIG.
// 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)