TODOPIC

Microcontroladores PIC => Pic32 => Mensaje iniciado por: KALLITOS en 01 de Octubre de 2011, 13:04:19

Título: Inicio con PIC32
Publicado por: KALLITOS en 01 de Octubre de 2011, 13:04:19
 Hola a todos.

Ando haciendo un programa en el que necesito bastante velocidad por lo que opté por usar un pic32 y sus tan celebrados 80Mhz, pero como que no me convencen, o no se qué :?.

Noté que el pic32 como que iba lento y se me dio por hacer pruebas entre un pic32MX575F512l y un pic24HJ256GP210.

Como no tengo osciloscopio hice un contador ascendente en LATD y lo veo en leds colocados en el puerto, y observé los siguiente: Los 5 MSB leds parpadeaban indicando la operacion del contador, esto con el siguiente codigo y con el mismo cristal de 4Mhz:
Código: CSS
  1. #include <p32xxxx.h>
  2. #include <plib.h>
  3.  
  4. #pragma config FPLLIDIV = DIV_1, FPLLMUL = MUL_20, FPLLODIV = DIV_1 //80MHz
  5. #pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1
  6. #pragma config FSOSCEN = OFF //sin oscilador secundario
  7.  
  8.  
  9. main()
  10. {
  11. DDPCONbits.JTAGEN = 0; // disable JTAG port
  12. AD1PCFG = 0xffff;
  13. TRISD = 0;
  14. LATD = 0;                
  15.  
  16. while( 1)
  17. {
  18. LATD++;
  19. }
  20. }

A continuación le adicione la siguiente línea de codigo, resultando en el aumento de la velocidad de tal manera que sólo parpadeaban los 2MSB leds.

Código: CSS
  1. CheKseg0CacheOn();

Y para probar realice a misma operación para un pic24:

Código: CSS
  1. #include "p24Hxxxx.h"
  2. #include <p24hj256gp210.h>
  3. //#define FCY 40000000UL
  4. //#include "libpic30.h"
  5.  
  6. _FOSCSEL(IESO_OFF & FNOSC_PRIPLL);
  7. _FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);
  8. _FWDT(FWDTEN_OFF);
  9. _FPOR(FPWRT_PWR2);
  10.  
  11.  
  12. int main(void)
  13. {
  14.  
  15. // Cristal de 4MHz y PLL trabajando a 40 MIPS.
  16. //PLLFBD = 0x004E;                      // M=80.
  17. //CLKDIV = 0x0000;                      //N1=2, N2=2.  
  18. AD1PCFGL=0xFFFF;                        // todos los pines digitales.-
  19. //config_uart1();                               //ARANQUE DE UART
  20.  
  21.  
  22.  
  23. LATD = 0;
  24. TRISD = 0;
  25.  
  26. while(1)
  27.         {
  28.         LATD++;
  29.         }
  30.  
  31. }
  32. ///

El resultado fue que en el pic24 los leds no parpadeaban, por un momento le coloque una pausa de 100 us para asegurarme de su funcionamiento.

No cuento con osciloscopio, pero, acaso el pic24 va mas rápido que el pic32????.

Me gustaría usar los 80MIPS del pic32, pero hasta el momento, decepcionado.

Que opinan.

saludos.




Título: Re: PIC24HJ vs PIC32
Publicado por: Suky en 01 de Octubre de 2011, 13:40:43
No veo que hayas utilizado SYSTEMConfigPerformance(80000000L). En Programming 32-bit microcontrollers in C : exploring the PIC32 hay detalles  ;-)

Y ojo, usas un cristal de 4MHz y veo un HS por ahí.

Saludos
Título: Re: PIC24HJ vs PIC32
Publicado por: KALLITOS en 03 de Octubre de 2011, 21:47:51
OK, encontre el libro y ando leyendo  :).

