Programación dsPIC30F4011 / 13 a bordo dsPICDEM 2 con MPLAB ICD 2

1

Tengo la Junta de desarrollo dsPICDEM 2 de Microchip con dos MCU, una dsPIC30F4011 Motor Control MCU y una dsPIC30F4013 MCU de propósito general . Necesito programar ambos microcontroladores con el MPLAB ICD 2 In-Circuit Debugger .

Cuando construyo un proyecto de prueba (con un programa que solo enciende y apaga los LED D3 y D4), todo se ha creado correctamente (utilizando las herramientas de lenguaje C30). El programa se ve así:

#include <p30fxxxx.h>

#include "delay.h"

int main(void)
{
    // setup
    LATBbits.LATB0 = 0;
    TRISBbits.TRISB0 = 0;

    while (1)
    {
        LATBbits.LATB0 = ~LATBbits.LATB0;
        Delay5ms(100);
    }

    return 0;
}

(las funciones impresas en delay.h son funciones definidas en el código de ensamblaje en delay.s y han sido extraídas de los ejemplos de Microchip)

Cuando programo cualquier MCU por medio de MPLAB 8.80 y el ICD, aparece el mensaje Programación correcta . Sin embargo, cuando ejecuto el programa en la placa, no pasa nada (ningún LED se enciende y apaga).

He intentado incluir algunos archivos en el proyecto:

  • libpic30-coff.a en Archivos de biblioteca
  • p30F4011.gld en secuencia de comandos de vinculador
  • p30F4011.h y p30Fxxxx.h en Archivos de encabezado

pero eso no ha ayudado.

No he podido encontrar información detallada, paso a paso, sobre cómo programar estos PIC utilizando las herramientas mencionadas, ni en la documentación de Microchip ni en Internet.

¿Qué debo hacer en MPLAB IDE 8.80 para poder programar tanto dsPIC30F4011 como dsPIC30F4013 con MPLAB ICD 2, suponiendo que MPLAB IDE y ICD 2 ya están configurados?

Gracias de antemano.

EDIT:

Estaba usando las siguientes directivas para establecer los bits de configuración:

_FOSC(CSW_FSCM_OFF & XT_PLL8);  //Run this project using an external crystal
                                //routed via the PLL in 8x multiplier mode
                                //For the 7.3728 MHz crystal we will derive a
                                //throughput of 7.3728e+6*8/4 = 14.74 MIPS(Fcy)
                                //,~67nanoseconds instruction cycle time(Tcy).
_FWDT(WDT_OFF);                 //Turn off the Watch-Dog Timer.
_FBORPOR(MCLR_EN & PWRT_OFF);   //Enable MCLR reset pin and turn off the
                                //power-up timers.
_FGS(CODE_PROT_OFF);            //Disable Code Protection

Vi este código en los ejemplos de Microchip.

Sin embargo, esto no estaba funcionando. De todos modos, la solución es como Brett señaló. Lo intenté y funcionó desde la primera vez.

He intentado nuevamente el primer código, y ahora funciona. Extraño. Todavía no sé qué estaba haciendo mal.

Además, he intentado eliminar los archivos que incluí, y me he dado cuenta de que no hay necesidad de incluir esas bibliotecas / archivos de encabezado / scripts del enlazador en el proyecto.

    
pregunta Genba

1 respuesta

1

Tienes que configurar los bits de configuración. Cerca del final del archivo de encabezado del dispositivo (línea 5880 para dsPIC30F4013) hay una lista de todos los bits de configuración del dispositivo que deben configurarse o borrarse para garantizar el funcionamiento correcto del dispositivo, así como los comentarios en código para saber cómo hacerlo.

Por ejemplo:

_FOSC( XT & CSW_FSCM_OFF )  // Configure for external XT crystal oscillator, turn off clock switching and monitoring

Las configuraciones del temporizador de vigilancia y oscilador son muy importantes.

EDITAR: En su publicación editada, intentó usar la opción de bucle de bloqueo de fase para el oscilador. Debe agregar el siguiente código en su rutina principal para usar un oscilador externo + PLL:

/*
 *  Set up the PLL for full 60 MIPS operation (dsPIC33EP512MU810)
 *
 *  Fcy = Fin*K/2 --> 60MHz = 8MHz*K/2 --> K = 15
 *  K = M/(N2*N1) --> 15 = M/(N2*N1)   --> N2 = 2, N1 = 2, M = 60
 *  Fcy = 8MHz*15/2 = 60MHz
 *
 *  p. 164-171 datasheet
 */
void configPLL()
{
    PLLFBDbits.PLLDIV = 58; // M = 60
    CLKDIVbits.PLLPOST = 0; // N1 = 2
    CLKDIVbits.PLLPRE = 0;  // N2 = 2
    OSCTUN = 0;
    // Writing to the OSCCON register requires a special unlock sequence
    // Using a compiler built-in write instruction to handle this
    __builtin_write_OSCCONH(0x03);  // Select primary oscillator with PLL   
    __builtin_write_OSCCONL(0x01);  // Request oscillator switch
    while (OSCCONbits.COSC != 0x3); // Wait for the PLL to lock
}
    
respondido por el Brett

Lea otras preguntas en las etiquetas