From 7caffb47d6fc9426b2f65ad6bdd6197b324fb68a Mon Sep 17 00:00:00 2001 From: Bernhard Tittelbach Date: Sun, 12 Jun 2016 06:59:34 +0200 Subject: basic bmp280 lib (mostly adafruit reimplementation) and example --- usb-bmp280/usb-bmp280.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 usb-bmp280/usb-bmp280.c (limited to 'usb-bmp280/usb-bmp280.c') diff --git a/usb-bmp280/usb-bmp280.c b/usb-bmp280/usb-bmp280.c new file mode 100644 index 0000000..0c19545 --- /dev/null +++ b/usb-bmp280/usb-bmp280.c @@ -0,0 +1,120 @@ +/* + * spreadspace avr utils - usb-bmp180 example + * + * + * Copyright (C) 2016 Bernhard Tittelbach + * basically this is refactored and enhanced code from: + * https://github.com/sparkfun/BMP180_Breakout_Arduino_Library + * Please buy the sparkfun people Beer when you see them!!!! + * + * This file is part of spreadspace avr utils. + * + * spreadspace avr utils is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * spreadspace avr utils is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with spreadspace avr utils. If not, see . + */ + +#include +#include +#include +#include +#include + +#include + +#include "util.h" +#include "led.h" +#include "usbio.h" +#include "bmp280.h" + +#define ALTITUDE 353.0 // Altitude of Graz in Austria + +#define PIN_CS_S0 PD1 +#define REG_CS_S0 PIND +#define PIN_CS_S1 PD0 +#define REG_CS_S1 PIND + +#define OP_SETBIT |= +#define OP_CLEARBIT &= ~ +#define OP_CHECK & +#define PIN_SW(PORTDDRREG, PIN, OP) PORTDDRREG OP (1 << PIN) + +#define PINREG(x) x +#define DDRREG(x) *(&x+1) +#define PORTREG(x) *(&x+2) + +#define HIGHv OP_SETBIT +#define LOWv OP_CLEARBIT + +#define CS_SENSOR_0(LOWHIGH) (PIN_SW(PORTREG(REG_CS_S0),PIN_CS_S0,LOWHIGH)) +#define CS_SENSOR_1(LOWHIGH) (PIN_SW(PORTREG(REG_CS_S1),PIN_CS_S1,LOWHIGH)) +#define CS_SENSOR(x,LOWHIGH) CS_SENSOR_##x(LOWHIGH) + +void printCoeffs(bmp280_sensor *sensor) +{ + printf("Coeffients\r\n"); + printf("T1: %d, T2: %d, T3: %d\r\n", sensor->dig_T1, sensor->dig_T2, sensor->dig_T3); + printf("P1: %d, P2: %d, P3: %d, P4: %d, P5: %d, P6: %d, P7: %d, P8: %d, P9: %d\r\n",sensor->dig_P1,sensor->dig_P2,sensor->dig_P3,sensor->dig_P4,sensor->dig_P5,sensor->dig_P6,sensor->dig_P7,sensor->dig_P8,sensor->dig_P9); + printf("H1: %d, H2: %d, H3: %d, H4: %d, H5: %d, H6: %d\r\n",sensor->dig_H1,sensor->dig_H2,sensor->dig_H3 + ,sensor->dig_H4,sensor->dig_H5,sensor->dig_H6); +} + +int main(void) +{ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + cpu_init(); + led_init(); + usbio_init(); + sei(); + + bmp280_sensor sensor0; + bmp280_sensor sensor1; + + CS_SENSOR(0,HIGHv); + CS_SENSOR(1,HIGHv); + SPI_Init(BMP280_LUFA_SPIO_OPTIONS); + bmp280_init(&sensor0, &PORTREG(REG_CS_S0), PIN_CS_S0); + bmp280_init(&sensor1, &PORTREG(REG_CS_S1), PIN_CS_S1); + + printf("BMP280 initialized"); + + for(;;) { + + printf("\r\n== Sensor 0 ==\r\n"); + printCoeffs(&sensor0); + float temp = bmp280_readTemp(&sensor0); + float pressure = bmp280_readPressure(&sensor0); + printf("\r\nPressure: %.2f Pa @ %.2f degC\r\n", pressure, temp); + + printf("\r\n== Sensor 1 ==\r\n"); + printCoeffs(&sensor1); + temp = bmp280_readTemp(&sensor1); + pressure = bmp280_readPressure(&sensor1); + printf("\r\nPressure: %.2f Pa @ %.2f degC\r\n", pressure, temp); + + usbio_task(); + + int16_t BytesReceived = usbio_bytes_received(); + while(BytesReceived > 0) { + int ReceivedByte = fgetc(stdin); + if(ReceivedByte != EOF) { + if (ReceivedByte == '!') + reset2bootloader(); + } + BytesReceived--; + } + + _delay_ms(2000); // Pause for 5 seconds. + } +} -- cgit v1.2.3