aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c8
-rw-r--r--src/temperature.c49
-rw-r--r--src/temperature.h11
3 files changed, 65 insertions, 3 deletions
diff --git a/src/main.c b/src/main.c
index 1b804b7..513d8b3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3,14 +3,16 @@
#include <util/delay.h>
#include "display.h"
+#include "temperature.h"
int main(void) {
display_init();
- int n = 1;
+ temperature_init();
+ float temperature = 0;
while (1) {
- display_draw_float2(1.01 * n);
- n = (n + 1) % 100;
+ temperature = temperature_read();
+ display_draw_float2(temperature);
_delay_ms(1000);
}
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;
+}
diff --git a/src/temperature.h b/src/temperature.h
new file mode 100644
index 0000000..31fa92a
--- /dev/null
+++ b/src/temperature.h
@@ -0,0 +1,11 @@
+#define THERMO_MISO PA0
+#define THERMO_SCK PA1
+#define THERMO_CS PA2
+#define THERMO_PORT PORTA
+#define THERMO_DDR DDRA
+
+#define SPI_DELAY_US 10
+
+void temperature_init(void);
+
+float temperature_read(void);