Files
pa50contr/temp.c
Олег Бородин f38727054d update
2024-08-27 11:29:20 +02:00

88 lines
1.9 KiB
C

#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <tool.h>
#include <temp.h>
uint8_t ds18b20_reset() {
uint8_t error;
REG_SETDOWN_BIT(DS18B20_PORT, DS18B20_PB);
REG_SETUP_BIT(DS18B20_DDR, DS18B20_PB);
_delay_us(480);
REG_SETDOWN_BIT(DS18B20_DDR, DS18B20_PB);
_delay_us(60);
error = REG_BIT_VALUE(DS18B20_PIN, DS18B20_PB);
_delay_us(420);
return error;
}
void ds18b20_write_bit(uint8_t bit) {
REG_SETDOWN_BIT(DS18B20_PORT, DS18B20_PB);
REG_SETUP_BIT(DS18B20_DDR, DS18B20_PB);
_delay_us(1);
if (bit) {
REG_SETDOWN_BIT(DS18B20_DDR, DS18B20_PB);
}
_delay_us(60);
REG_SETDOWN_BIT(DS18B20_DDR, DS18B20_PB);
}
uint8_t ds18b20_read_bit(void) {
uint8_t bit = 0x00;
REG_SETDOWN_BIT(DS18B20_PORT, DS18B20_PB);
REG_SETUP_BIT(DS18B20_DDR, DS18B20_PB);
_delay_us(1);
REG_SETDOWN_BIT(DS18B20_DDR, DS18B20_PB);
_delay_us(14);
if (REG_BIT_VALUE(DS18B20_PIN, DS18B20_PB)) {
bit = 0x01;
}
_delay_us(45);
return bit;
}
void ds18b20_write_byte(uint8_t byte) {
int i = 8;
while (i--) {
ds18b20_write_bit(byte & 0x01);
byte >>= 1;
}
}
uint8_t ds18b20_read_byte(void) {
uint8_t i = 8, byte = 0;
while (i--) {
byte >>= 1;
byte |= (ds18b20_read_bit() << 7);
}
return byte;
}
#define TEMP_SCALE 63
uint16_t ds18b20_get_temp() {
uint8_t ltemp;
uint8_t htemp;
uint16_t temp = 0;
ds18b20_reset();
ds18b20_write_byte(DS18B20_CMD_SKIPROM);
ds18b20_write_byte(DS18B20_CMD_CONVERTTEMP);
while (!ds18b20_read_bit());
ds18b20_reset();
ds18b20_write_byte(DS18B20_CMD_SKIPROM);
ds18b20_write_byte(DS18B20_CMD_RSCRATCHPAD);
ltemp = ds18b20_read_byte();
htemp = ds18b20_read_byte();
temp = ((htemp << 8) | ltemp) * TEMP_SCALE / 10;
return temp;
}