From 9ed512b6863311ff53f07b76f6b679fa1ec6a9c9 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 12 Apr 2026 18:32:41 +0530 Subject: Add thermocouple sensor SPI interface --- src/main.c | 8 +++++--- src/temperature.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/temperature.h | 11 +++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 src/temperature.c create mode 100644 src/temperature.h (limited to 'src') 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 #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 +#include + +#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); -- cgit v1.3.1