Encontré la parte que mencionas de la configuración del pic32 pero aun asi me hacía cosas raras, encontré esta WEB (http://www.aquihayapuntes.com/curso-pic32/osciladores-timer.html) en la que indica algo referente al clock de perifericos, seguí sus indicaciones y ya funciona, además es necesario mencionar que a 80Mhz el bloque de perifericos o por lo menos el LATD no me respondía por lo que la división la puse en 2 y quedó trabajando, en 4 y 8 tambien trabaja.

Ya tengo funcionando los timer y avanzo en mi camino.

Muchas gracias suky.

Aca dejo pruebas de 5 interrupciones con los timers:

Código: CSS
  1. #include <p32xxxx.h>
  2. #include <plib.h>
  3.  
  4. //Bits de configuración
  5.  
  6. #pragma config FNOSC = PRIPLL//Oscilador Principal con PPL
  7. #pragma config POSCMOD = XT //Modo reloj principal XT (4Mz)
  8. #pragma config FPBDIV = DIV_2//divisor Bus Periféricos
  9. #pragma config FWDTEN = OFF//Wachdog deshabilitado
  10. #pragma config FPLLODIV = DIV_1//Pos-Divisor PPL 1/1
  11. #pragma config FPLLIDIV = DIV_1//Pre-Divisor PPL 1/1
  12. #pragma config FPLLMUL = MUL_20// 20xPPL
  13.  
  14.  
  15.  
  16. unsigned short count = 0;
  17. unsigned char cont_t2 = 0;
  18.  
  19. main()
  20. {
  21. unsigned short valor;
  22. DDPCONbits.JTAGEN = 0;                                                          // disable JTAG port
  23. CheKseg0CacheOn();                              // enable the cache for max performance
  24. mCheConfigure(CHECON | 0x30);   // enable instruction prefetch
  25. mBMXDisableDRMWaitState();              // disable RAM wait states
  26. SYSTEMConfigPerformance(80000000L);
  27. SYSTEMConfigWaitStatesAndPB(80000000L);
  28.  
  29.  
  30.  
  31. // Sobrescribo el PBDIV a 1:8 para este ejemplo, la sentencia anterior varia el PBDIV
  32.  
  33.  
  34. mOSCSetPBDIV(OSC_PB_DIV_2);   ////ESTA LINEA ES LA QUE PONE LAS COSAS EN ORDEN
  35.  
  36.  
  37.  
  38. TRISD = 0;
  39. LATD = 0;
  40. //_LATD0 = 0;
  41. //_LATD14 = 1;
  42. valor = 65468;
  43. OpenTimer1(T1_ON | T1_PS_1_256, valor);
  44. OpenTimer2(T2_ON | T2_PS_1_256, valor/2);
  45. OpenTimer3(T3_ON | T3_PS_1_256, valor/15);
  46. OpenTimer4(T4_ON | T4_PS_1_256, valor/4);
  47. OpenTimer5(T5_ON | T5_PS_1_256, valor/25);
  48.  
  49. // 6. init interrupts
  50. mT1SetIntPriority( 1);
  51. mT2SetIntPriority( 1);
  52. mT3SetIntPriority( 1);
  53. mT4SetIntPriority( 1);
  54. mT5SetIntPriority( 1);
  55. mT1IntEnable( 1);
  56. mT2IntEnable( 1);
  57. mT3IntEnable( 1);
  58. mT4IntEnable( 1);
  59. mT5IntEnable( 1);
  60. INTEnableSystemMultiVectoredInt();
  61.  
  62. while( 1)
  63.         {
  64.         }
  65. } // main
  66.  
  67.  
  68.  
  69. void __ISR( _TIMER_1_VECTOR, ipl1) T1InterruptHandler( void)
  70. {
  71. _LATD14 = ~_LATD14;
  72. mT1ClearIntFlag();
  73. } //
  74.  
  75.  
  76. void __ISR( _TIMER_2_VECTOR, ipl1) T2InterruptHandler(void)
  77. {
  78. _LATD11 = ~_LATD11;
  79. mT2ClearIntFlag();
  80. } //
  81.  
  82. void __ISR( _TIMER_3_VECTOR, ipl1) T3InterruptHandler(void)
  83. {
  84. _LATD8 = ~_LATD8;
  85. mT3ClearIntFlag();
  86. } //
  87.  
  88.  
  89. void __ISR( _TIMER_4_VECTOR, ipl1) T4InterruptHandler(void)
  90. {
  91. _LATD4 = ~_LATD4;
  92. mT4ClearIntFlag();
  93. } //
  94.  
  95.  
  96. void __ISR( _TIMER_5_VECTOR, ipl1) T5InterruptHandler(void)
  97. {
  98. _LATD0 = ~_LATD0;
  99. mT5ClearIntFlag();
  100. } //

Modifique el titulo del hilo, no se acomoda al contenido.


Saludos  :)





Título: Re: Inicio con PIC32
Publicado por: PCCM en 18 de Diciembre de 2013, 11:52:52
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.

Código: [Seleccionar]
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

Código: [Seleccionar]
#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:

Código: [Seleccionar]
#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.
Título: Re: Inicio con PIC32
Publicado por: KALLITOS en 18 de Diciembre de 2013, 13:58:20
Hola paisano, debo decirte que a raiz de esto no uso pic32, en cambio uso pic24EP los corro a 85MIPS max sin problema.

Saludos.
Título: Re: Inicio con PIC32
Publicado por: PCCM en 18 de Diciembre de 2013, 18:03:42
Gracias por responder.

Logré hacerlo funcionar correctamente pero por debajo de 60MIPS, entre 60 y 80 MIPS  el PIC hace cualquier cosa que se le de la gana, cabe recalcar que este PIC32mx795f512l esta soldado a una plaquita(No es un board comprado, compré el chip solo), por ahí necesita un buen diseño para que trabaje a 80MHz tal vés.

Lo que aún no veo, es porque es más lento que el dspic33fj32mc204 de 40MIPS.

Por lo que dije anteriormente con este dspic demora un periodo de 0.25 ms.
Y con el pic32 a 60MIPS llego a las justas también a 0.25 ms

Código: [Seleccionar]
#include <p32xxxx.h>
#include <plib.h> //contiene registros de PIC

 
#pragma config FNOSC = PRIPLL//Oscilador Principal con PPL
#pragma config POSCMOD = XT //Modo reloj principal XT (4Mz)
#pragma config FPBDIV = DIV_1//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_15// 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(60000000L);
SYSTEMConfigWaitStatesAndPB(60000000L);
 
mOSCSetPBDIV(OSC_PB_DIV_1);   ////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++){
Nop();
}
LED=1;
for(aaa=0;aaa<=1000;aaa++){
Nop();
}

}

while(1);
return 0;
}



Será que las instrucciones de operaciones en el PIC32 demorá mas que en el DSPIC33?
Como puedo saber eso?
Título: Re: Inicio con PIC32
Publicado por: jeremylf en 15 de Marzo de 2014, 20:50:52
Hola paisano, debo decirte que a raiz de esto no uso pic32, en cambio uso pic24EP los corro a 85MIPS max sin problema.

Saludos.
Pero si máximo los 24EP van a 70MIPS. Lo estas overclokeando al pobre? xD