aboutsummaryrefslogtreecommitdiff
path: root/src/temperature.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/temperature.c')
-rw-r--r--src/temperature.c49
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;
+}