Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
1

Как считать уникальный 64бит. номер датчика DS18B20

09.04.2018, 13:24. Показов 1988. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Подскажите, как прочитать уникальный код датчика DS18B20.
Что делаю я:
1) Создаю функцию для передач команды на датчик.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void write_18b20(unsigned char dat)
{
    unsigned char i;
    for(i = 0;i < 8;i++)
    {
        DDRC |= (1 << PC0);
        _delay_us(2);
        if(dat & 0x01)
        {
            DDRC &= ~(1 << PC0);
        }
        else
        {
            DDRC |= (1 << PC0);
        }
        dat = dat >> 1;
        _delay_us(62);
        DDRC &= ~(1 << PC0);
        _delay_us(2);
    }
}
2) После чего создаю функция для чтения 64 битного уникального номера.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uint64_t read_unique_serial_code (){
    uint64_t unique_serial = 0x0000000000000000; // Переменная для хранения номера.
    for (uint8_t i=0; i!=64; i++){ // Начало цикла
        DDRC |=(1 << DDC0);
            _delay_us(2);
                DDRC &= ~ (1 << DDC0);
                    _delay_us(4);
        
        
        if (PINC & (1 << PC0)){
            unique_serial |= 0x8000000000000000; // Если на входе еденица, записываем в самый старший разряд лог 1.
        } else {
            unique_serial &= ~ 0x8000000000000000; // Если на входе нуль, записываем в самый старший разряд лог 0.
        }   unique_serial = (unique_serial >> 1);  // Сдвигаем на одни разряд.
    } // Конец цикла.
    
    return unique_serial;
}
3) В главной функции делаю следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
int main (void){
    
    LCD_INIT(); // Инициализация ЖКИ дисплея.
    reset_DS18B20(); // Сброс датчиков DS18B20
 
    precense_DS18B20 == 1 ? LCD_STRING("DS18B20 works") : LCD_STRING("DS18B20 doesn't work"); // Вывод отведа датчика на дисплей.
    _delay_ms(1000);
    LCD_COM(0x01); // Очиска
 
    uint64_t unique_serial = 0x0000000000000000; // Переменная для уникального серийного номера.
    
    reset_DS18B20(); // Повторный сброс датчика
    write_18b20(0x33); // Чтения ROM датчика.
    unique_serial = read_unique_serial_code(); // Чтение уникального номера датчика.
    
    
    // Дальше код для формирования байтового представления уникального серийника.
    for (uint8_t i=0; i!=8; i++){
        uint8_t temp = 0x00;
        if (unique_serial & (1 << 63))
            temp |= (1 << 0);
        if (unique_serial & (1 << 62))
        temp |= (1 << 1);
        if (unique_serial & (1 << 61))
        temp |= (1 << 2);
        if (unique_serial & (1 << 60))
        temp |= (1 << 3);
        if (unique_serial & (1 << 59))
        temp |= (1 << 4);
        if (unique_serial & (1 << 58))
        temp |= (1 << 5);
        if (unique_serial & (1 << 57))
        temp |= (1 << 6);
        if (unique_serial & (1 << 56))
        temp |= (1 << 7);
        
        for (uint8_t j = 0; j!=8; j++){
            if (temp & 0x80)
                LCD_DATA ('1');
                else
                    LCD_DATA('0');
                        temp = (temp << 1);
        }
        
        
        unique_serial = (unique_serial << 8); // Сдвигаем на 8 разрядов.
        _delay_ms(1000); // Задержка
        LCD_COM(0x01); // Очиска дисплея.
    }
 
    
 
 
    while (true){}
 
    return 0;
    
}
Тестирую все в протеусе. Никакого уникального кода не находит.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2018, 13:24
Ответы с готовыми решениями:

Как повысить скорость снятия температуры с датчика DS18B20?
Работаю над неким проэктом где очень важно максимально точно поддерживать температуру. Столкнулся с...

Четыре датчика DS18B20 и динамическая индикация
Здравствуйте! Есть следующая задача. Рожается контроллер нагревателя, который содержит в своем...

ds18b20 два датчика сравнить с переменной
не знаю как точнее назвать тему, задача в следующем нужно, допустим: если температура второго...

[ Решено] Чтение датчика DS18b20 в опен драй. Не работает.
Взял за основу механизм работы датчика описанный здесь. http://mycontroller.ru/old_site/stm32-d ......

1
125 / 43 / 12
Регистрация: 23.03.2018
Сообщений: 169
10.04.2018, 18:36 2
В протеусе подключи осциллоограф. Должен увидеть такую картину:
1. опускание порта на 480 мкс,
2. поднятие порта на 60 мкс
3. опускание на 200
4. поднятие на 60 мкс примерно, может быть меньше.
5. потом последовательность коротких (5 мкс) или чуть длиннее 45 мкс 8 битов, это то, что ты отправляешь.
6. после этого 16 коротких падений.
Некоторые из этих 16 падений должны быть чуть длиннее - это единицы. - это и есть его номер.
И смотрите, что в сигнале осциллографа не так. И поймете какой этап у вас не срабатывает.
0
10.04.2018, 18:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2018, 18:36
Помогаю со студенческими работами здесь

Функция чтения ROM-кода для датчика DS18b20
Здравствуйте. Я смог подключить один датчик DS18b20 и считать с него данные, но с пропуском чтения...

Отображение отрицательных значений на индикаторе TM1637 с датчика DS18B20
Здравствуйте.Помогите решить задачу! Проблема с датчиком DS18B20 и сегментным индикатором TM1637 у...

Cчитывание измеренной температуры с датчика DS18B20 в Excel, используя библиотеку RSAPI.DLL
Собрала электронный термометр в соответствии со схемой представленной на странице:...

Как считать показания датчика
Есть ИК датчик дальномер,есть мега8 с портами АЦП как мне посмотреть получаемые параметры,...

64бит ос на виртуалке под 32бит ос, процессор 64бит
Конкретно интересует следующее: Возможно ли запустить x64 ОС на виртуалке (VMware, например) из-под...

Как программно считать температуру цп с датчика температуры?
Как программно считать температуру цп с датчика температуры?

Как вывести уникальный номер ПК?
Здравствуйте! Хочу привязать программу к ПК, но для этого нужно что бы программа выдавала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru