Autor Tema: Breve Tutorial - PIC32MX  (Leído 19537 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Breve Tutorial - PIC32MX
« en: 26 de Marzo de 2010, 12:34:17 »
Hola Amigos

El siguiente tutorial pretende ayudar a iniciarse con los PIC32MX y prender un led.

NOTA: Puedes encontrar este mismo tutorial en mi página web:
http://migsantiago.com/index.php?option=com_content&view=article&id=17&Itemid=20

Material empleado
+ PIC32MX420F032H (link)
+ MPLAB (8.43 o mejor)
+ C32 Standard v1.10

http://img338.imageshack.us/img338/5713/tuto1dg.png


Puedes construir un adaptador de TQFP de 64 pines a DIP para protoboard con los siguientes adjuntos...

http://img130.imageshack.us/img130/6904/tqfp.png


3 placas
http://www.4shared.com/file/249217299/ad24a43e/TQFP64_PIC32MX.html

1 placa
http://www.4shared.com/file/249219093/aeaaee7d/TQFP64_PIC32MX_una_placa.html

Las conexiones obligatorias que el PIC32 debe llevar son:

+ Todos los pines Vdd y Vss siempre conectados (3.3V y 0V respectivamente)
+ Todos los pines AVdd y AVss siempre conectados
+ Un capacitor de 10uF entre la terminal Vcap/Vddcore y GND, sirve para regular el voltaje interno del núcleo del pic
+ La terminal ENVREG conectada a 3.3V para habilitar el regulador interno
+ El pin MCLR como siempre se ha conectado
+ Los pines PGEC1 y PGED1, o PGEC2 y PGED2 conectados al programador Pickit2 (por ahora el único que lo puede programar)
+ OSC1 y OSC2 con un cristal de 4MHz y capacitores de 15pF (si se usa el Fast RC Oscillator interno entonces esto se omite)

Las conexiones quedan más o menos así:

http://img532.imageshack.us/img532/6369/pic32mxmnimaconexin.png


Una vez que se ha conectado lo anterior, puedes colocar un LED y una R de 220 ohms en cualquier terminal del puerto B (RB0 a RB15).

Debes abrir el Project Wizard de MPLAB, elegir el pic apropiado, elegir la suite C32 y crear un nuevo archivo.c en el que colocarás lo siguiente:

Código: [Seleccionar]
/*
Programa para encender un led
MigSantiago, Marzo 2010
*/
#include <p32mx420f032h.h>
#include <plib.h>

//Entrada de cristal a 4MHz
//Para CPU será elevada a 80Mhz

//CPU
#pragma config FPLLIDIV = DIV_1, FPLLMUL = MUL_20, FPLLODIV = DIV_1 //80MHz
#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_8
#pragma config FSOSCEN = OFF //sin oscilador secundario

int main()
{
    int i=0;

    //Disable JTAG port
    //Hace que las terminales RB10 y RB11 sean I/O
    DDPCONbits.JTAGEN = 0;

    //PORTSetPinsDigitalOut(IOPORT_B, BIT_0);
    mPORTBDirection(0x0000); //todo b salida

while(1)
   {
   ++i;
   PORTWrite(IOPORT_B, i);
   }
}

Adicionalmente hay que agregar una ruta include al proyecto para que el compilador encuentre las librerías. Esto se logra yendo a Project, Build Options, project, Directories, Show Directories for: Include Search Path y se debe agregar esta ruta:

C:\Program Files (x86)\Microchip\MPLAB C32\pic32mx\include\proc

Modifica Program Files (x86) para que coincida con tu Windows.

Lo que hace el programa es que incrementa la variable i en una unidad. Posteriormente la coloca en el puerto B. El resultado es que cada pin del puerto B tendrá un encendido y apagado con un duty time del 50%. El pin b0 es el que más rápidamente oscilará mientras que el pin b15 será el más lento, pero todos tendrán un duty time del 50%.

Con un voltímetro en DC puedes comprobarlo midiendo aproximadamente 1.6V en los pines.

Este es mi circuito de prueba:

http://img260.imageshack.us/img260/7033/dsc00406wc.jpg


Como todo buen PIC, el PIC32 trae PLL para multiplicar la frecuencia de oscilación hasta 80MHz (80MIPS). La ruta que sigue la frecuencia de oscilación es la siguiente:

http://img248.imageshack.us/img248/9381/osci.png


Entran 4MHz, se dividen entre 1, se multiplican por 20, se dividen entre 1 y salen 80MHz. Entran 80Mhz al CPU. Entran 10MHz al bus de los periféricos ya que el divisor es de 8.

Si quieres ahorrarte el cristal deberás configurar el FRCPLL. Dividir los 8MHz que genera entre 2, multiplicarlo por 20, dividirlo entre 1 y obtendrás 80MHz sin cristal.

La librería plib.h incluye muchas funciones para el manejo de los periféricos del PIC32 (I2C, UART, Timers, etc.).

Existen muchas incongruencias entre lo que anuncia la página web del PIC32MX420F032H y lo que detalla la datasheet. La más importante, la velocidad del micro. En la página menciona que es de hasta 40MHz mientras que la datasheet indica que va hasta 80MHz.

Lo checaré y les aviso.

http://img401.imageshack.us/img401/8674/inconz.png
« Última modificación: 05 de Julio de 2010, 13:55:35 por migsantiago »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Breve Tutorial - PIC32MX
« Respuesta #1 en: 26 de Marzo de 2010, 12:50:12 »
Muy bueno Mig.
Citar
+ Los pines PGEC1 y PGED1, o PGEC2 y PGED2 conectados al programador Pickit2 (por ahora el único que lo puede programar)

En esto que explicas , se conectan los 2???

O solo la pareja PGEC1 y PGED1 ??  o la pareja PGEC2 y PGED2



Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Breve Tutorial - PIC32MX
« Respuesta #2 en: 26 de Marzo de 2010, 13:00:06 »
Solo una pareja debes conectar, la que más se acomode a tu circuito. Para mi caso en que apenas estoy usando uno de los cincuenta y tantos pines disponibles, es igual si uso la interfaz 1 o la 2.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Breve Tutorial - PIC32MX
« Respuesta #3 en: 26 de Marzo de 2010, 13:10:04 »
Entendido

Gracias!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Breve Tutorial - PIC32MX
« Respuesta #4 en: 26 de Marzo de 2010, 13:24:10 »
Hay librerias de Delays y de impresion a puertos de comunicacion, como tiene CCS?? :shock:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Breve Tutorial - PIC32MX
« Respuesta #5 en: 26 de Marzo de 2010, 13:32:20 »
No, no hay librerías con Delays. Ayer tardé un buen rato buscándolas. No existen porque los delay_ms y delay_us que conocemos son una forma de desperdiciar energía y procesamiento del CPU (los ciclos anidados). Es mejor configurar una interrupción por timer y poner en sleep al micro mientras tanto. A estos niveles de procesamiento (32 bits y 80MHz) este tipo de cosas deben cuidarse.

Hay librerías de delay para el PIC18, pero no son tal cual delays movibles, son delays constantes integrados para el control de una LCD.

Sobre los puertos de comunicación puedes investigar más dando click en Help, Topics, C32 compiler, C32 peripheral lib guide.

Código: [Seleccionar]
This chapter is organized as follows:
Individual Peripheral Module functions and macros
• System Level Functions
• Prefetch Cache Functions
• DMA Functions
• Bus Matrix Functions
• NVM Functions
• Reset/Control Functions
• Interrupt Functions
• Oscillator Functions
• Power Save Functions
• I/O Port Functions
• Timer Functions
• Input Capture Functions
• Output Compare Functions
• SPI Functions
• I2C™ Functions
• UART Functions
• PMP Functions
• RTCC Functions
• A/D Functions
• Comparator Functions
• CVREF Functions
• Watchdog Timer Functions

Es como en CCS, trae la lista de funciones y un par de ejemplos para ponerlas a prueba.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Breve Tutorial - PIC32MX
« Respuesta #6 en: 26 de Marzo de 2010, 13:35:21 »
Si señor!! esto se pudo bueno.. Grandioso Mig.

Estoy esperando empezar con algo..No tengo nada..  :(

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Breve Tutorial - PIC32MX
« Respuesta #7 en: 26 de Marzo de 2010, 13:41:44 »
Para LCD y perifericos por SPI o I2C hay o es mejor usar el hardware??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Breve Tutorial - PIC32MX
« Respuesta #8 en: 26 de Marzo de 2010, 13:49:30 »
Para LCD y perifericos por SPI o I2C hay o es mejor usar el hardware??

No sé amigo Mglsoft, apenas ayer estrené el C32 y estuve paseándome por los menús, ayudas y archivos.h.

No hay mucha diferencia con las librerías de CCS, todo viene documentado y con "defines" amigables.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Breve Tutorial - PIC32MX
« Respuesta #9 en: 26 de Marzo de 2010, 13:58:45 »
Para LCD y perifericos por SPI o I2C hay o es mejor usar el hardware??

Yo conozco un foro en el que si encuentras algun problema con los PICs...seguro alguien sabe lo que uno no y te ayudan sin problemas. Eso si debes respetar las reglas y preguntar como se debe, ademas de ello debes mostrar que si estas intentando solucionar el problema con trabajo y esfuerzo. Su nombre tiene algo como TxxxPIC..     :D :D :D

LO que creo es que para ayudar al cambio de nuestra dependencia de CCS y pasar a C32 hay que crear esos macros de printf, delay_ms, i2c_start y todas las que nos tienen amañados y amarrados los de CCS.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Breve Tutorial - PIC32MX
« Respuesta #10 en: 26 de Marzo de 2010, 14:06:02 »
Gracias, yo voy a estar viendolo tambien...

Estaba por decir que lo simularia en Proteus, pero ahora veo que ni lo olfatea tampoco, buahhh!!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Breve Tutorial - PIC32MX
« Respuesta #11 en: 26 de Marzo de 2010, 14:09:16 »
eso mismo hiba a decir marcos, yo no tengo nada para empezar y pense que proteus me salvaria,....pero toca si o si hard por que en proteus no figura ningun pic32 :(
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Breve Tutorial - PIC32MX
« Respuesta #12 en: 26 de Marzo de 2010, 14:16:49 »
Un segundo ejemplo, esta vez utiliza el timer1 configurado para generar una interrupción cada 1s e incrementar el estado del puerto B. Ahora sí el led flashea a una velocidad humanamente visible.

Código: [Seleccionar]
/*
Programa para encender un led
MigSantiago, Marzo 2010
*/
#include <p32mx420f032h.h>
#include <plib.h>

//Entrada de cristal a 4MHz
//Para CPU será elevada a 80Mhz

//CPU
#pragma config FPLLIDIV = DIV_1, FPLLMUL = MUL_20, FPLLODIV = DIV_1 //80MHz
#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_8
#pragma config FSOSCEN = OFF //sin oscilador secundario

// Let compile time pre-processor calculate the PR1 (period)
#define SYS_FREQ             (80000000L)
#define PB_DIV                 8
#define PRESCALE               256
#define TOGGLES_PER_SEC        1
#define T1_TICK               (SYS_FREQ/PB_DIV/PRESCALE/TOGGLES_PER_SEC)

int i=0;

//////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    //Disable JTAG port
    //Hace que las terminales RB10 y RB11 sean I/O
    DDPCONbits.JTAGEN = 0;

    mPORTBDirection(0x0000); //todo b salida
    //Configure Timer 1 using internal clock, 1:256 prescale
    OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, T1_TICK);

    // set up the timer interrupt with a priority of 2
    ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2);

    // enable multi-vector interrupts
    INTEnableSystemMultiVectoredInt();

    while(1);
}
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
//Interrupción timer 1
void __ISR(_TIMER_1_VECTOR, ipl2) Timer1Handler(void)
{
    // clear the interrupt flag
    mT1ClearIntFlag();

    // .. things to do
    // .. in this case, toggle the LED
   ++i;
   PORTWrite(IOPORT_B, i);
}
//////////////////////////////////////////////////////////////////////////////////////////

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Breve Tutorial - PIC32MX
« Respuesta #13 en: 26 de Marzo de 2010, 14:23:55 »
Hasta aca entiendo todo.
Haces facil la configuracion de tiempos de ticks del timer 1, solo una constante y ya esta??

Cada interrupcion tiene su propio vector??
Esta bueno, bueno.

Me guta muto!!! :-/ :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Breve Tutorial - PIC32MX
« Respuesta #14 en: 26 de Marzo de 2010, 14:31:10 »
Sí, el timer1 es diferente a los tmr1 de siempre.

Esta vez el timer1 se "autorecarga". Uno carga el valor que quiere que dure el tiempo, en este caso T1_TICK que es de 1s. El compilador hace las cuentas por uno y determina que PR1 debe cargarse con 39062.

El timer1 empieza a contar. Cuando llega a 39062 entonces genera la interrupción y automáticamente el TMR1 se pone a 0x0000... es genial porque ya no depende de uno, ya no hay que hacerlo en la subrrutina de interrupción.

Ah y no me preguntes sobre los vectores de interrupción y prioridades, si no entendía los de los PIC18, menos estos  :D