Вс июл 02, 2023 17:07:33
#define F_CPU 4800000L
//подключаем заголовочные файлы
#include <avr/io.h>
#include <avr/signal.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//задаёмся прототипом функции, чтения данных датчика ds18b20
void temperature(void);
int8_t volatile termo; //переменная для данных температуры
int main(void)
{
while(1)
{
temperature() ; // функцию read ds18b20
}
return 0;
}
//----------
uint8_t therm_reset() //функция подготовки ds18b20
{
uint8_t i; // переменная
PORTB&=~(1<<3); //устанавливаем порт PB3 как низкий уровень
DDRB|=(1<<3); //активируем PB3 как выход
_delay_us(480);//--480 // ждём
DDRB&=~(1<<3); //активируем PB3 как вход
_delay_us(60);//--60
i=(PINB & (1<<3)); //читаем
_delay_us(420);//--420
return i; // возвращаем "1" ok
}
//----------
//запись бита
void therm_write_bit(uint8_t bit)
{
PORTB&=~(1<<3);
DDRB|=(1<<3);
_delay_us(2);//---2
if(bit) DDRB&=~(1<<3);
_delay_us(60);//--60
DDRB&=~(1<<3);
}
//----------
//запись байта
void therm_write_byte(uint8_t byte)
{
uint8_t i=8;
while(i--)
{
therm_write_bit(byte&1);
byte>>=1;
}
}
//----------
//чтение бита
uint8_t therm_read_bit(void)
{
uint8_t bit=0;
PORTB&=~(1<<3);
DDRB|=(1<<3);
_delay_us(2);//2
DDRB&=~(1<<3);
_delay_us(14);//--14
if(PINB&(1<<3)) bit=1;
_delay_us(45);//--45
return bit;
}
//----------
//чтение байта
uint8_t therm_read_byte(void)
{
uint8_t i=8, n=0;
while(i--)
{
n>>=1;
n|=(therm_read_bit()<<7);
}
return n;
}
//----------
void temperature(void)
{
asm("cli");
uint8_t temperature[2];
therm_reset();
therm_write_byte(0xcc);
therm_write_byte(0x44);
while(!therm_read_bit());
therm_reset();
therm_write_byte(0xcc);
therm_write_byte(0xbe);
temperature[0]=therm_read_byte();
temperature[1]=therm_read_byte();
therm_reset();
// обрабатываем полученные данные в читаемый вид
termo=temperature[0]>>4;
termo|=(temperature[1]&0xf)<<4;
}
//---------- обработки ds18b20----------------
Вс июл 02, 2023 17:10:49
Вс июл 02, 2023 17:27:14
Вс июл 02, 2023 18:11:12
ОК будет, если вернется НОЛЬ. если вернется"1", то ответа от датчика нет.WorkPage писал(а):return i; // возвращаем "1" ok
Вс июл 02, 2023 23:00:26
Пн июл 03, 2023 09:16:15
Пн июл 03, 2023 09:23:02
Пн июл 03, 2023 11:15:55
Пн июл 03, 2023 11:20:44
Чт июл 13, 2023 16:30:18
Ср авг 09, 2023 22:11:37
Не всегда. Китайские клоны отдают после сброса последнюю измеренную температуру, поскольку запоминают ее в еепромке.Martian писал(а):И еще можно считать 85 после сброса.
Ср авг 09, 2023 22:23:48
WorkPage писал(а):Сделал проверку контрольной суммы. Убил двх зайцев. Температура точно будет без искажений и присутствие датчика покажет при CRC==0
Всем спасибо. Вопрос закрыт.
Не закрыт.))
по одному только CRC==0 нельзя сказать точно есть датчик или нет...
При отсутствии датчика CRC будет не 0. Проверено.
Чт авг 10, 2023 14:38:21
Чт авг 10, 2023 16:13:30
Чт авг 10, 2023 17:07:00
Starichok51 писал(а):CRC с девятью байтами 0xFF
roman.com писал(а):CRC с девятью байтами 0x00
Чт авг 10, 2023 17:42:05
Чт авг 10, 2023 19:33:10
Чт авг 10, 2023 22:43:37
Чт авг 10, 2023 23:45:05
Пт авг 11, 2023 08:38:20
это ты делаешь через попу, а не Dallas.roman.com писал(а):но у Dallas всё через... попу))