Hola a todos!! en la entrada anterior os comentaba que me habían llegado a casa 2 DSCs de microchip de 16 bits. Tenia pedidos también dos microcontroladores PIC24H en concreto un PIC24HJ64GP202 y un PIC24HJ12GP202. Las características de estos son muy parecidas a las que describí en los DSPIC33FJ, con la salvedad de que estos no llevan un núcleo DSP.
Este fin de semana, en el poco tiempo que he tenido libre, me he decidido a probarlos con algunos programas muy sencillos, los típicos “Hola mundo”, ya que nunca había programado antes en C30, y la verdad, como ya comenté, es muy parecido a C18, así que en cuento a la programación no he tenido problemas.
Si que me ha surgido algún problema en cuento al programador, os lo resumo. Yo utilizo el PIckit2, que si que es compatible con este tipo de micros, pero al intentar programarlo desde MPLAB, me salía el siguiente mensaje:
Programming Target (26/05/2012 21:58:08)
PIC24HJ64GP202 found (Rev 0x3002)
Erasing Target
Programming Program Memory (0x0 - 0x2FF)
PE Error: Using ICSP
Verifying Program Memory (0x0 - 0x2FF)
PE Error: Using ICSP
PK2Error0027: Failed verify (Address = 0x80 - Expected Value 0x290 - Value Read 0xFFFFFF)
PICkit 2 Ready
Al no saber lo que pasaba pregunte en el foro de ucontrol, y me sugirieron que actualizara el firmware del PK2 al más reciente, y así lo hice, lo bajé desde la página de microchip y mediante la aplicación Pickit2, yéndome a Tools > Download Pickit2 Operating System, actualicé el firmware y lo pude programar perfectamente.
Lo que más echo de menos en C30, es un archivo de ayuda para configurar los fuses, al estilo C18, que tenemos el Config settings file, en estos hay que ir al archivo .h del pic y ver allí las configuraciones que admite, que son muchísimas menos que en C18, por cierto.
Aquí os pongo un código sencillísimo que hace parpadear un led mediante retardos creados con bucles for.
1: #include <p24hj64gp202.h>
2:
3: _FICD( ICS_PGD1)
4: _FOSCSEL( FNOSC_PRI)
5: _FOSC( POSCMD_HS)
6:
7: main(){
8:
9: _TRISB5 = 0;
10: AD1PCFGL = 0xffff;
11: _RB5 = 0;
12:
13: unsigned int i;
14:
15: while(1){
16:
17: for(i=0;i<65000;i++);
18: for(i=0;i<65000;i++);
19: _RB5 = 0;
20:
21: for(i=0;i<65000;i++);
22: for(i=0;i<65000;i++);
23:
24: _RB5 = 1;
25:
26: }
27: }
Para ver de una forma muy visual la diferencia de velocidades entre los PIC24 y los PIC18, he cogido el mismo código y se lo he metido a un PIC18, funcionando con el mismo oscilador, y la aquí tenéis el resultado.
Como veis la diferencia es notable, va incluso a más del doble de velocidad, y esto es porque, además de que el procesador va al doble de velocidad, es mucho más eficiente trabajando con enteros de 16 bits.
En el siguiente ejemplo, he querido probar la versatilidad del PLL que llevan integrado estos microcontroladores, para ello, utilizando el mismo oscilador de 20MHz (10MIPS), he obtenido la velocidad máxima que admiten estos micros de 80MHz, 40MIPS. la explicación del módulo PLL la dejo para otra entrada, pero os voy a poner un código que funcionando a 40MIPS, obtenemos una señal de 200ms de periodo.
1: #include <p24hj64gp202.h>
2:
3: _FICD( ICS_PGD1)
4: _FOSCSEL( FNOSC_PRIPLL) //activamos el oscilador principal con PLL
5: _FOSC( POSCMD_HS)
6:
7:
8: main(){
9:
10: // configuración del oscilador para 40MIPS
11:
12: _PLLPRE = 0x02; // N1 = 4
13: _PLLPOST = 0; // N2 = 2
14: _PLLDIV = 0x1E; // M = 32 -> 20MHz / 4 = 5MHz * 32 = 160MHz /2 = 80MHz / 2 = 40MIPS
15:
16: //configuración del Timer1
17:
18: T1CON = 0x8030; //preescaler 1:256
19:
20: AD1PCFGL = 0xffff; // todos los puertos digitales
21:
22: _TRISB5 = 0;
23: _RB5 = 0;
24:
25: while(1){
26:
27: while(TMR1 <= 15625); //temporización de 100ms
28: TMR1 = 0;
29: _RB5 = !_LATB5;
30: }
31: }

la calidad no es muy buena, pero se observa que el tiempo entre los dos cursores es de 100ms. Este dato nos va a servir para verificar que estamos funcionando a 40MIPS.
El temporizador esta configurado con un preescaler de 256, y necesitamos que llegue a contar hasta 15.625, por lo que tenemos en total 256 x 15625 ciclos para obtener 100ms, lo que nos da 4.000.000, si eso lo dividimos entre 100ms, nos da que estamos trabajando a 40.000.000, es decir, 40MIPS.
No hay comentarios:
Publicar un comentario