TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: INIGZ en 08 de Febrero de 2012, 16:54:11

Título: Ayuda mcp3909 eval board
Publicado por: INIGZ en 08 de Febrero de 2012, 16:54:11
hi
i´ve working in this source code.
but isn´t work.

look it.

#include <p33FJ256GP710.h>
#include "LCD.h"
#include "delay.h"
#include "spi.h"
#include "pwm.h"
#include "outcompare.h"
#include "timer.h"
#include "incap.h"

#define INPUT 1
#define OUTPUT 0
#define TRUE 1
#define FALSE 0
#define LEDG    LATAbits.LATA9   //control Led rojo
#define LEDR    LATAbits.LATA10   // "  "   Led verde
#define PIN_MCLR_MCP    LATAbits.LATA5   //controles para ADC
#define PIN_CS1       LATAbits.LATA4
short data1;
short data2;
unsigned char dm,um,c,d,u;
int i;
short a;

_FOSCSEL(FNOSC_FRC);         // Internal FRC oscillator
// Enable Clock Switching and Configure
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);

_FWDT(FWDTEN_OFF);            // Watchdog timmer apagado

int main()
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 41; // M = 43
CLKDIVbits.PLLPOST=0; // N2 = 2
CLKDIVbits.PLLPRE=0; // N1 = 2
// Initiate Clock Switch to Internal FRC with PLL (NOSC = 0b001)
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b001);
// Wait for PLL to lock
while(OSCCONbits.LOCK != 1) {};

Int_IO();
a=0;
Init_LCD();
initSPI();
initCaptura();
initPWM();
InitMCP3909();

_T1IP = 1;       // set Timer1 priority, (4 is the default value)
TMR1 = 0;       // clear the timer
PR1 = 10420-1;  // set the period register (10420 * 1 * 1 cycle (50 ns) = 521 us)
      // 2.1 configure Timer1 module clock source and sync setting
T1CON = 0x8000; // check T1CON register options (1000000000000000)
            // 2.2 init the Timer1 Interrupt control bits
_T1IF = 0;       // clear the interrupt flag, before
_T1IE = 1;       // enable the T1 interrupt source


while(1)
{

//LEDG=TRUE;
//LEDR=TRUE;
a++;
}
}

void initSPI(void)
{
unsigned int SPI1CON1_Value;
unsigned int SPI1STAT_Value;
unsigned int SPI1CON2_Value;

    SPI1CON1_Value = SPI_MODE16_OFF & SPI_CKE_OFF & SPI_SMP_OFF & CLK_POL_ACTIVE_HIGH &
                ENABLE_SDO_PIN & ENABLE_SCK_PIN & MASTER_ENABLE_ON & PRI_PRESCAL_16_1 & SEC_PRESCAL_2_1;
    SPI1CON2_Value = FRAME_ENABLE_OFF;
    SPI1STAT_Value = SPI_ENABLE;
    OpenSPI1(SPI1CON1_Value,SPI1CON2_Value,SPI1STAT_Value);
}

void initCaptura(void)
{
// ** Configuramos Timer3 ** *
    OpenTimer3(T3_ON & T3_IDLE_STOP & T3_GATE_OFF & T3_PS_1_256 & T3_SOURCE_INT, 65535);
    
    // Detecta flanco descendente de SDO y genera interrupción al 2º
    OpenCapture2(IC_IDLE_STOP & IC_TIMER3_SRC & IC_INT_2CAPTURE & IC_EVERY_FALL_EDGE);
    // Habilita interrupción y prioridad 3
    ConfigIntCapture2(IC_INT_ON & IC_INT_PRIOR_3);
}

void initPWM(void)
{
CloseOC1();
    OpenOC1(OC_IDLE_CON & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_DISABLE ,6,6);
    // ** Configuramos Timer2 para generar PWM de 3.33MHz ** *
    OpenTimer2(T2_ON & T2_IDLE_STOP & T2_GATE_OFF & T2_PS_1_1 & T2_32BIT_MODE_OFF & T2_SOURCE_INT, 11);
    WriteTimer2(0);
}

void InitMCP3909(void){

    PIN_MCLR_MCP=1;
    Delay_us(1);

    PIN_CS1=0;                  // Selecciona MCP3909
    Delay_us(1);

    WriteSPI1(0b10100100);            //

    while(DataRdySPI1()==0);
    PIN_CS1=1;
    Delay_us(1);
    // Queda habilitado...

    PIN_CS1=0;      
    SPI1STATbits.SPIEN = 0;     // SPI OFF
    SPI1CON1bits.MODE16 = 1;    // 0/1 ->8bits/16bits
    SPI1STATbits.SPIEN = 1;     // Enable SPI
}

