static int8_t ow_record_temp(uint8_t dummy __attribute__((unused))) { char *p, *q; uint16_t tu; int16_t t = (int16_t)((uint16_t)ow_read_buf[0] | ((uint16_t)(ow_read_buf[1]) << 8)) / 2; int8_t count_remain = ow_read_buf[6]; int16_t t_16 = 16*t - count_remain + (16 - 4); p= last_temp_buf; if (t_16 < 0) { *p++ = '-'; tu= (uint16_t)0 - (uint16_t)t_16; } else tu= (uint16_t)t_16; p= sprint_uint16_b10(p, tu/16); *p++ = '.'; q= sprint_uint16_b10(p, tu%16*(10000/16)); p+= 4; while (q < p) *q++ = '0'; *p= '\0'; /* Schedule a new temperature measurement in a bit. */ reset_cmds(ow_cmds_read_temp_simple); ow_delay_ms(250); /* Hack: return error; this way we avoid updating the cmd counter after return, which would cause us to skip the first step of the second round. */ return -1; }
main(void) { serial_baud_9600(); serial_mode_8e1(); serial_transmitter_enable(); sleep_mode_idle(); /* setup timer2 to trigger interrupt a * once every millisecond * 128 * (124 + 1) / 16MHz = 1ms */ timer2_mode_ctc(); timer2_clock_d128(); timer2_compare_a_set(124); timer2_interrupt_a_enable(); adc_reference_internal_5v(); adc_pin_select(5); adc_clock_d128(); adc_trigger_freerunning(); adc_trigger_enable(); adc_interrupt_enable(); adc_enable(); sei(); while (1) { char *p; p = sprint_uint16_b10(buf, value); *p++ = '\n'; *p = '\0'; serial_puts(buf); } }
main() { pin13_mode_output(); serial_baud_9600(); serial_mode_8e1(); serial_transmitter_enable(); sleep_mode_idle(); /* setup timer2 to trigger interrupt a * once every millisecond */ timer2_mode_ctc(); timer2_compare_a_set(124); timer2_clock_d128(); timer2_interrupt_a_enable(); sei(); while (1) { uint16_t now = time; if (now >= 6000) { char *p; timer2_clock_reset(); time = 0; p = sprint_uint16_b10(buf, now); *p++ = '\n'; *p = '\0'; serial_puts(buf); } sleep_enable(); sleep_cpu(); sleep_disable(); } }
main() { uint8_t state = 0; serial_baud_9600(); serial_mode_8e1(); serial_transmitter_enable(); sleep_mode_idle(); pin13_mode_output(); pin13_low(); /* setup timer2 to trigger interrupt a * once every millisecond * 128 * (124 + 1) / 16MHz = 1ms */ timer2_mode_ctc(); timer2_clock_d128(); timer2_compare_a_set(124); timer2_interrupt_a_enable(); adc_reference_internal_5v(); adc_pin_select(5); adc_clock_d128(); adc_trigger_freerunning(); adc_trigger_enable(); adc_interrupt_enable(); adc_enable(); sei(); while (1) { uint16_t value; cli(); if (!new_value) { sleep_enable(); sei(); sleep_cpu(); sleep_disable(); continue; } sei(); value = adc_data(); new_value = 0; if (state && value < BOUND_LOW) { uint16_t now = time; char *p; timer2_clock_reset(); time = 0; pin13_low(); p = sprint_uint16_b10(buf, now); *p++ = '\n'; *p = '\0'; serial_puts(buf); state = 0; continue; } if (value > BOUND_HIGH) { pin13_high(); state = 1; } } }