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/temperature.c | |
| parent | 2f23df99bc82ef2d06dd962599f1abb4b48fb556 (diff) | |
| download | temperature-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.c | 49 |
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; +} |