void __attribute__((__interrupt__,no_auto_psv)) _IC2Interrupt(void){
    
LEDG=FALSE;   

   unsigned int Temp[4];
    
    IEC0bits.IC1IE = 0;
    vReadMPC3909();
    ReadCapture2(&Temp[0]); // Leemos... No importa.-
    IC2CONbits.ICOV=0;      // overflow
    _IC2IF = 0; // Borramos flag.
    IEC0bits.IC1IE = 1;    
}

void vReadMPC3909(void){
    unsigned int Temp;
    
    PIN_CS1=0;
    Temp = SPI1BUF;                            
    SPI1STATbits.SPIROV = 0;
    SPI1BUF = 0; // Generamos clock para recibir data...
    while(DataRdySPI1()==0);
    data1=ReadSPI1();
    SPI1BUF = 0;
    while(DataRdySPI1()==0);
    data2=ReadSPI1();
    PIN_CS1=1;
    SPI1STATbits.SPIROV = 0;
    PIN_CS1=0;  
    
    i++;
    
}

void Delay_us(unsigned int time){

   while(time!=0){
      asm volatile("repeat #34");
        asm volatile("nop");
      time--;
   }
}

void Int_IO(void)
{

   //all port as digital port
   AD1PCFGH = 0XFFFF;
   AD1PCFGL = 0XFFFF;
   //MCP3909 Gain control pin
    TRISDbits.TRISD10 = OUTPUT;   // G0A
    TRISDbits.TRISD11 = OUTPUT;   // G1A

    // LEDs
    TRISAbits.TRISA9 = OUTPUT;  
    TRISAbits.TRISA10 = OUTPUT;    
               
   //set gain = 1
    LATDbits.LATD10 = FALSE;   // G0
    LATDbits.LATD11 = FALSE;   // G1
}

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
LEDR=FALSE;
a--;
Dec_ascii(i);

//home_clr();
         lcd_cmd( 0x02 );
         lcd_data(' ');
         lcd_data('V');
         lcd_data('i');
         lcd_data('n');
         lcd_data('=');
         lcd_data(u);
         lcd_data(d);
         lcd_data(c);
         lcd_data(um);
         lcd_data(dm);
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
/*Dec_ascii(data2);
         lcd_cmd( 0xc0 );
         lcd_data(' ');
         lcd_data('I');
         lcd_data('i');
         lcd_data('n');
         lcd_data('=');
         lcd_data(u);
         lcd_data(d);
         lcd_data(c);
         lcd_data(um);
         lcd_data(dm);
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
//LEDG=FALSE;*/

//a++;

   _T1IF = 0;
}

void Dec_ascii(short x)
{
   u = 0x30 + x % 10;
     x /= 10;
   d = 0x30 + x % 10;
   x /= 10;   
   c = 0x30 + x% 10;
   x /= 10;
   um = 0x30 + x% 10;
     x /= 10;
   dm = 0x30 + x % 10;
     x /= 10;
}

mi problema esta en void InitMCP3909(void)
El 3909 no responde
gracias por ayudar.
Título: Re: Ayuda mcp3909 eval board
Publicado por: Suky en 08 de Febrero de 2012, 21:41:00
Si se queda en el while me parece que es problema del modulo SPI.... No hay que seleccionar los pines para el periférico? Es adecuada la frecuencia del SPI? Podrías debugger y determinar si la carga de los registros de configuración del módulo son los esperados.



Saludos!
Título: Re: Ayuda mcp3909 eval board
Publicado por: INIGZ en 09 de Febrero de 2012, 11:39:02
Hola
ya revise los registros del spi y estaban mal. Pero no entiendo a que te refieres con seleccionar los pines del periferico. y segun yo el mcp si se inicializa por lo q indica el led verde.
#include <p33FJ256GP710.h>
#include "LCD.h"
#include "delay.h"
#include "spi.h"
#include "pwm.h"
#include "outcompare.h"
#include "timer.h"
#include "incap.h"

#define INPUT 1
#define OUTPUT 0
#define TRUE 1
#define FALSE 0
#define LEDG    LATAbits.LATA9   //control Led rojo
#define LEDR    LATAbits.LATA10   // "  "   Led verde
#define PIN_MCLR_MCP    LATAbits.LATA5   //controles para ADC
#define PIN_CS1       LATAbits.LATA4
short data1;
short data2;
unsigned char dm,um,c,d,u;
int i;
short a;

_FOSCSEL(FNOSC_FRC);         // Internal FRC oscillator
// Enable Clock Switching and Configure
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);

_FWDT(FWDTEN_OFF);            // Watchdog timmer apagado

int main()
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 41; // M = 43
CLKDIVbits.PLLPOST=0; // N2 = 2
CLKDIVbits.PLLPRE=0; // N1 = 2
// Initiate Clock Switch to Internal FRC with PLL (NOSC = 0b001)
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b001);
// Wait for PLL to lock
while(OSCCONbits.LOCK != 1) {};

Int_IO();
a=0;
Init_LCD();
initSPI();
initCaptura();
initPWM();
InitMCP3909();

_T1IP = 1;       // set Timer1 priority, (4 is the default value)
TMR1 = 0;       // clear the timer
PR1 = 10420-1;  // set the period register (10420 * 1 * 1 cycle (50 ns) = 521 us)
      // 2.1 configure Timer1 module clock source and sync setting
T1CON = 0x8000; // check T1CON register options (1000000000000000)
            // 2.2 init the Timer1 Interrupt control bits
_T1IF = 0;       // clear the interrupt flag, before
_T1IE = 1;       // enable the T1 interrupt source


while(1)
{

//LEDG=TRUE;
//LEDR=TRUE;
a++;
}
}

void initSPI(void)
{
unsigned int SPI1CON1_Value;
unsigned int SPI1STAT_Value;
unsigned int SPI1CON2_Value;

    SPI1CON1_Value = 0b0000000000111110;/*SPI_MODE16_OFF & SPI_CKE_OFF & SPI_SMP_OFF & CLK_POL_ACTIVE_HIGH &
                ENABLE_SDO_PIN & ENABLE_SCK_PIN & MASTER_ENABLE_ON & PRI_PRESCAL_4_1 & SEC_PRESCAL_1_1;*/
    SPI1CON2_Value = 0b0000000000000000;//FRAME_ENABLE_OFF;
    SPI1STAT_Value = 0b1000000000000000;//SPI_ENABLE;
    OpenSPI1(SPI1CON1_Value,SPI1CON2_Value,SPI1STAT_Value);
}

void initCaptura(void)
{
// ** Configuramos Timer3 ** *
    OpenTimer3(T3_ON & T3_IDLE_STOP & T3_GATE_OFF & T3_PS_1_256 & T3_SOURCE_INT, 65535);
   
    // Detecta flanco descendente de SDO y genera interrupción al 2º
    OpenCapture2(IC_IDLE_STOP & IC_TIMER3_SRC & IC_INT_2CAPTURE & IC_EVERY_FALL_EDGE);
    // Habilita interrupción y prioridad 3
    ConfigIntCapture2(IC_INT_ON & IC_INT_PRIOR_3);
}

void initPWM(void)
{
CloseOC1();
    OpenOC1(OC_IDLE_CON & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_DISABLE ,6,6);
    // ** Configuramos Timer2 para generar PWM de 3.33MHz ** *
    OpenTimer2(T2_ON & T2_IDLE_STOP & T2_GATE_OFF & T2_PS_1_1 & T2_32BIT_MODE_OFF & T2_SOURCE_INT, 11);
    WriteTimer2(0);
}

void InitMCP3909(void){

    PIN_MCLR_MCP=1;
    Delay_us(1);
    PIN_CS1=0;                  // Selecciona MCP3909
      Delay_us(1);
    WriteSPI1(0b10100100);            //
    while(DataRdySPI1()==0);
    PIN_CS1=1;
    Delay_us(1);
   LEDG=TRUE;
    // Queda habilitado...
    PIN_CS1=0;     
    SPI1STATbits.SPIEN = 0;     // SPI OFF
    SPI1CON1bits.MODE16 = 1;    // 0/1 ->8bits/16bits
    SPI1STATbits.SPIEN = 1;     // Enable SPI
}

void __attribute__((__interrupt__,no_auto_psv)) _IC2Interrupt(void){
   
LEDG=FALSE;   

   unsigned int Temp[4];
   
    IEC0bits.IC1IE = 0;
    vReadMPC3909();
    ReadCapture2(&Temp[0]); // Leemos... No importa.-
    IC2CONbits.ICOV=0;      // overflow
    _IC2IF = 0; // Borramos flag.
    IEC0bits.IC1IE = 1;     
}

void vReadMPC3909(void){
    unsigned int Temp;
   
    PIN_CS1=0;
    Temp = SPI1BUF;                             
    SPI1STATbits.SPIROV = 0;
    SPI1BUF = 0; // Generamos clock para recibir data...
    while(DataRdySPI1()==0);
    data1=ReadSPI1();
    SPI1BUF = 0;
    while(DataRdySPI1()==0);
    data2=ReadSPI1();
    PIN_CS1=1;
    SPI1STATbits.SPIROV = 0;
    PIN_CS1=0; 
   
    i++;
   
}

