diff options
Diffstat (limited to 'src/temperature.c')
| -rw-r--r-- | src/temperature.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/temperature.c b/src/temperature.c new file mode 100644 index 0000000..b804fc9 --- /dev/null +++ b/src/temperature.c @@ -0,0 +1,49 @@ +#include <avr/io.h> +#include <util/delay.h> + +#include "temperature.h" + +void temperature_init(void) { + THERMO_DDR |= (1 << THERMO_CS) | (1 << THERMO_SCK); + THERMO_DDR &= ~(1 << THERMO_MISO); + THERMO_PORT |= (1 << THERMO_CS); +} + +uint8_t spi_read8(void) { + int i; + uint8_t data = 0; + + for (i = 7; i >= 0; i--) { + THERMO_PORT &= ~(1 << THERMO_SCK); + _delay_us(SPI_DELAY_US); + if (PINA & (1 << THERMO_MISO)) + data |= (1 << i); + + THERMO_PORT |= (1 << THERMO_SCK); + _delay_us(SPI_DELAY_US); + } + + return data; +} + +uint16_t spi_read16(void) { + uint16_t data; + _delay_us(SPI_DELAY_US); + data = spi_read8(); + data <<= 8; + data |= spi_read8(); + return data; +} + +float temperature_read(void) { + THERMO_PORT &= ~(1 << THERMO_CS); + uint16_t v = spi_read16(); + THERMO_PORT |= (1 << THERMO_CS); + + // invalid temp + if (v & 0x4) + return 999.9; + + v >>= 3; + return v * 0.25; +} |
