int16_t lome6_get_temperature (struct ow_rom_code_t *rom) { int16_t retval = 0x7FFF; // error // disable interrupts uint8_t sreg = SREG; cli(); struct ow_temp_scratchpad_t sp; if (ow_temp_read_scratchpad(rom, &sp) != 1) goto out; // scratchpad read failed uint16_t temp = ow_temp_normalize(rom, &sp); retval = ((int8_t) HI8(temp)) * 10 + HI8(((temp & 0x00ff) * 10) + 0x80); out: sei(); SREG = sreg; return retval; }
/*This function will be called every 800 ms*/ void ow_periodic(void) { /*At startup we want an immediate discovery*/ static uint16_t discover_delay = 3; if (--discover_delay == 0) { discover_delay = OW_DISCOVER_DELAY; ow_discover_sensor(); #ifdef DEBUG_OW_POLLING for (uint8_t i = 0, k = 0; i < OW_SENSORS_COUNT; i++) { if (ow_sensors[i].ow_rom_code.raw != 0) { debug_printf("sensor #%d in list is: %02x %02x %02x %02x %02x %02x %02x %02x\n", ++k, ow_sensors[i].ow_rom_code.bytewise[0], ow_sensors[i].ow_rom_code.bytewise[1], ow_sensors[i].ow_rom_code.bytewise[2], ow_sensors[i].ow_rom_code.bytewise[3], ow_sensors[i].ow_rom_code.bytewise[4], ow_sensors[i].ow_rom_code.bytewise[5], ow_sensors[i].ow_rom_code.bytewise[6], ow_sensors[i].ow_rom_code.bytewise[7]); } } #endif /* DEBUG_OW_POLLING */ } for (uint8_t i = 0; i < OW_SENSORS_COUNT; i++) { if (ow_temp_sensor(&ow_sensors[i].ow_rom_code)) { if (ow_sensors[i].converted == 1) { if (ow_sensors[i].convert_delay == 1) ow_sensors[i].convert_delay = 0; else { #ifdef DEBUG_OW_POLLING debug_printf("reading temperature\n"); #endif /* DEBUG_OW_POLLING */ int8_t ret; ow_temp_scratchpad_t sp; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = ow_temp_read_scratchpad(&ow_sensors[i].ow_rom_code, &sp); } if (ret != 1) { #ifdef DEBUG_OW_POLLING debug_printf("scratchpad read failed: %d\n", ret); #endif /* DEBUG_OW_POLLING */ return; } #ifdef DEBUG_OW_POLLING debug_printf("scratchpad read succeeded\n"); #endif /* DEBUG_OW_POLLING */ int16_t temp = ow_temp_normalize(&ow_sensors[i].ow_rom_code, &sp); #ifdef DEBUG_OW_POLLING debug_printf("temperature: %d.%d\n", HI8(temp), LO8(temp) > 0 ? 5 : 0); #endif /* DEBUG_OW_POLLING */ ow_sensors[i].temp = ((int8_t) HI8(temp)) * 10 + HI8(((temp & 0x00ff) * 10) + 0x80); ow_sensors[i].converted = 0; } } if (--ow_sensors[i].read_delay == 0 && ow_sensors[i].converted == 0) { ow_sensors[i].read_delay = OW_READ_DELAY; ow_temp_start_convert_nowait(&ow_sensors[i].ow_rom_code); ow_sensors[i].convert_delay = 1; ow_sensors[i].converted = 1; } } } }