//PIC Stuff/PICX_27J13/defines.h |
---|
6,23 → 6,36 |
#define _DEBUG |
// <editor-fold defaultstate="collapsed" desc="I2C Addresses"> |
// HT16K33_ADDRESS 0x70 |
// L3GD20_ADDRESS 0x6B |
// BMP085_I2CADDR 0x77 |
// TSL2561_ADDR_FLOAT 0x39 |
// PN532_I2C_ADDRESS 0x24 |
// LSM303_MAG_ADDRESS 0x1E |
// LSM303_ACC_ADDRESS 0x18 |
// </editor-fold> |
// <editor-fold defaultstate="expanded" desc="Test Cases"> |
//#define _TEST_UART |
//#define _TEST_I2C_MASTER |
//#define _TEST_I2C_SLAVE |
//#define _TEST_SPI |
//#define _TEST_ADC |
//#define _TEST_TIMER1_RTC |
//#define _TEST_NFC |
//#define _TEST_LUX |
//#define _TEST_BMP |
//#define _TEST_GYRO |
//#define _TEST_ACCEL |
//#define _TEST_LED_BACKPACK |
//#define _TEST_SSD1306_OLED |
//#define _TEST_SSD1331_OLED |
//#define _TEST_TIMER1_RTC |
//#define _TEST_LUX |
//#define _TEST_XBEE |
//#define _TEST_OLED_CHAR |
//#define _TEST_NFC_TO_SSD1306_OLED |
//#define _TEST_LUX_TO_CHAR_OLED |
//#define _TEST_ADC |
//#define _TEST_BMP |
//#define _TEST_XBEE |
#define _TEST_LUX_TO_CHAR_OLED |
// </editor-fold> |
// <editor-fold defaultstate="collapsed" desc="Debug Redirection"> |
//PIC Stuff/PICX_27J13/funclist |
---|
1,22 → 1,57 |
_I2C_Get_Status: CODE, 76556 0 214 |
_I2C_Interrupt_Master: CODE, 67304 0 1764 |
exp@coeff: MEDIUMCONST, 0 0 64687 |
__stringdata: MEDIUMCONST, 64729 0 805 |
_UART1_WriteS: CODE, 71142 0 64 |
exp@coeff: MEDIUMCONST, 0 0 64649 |
_NHD_Write_String: CODE, 78440 0 92 |
_LUX_Enable: CODE, 79050 0 40 |
_NHD_Write_4_Bits: CODE, 77258 0 152 |
_I2C_Read_Buffer: CODE, 75864 0 238 |
__stringdata: MEDIUMCONST, 64691 0 843 |
_UART1_WriteS: CODE, 78818 0 64 |
_NHD_Init: CODE, 79090 0 36 |
_I2C_Interrupt_Slave: CODE, 65536 0 1768 |
_strlen: CODE, 71074 0 68 |
_font: MEDIUMCONST, 63366 0 1275 |
_UART1_Recv_Interrupt_Handler: CODE, 70092 0 428 |
_pn532response_firmwarevers: MEDIUMCONST, 64714 0 8 |
_main: CODE, 71210 0 4 |
_numbertable: MEDIUMCONST, 64641 0 10 |
_pn532ack: MEDIUMCONST, 64722 0 7 |
_I2C_Process_Send: CODE, 70520 0 164 |
_I2C_Interrupt_Handler: CODE, 71002 0 72 |
__initialization: CODE, 70822 0 90 |
_alphatable: MEDIUMCONST, 64651 0 6 |
_sprintf: CODE, 70918 0 84 |
_strlen: CODE, 78250 0 96 |
_I2C_Configure_Master: CODE, 78532 0 78 |
_LUX_Calculate_Lux: CODE, 69068 0 1422 |
_I2C_Master_Send: CODE, 75600 0 264 |
_font: MEDIUMCONST, 63288 0 1275 |
_dpowers: MEDIUMCONST, 64563 0 40 |
_UART1_Recv_Interrupt_Handler: CODE, 74300 0 428 |
_pn532response_firmwarevers: MEDIUMCONST, 64676 0 8 |
_main: CODE, 73090 0 732 |
_LUX_Init: CODE, 78682 0 68 |
_Interrupt_Enable: CODE, 79176 0 8 |
_numbertable: MEDIUMCONST, 64603 0 10 |
_NHD_Send_Command: CODE, 78930 0 40 |
_NHD_Send_Data: CODE, 78970 0 40 |
_pn532ack: MEDIUMCONST, 64684 0 7 |
_I2C_Process_Send: CODE, 76938 0 164 |
_LUX_Read_2_Bytes: CODE, 77410 0 140 |
___lmul: CODE, 76770 0 168 |
_LUX_Write_2_Bytes: CODE, 78346 0 94 |
_I2C_Interrupt_Handler: CODE, 78610 0 72 |
i2___lldiv: CODE, 77102 0 156 |
_Interrupt_Init: CODE, 79156 0 10 |
__initialization: CODE, 78152 0 92 |
_NHD_Begin: CODE, 75314 0 286 |
_alphatable: MEDIUMCONST, 64613 0 6 |
_I2C_Master_Restart: CODE, 76338 0 218 |
_LUX_Set_Gain: CODE, 77932 0 110 |
___lldiv: CODE, 75026 0 288 |
_I2C_Init: CODE, 74728 0 298 |
_LUX_Disable: CODE, 79010 0 40 |
_sprintf: CODE, 71514 0 830 |
_NHD_Set_Cursor: CODE, 77816 0 116 |
i2___llmod: CODE, 77688 0 128 |
i2_sprintf: CODE, 72344 0 746 |
_InterruptHandlerLow: CODE, 24 0 154 |
_Timer1_Interrupt_Handler: CODE, 71214 0 2 |
_InterruptHandlerHigh: CODE, 8 0 70814 |
log@coeff: MEDIUMCONST, 0 0 64714 |
Total: 206988 |
_Timer1_Interrupt_Handler: CODE, 79188 0 2 |
_Delay10KTCYx: CODE, 79126 0 30 |
_LUX_Set_Timing: CODE, 78042 0 110 |
_InterruptHandlerHigh: CODE, 8 0 77680 |
___llmod: CODE, 76102 0 236 |
log@coeff: MEDIUMCONST, 0 0 64676 |
_NHD_Wait_For_Ready: CODE, 78882 0 48 |
i2_strlen: CODE, 78750 0 68 |
_LUX_Get_Full_Luminosity: CODE, 73822 0 478 |
_NHD_Pulse_Enable: CODE, 79166 0 10 |
Total: 221830 |
//PIC Stuff/PICX_27J13/main.c |
---|
17,6 → 17,8 |
#include "display_oled_ssd1331.h" |
#include "display_oled_NHD-0216KZW-AB5.h" |
#include "comm_xbee.h" |
#include "sensor_gyro_L3G.h" |
#include "sensor_accel_LSM303.h" |
// <editor-fold defaultstate="collapsed" desc="Configuration Bits"> |
/* --------------------------- Configuration Bits --------------------------- */ |
62,7 → 64,7 |
/* -------------------------------------------------------------------------- */ |
// </editor-fold> |
#if defined(_TEST_UART) |
#if defined(_TEST_UART) |
// <editor-fold defaultstate="collapsed" desc="_TEST_UART"> |
int main() { |
char buffer[100]; |
259,6 → 261,88 |
} |
} |
// </editor-fold> |
#elif defined(_TEST_ADC) |
// <editor-fold defaultstate="collapsed" desc="_TEST_ADC"> |
void main(void) { |
unsigned int x, y, z; |
char buffer[60]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); // Initialize the UART handler code |
SPI_DATA spi_data; |
SPI2_Init(&spi_data, SPI2_FOSC_8); // Initialize the SPI module |
SSD1306_DATA ssd1306_data; |
SSD1306_Init(&ssd1306_data); // Initialize the SSD1331 OLED display (uses SPI2) |
ADC_DATA adc_data; |
ADC_Init(&adc_data, ADC_TAD_20, ADC_FOSC_64_); |
SSD1306_Begin(SSD1306_SWITCHCAPVCC); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
sprintf(buffer, "\r\nBegin Program\r\n"); |
SSD1306_Write_String(buffer, strlen(buffer)); |
memset(buffer, 0, 60); |
SSD1306_Clear_Display(); |
SSD1306_Display(); |
while (1) { |
// ADC read from AN0-AN2 and prints to display |
ADC_Start(ADC_CHANNEL_AN2); |
// SSD1306_Fill_Rect(0, 0, SSD1306_LCDWIDTH, 8, SSD1331_BLACK); |
SSD1306_Set_Cursor(0, 0); |
while (!ADC_Get_Result(&x)); |
sprintf(buffer, "X: %u", x); |
SSD1306_Write_String(buffer, strlen(buffer)); |
SSD1306_Display(); |
ADC_Start(ADC_CHANNEL_AN1); |
// SSD1306_Fill_Rect(0, 8, SSD1306_LCDWIDTH, 8, SSD1331_BLACK); |
SSD1306_Set_Cursor(0, 8); |
while (!ADC_Get_Result(&y)); |
sprintf(buffer, "Y: %u", y); |
SSD1306_Write_String(buffer, strlen(buffer)); |
SSD1306_Display(); |
ADC_Start(ADC_CHANNEL_AN0); |
// SSD1306_Fill_Rect(0, 16, SSD1306_LCDWIDTH, 8, SSD1331_BLACK); |
SSD1306_Set_Cursor(0, 16); |
while (!ADC_Get_Result(&z)); |
sprintf(buffer, "Z: %u", z); |
SSD1306_Write_String(buffer, strlen(buffer)); |
SSD1306_Display(); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_TIMER1_RTC) |
// <editor-fold defaultstate="collapsed" desc="_TEST_TIMER1_RTC"> |
void main(void) { |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
Timer1_Init(); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
LED_BLUE_TRIS = 0; |
LED_RED_TRIS = 0; |
Timer1_Enable(); |
while (1) { |
} |
} |
// </editor-fold> |
#elif defined(_TEST_NFC) |
// <editor-fold defaultstate="collapsed" desc="_TEST_NFC"> |
void main(void) { |
422,6 → 506,177 |
} |
} |
// </editor-fold> |
#elif defined(_TEST_LUX) |
// <editor-fold defaultstate="collapsed" desc="_TEST_LUX"> |
void main(void) { |
char output[64]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); |
I2C_DATA i2c_data; |
I2C_Init(&i2c_data); |
TSL2561_DATA lux_data; |
LUX_Init(&lux_data, TSL2561_ADDR_FLOAT); |
I2C_Configure_Master(I2C_100KHZ); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
LUX_Begin(); |
// You can change the gain on the fly, to adapt to brighter/dimmer light situations |
// LUX_Set_Gain(TSL2561_GAIN_0X); // set no gain (for bright situtations) |
LUX_Set_Gain(TSL2561_GAIN_16X); // set 16x gain (for dim situations) |
// Changing the integration time gives you a longer time over which to sense light |
// longer timelines are slower, but are good in very low light situtations! |
// LUX_Set_Timing(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light) |
LUX_Set_Timing(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light) |
// LUX_Set_Timing(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim light) |
sprintf(output, "\r\nBegin Program\r\n"); |
DBG_PRINT_MAIN(output, strlen(output)); |
while (1) { |
unsigned long lum = LUX_Get_Full_Luminosity(); |
unsigned int ir = lum >> 16; |
unsigned int full = lum & 0xFFFF; |
sprintf(output, "IR: %d\r\n", ir); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Visible: %d\r\n", full - ir); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Full: %d\r\n", full); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Lux: %ld\r\n\r\n", LUX_Calculate_Lux(full, ir)); |
DBG_PRINT_MAIN(output, strlen(output)); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_BMP) |
// <editor-fold defaultstate="collapsed" desc="_TEST_BMP"> |
void main(void) { |
char output[64]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); |
I2C_DATA i2c_data; |
I2C_Init(&i2c_data); |
BMP085_DATA bmp_data; |
BMP_Init(&bmp_data); |
I2C_Configure_Master(I2C_400KHZ); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
BMP_Begin(BMP085_ULTRAHIGHRES); |
BMP_Read_Temperature(); |
BMP_Read_Pressure(); |
BMP_Read_Altitude(101592); |
while (1) { |
sprintf(output, "Temp: %f *C\r\n", BMP_Read_Temperature()); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Pressure: %ld Pa\r\n", BMP_Read_Pressure()); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Altitude: %f meters\r\n", BMP_Read_Altitude(101592)); |
DBG_PRINT_MAIN(output, strlen(output)); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_GYRO) |
// <editor-fold defaultstate="collapsed" desc="_TEST_GYRO"> |
void main(void) { |
char output[64]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); |
I2C_DATA i2c_data; |
I2C_Init(&i2c_data); |
L3G_DATA gyro_data; |
L3G_Init(&gyro_data, L3GD20_DEVICE, L3G_SA0_HIGH); |
I2C_Configure_Master(I2C_100KHZ); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
sprintf(output, "\r\nBegin Program\r\n"); |
DBG_PRINT_MAIN(output, strlen(output)); |
L3G_Begin(); |
int x,y,z; |
while (1) { |
L3G_Read(&x, &y, &z); |
sprintf(output, "X: %d Y: %d Z: %d\r\n", x, y, z); |
DBG_PRINT_MAIN(output, strlen(output)); |
Delay10KTCYx(100); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_ACCEL) |
// <editor-fold defaultstate="collapsed" desc="_TEST_ACCEL"> |
void main(void) { |
char output[64]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); |
I2C_DATA i2c_data; |
I2C_Init(&i2c_data); |
LSM303_DATA acc_data; |
LSM303_Init(&acc_data, LSM303DLHC_DEVICE, ACC_ADDRESS_SA0_A_LOW); |
I2C_Configure_Master(I2C_100KHZ); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
sprintf(output, "\r\nBegin Program\r\n"); |
DBG_PRINT_MAIN(output, strlen(output)); |
LSM303_Begin(); |
int a_x, a_y, a_z, m_x, m_y, m_z; |
while (1) { |
LSM303_Read_Acc(&a_x, &a_y, &a_z); |
LSM303_Read_Mag(&m_x, &m_y, &m_z); |
sprintf(output, "A - X: %d Y: %d Z: %d\r\n", a_x, a_y, a_z); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "M - X: %d Y: %d Z: %d\r\n", m_x, m_y, m_z); |
DBG_PRINT_MAIN(output, strlen(output)); |
Delay10KTCYx(100); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_LED_BACKPACK) |
// <editor-fold defaultstate="collapsed" desc="_TEST_LED_BACKPACK"> |
void main(void) { |
720,85 → 975,6 |
} |
} |
// </editor-fold> |
#elif defined(_TEST_TIMER1_RTC) |
// <editor-fold defaultstate="collapsed" desc="_TEST_TIMER1_RTC"> |
void main(void) { |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
Timer1_Init(); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
LED_BLUE_TRIS = 0; |
LED_RED_TRIS = 0; |
Timer1_Enable(); |
while (1) { |
} |
} |
// </editor-fold> |
#elif defined(_TEST_LUX) |
// <editor-fold defaultstate="collapsed" desc="_TEST_LUX"> |
void main(void) { |
char output[64]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); |
I2C_DATA i2c_data; |
I2C_Init(&i2c_data); |
TSL2561_DATA lux_data; |
LUX_Init(&lux_data, TSL2561_ADDR_FLOAT); |
I2C_Configure_Master(I2C_100KHZ); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
LUX_Begin(); |
// You can change the gain on the fly, to adapt to brighter/dimmer light situations |
// LUX_Set_Gain(TSL2561_GAIN_0X); // set no gain (for bright situtations) |
LUX_Set_Gain(TSL2561_GAIN_16X); // set 16x gain (for dim situations) |
// Changing the integration time gives you a longer time over which to sense light |
// longer timelines are slower, but are good in very low light situtations! |
// LUX_Set_Timing(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light) |
LUX_Set_Timing(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light) |
// LUX_Set_Timing(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim light) |
sprintf(output, "\r\nBegin Program\r\n"); |
DBG_PRINT_MAIN(output, strlen(output)); |
while (1) { |
unsigned long lum = LUX_Get_Full_Luminosity(); |
unsigned int ir = lum >> 16; |
unsigned int full = lum & 0xFFFF; |
sprintf(output, "IR: %d\r\n", ir); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Visible: %d\r\n", full - ir); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Full: %d\r\n", full); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Lux: %ld\r\n\r\n", LUX_Calculate_Lux(full, ir)); |
DBG_PRINT_MAIN(output, strlen(output)); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_OLED_CHAR) |
// <editor-fold defaultstate="collapsed" desc="_TEST_OLED_CHAR"> |
void main(void) { |
964,8 → 1140,8 |
// Changing the integration time gives you a longer time over which to sense light |
// longer timelines are slower, but are good in very low light situtations! |
LUX_Set_Timing(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light) |
// LUX_Set_Timing(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light) |
// LUX_Set_Timing(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light) |
LUX_Set_Timing(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light) |
// LUX_Set_Timing(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim light) |
while (1) { |
981,111 → 1157,10 |
sprintf(output, "Lux: %ld ", LUX_Calculate_Lux(full, ir)); |
NHD_Write_String(output, strlen(output)); |
Delay10KTCYx(100); |
// Delay10KTCYx(100); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_ADC) |
// <editor-fold defaultstate="collapsed" desc="_TEST_ADC"> |
void main(void) { |
unsigned int x, y, z; |
char buffer[60]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); // Initialize the UART handler code |
SPI_DATA spi_data; |
SPI2_Init(&spi_data, SPI2_FOSC_8); // Initialize the SPI module |
SSD1306_DATA ssd1306_data; |
SSD1306_Init(&ssd1306_data); // Initialize the SSD1331 OLED display (uses SPI2) |
ADC_DATA adc_data; |
ADC_Init(&adc_data, ADC_TAD_20, ADC_FOSC_64_); |
SSD1306_Begin(SSD1306_SWITCHCAPVCC); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
sprintf(buffer, "\r\nBegin Program\r\n"); |
SSD1306_Write_String(buffer, strlen(buffer)); |
memset(buffer, 0, 60); |
SSD1306_Clear_Display(); |
SSD1306_Display(); |
while (1) { |
// ADC read from AN0-AN2 and prints to display |
ADC_Start(ADC_CHANNEL_AN2); |
// SSD1306_Fill_Rect(0, 0, SSD1306_LCDWIDTH, 8, SSD1331_BLACK); |
SSD1306_Set_Cursor(0, 0); |
while (!ADC_Get_Result(&x)); |
sprintf(buffer, "X: %u", x); |
SSD1306_Write_String(buffer, strlen(buffer)); |
SSD1306_Display(); |
ADC_Start(ADC_CHANNEL_AN1); |
// SSD1306_Fill_Rect(0, 8, SSD1306_LCDWIDTH, 8, SSD1331_BLACK); |
SSD1306_Set_Cursor(0, 8); |
while (!ADC_Get_Result(&y)); |
sprintf(buffer, "Y: %u", y); |
SSD1306_Write_String(buffer, strlen(buffer)); |
SSD1306_Display(); |
ADC_Start(ADC_CHANNEL_AN0); |
// SSD1306_Fill_Rect(0, 16, SSD1306_LCDWIDTH, 8, SSD1331_BLACK); |
SSD1306_Set_Cursor(0, 16); |
while (!ADC_Get_Result(&z)); |
sprintf(buffer, "Z: %u", z); |
SSD1306_Write_String(buffer, strlen(buffer)); |
SSD1306_Display(); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_BMP) |
// <editor-fold defaultstate="collapsed" desc="_TEST_BMP"> |
void main(void) { |
char output[64]; |
// Set all ports as digial I/O except for AN0-AN2 (pins 2-4) |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
UART_DATA uart_data; |
UART1_Init(&uart_data); |
I2C_DATA i2c_data; |
I2C_Init(&i2c_data); |
BMP085_DATA bmp_data; |
BMP_Init(&bmp_data); |
I2C_Configure_Master(I2C_400KHZ); |
Interrupt_Init(); // Initialize the interrupt priorities |
Interrupt_Enable(); // Enable high-priority interrupts and low-priority interrupts |
BMP_Begin(BMP085_ULTRAHIGHRES); |
BMP_Read_Temperature(); |
BMP_Read_Pressure(); |
BMP_Read_Altitude(101592); |
while (1) { |
sprintf(output, "Temp: %f *C\r\n", BMP_Read_Temperature()); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Pressure: %ld Pa\r\n", BMP_Read_Pressure()); |
DBG_PRINT_MAIN(output, strlen(output)); |
sprintf(output, "Altitude: %f meters\r\n", BMP_Read_Altitude(101592)); |
DBG_PRINT_MAIN(output, strlen(output)); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
// </editor-fold> |
#elif defined(_TEST_XBEE) |
// <editor-fold defaultstate="collapsed" desc="_TEST_XBEE"> |
void main(void) { |
//PIC Stuff/PICX_27J13/nbproject/Makefile-default.mk |
---|
45,11 → 45,11 |
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} |
# Object Files Quoted if spaced |
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.p1 ${OBJECTDIR}/base_UART.p1 ${OBJECTDIR}/base_I2C.p1 ${OBJECTDIR}/base_SPI.p1 ${OBJECTDIR}/display_led_HT16K33.p1 ${OBJECTDIR}/sensor_nfc_PN532.p1 ${OBJECTDIR}/base_TIMERS.p1 ${OBJECTDIR}/comm_xbee.p1 ${OBJECTDIR}/base_ADC.p1 ${OBJECTDIR}/base_INTERRUPTS.p1 ${OBJECTDIR}/display_oled_NHD-0216KZW-AB5.p1 ${OBJECTDIR}/display_oled_ssd1306.p1 ${OBJECTDIR}/display_oled_ssd1331.p1 ${OBJECTDIR}/glcdfont.p1 ${OBJECTDIR}/sensor_lux_TSL2561.p1 ${OBJECTDIR}/sensor_temp_BMP085.p1 |
POSSIBLE_DEPFILES=${OBJECTDIR}/main.p1.d ${OBJECTDIR}/base_UART.p1.d ${OBJECTDIR}/base_I2C.p1.d ${OBJECTDIR}/base_SPI.p1.d ${OBJECTDIR}/display_led_HT16K33.p1.d ${OBJECTDIR}/sensor_nfc_PN532.p1.d ${OBJECTDIR}/base_TIMERS.p1.d ${OBJECTDIR}/comm_xbee.p1.d ${OBJECTDIR}/base_ADC.p1.d ${OBJECTDIR}/base_INTERRUPTS.p1.d ${OBJECTDIR}/display_oled_NHD-0216KZW-AB5.p1.d ${OBJECTDIR}/display_oled_ssd1306.p1.d ${OBJECTDIR}/display_oled_ssd1331.p1.d ${OBJECTDIR}/glcdfont.p1.d ${OBJECTDIR}/sensor_lux_TSL2561.p1.d ${OBJECTDIR}/sensor_temp_BMP085.p1.d |
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.p1 ${OBJECTDIR}/base_UART.p1 ${OBJECTDIR}/base_I2C.p1 ${OBJECTDIR}/base_SPI.p1 ${OBJECTDIR}/display_led_HT16K33.p1 ${OBJECTDIR}/sensor_nfc_PN532.p1 ${OBJECTDIR}/base_TIMERS.p1 ${OBJECTDIR}/comm_xbee.p1 ${OBJECTDIR}/base_ADC.p1 ${OBJECTDIR}/base_INTERRUPTS.p1 ${OBJECTDIR}/display_oled_NHD-0216KZW-AB5.p1 ${OBJECTDIR}/display_oled_ssd1306.p1 ${OBJECTDIR}/display_oled_ssd1331.p1 ${OBJECTDIR}/glcdfont.p1 ${OBJECTDIR}/sensor_lux_TSL2561.p1 ${OBJECTDIR}/sensor_temp_BMP085.p1 ${OBJECTDIR}/sensor_gyro_L3G.p1 ${OBJECTDIR}/sensor_accel_LSM303.p1 |
POSSIBLE_DEPFILES=${OBJECTDIR}/main.p1.d ${OBJECTDIR}/base_UART.p1.d ${OBJECTDIR}/base_I2C.p1.d ${OBJECTDIR}/base_SPI.p1.d ${OBJECTDIR}/display_led_HT16K33.p1.d ${OBJECTDIR}/sensor_nfc_PN532.p1.d ${OBJECTDIR}/base_TIMERS.p1.d ${OBJECTDIR}/comm_xbee.p1.d ${OBJECTDIR}/base_ADC.p1.d ${OBJECTDIR}/base_INTERRUPTS.p1.d ${OBJECTDIR}/display_oled_NHD-0216KZW-AB5.p1.d ${OBJECTDIR}/display_oled_ssd1306.p1.d ${OBJECTDIR}/display_oled_ssd1331.p1.d ${OBJECTDIR}/glcdfont.p1.d ${OBJECTDIR}/sensor_lux_TSL2561.p1.d ${OBJECTDIR}/sensor_temp_BMP085.p1.d ${OBJECTDIR}/sensor_gyro_L3G.p1.d ${OBJECTDIR}/sensor_accel_LSM303.p1.d |
# Object Files |
OBJECTFILES=${OBJECTDIR}/main.p1 ${OBJECTDIR}/base_UART.p1 ${OBJECTDIR}/base_I2C.p1 ${OBJECTDIR}/base_SPI.p1 ${OBJECTDIR}/display_led_HT16K33.p1 ${OBJECTDIR}/sensor_nfc_PN532.p1 ${OBJECTDIR}/base_TIMERS.p1 ${OBJECTDIR}/comm_xbee.p1 ${OBJECTDIR}/base_ADC.p1 ${OBJECTDIR}/base_INTERRUPTS.p1 ${OBJECTDIR}/display_oled_NHD-0216KZW-AB5.p1 ${OBJECTDIR}/display_oled_ssd1306.p1 ${OBJECTDIR}/display_oled_ssd1331.p1 ${OBJECTDIR}/glcdfont.p1 ${OBJECTDIR}/sensor_lux_TSL2561.p1 ${OBJECTDIR}/sensor_temp_BMP085.p1 |
OBJECTFILES=${OBJECTDIR}/main.p1 ${OBJECTDIR}/base_UART.p1 ${OBJECTDIR}/base_I2C.p1 ${OBJECTDIR}/base_SPI.p1 ${OBJECTDIR}/display_led_HT16K33.p1 ${OBJECTDIR}/sensor_nfc_PN532.p1 ${OBJECTDIR}/base_TIMERS.p1 ${OBJECTDIR}/comm_xbee.p1 ${OBJECTDIR}/base_ADC.p1 ${OBJECTDIR}/base_INTERRUPTS.p1 ${OBJECTDIR}/display_oled_NHD-0216KZW-AB5.p1 ${OBJECTDIR}/display_oled_ssd1306.p1 ${OBJECTDIR}/display_oled_ssd1331.p1 ${OBJECTDIR}/glcdfont.p1 ${OBJECTDIR}/sensor_lux_TSL2561.p1 ${OBJECTDIR}/sensor_temp_BMP085.p1 ${OBJECTDIR}/sensor_gyro_L3G.p1 ${OBJECTDIR}/sensor_accel_LSM303.p1 |
CFLAGS= |
184,6 → 184,20 |
@-${MV} ${OBJECTDIR}/sensor_temp_BMP085.d ${OBJECTDIR}/sensor_temp_BMP085.p1.d |
@${FIXDEPS} ${OBJECTDIR}/sensor_temp_BMP085.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
${OBJECTDIR}/sensor_gyro_L3G.p1: sensor_gyro_L3G.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/sensor_gyro_L3G.p1.d |
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --asmlist -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --emi=wordwrite --opt=default,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore --mode=free -P -N255 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,+plib "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: %%s" "--msgformat=%%f:%%l: advisory: %%s" -o${OBJECTDIR}/sensor_gyro_L3G.p1 sensor_gyro_L3G.c |
@-${MV} ${OBJECTDIR}/sensor_gyro_L3G.d ${OBJECTDIR}/sensor_gyro_L3G.p1.d |
@${FIXDEPS} ${OBJECTDIR}/sensor_gyro_L3G.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
${OBJECTDIR}/sensor_accel_LSM303.p1: sensor_accel_LSM303.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/sensor_accel_LSM303.p1.d |
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --asmlist -D__DEBUG=1 --debugger=pickit3 --double=24 --float=24 --emi=wordwrite --opt=default,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore --mode=free -P -N255 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,+plib "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: %%s" "--msgformat=%%f:%%l: advisory: %%s" -o${OBJECTDIR}/sensor_accel_LSM303.p1 sensor_accel_LSM303.c |
@-${MV} ${OBJECTDIR}/sensor_accel_LSM303.d ${OBJECTDIR}/sensor_accel_LSM303.p1.d |
@${FIXDEPS} ${OBJECTDIR}/sensor_accel_LSM303.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
else |
${OBJECTDIR}/main.p1: main.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
297,6 → 311,20 |
@-${MV} ${OBJECTDIR}/sensor_temp_BMP085.d ${OBJECTDIR}/sensor_temp_BMP085.p1.d |
@${FIXDEPS} ${OBJECTDIR}/sensor_temp_BMP085.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
${OBJECTDIR}/sensor_gyro_L3G.p1: sensor_gyro_L3G.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/sensor_gyro_L3G.p1.d |
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --asmlist --double=24 --float=24 --emi=wordwrite --opt=default,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore --mode=free -P -N255 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,+plib "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: %%s" "--msgformat=%%f:%%l: advisory: %%s" -o${OBJECTDIR}/sensor_gyro_L3G.p1 sensor_gyro_L3G.c |
@-${MV} ${OBJECTDIR}/sensor_gyro_L3G.d ${OBJECTDIR}/sensor_gyro_L3G.p1.d |
@${FIXDEPS} ${OBJECTDIR}/sensor_gyro_L3G.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
${OBJECTDIR}/sensor_accel_LSM303.p1: sensor_accel_LSM303.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/sensor_accel_LSM303.p1.d |
${MP_CC} --pass1 $(MP_EXTRA_CC_PRE) --chip=$(MP_PROCESSOR_OPTION) -Q -G --asmlist --double=24 --float=24 --emi=wordwrite --opt=default,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore --mode=free -P -N255 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,+plib "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: %%s" "--msgformat=%%f:%%l: advisory: %%s" -o${OBJECTDIR}/sensor_accel_LSM303.p1 sensor_accel_LSM303.c |
@-${MV} ${OBJECTDIR}/sensor_accel_LSM303.d ${OBJECTDIR}/sensor_accel_LSM303.p1.d |
@${FIXDEPS} ${OBJECTDIR}/sensor_accel_LSM303.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ |
endif |
# ------------------------------------------------------------------------------------ |
//PIC Stuff/PICX_27J13/nbproject/Makefile-genesis.properties |
---|
1,5 → 1,5 |
# |
#Mon Dec 31 22:16:52 EST 2012 |
#Wed Jan 02 02:59:02 EST 2013 |
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\xc8\\v1.12\\bin |
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=d94e033fce233e60ccb9abf3a212a9b7 |
default.languagetoolchain.version=1.12 |
//PIC Stuff/PICX_27J13/nbproject/configurations.xml |
---|
19,6 → 19,8 |
<itemPath>sensor_temp_BMP085.h</itemPath> |
<itemPath>comm_xbee.h</itemPath> |
<itemPath>base_ADC.h</itemPath> |
<itemPath>sensor_gyro_L3G.h</itemPath> |
<itemPath>sensor_accel_LSM303.h</itemPath> |
</logicalFolder> |
<logicalFolder name="LinkerScript" |
displayName="Linker Files" |
43,6 → 45,8 |
<itemPath>glcdfont.c</itemPath> |
<itemPath>sensor_lux_TSL2561.c</itemPath> |
<itemPath>sensor_temp_BMP085.c</itemPath> |
<itemPath>sensor_gyro_L3G.c</itemPath> |
<itemPath>sensor_accel_LSM303.c</itemPath> |
</logicalFolder> |
<logicalFolder name="ExternalFiles" |
displayName="Important Files" |
//PIC Stuff/PICX_27J13/sensor_accel_LSM303.c |
---|
0,0 → 1,108 |
#include "defines.h" |
#include "sensor_accel_LSM303.h" |
#include "base_I2C.h" |
static LSM303_DATA *lsm303_data_p; |
void LSM303_Init(LSM303_DATA* data, char device, char sa0) { |
lsm303_data_p = data; |
lsm303_data_p->device = device; |
switch (device) { |
case LSM303DLH_DEVICE: |
case LSM303DLM_DEVICE: |
if (sa0 == LSM303_SA0_A_LOW) |
lsm303_data_p->acc_address = ACC_ADDRESS_SA0_A_LOW; |
else |
lsm303_data_p->acc_address = ACC_ADDRESS_SA0_A_HIGH; |
break; |
case LSM303DLHC_DEVICE: |
lsm303_data_p->acc_address = ACC_ADDRESS_SA0_A_HIGH; |
break; |
default: |
break; |
} |
} |
void LSM303_Begin() { |
// Enable Accelerometer |
// 0x27 = 0b00100111 |
// Normal power mode, all axes enabled |
LSM303_Write_A_Reg(LSM303_CTRL_REG1_A, 0x27); |
// Enable Magnetometer |
// 0x00 = 0b00000000 |
// Continuous conversion mode |
LSM303_Write_M_Reg(LSM303_MR_REG_M, 0x00); |
} |
void LSM303_Write_A_Reg(char reg, char value) { |
char buffer[2]; |
buffer[0] = reg; |
buffer[1] = value; |
I2C_Master_Send(lsm303_data_p->acc_address, 2, buffer); |
char result; |
do { |
result = I2C_Get_Status(); |
} while (!result); |
} |
void LSM303_Write_M_Reg(char reg, char value) { |
char buffer[2]; |
buffer[0] = reg; |
buffer[1] = value; |
I2C_Master_Send(lsm303_data_p->mag_address, 2, buffer); |
char result; |
do { |
result = I2C_Get_Status(); |
} while (!result); |
} |
void LSM303_Set_Mag_Gain(enum magGain value) { |
char buffer[2]; |
buffer[0] = LSM303_CRB_REG_M; |
buffer[1] = (char)value; |
I2C_Master_Send(lsm303_data_p->mag_address, 2, buffer); |
char result; |
do { |
result = I2C_Get_Status(); |
} while (!result); |
} |
void LSM303_Read_Acc(int* x, int* y, int* z) { |
char buffer[6]; |
char value = LSM303_OUT_X_L_A | 0x80; |
I2C_Master_Restart(lsm303_data_p->acc_address, value, 6); |
char result; |
do { |
result = I2C_Get_Status(); |
} while (!result); |
I2C_Read_Buffer(buffer); |
// 0 = x_l, 1 = x_h, 2 = y_l, ... |
*x = buffer[1] << 8 | buffer[0]; |
*y = buffer[3] << 8 | buffer[2]; |
*z = buffer[5] << 8 | buffer[4]; |
} |
void LSM303_Read_Mag(int* x, int* y, int* z) { |
char buffer[6]; |
char value = LSM303_OUT_X_H_M; |
I2C_Master_Restart(lsm303_data_p->mag_address, value, 6); |
char result; |
do { |
result = I2C_Get_Status(); |
} while (!result); |
I2C_Read_Buffer(buffer); |
*x = buffer[0] << 8 | buffer[1]; |
if (lsm303_data_p->device == LSM303DLH_DEVICE) { |
// DLH: register address for Y comes before Z |
*y = buffer[2] << 8 | buffer[3]; |
*z = buffer[4] << 8 | buffer[5]; |
} else { |
// DLM, DLHC: register address for Z comes before Y |
*z = buffer[2] << 8 | buffer[3]; |
*y = buffer[4] << 8 | buffer[5]; |
} |
} |
//PIC Stuff/PICX_27J13/sensor_accel_LSM303.h |
---|
0,0 → 1,116 |
#ifndef ACCEL_LSM303_H |
#define ACCEL_LSM303_H |
// Device |
#define LSM303DLH_DEVICE 0 |
#define LSM303DLM_DEVICE 1 |
#define LSM303DLHC_DEVICE 2 |
// SA0_A States |
#define LSM303_SA0_A_LOW 0 |
#define LSM303_SA0_A_HIGH 1 |
// Slave Addresses |
#define MAG_ADDRESS (0x3C >> 1) |
#define ACC_ADDRESS_SA0_A_LOW (0x30 >> 1) |
#define ACC_ADDRESS_SA0_A_HIGH (0x32 >> 1) |
// Register Addresses |
#define LSM303_CTRL_REG1_A 0x20 |
#define LSM303_CTRL_REG2_A 0x21 |
#define LSM303_CTRL_REG3_A 0x22 |
#define LSM303_CTRL_REG4_A 0x23 |
#define LSM303_CTRL_REG5_A 0x24 |
#define LSM303_CTRL_REG6_A 0x25 // DLHC only |
#define LSM303_HP_FILTER_RESET_A 0x25 // DLH, DLM only |
#define LSM303_REFERENCE_A 0x26 |
#define LSM303_STATUS_REG_A 0x27 |
#define LSM303_OUT_X_L_A 0x28 |
#define LSM303_OUT_X_H_A 0x29 |
#define LSM303_OUT_Y_L_A 0x2A |
#define LSM303_OUT_Y_H_A 0x2B |
#define LSM303_OUT_Z_L_A 0x2C |
#define LSM303_OUT_Z_H_A 0x2D |
#define LSM303_FIFO_CTRL_REG_A 0x2E // DLHC only |
#define LSM303_FIFO_SRC_REG_A 0x2F // DLHC only |
#define LSM303_INT1_CFG_A 0x30 |
#define LSM303_INT1_SRC_A 0x31 |
#define LSM303_INT1_THS_A 0x32 |
#define LSM303_INT1_DURATION_A 0x33 |
#define LSM303_INT2_CFG_A 0x34 |
#define LSM303_INT2_SRC_A 0x35 |
#define LSM303_INT2_THS_A 0x36 |
#define LSM303_INT2_DURATION_A 0x37 |
#define LSM303_CLICK_CFG_A 0x38 // DLHC only |
#define LSM303_CLICK_SRC_A 0x39 // DLHC only |
#define LSM303_CLICK_THS_A 0x3A // DLHC only |
#define LSM303_TIME_LIMIT_A 0x3B // DLHC only |
#define LSM303_TIME_LATENCY_A 0x3C // DLHC only |
#define LSM303_TIME_WINDOW_A 0x3D // DLHC only |
#define LSM303_CRA_REG_M 0x00 |
#define LSM303_CRB_REG_M 0x01 |
#define LSM303_MR_REG_M 0x02 |
#define LSM303_OUT_X_H_M 0x03 |
#define LSM303_OUT_X_L_M 0x04 |
#define LSM303_OUT_Y_H_M -1 // The addresses of the Y and Z magnetometer output registers |
#define LSM303_OUT_Y_L_M -2 // are reversed on the DLM and DLHC relative to the DLH. |
#define LSM303_OUT_Z_H_M -3 // These four defines have dummy values so the library can |
#define LSM303_OUT_Z_L_M -4 // determine the correct address based on the device type. |
#define LSM303_SR_REG_M 0x09 |
#define LSM303_IRA_REG_M 0x0A |
#define LSM303_IRB_REG_M 0x0B |
#define LSM303_IRC_REG_M 0x0C |
#define LSM303_WHO_AM_I_M 0x0F // DLM only |
#define LSM303_TEMP_OUT_H_M 0x31 // DLHC only |
#define LSM303_TEMP_OUT_L_M 0x32 // DLHC only |
#define LSM303DLH_OUT_Y_H_M 0x05 |
#define LSM303DLH_OUT_Y_L_M 0x06 |
#define LSM303DLH_OUT_Z_H_M 0x07 |
#define LSM303DLH_OUT_Z_L_M 0x08 |
#define LSM303DLM_OUT_Z_H_M 0x05 |
#define LSM303DLM_OUT_Z_L_M 0x06 |
#define LSM303DLM_OUT_Y_H_M 0x07 |
#define LSM303DLM_OUT_Y_L_M 0x08 |
#define LSM303DLHC_OUT_Z_H_M 0x05 |
#define LSM303DLHC_OUT_Z_L_M 0x06 |
#define LSM303DLHC_OUT_Y_H_M 0x07 |
#define LSM303DLHC_OUT_Y_L_M 0x08 |
typedef struct { |
char acc_address; |
char mag_address; |
char device; |
} LSM303_DATA; |
enum magGain { |
magGain_13 = 0x20, magGain_19 = 0x40, |
magGain_25 = 0x60, magGain_40 = 0x80, |
magGain_47 = 0xA0, magGain_56 = 0xC0, |
magGain_81 = 0xE0 |
}; |
void LSM303_Init(LSM303_DATA *data, char device, char sa0); |
void LSM303_Begin(void); |
void LSM303_Write_A_Reg(char reg, char value); |
void LSM303_Write_M_Reg(char reg, char value); |
void LSM303_Set_Mag_Gain(enum magGain value); |
void LSM303_Read_Acc(int *x, int *y, int *z); |
void LSM303_Read_Mag(int *x, int *y, int *z); |
#endif |
//PIC Stuff/PICX_27J13/sensor_gyro_L3G.c |
---|
0,0 → 1,54 |
#include "defines.h" |
#include "sensor_gyro_L3G.h" |
#include "base_I2C.h" |
static L3G_DATA *l3g_data_p; |
void L3G_Init(L3G_DATA *data, char device, char sa0) { |
l3g_data_p = data; |
switch(device) { |
case L3G4200D_DEVICE: |
if (sa0 == L3G_SA0_LOW) |
l3g_data_p->address = L3G4200D_ADDRESS_SA0_LOW; |
else |
l3g_data_p->address = L3G4200D_ADDRESS_SA0_HIGH; |
break; |
case L3GD20_DEVICE: |
if (sa0 == L3G_SA0_LOW) |
l3g_data_p->address = L3GD20_ADDRESS_SA0_LOW; |
else |
l3g_data_p->address = L3GD20_ADDRESS_SA0_HIGH; |
break; |
default: |
break; |
} |
} |
void L3G_Begin() { |
char buffer[2]; |
// Normal power mode, all axes enabled |
buffer[0] = L3G_CTRL_REG1; |
buffer[1] = 0x0F; |
I2C_Master_Send(l3g_data_p->address, 2, buffer); |
char result; |
do { |
result = I2C_Get_Status(); |
} while (!result); |
} |
void L3G_Read(int* x, int* y, int* z) { |
char msg = L3G_OUT_X_L | 0x80; |
char buffer[6]; |
char result; |
I2C_Master_Restart(l3g_data_p->address, msg, 6); |
do { |
result = I2C_Get_Status(); |
} while (!result); |
I2C_Read_Buffer(buffer); |
// 0 = x_l, 1 = x_h, 2 = y_l, ... |
*x = buffer[1] << 8 | buffer[0]; |
*y = buffer[3] << 8 | buffer[2]; |
*z = buffer[5] << 8 | buffer[4]; |
} |
//PIC Stuff/PICX_27J13/sensor_gyro_L3G.h |
---|
0,0 → 1,59 |
#ifndef GYRO_L3G_H |
#define GYRO_L3G_H |
// Device Types |
#define L3G4200D_DEVICE 0 |
#define L3GD20_DEVICE 1 |
// SA0 States |
#define L3G_SA0_LOW 0 |
#define L3G_SA0_HIGH 1 |
// Slave Addresses |
#define L3G4200D_ADDRESS_SA0_LOW (0xD0 >> 1) |
#define L3G4200D_ADDRESS_SA0_HIGH (0xD2 >> 1) |
#define L3GD20_ADDRESS_SA0_LOW (0xD4 >> 1) |
#define L3GD20_ADDRESS_SA0_HIGH (0xD6 >> 1) |
// Register Addresses |
#define L3G_WHO_AM_I 0x0F |
#define L3G_CTRL_REG1 0x20 |
#define L3G_CTRL_REG2 0x21 |
#define L3G_CTRL_REG3 0x22 |
#define L3G_CTRL_REG4 0x23 |
#define L3G_CTRL_REG5 0x24 |
#define L3G_REFERENCE 0x25 |
#define L3G_OUT_TEMP 0x26 |
#define L3G_STATUS_REG 0x27 |
#define L3G_OUT_X_L 0x28 |
#define L3G_OUT_X_H 0x29 |
#define L3G_OUT_Y_L 0x2A |
#define L3G_OUT_Y_H 0x2B |
#define L3G_OUT_Z_L 0x2C |
#define L3G_OUT_Z_H 0x2D |
#define L3G_FIFO_CTRL_REG 0x2E |
#define L3G_FIFO_SRC_REG 0x2F |
#define L3G_INT1_CFG 0x30 |
#define L3G_INT1_SRC 0x31 |
#define L3G_INT1_THS_XH 0x32 |
#define L3G_INT1_THS_XL 0x33 |
#define L3G_INT1_THS_YH 0x34 |
#define L3G_INT1_THS_YL 0x35 |
#define L3G_INT1_THS_ZH 0x36 |
#define L3G_INT1_THS_ZL 0x37 |
#define L3G_INT1_DURATION 0x38 |
typedef struct { |
char address; |
} L3G_DATA; |
void L3G_Init(L3G_DATA *data, char device, char sa0); |
void L3G_Begin(void); |
void L3G_Read(int *x, int *y, int *z); |
#endif |