Rather than using a full w1_read_byte() to wait for the temperature
sensor to indicate a result is ready introduce a w1_read_bit() and
use that instead. This lets us service USB requests more often while
waiting for the result.
w1_write(0x44); /* Convert T */
temp_state = 4;
} else if (temp_state == 4) {
- if (w1_read_byte() == 0xFF)
+ if (w1_read_bit())
temp_state = 5;
} else if (temp_state == 5) {
if (w1_reset()) {
}
}
+bool w1_read_bit()
+{
+ bool val;
+
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ /* Pull low for 6µs */
+ DDRB |= 1 << W1_PIN;
+ _delay_us(6);
+ /* Release for 9µs */
+ DDRB &= ~(1 << W1_PIN);
+ _delay_us(9);
+
+ /* Read the line state */
+ val = ((PINB >> W1_PIN) & 1);
+ }
+ _delay_us(55);
+
+ return val;
+}
+
uint8_t w1_read_byte()
{
uint8_t i, val;
val = 0;
for (i = 0; i < 8; i++) {
- ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
- {
- /* Pull low for 6µs */
- DDRB |= 1 << W1_PIN;
- _delay_us(6);
- /* Release for 9µs */
- DDRB &= ~(1 << W1_PIN);
- _delay_us(9);
-
- /* Read the line state */
- val |= ((PINB >> W1_PIN) & 1) << i;
- }
-
- _delay_us(55);
+ if (w1_read_bit())
+ val |= (1 << i);
}
return val;
uint8_t w1_crc(uint8_t *buf, uint8_t len);
void w1_write(uint8_t val);
+bool w1_read_bit();
uint8_t w1_read_byte();
void w1_read(uint8_t *buf, uint8_t len);
bool w1_reset(void);