Autor Tema: retardos imprecisos con PLL  (Leído 2680 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado oscarjf

  • PIC10
  • *
  • Mensajes: 10
retardos imprecisos con PLL
« en: 01 de Febrero de 2009, 11:24:02 »
hola a todos, cuando activo los retardos que vienen incluidos en la libreria del compilador de estudiante de microchip con el oscillador basico integrado (7.37mhz) y asignando el FCY adecuado (3.685mhz) me funcionan de maravilla, pero al activar el PLL con el visual initializer y estableciendo una frecuencia de 73.7 MHZ y un FCY de 36.85 MHZ los retardos se vuelven completamente imprecisos, alguna ayuda?

#include "p33FJ256GP710.h"
#define FCY 36850000UL
#include <libpic30.h>




int main(void){

  /* set LED pins (D3-D10/RA0-RA7) as outputs */
  TRISA = 0xFF00;

  /* Infinite Loop */
  while(1){

    // All PORTA to ON
      PORTA = 0xFFFF;
    // Wait 1 second
    __delay_ms(250);
    __delay_ms(250);
   __delay_ms(250);
   __delay_ms(250);
   // All PORTA to OFF
    PORTA = 0x0000;
    // Wait 1 second
    __delay_ms(250);
    __delay_ms(250);
   __delay_ms(250);
   __delay_ms(250);
   };
}

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: retardos imprecisos con PLL
« Respuesta #1 en: 01 de Febrero de 2009, 13:43:02 »
Que tan imprecisos son los retardos? ...  por ejemplo, 1 segundo se retarda o adelanta  xx ms ...

La mejor prueba para verificar el tiempo de ejecución de ciclos es usando algun TIMER
Control Automático, DSP & Microcontroladores

Desconectado oscarjf

  • PIC10
  • *
  • Mensajes: 10
Re: retardos imprecisos con PLL
« Respuesta #2 en: 01 de Febrero de 2009, 21:17:24 »
bastantes, en lugar de 1 segundo te lo da como de milisegundos, incluso lo simule y utilize el stopwatch y sigue asi, vi la libreria de libpic30.h y encontre lo siguiente

#if !defined(FCY)
extern void __delay_ms(unsigned long);
extern void __delay_us(unsigned long);
#else
#define __delay_ms(d) \
{ __delay32( (unsigned long) (d)*(FCY)/1000); }
#define __delay_us(d) \
{ __delay32( (unsigned long) (d)*(FCY)/1000000); }
#endif

entonces realize la cuenta que sale ahi que es d*FCY/1000 que viene siendo 250*36.85Mhz/1000 que nos da 9212500, esto se pasa al delay32 y entonces para ver si ese valos generara el retardo correcto obtenemos el tiempo de ejecucion de una instruccion que seria 1/36.85Mhz = 27.1370nS y este valor 27.1370nS lo multiplicamos por 9212500 nos da 249mS que no se porque no esta saliendo, ahora si al delay32 le pongo el valor manualmente 9212500 si me otorga el retardo mal, entonces no se si me pudieran ayudar en que estoy haciendo mal

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: retardos imprecisos con PLL
« Respuesta #3 en: 01 de Febrero de 2009, 23:55:20 »
Vamos a ver ... yo creo que el error no está propiamente en el oscilador, ni tampoco en el PLL ... sino en la resolucion de la operacion:

Simule la siguiente operacion:

Código: C
  1. #define FCY 36850000UL
  2. unsigned long d = 250;
  3.  
  4. d = d*(FCY)/1000;

con resultado d = 622565

es decir ... en vez de 9212500 estamos colocando 622565 .. obteniendose asi 16.89 ms aproximadamente en vez de 250ms ....

Analicemos la situacion, un unsigned long permite representar números de 0 hasta 4294967295 .. que son 32 bits ..

La multiplicacion de 250 x 36850000 = 9212500000 ... esto es mad del doble de lo que puede representar un unsigned long, lo mejor es primero dividir FCY entre 1000 y luego multiplicar, pero el micro esta haciendolo al reves ... primero FCY por 250, ocurre desborde y luego divide. 

Por lo que efectivamente el problema no es de el oscilador ni el PLL sino de resolucion de las operaciones matematicas ...

En vez de __delay_ms(250); haz el intento con 10 veces  __delay_ms(100);

Tambien podes verificar con el simulador y la ventana de WATCH que efectivamente el 9212500 no está siendo calculado correctamente.

Saludos!







« Última modificación: 02 de Febrero de 2009, 00:00:30 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado oscarjf

  • PIC10
  • *
  • Mensajes: 10
Re: retardos imprecisos con PLL
« Respuesta #4 en: 02 de Febrero de 2009, 00:22:59 »
seria bueno mandar un correo a microchip con este problema? al parecer estas rutinas de retardos las introducieron en la ultima version del compilador

Desconectado oscarjf

  • PIC10
  • *
  • Mensajes: 10
Re: retardos imprecisos con PLL
« Respuesta #5 en: 02 de Febrero de 2009, 08:56:55 »
bueno al final solo llamo a la rutina __delay32(delay_250ms) y escribo #define delay_250ms 9212500 y otros con diferente tiempo y logro retardos bastante precios, gracias  :-/