Buenas, tengo un problema bien parecido con el pic32mx795f512l,No veo que trabaje a 80 MIPS además se comporta raro, Con ese código solucionaste tu problema de los leds?
En mi caso si tengo osciloscopio para medir.
hice una comparación con un dspic que trabajo buen tiempo a 40MIPS.
En el dspic de 40 MIPS, hice un encendido y apago de leds, viendo en el osicloscopio el periodo me duraba 0.25 ms.
while(1){
LED=0;
for(aaa=0;aaa<=1000;aaa++);
LED=1;
for(aaa=0;aaa<=1000;aaa++);
}
Pero en el pic32mx795f512l hice la siguiente configuración, para que se comporte igual pero a 80MIPS, uso un cristal de 4MHZ externo
#include <p32xxxx.h>
#include <plib.h>
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_1, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_1
#define SYS_FREQ (80000000L)
#define LED LATEbits.LATE5
int main(void){
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
TRISEbits.TRISE5=0;
TRISEbits.TRISE6=0;
int aaa=0;
while(1){
LED=0;
for(aaa=0;aaa<=1000;aaa++);
LED=1;
for(aaa=0;aaa<=1000;aaa++);
}
while(1);
return 0;
}
además utilice el código de este post, para verificar que el código anterior de repente estaba mal:
#include <p32xxxx.h>
#include <plib.h> //contiene registros de PIC
//Bits de configuración
#pragma config FNOSC = PRIPLL//Oscilador Principal con PPL
#pragma config POSCMOD = XT //Modo reloj principal XT (4Mz)
#pragma config FPBDIV = DIV_2//divisor Bus Periféricos
#pragma config FWDTEN = OFF//Wachdog deshabilitado
#pragma config FPLLODIV = DIV_1//Pos-Divisor PPL 1/1
#pragma config FPLLIDIV = DIV_1//Pre-Divisor PPL 1/1
#pragma config FPLLMUL = MUL_20// 20xPPL
#define LED LATEbits.LATE5
int main(void){
unsigned short valor;
DDPCONbits.JTAGEN = 0; // disable JTAG port
CheKseg0CacheOn(); // enable the cache for max performance
mCheConfigure(CHECON | 0x30); // enable instruction prefetch
mBMXDisableDRMWaitState(); // disable RAM wait states
SYSTEMConfigPerformance(80000000L);
SYSTEMConfigWaitStatesAndPB(80000000L);
mOSCSetPBDIV(OSC_PB_DIV_2); ////ESTA LINEA ES LA QUE PONE LAS COSAS EN ORDEN
TRISEbits.TRISE5=0;
TRISEbits.TRISE6=0;
int aaa=0;
while(1){
LED=0;
for(aaa=0;aaa<=1000;aaa++);
LED=1;
for(aaa=0;aaa<=1000;aaa++);
}
while(1);
return 0;
}
Pero se sigue comportando igual de raro, lo primero es que es más lento que el dspic de 40Mhz, el periodo es de 2ms.
Además otra cosa más intrigante es que si aumento el conteo, osea de 1000 a 1500 o a más, se reduce el tiempo en alto,lo cual es ilógico, osea:
////duty cycle de 50%
while(1){
LED=0;
for(aaa=0;aaa<=1000;aaa++);
LED=1;
for(aaa=0;aaa<=1000;aaa++);
}
//duty cycle de 20%
while(1){
LED=0;
for(aaa=0;aaa<=1500;aaa++);
LED=1;
for(aaa=0;aaa<=1500;aaa++);
}
//duty cycle de 0%
while(1){
LED=0;
for(aaa=0;aaa<=5000;aaa++);
LED=1;
for(aaa=0;aaa<=5000;aaa++);
}
Y si ahora cambio primero que encienda y después apague :
while(1){
LED=1;
for(aaa=0;aaa<=1000;aaa++);
LED=0;
for(aaa=0;aaa<=1000;aaa++);
}
Sucede lo mismo de antes pero ahora variando el duty cycle con nivel bajo.
Utilizo
MPLAB 8.83
C32 2.01
Cualquier consejo sería de gran ayuda.
Gracias.