Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 158 → Rev 159

/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