Raw Text Content QR
fish-crow-koala



#include "ds18b20.h"
#include <util/delay.h>

#define OW_DDR DDRB
#define OW_PORT PORTB
#define OW_PIN PINB
#define OW_BIT PB0

static void ow_drive_low(void) { OW_DDR |= (1 << OW_BIT); OW_PORT &= ~(1 << OW_BIT); }
static void ow_release(void)  { OW_DDR &= ~(1 << OW_BIT); OW_PORT |= (1 << OW_BIT); }
static uint8_t ow_read(void)  { return (OW_PIN & (1 << OW_BIT)) ? 1 : 0; }

void ds18b20_init(void) {
	OW_DDR &= ~(1 << OW_BIT);
	OW_PORT |= (1 << OW_BIT);
}

uint8_t ow_reset(void) {
	uint8_t presence;
	ow_drive_low();
	_delay_us(480);
	ow_release();
	_delay_us(70);
	presence = !ow_read();
	_delay_us(410);
	return presence;
}

void ow_write_bit(uint8_t bit) {
	ow_drive_low();
	if (bit) { _delay_us(6); ow_release(); _delay_us(64); }
	else     { _delay_us(60); ow_release(); _delay_us(10); }
}

uint8_t ow_read_bit(void) {
	uint8_t bit;
	ow_drive_low();
	_delay_us(6);
	ow_release();
	_delay_us(9);
	bit = ow_read();
	_delay_us(55);
	return bit;
}

void ow_write_byte(uint8_t byte) {
	for (uint8_t i = 0; i < 8; i++) {
		ow_write_bit(byte & 0x01);
		byte >>= 1;
	}
}

uint8_t ow_read_byte(void) {
	uint8_t byte = 0;
	for (uint8_t i = 0; i < 8; i++) {
		byte >>= 1;
		if (ow_read_bit()) byte |= 0x80;
	}
	return byte;
}

int16_t ds18b20_read_temp(void) {
	if (!ow_reset()) return -1000;
	ow_write_byte(0xCC); // Skip ROM
	ow_write_byte(0x44); // Convert T
	for (uint16_t i = 0; i < 750; i++) {
		_delay_ms(1);
		if (ow_read()) break;
	}
	if (!ow_reset()) return -1000;
	ow_write_byte(0xCC); // Skip ROM
	ow_write_byte(0xBE); // Read Scratchpad
	uint8_t temp_l = ow_read_byte();
	uint8_t temp_h = ow_read_byte();
	return (temp_h << 8) | temp_l;
}

Read 6 times, last 51 minutes ago