Autor Tema: Ayuda mcp3909 eval board  (Leído 3649 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado INIGZ

  • PIC10
  • *
  • Mensajes: 4
Ayuda mcp3909 eval board
« 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.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda mcp3909 eval board
« Respuesta #1 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!
No contesto mensajes privados, las consultas en el foro

Desconectado INIGZ

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda mcp3909 eval board
« Respuesta #2 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.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda mcp3909 eval board
« Respuesta #3 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!
No contesto mensajes privados, las consultas en el foro

Desconectado INIGZ

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda mcp3909 eval board
« Respuesta #4 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#

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda mcp3909 eval board
« Respuesta #5 en: 09 de Febrero de 2012, 20:49:17 »
No contesto mensajes privados, las consultas en el foro

Desconectado INIGZ

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda mcp3909 eval board
« Respuesta #6 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