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.