aboutsummaryrefslogtreecommitdiff
path: root/src/temperature.c
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2026-04-12 18:32:41 +0530
committerAkshay Nair <phenax5@gmail.com>2026-04-12 18:32:41 +0530
commit9ed512b6863311ff53f07b76f6b679fa1ec6a9c9 (patch)
treedd5f27857fe106a8d1a6081d2837d4c9fcf87857 /src/temperature.c
parent2f23df99bc82ef2d06dd962599f1abb4b48fb556 (diff)
downloadtemperature-sensor-attiny84a-9ed512b6863311ff53f07b76f6b679fa1ec6a9c9.tar.gz
temperature-sensor-attiny84a-9ed512b6863311ff53f07b76f6b679fa1ec6a9c9.zip
Add thermocouple sensor SPI interface
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;
+}