|
|
View previous topic :: View next topic |
Author |
Message |
Classic
Joined: 22 Aug 2011 Posts: 6 Location: Thailand
|
Accelerometer + 18F46J50 not work |
Posted: Tue Aug 23, 2011 1:09 pm |
|
|
I'm newbie for CCS. This code compile pass but not output in oscilloscope. Code what's wrong. Can you help me?
Code: |
#include <18F46J50.h>
#fuses HS,NOPROTECT,NOWDT,NOLVP
#use delay(clock=20000000)
//************************************************************MMA7455 reg define
#define XOUT8 0x06
#define YOUT8 0x07
#define ZOUT8 0x08
#define MCTL 0x16 //4g, measurement mode,SPI 4wire =0x09
//***********************************MMA7455_SPI PIN define
#define MMA7455_CS PIN_A5 //0
#define MMA7455_CLK PIN_B4 //0
#define MMA7455_SDI PIN_B5 //0
#define MMA7455_SDO PIN_C7 //1
#define MMA7455_INT1 PIN_B0 //1 DRDY
//**************************SPI_write data to MMA7455
void spi_write(char addr)
{
char a;
for(a=0;a<8;a++) // loop 8 bit
{
if((addr & 0x80)== 0x80) //check data bit 8 w=1 r=0
output_high(MMA7455_SDO); //Sent 1 to SDO
else
output_low(MMA7455_SDO); //Sent 0 to SDO
output_high(MMA7455_CLK);
output_low(MMA7455_CLK);
addr<<=1; //Shift data Next Bit
}
}
//******************************write_Acc value for set up MMA7455
void write_Acc(char reg,char dat) //reg(reg for write),dat(set up Acc)
{
output_low(MMA7455_CS); //from timing
spi_write(((reg&0x3F)<<1)|0x80); //write address data for write to SPI(th guide)
spi_write(dat); //Write data to SPI
output_high(MMA7455_CS);
}
//********************************************SPI_read
char spi_read(char reg)
{
char a,result=0;
for(a=0;a<8;a++) //write reg for read(SDO)
{
if((reg & 0x80)== 0x80) //check data bit 8 w=1 r=0
output_high(MMA7455_SDO);
else
output_low(MMA7455_SDO);
output_high(MMA7455_CLK);
output_low(MMA7455_CLK);
reg <<= 1;
}
for(a=0;a<8;a++) //read data(SDI)
{
output_high(MMA7455_CLK);
result <<= 1;
if((MMA7455_SDI && 0x08)== 0x08) //If SDI = "1"
{
result |= 0x01; //Keep Result of data-Read
output_low(MMA7455_CLK);
}
}
return(result); //Return data
}
//******************************read_Acc data
signed char read_Acc(char reg)
{
signed char dat;
output_low(MMA7455_CS);
dat=spi_read(((reg&0x3F)<<1)); //Write address command for read to SPI Accelerate
output_high(MMA7455_CS);
return(dat);
}
//************************************Check status ready
void data_ready()
{
while((MMA7455_INT1&&0x01) != 0x01){;} //Check Data Ready exit loop
}
void Acc_init(void)
{
set_tris_b(0xFF);
set_tris_c(0x20);
setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16);
output_high(MMA7455_CS);
output_high(MMA7455_SDO);
output_low(MMA7455_CLK);
delay_ms(100);
write_Acc(MCTL,0x09); //4g,meas,4wire
}
//*************************main********************
void main()
{
int Xdata,Ydata,Zdata;
Acc_init();
delay_ms(100);
while(TRUE)
{
data_ready();
Xdata = read_Acc(XOUT8);
Ydata = read_Acc(YOUT8);
Zdata = read_Acc(ZOUT8);
delay_ms(100);
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 23, 2011 1:28 pm |
|
|
Look at the .LST file. The compiler is ignoring your spi_write() and
spi_read() functions because you gave them the same names as the
built-in CCS functions. If you want it to use your functions, change
the names slightly. You could call it my_spi_write(), or spi_wrt() and
spi_rd().
Also, if you want to use your own software spi functions, then don't
call the setup_spi() function.
Also, you don't need to set the TRIS. The compiler will do it for you. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|