TODOPIC

Microcontroladores PIC => Pic32 => Mensaje iniciado por: RodrigoAndres en 02 de Agosto de 2016, 23:26:41

Título: PIC32 va mas rapido de lo normal (cada 2 minutos se adelanta 1 segundo)
Publicado por: RodrigoAndres en 02 de Agosto de 2016, 23:26:41
hola a todo de nuevo, tengo el PIC32MX250F128B, lo unico que hago es apagar y encender un foco cada 60 segundos, pero me di cuenta que cada 2 minutos se adelanta 1 segundo, el oscilador que estoy usando es el interno, que es el "Fast RC Osc", no se que significa o si tenga algo que ver con la presision

este es el codigo que tengo:

Código: [Seleccionar]

#include <xc.h>
#include <stdint.h>
#include <plib.h> 

// DEVCFG3
// USERID = No Setting
#pragma config PMDL1WAY = ON            // Peripheral Module Disable Configuration (Allow only one reconfiguration)
#pragma config IOL1WAY = ON             // Peripheral Pin Select Configuration (Allow only one reconfiguration)
#pragma config FUSBIDIO = ON            // USB USID Selection (Controlled by the USB Module)
#pragma config FVBUSONIO = ON           // USB VBUS ON Selection (Controlled by USB Module)

// DEVCFG2
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider (2x Divider)
#pragma config FPLLMUL = MUL_20         // PLL Multiplier (20x Multiplier)
#pragma config UPLLIDIV = DIV_1         // USB PLL Input Divider (1x Divider)
#pragma config UPLLEN = OFF             // USB PLL Enable (Disabled and Bypassed)
#pragma config FPLLODIV = DIV_2         // System PLL Output Clock Divider (PLL Divide by 2)

// DEVCFG1
#pragma config FNOSC = FRCPLL              // Oscillator Selection Bits (Fast RC Osc (FRC))
#pragma config FSOSCEN = ON             // Secondary Oscillator Enable (Enabled)
#pragma config IESO = ON                // Internal/External Switch Over (Enabled)
#pragma config POSCMOD = OFF            // Primary Oscillator Configuration (Primary osc disabled)
#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)
#pragma config FPBDIV = DIV_2           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/2)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)
#pragma config WINDIS = OFF             // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
#pragma config FWDTWINSZ = WINSZ_25     // Watchdog Timer Window Size (Window Size is 25%)

// DEVCFG0
#pragma config JTAGEN = ON              // JTAG Enable (JTAG Port Enabled)
#pragma config ICESEL = ICS_PGx1        // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1)
#pragma config PWP = OFF                // Program Flash Write Protect (Disable)
#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled)
#pragma config CP = OFF                 // Code Protect (Protection Disabled)

#define SYS_FREQ (40000000L)

#define GetSystemClock()     (SYS_FREQ)
#define READ_CORE_TIMER()    _CP0_GET_COUNT()                // para leer el tiempo de ejecusion

void System_Clock_DelayMs(uint16_t milliseconds);


int main() {
   
    SYSTEMConfigPerformance(GetSystemClock());     
    TRISBbits.TRISB0 = 0;     
    LATBbits.LATB0 = 0;         

    while( 1)
    {       
        LATBbits.LATB0 = 1;       
        System_Clock_DelayMs(60000); //espera un minuto
        LATBbits.LATB0 = 0;       
        System_Clock_DelayMs(60000);  //espera un minuto
       
    }
    return 0;
}


void System_Clock_DelayMs(uint16_t milliseconds)
{
    uint32_t time;
    time = READ_CORE_TIMER(); // Read Core Timer
    time += (GetSystemClock() / 2 / 1000) * milliseconds; // calc the Stop Time
    while ((int32_t)(time - READ_CORE_TIMER()) > 0){};
}


