Beispiel #1
0
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;
}
Beispiel #2
0
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);
    }
}
Beispiel #3
0
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();
	}
}
Beispiel #4
0
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;
		}
	}
}