void Delay_us(unsigned int time){

   while(time!=0){
      asm volatile("repeat #34");
        asm volatile("nop");
      time--;
   }
}

void Int_IO(void)
{

   //all port as digital port
   AD1PCFGH = 0XFFFF;
   AD1PCFGL = 0XFFFF;
   //MCP3909 Gain control pin
    TRISDbits.TRISD10 = OUTPUT;   // G0A
    TRISDbits.TRISD11 = OUTPUT;   // G1A

    // LEDs
    TRISAbits.TRISA9 = OUTPUT;   
    TRISAbits.TRISA10 = OUTPUT;   
                
   //set gain = 1
    LATDbits.LATD10 = FALSE;   // G0
    LATDbits.LATD11 = FALSE;   // G1
}

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
LEDR=FALSE;

a--;
Dec_ascii(i);

//home_clr();
         lcd_cmd( 0x02 );
         lcd_data(' ');
         lcd_data('V');
         lcd_data('i');
         lcd_data('n');
         lcd_data('=');
         lcd_data(u);
         lcd_data(d);
         lcd_data(c);
         lcd_data(um);
         lcd_data(dm);
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
/*Dec_ascii(data2);
         lcd_cmd( 0xc0 );
         lcd_data(' ');
         lcd_data('I');
         lcd_data('i');
         lcd_data('n');
         lcd_data('=');
         lcd_data(u);
         lcd_data(d);
         lcd_data(c);
         lcd_data(um);
         lcd_data(dm);
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
         lcd_data(' ');
//LEDG=FALSE;*/

//a++;

   _T1IF = 0;
}

void Dec_ascii(short x)
{
   u = 0x30 + x % 10;
     x /= 10;
   d = 0x30 + x % 10;
   x /= 10;   
   c = 0x30 + x% 10;
   x /= 10;
   um = 0x30 + x% 10;
     x /= 10;
   dm = 0x30 + x % 10;
     x /= 10;
}

si puedes explicarme un poco mas a cerca de las configuraciones que veas mal en mi codigo.
gracias.
Título: Re: Ayuda mcp3909 eval board
Publicado por: Suky en 09 de Febrero de 2012, 12:18:05
No he revisado el datasheet de ese MCU, puede que tenga PPS (selección de pines de periféricos). Habría que revisar ese tema



Saludos!
Título: Re: Ayuda mcp3909 eval board
Publicado por: INIGZ en 09 de Febrero de 2012, 13:21:23
Hola Suky

he estado leyendo el datasheet y reference manual del dspic33f y la configuracion spi propuesta es:
/* The following code shows the SPI register configuration for Master mode */
IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
IEC0bits.SPI1IE = 0;// Disable the Interrupt
//SPI1CON1 Register Settings
SPI1CON1bits.DISSCK = 0;// Internal Serial Clock is Enabled
SPI1CON1bits.DISSDO = 0;// SDOx pin is controlled by the module
SPI1CON1bits.MODE16 = 1;// Communication is word-wide (16 bits)
SPI1CON1bits.SMP = 0;// Input data is sampled at the middle of data
 // output time
SPI1CON1bits.CKE = 0;// Serial output data changes on transition
// from Idle clock state to active clock state
SPI1CON1bits.CKP = 0;// Idle state for clock is a low level;
// active state is a high level
SPI1CON1bits.MSTEN = 1;// Master mode Enabled
SPI1STATbits.SPIEN = 1;// Enable SPI module
SPI1BUF = 0x0000;// Write data to be transmitted
 // Interrupt Controller Settings
IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
IEC0bits.SPI1IE = 1;// Enable the Interrupt

y no hay nada de pps.

aqui hay un firmware de esta tarjeta pero no logro entender la lectura del mcp, puedes ayudarme con eso?
gracias
http://www.microchip.com/Microchip.WWW.SecureSoftwareList/secsoftwaredownload.aspx?device=en539316&lang=en&ReturnURL=http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en539316#
Título: Re: Ayuda mcp3909 eval board
Publicado por: Suky en 09 de Febrero de 2012, 20:49:17
Por aquí hice algo con un MCP: http://www.micros-designs.com.ar/trabajando-con-el-mcp3909-c-i-para-medicion-de-energia/
Título: Re: Ayuda mcp3909 eval board
Publicado por: INIGZ en 10 de Febrero de 2012, 13:57:53
hola

ya probe las configuraciones q propones en la pagina micro-designs, pero no me funciono.

podrias ayudarme con las configuracion para un dspic33f a 40 MIPS
saludos