TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: Quad_Transistor en 11 de Abril de 2014, 18:07:14
-
Buen día!
Aclaro que soy nuevo en el tema de los dspic (por si cometo alguna tontería). Deseo hacer funcionar un dspic33fj64gp802 a una frecuencia de 80Mhz para aprovechar todo su potencial, para ello tengo un cristal externo de 8 MHz con el cual he estado trabajando pero por más que configuro los registros para el PLL (CLKDIV,PLLFBD,PLLFBD)no logro configurar el dispositivo para que funcione a dicha frecuencia, estoy usando un compilador PCWHD version 5.015. Los registros los configuro como menciona la hoja de datos del fabricante. Alguien ha tenido el mismo problema con ese mismo compilador? Podrían ayudarme?
La forma en que verifico que no funciona a la frecuencia deseada es programar un timer para que haga una interrupción cada tantos milisegundos, pero nunca lo hace correctamente.
Saludos,
Muchas gracias por su respuesta.
-
sin codigo no te podremos ayudar
-
Disculpa mi omisión el código es el siguiente:
#include "C:\Archivos de programa\PICC\Devices\33FJ64GP802.h"
#device ADC=12
#FUSES ICSP1
#FUSES PR_PLL // Primary Oscillator with PLL
#FUSES HS // Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOIESO // Internal External Switch Over mode enabled
#FUSES CKSNOFSM // Clock Switching is enabled, fail Safe clock monitor is disabled
#FUSES NOWDT // Watch Dog Timer
#FUSES NOCKSFSM // Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES PUT2 // Power On Reset Timer value 2ms
#FUSES NOJTAG // JTAG disabled
#FUSES NODEBUG // No Debug mode for ICD
#FUSES NOPROTECT
#FUSES WINDIS
#use delay(clock=80M, xtal=20M)
#include "main.h"
#include <stdlib.h>
#include <math.h>
#BYTE OSCCON = 0x0742
#BYTE CLKDIV = 0x0744
#BYTE PLLFBD = 0x0746
int8 ban; //bandera del timer
#INT_TIMER1
void TIMER1_isr(void)
{
ban=0;
output_high(PIN_B5);
set_timer1(60848); //Tiempo de muestreo de 30ms TMR=(Ts)*(fxtal)/(2*Tdir)
}
//------------Programa principal------------//
void main(void){
CLKDIV = 0x0001;
PLLFBD = 0x0016;
setup_timer1(TMR_INTERNAL | TMR_DIV_BY_256); //config timer
set_timer1(60848);
setup_wdt(WDT_OFF);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(TRUE){
output_low(PIN_B5);
output_high(PIN_B6);
ban=1;
while(ban);
output_low(PIN_B6);
}
}
Los fusibles que me graba el CCS son:
Configuration Fuses:
Word 1L: 00CF NOWRTB NOBSS NORBS
H: FF00
Word 2L: 00CF NOWRTSS NOSSS NORSS
H: FF00
Word 3L: 0007 NOWRT NOPROTECT
H: FF00
Word 4L: 0000 FRC NOIESO
H: FF00
Word 5L: 0066 HS NOOSCIO IOL1WAY CKSNOFSM
H: FF00
Word 6L: 005F WPOSTS16 WPRES128 WINDIS NOWDT
H: FF00
Word 7L: 0011 PUT2 NOALTI2C1
H: FF00
Word 8L: 00C3 ICSP1 NOJTAG NODEBUG
H: FF00
No sé por que razón me activa el FRC y no me respeta el PLL o lo estoy interpretando mal?.
Muchas gracias por su tiempo,
Saludos
-
Te falta la parte de cambiar del primario al primario con pll, mirate los ejemplos que viene de microchip y veras a que me refiero, se trata de configurar el registro OSCCON. La idea es poner el oscilador primario y luego cambiar a pll mediante la modificacion de osccon y esperar a que se estabilice.
-
Perfecto, así lo haré, esta tarde lo probaré y te cuento como me fue. Muchas gracias.
-
Otra cosa que noto es que indicas que trabajas con un xtal de 8MHz fisico pero en el codigo indicas que tome un xtal de 20MHz y con ello CCS esta tomandolo para las configuraciones y en base a 20MHz llegar a los 80MHz y tu al colocarle uno de 8MHz la configuracion ya no concuerda, prueba a indicarle a CCS que trabajas a 8MHz.
De: #use delay(clock=80M, xtal=20M)
A: #use delay(clock=80M, xtal=8M)
Saludos.