¿Por qué necesito un retraso a medida que se enciende el PIC?

5

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)
    
pregunta Roger Rowland

4 respuestas

2

Debe borrar el bit de configuración PWRTE para habilitar el temporizador de encendido. Con esta función, el PIC esperará con la ejecución de cualquier código durante un tiempo determinado por un oscilador RC. Para tu chip eso significa un retraso de aproximadamente 64ms. Puede encontrar más información en AN607 y en la sección 6.1 de la hoja de datos de su chip .

También puede intentar establecer los bits BOREN en 10, habilitando el restablecimiento de la salida parda, lo que significa que V DD debe alcanzar un voltaje mínimo antes de iniciar la ejecución del código.

    
respondido por el Keelan
5

¿Experimentaste con el valor de retardo, puede ser menor?

Los chips más complejos a menudo tienen una secuencia de encendido durante la cual no se pueden usar, como el famoso controlador LCD HD44780. Noté este valor de Tpor en la hoja de datos nRF24L01 + (100 ms). No estoy realmente seguro de lo que especifica, pero podría interpretarse como el tiempo entre la potencia que llega a 1,8 V y el chip que está listo para manejar los comandos.

Leyendounpocomás,eldiagramaenlap22confirmamiinterpretación.

    
respondido por el Wouter van Ooijen
4

Esto se hizo un poco largo para comentarios, así que solo tres puntos pequeños.

Puede capturar el encendido con un alcance y un disparador adecuado, haga esto tanto en el PIC como en el nRF24L01 y verá si aumentan a diferentes velocidades. Bien podría ser que la capacitancia adicional o la regulación adicional hagan que las dos pendientes sean diferentes.

Con respecto a la demora en su código, no creo que sea malo si puede cuantificarlo . Usted sabe que la razón de la demora es dejar que el voltaje se estabilice, esto debería ser un período de tiempo similar en cada inicio. Gran parte de mi código tiene una demora similar a la suya, por ejemplo, esperar a que se inicie una pantalla LCD gráfica o que se estabilicen partes externas.

Si simplemente estuvieras insertando un retraso para solucionar un problema desconocido e intermitente, sería bastante diferente, pero ese no es el caso.

Sin embargo, otra idea es que en algunos PIC puede conectar la Referencia de voltaje fijo (FVR) a la entrada del ADC, siempre que tenga una referencia estable en otro lugar (o la referencia interna), puede usar esto para establecer un umbral Tensión estable adecuada para el módulo de RF. Escribí un breve artículo sobre este " Measuring PIC Vdd sin componentes externos usando el FVR ".

Del artículo:

  

Para calcular nuestro Vdd desconocido, necesitamos un valor conocido para comparar   contra, que proporciona el módulo de referencia de voltaje fijo (FVR).   Normalmente, el FVR suministraría un voltaje de referencia estable para el ADC,   pero una inspección cercana de la hoja de datos muestra que también se puede usar   como una entrada.

También puede conectar la fuente de alimentación de la placa de RF (si las pruebas de alcance muestran que varía) a un canal ADC y monitorearlo allí.

    
respondido por el David
4

¿Por qué no considera un MAX6326 - es un chip supervisor de proveedor de energía SOT23-3 pin que mantendrá el PIC en reinicio hasta que las líneas eléctricas se estabilicen por encima de cierto voltaje. Estos son los tipos que puede obtener: -

Uno de estos debería hacer el trabajo. Por cierto, no es necesario que lo uses en el pin de reinicio, simplemente puedes leer el pin en cualquier línea GPIO.

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas