HEY NNIMAR: NO UNFORTUNATELLY NOT, I STOPED TRYING AFTER A WHILE BECAUSE OF OTHER THINGS WHICH HAVE TO BE DONE. I SUPPOSE THE FUNCTION MYSHIFTOUT OR MYSHIFTIN OR BOTH OF THEM ARE THE PROBLEM. THE SERIAL COMMUNICATION IS VERY HARD TO DEBUG THOUGH. DO YOU HAVE ANY THOUGHTS WHAT'S THE PROB? OR MAYBE SOMEONE ELSE GOT IT RUNNING? WOULD BE GREAT.
// Constants:
int xAxis = 0;
int yAxis = 1;
int zAxis = 2;
int Cnt2Mv = (short) 52813; // 0.8058665536
int GfCnv = 14418; //0.2265536
// Pins:
int dioPin;
int clkPin;
int csPin;
void setup()
{
beginSerial( 19200 );
int dioPin = 5;
int clkPin = 6;
int csPin = 7;
pinMode( dioPin, OUTPUT );
pinMode( clkPin, OUTPUT );
pinMode( csPin, OUTPUT );
digitalWrite( csPin, HIGH ); // disable device
digitalWrite( clkPin, LOW );
digitalWrite( dioPin, LOW );
}
void loop()
{
int value;
value = gForce( xAxis );
//Serial.print( "x = " );
//Serial.println( value );
value = gForce( yAxis );
//Serial.print( "y = " );
//Serial.println( value );
value = gForce( zAxis );
//Serial.print( "z = " );
//Serial.println( value );
delay( 1000 ); // wait 1sec
}
int gForce( int adcValue, int refValue )
{
if( adcValue >= refValue )
return umulf( adcValue - refValue, GfCnv );
else
return -umulf( refValue - adcValue, GfCnv );
}
int gForce( int axis )
{
int refValue = readValue( 3 );
// Serial.println(refValue);
delay( 1 ); // wait 1msec
int adcValue = readValue( axis );
// Serial.println(adcValue);
return gForce( adcValue, refValue );
}
int readValue( int channel )
{
digitalWrite(csPin, LOW) ;
myShiftOut(dioPin, clkPin, 5, MSBFIRST, (short) ( ( 0x18 + channel ) << 11 ) );
int value = myShiftIn( dioPin, clkPin, 13 );
digitalWrite( csPin, HIGH );
Serial.println(value);
return value;
}
void myShiftOut(int dataPin, int clockPin, int bitCount, int bitOrder, int val ) {
pinMode( dataPin, OUTPUT );
for( int i = 0; i < bitCount; i++) {
digitalWrite( clockPin, HIGH );
if (bitOrder == LSBFIRST) {
digitalWrite( dataPin, ( val & 1) );
val = val >> 1;
}
else {
digitalWrite( dataPin, ((val >> 15)&1) );
val = val << 1;
}
digitalWrite( clockPin, LOW );
}
}
int myShiftIn(int dataPin, int clockPin, int bitCount) {
int pinState;
int dataIn = 0;
pinMode( clockPin, OUTPUT );
pinMode( dataPin, INPUT );
for(int i = 0; i < bitCount; i++) {
digitalWrite(clockPin, HIGH) ;
//layMicroseconds( 20 );
int temp = digitalRead( dataPin );
if (temp) pinState = 1;
else pinState = 0;
dataIn = (dataIn << 1) | pinState;
digitalWrite(clockPin, LOW);
}
//Serial.println(dataIn);
return dataIn;
}
int umulf( int value, int fraction )
{
int result = 0;
int rest = 0;
int temp, temp2;
for ( int i = 1; i < 17; i ++ )
{
if ( fraction < 0 ) //b15 set
{
result += ( ( value >> i ) & 0x7FFF ); //accumulate integer result
temp = ( ( value & ( ( 1 << i ) - 1) ) << ( 16 - i ) ); //accumulate rest R/65536
temp2 = rest ^ temp; // never overflow if sign(rest) != sign(temp)
rest += temp; //accumulate rest R/65536
//if (CPU.carry()) result++; //update result if rest overflows
if ( temp2 >= 0 ) //b15 clear, signs equal -> test for overflow
{
if ( ( rest ^ temp ) < 0) result ++; //new rest has different sign than temp
}
}
fraction <<= 1; //next bit
}
if ( rest < 0 ) result ++; //roundoff
return result;
}