diff options
| author | Akshay Nair <phenax5@gmail.com> | 2026-04-12 18:32:41 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2026-04-12 18:32:41 +0530 |
| commit | 9ed512b6863311ff53f07b76f6b679fa1ec6a9c9 (patch) | |
| tree | dd5f27857fe106a8d1a6081d2837d4c9fcf87857 /src | |
| parent | 2f23df99bc82ef2d06dd962599f1abb4b48fb556 (diff) | |
| download | temperature-sensor-attiny84a-9ed512b6863311ff53f07b76f6b679fa1ec6a9c9.tar.gz temperature-sensor-attiny84a-9ed512b6863311ff53f07b76f6b679fa1ec6a9c9.zip | |
Add thermocouple sensor SPI interface
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.c | 8 | ||||
| -rw-r--r-- | src/temperature.c | 49 | ||||
| -rw-r--r-- | src/temperature.h | 11 |
3 files changed, 65 insertions, 3 deletions
@@ -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); |
