Skip to content

Instantly share code, notes, and snippets.

@pingswept
Created March 24, 2014 19:37
Show Gist options
  • Select an option

  • Save pingswept/9747449 to your computer and use it in GitHub Desktop.

Select an option

Save pingswept/9747449 to your computer and use it in GitHub Desktop.
Demonstration code for the 18-bit variant of the Rascal Micro Precision Voltage Shield
#include <SPI.h>
#define RESOLUTION 18
#define SCALE_FACTOR 0.00003814697265625
// 10/(2^18) = 0.00003814697265625
#define BUSY 3
#define RESET 4
#define START_CONVERSION 5
#define CHIP_SELECT 10
#define MISO 12
#define LED 13
#define TOTAL_RAW_BYTES RESOLUTION
int bytesToRead = TOTAL_RAW_BYTES;
byte raw[TOTAL_RAW_BYTES];
signed long parsed[8] = {0};
void setup() {
pinMode(BUSY, INPUT);
pinMode(RESET, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(START_CONVERSION, OUTPUT);
pinMode(MISO, INPUT);
Serial.begin(115200);
SPI.begin();
digitalWrite(START_CONVERSION, HIGH);
digitalWrite(CHIP_SELECT, HIGH);
digitalWrite(RESET, HIGH);
delay(1);
digitalWrite(RESET, LOW);
}
void loop() {
int i;
digitalWrite(START_CONVERSION, LOW);
delayMicroseconds(10);
digitalWrite(START_CONVERSION, HIGH);
while (digitalRead(BUSY) == HIGH) {
// wait for conversion to complete
}
digitalWrite(CHIP_SELECT, LOW);
while (bytesToRead > 0) {
raw[TOTAL_RAW_BYTES - bytesToRead] = SPI.transfer(0x00);
bytesToRead--;
}
digitalWrite(CHIP_SELECT, HIGH);
bytesToRead = TOTAL_RAW_BYTES;
parseRawBytes();
/* for(i=0; i<8; i++) {
printBits(raw[i]);
Serial.print(" ");
} */
for(i=0; i<8; i++) {
Serial.print((float)parsed[i] * SCALE_FACTOR, 5);
Serial.print(",");
}
Serial.print("\r\n");
delay(1000);
}
void printBits(byte myByte){
for(byte mask = 0x80; mask; mask >>= 1){
if(mask & myByte)
Serial.print('1');
else
Serial.print('0');
}
}
void printLongBits(long myLong){
for(unsigned long mask = 0x80000000; mask; mask >>= 1){
if(mask & myLong)
Serial.print('1');
else
Serial.print('0');
}
}
void parseRawBytes() {
int i;
memset(parsed, 0, sizeof(parsed));
parsed[0] = (((long)raw[0] << 10) | ((long)raw[1] << 2) | ((long)raw[2] >> 6)) & 0x0003FFFF;
parsed[1] = (((long)raw[2] << 12) | ((long)raw[3] << 4) | ((long)raw[4] >> 4)) & 0x0003FFFF;
parsed[2] = (((long)raw[4] << 14) | ((long)raw[5] << 6) | ((long)raw[6] >> 2)) & 0x0003FFFF;
parsed[3] = (((long)raw[6] << 16) | ((long)raw[7] << 8) | ((long)raw[8] >> 0)) & 0x0003FFFF;
parsed[4] = (((long)raw[9] << 10) | ((long)raw[10] << 2) | ((long)raw[11] >> 6)) & 0x0003FFFF;
parsed[5] = (((long)raw[11] << 12) | ((long)raw[12] << 4) | ((long)raw[13] >> 4)) & 0x0003FFFF;
parsed[6] = (((long)raw[13] << 14) | ((long)raw[14] << 6) | ((long)raw[15] >> 2)) & 0x0003FFFF;
parsed[7] = (((long)raw[15] << 16) | ((long)raw[16] << 8) | ((long)raw[17] >> 0)) & 0x0003FFFF;
for(i=0; i<8; i++) {
parsed[i] = fixSignBit(parsed[i]);
}
}
long fixSignBit(long reading) {
if(reading & 0x20000) { // if reading is < 0 (stored as two's complement)
return reading | 0xFFFC0000; // set bits 31-18
} else {
return reading;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment