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 --- compile_flags.txt | 1 + justfile | 6 +++--- src/main.c | 8 +++++--- src/temperature.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/temperature.h | 11 +++++++++++ 5 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 src/temperature.c create mode 100644 src/temperature.h diff --git a/compile_flags.txt b/compile_flags.txt index 8d56fa5..8720d77 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -3,6 +3,7 @@ -std=gnu99 -Isrc -mmcu=attiny84a +-DF_CPU=1000000L -I/nix/store/ivhsczriimr31rrmly0bcj03gv4qa3q7-avr-libc-avr-2.2.1/avr/include -L/nix/store/ivhsczriimr31rrmly0bcj03gv4qa3q7-avr-libc-avr-2.2.1/avr/lib -funsigned-char diff --git a/justfile b/justfile index 567f3c6..f16fda3 100644 --- a/justfile +++ b/justfile @@ -5,16 +5,16 @@ default: echo - AVR_LIBC := env("AVR_LIBC", "/usr/lib/avr") -# F_CPU := "32768" +F_CPU := "1000000" MCU := "attiny84a" MCU_PART := "attiny84" -SRCS := "src/main.c src/display.c" +SRCS := "src/main.c src/display.c src/temperature.c" OUTDIR := "./out" PROGRAMMER := "arduino" UPLOAD_SPEED := "19200" SERIAL_PORT := "/dev/ttyUSB0" -CFLAGS := f"-g -Os -std=gnu99 -Isrc -mmcu={{MCU}} \ +CFLAGS := f"-g -Os -std=gnu99 -Isrc -mmcu={{MCU}} -DF_CPU={{F_CPU}}L \ -I{{AVR_LIBC}}/avr/include -L{{AVR_LIBC}}/avr/lib \ -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall" 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