aboutsummaryrefslogtreecommitdiff
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
parent2f23df99bc82ef2d06dd962599f1abb4b48fb556 (diff)
downloadtemperature-sensor-attiny84a-9ed512b6863311ff53f07b76f6b679fa1ec6a9c9.tar.gz
temperature-sensor-attiny84a-9ed512b6863311ff53f07b76f6b679fa1ec6a9c9.zip
Add thermocouple sensor SPI interface
-rw-r--r--compile_flags.txt1
-rw-r--r--justfile6
-rw-r--r--src/main.c8
-rw-r--r--src/temperature.c49
-rw-r--r--src/temperature.h11
5 files changed, 69 insertions, 6 deletions
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 <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);