espero que puedan ayudarme o darme algunos consejos porque no entiendo casi nada de lo que dice en la hoja de datos esto lo veo muy complicado, les agradesco la ayuda.
Título: Re:PIC32 va mas rapido de lo normal (cada 2 minutos se adelanta 1 segundo)
Publicado por: MGLSOFT en 03 de Agosto de 2016, 08:57:39
No estoy acostumbrado a ese lenguaje C, pero me parece que estas usando temporización hecha por software.
En ese caso siempre habrá error, ya que se suman los tiempos de las demás instrucciones, que ademas en cuanto crezca tu aplicación, se hará mas notable la diferencia deberias hacer la interrupción en milisegundos y sumarlos para hacer segundos, minutos, etcetera.
Eso sacara el error que hoy tienes.
Título: Re:PIC32 va mas rapido de lo normal (cada 2 minutos se adelanta 1 segundo)
Publicado por: luismh en 03 de Agosto de 2016, 09:03:34
MGLSOFT tiene razón, se sugiere hacer las temporizaciones con un timer y/o interrupciones

Sin embargo, me pasaba lo mismo con el oscilaador RC interno de un dspic... Al parecer estos osciladores internos no son muy precisos. Son para aplicaciones donde la precisión del tiempo no es importante. Me di cuenta que varían muchísimo con la temperatura y probablemente con otras variables.

Si necesitás tiempos lo mas exactos posibles, la solución sigue siendo el viejo y querido cristal y usar timers

Saludos!
Luis
Título: Re:PIC32 va mas rapido de lo normal (cada 2 minutos se adelanta 1 segundo)
Publicado por: KILLERJC en 03 de Agosto de 2016, 09:08:56
Agregando info , que justo respondieron mientras escribia esto :P

Citar
el oscilador que estoy usando es el interno, que es el "Fast RC Osc", no se que significa o si tenga algo que ver con la presision

Ahi esta tu problema, no es preciso para hacer estas cosas, es decir si te dice 16Mhz, puede tener 15.8Mhz o 16.2Mhz, por lo tanto no te sirve para la aplicacion esa. Te aconsejo un cristal externo al PIC en algun Timer ( tal ves un SOSC) que te permita introducir un cristal de 32768 Khz, asi te manejas con el oscilador interno y solo obtenes los segundos de ese cristal externo.

Por supuesto que podes calibrar el oscilador interno, pero depende muhco de la temperatura tambien

Citar
espero que puedan ayudarme o darme algunos consejos porque no entiendo casi nada de lo que dice en la hoja de datos esto lo veo muy complicado, les agradesco la ayuda.
Es lo mismo que en los otros PICs

http://ww1.microchip.com/downloads/en/DeviceDoc/60001168J.pdf

Pagina 270, tenes los valores maximos y minimo de frecuencia que podes poner en cada modo
Pagina 271, tenes el valor maximo y minimo del FRC, segun dice es de +-0.9% de 4Mhz , es decir 3.6Mhz a 4.4Mhz
Pagina 309, podes ver la variacion con la temperatura del FRC
Título: Re:PIC32 va mas rapido de lo normal (cada 2 minutos se adelanta 1 segundo)
Publicado por: RodrigoAndres en 03 de Agosto de 2016, 11:11:36
si, tiene sentido, por fin comence a pensar

si tiene un error de 0.9% entonces como el pic va a 40 megas la frecuencia seria de de 8MHz * (1 + 0.009) * 5 = 40.36 MHz.

si el pic andara a 40 megas entonces tendria 1 minuto perfecto, por lo que el error de tiempo que va a tener en un minuto con 40.36 MHz es de 1/40MHz * (40.36 MHz - 40 MHz) = 0.009 minutos que son 0.54 segundos. en dos minutos serian 1.08 segundos, que es esactamente lo que le pasa al procesador que tengo

lo acabe de probar con un cristal de caruso de 4 MHz que me encontre y solamente se atrasa 2 segundos cada hora, creo que es mejor asi, seguro en baquela y con un cristal nuevo es mas presiso.