#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; }