Перейти к содержанию

Инициализация DS18B20


Рекомендуемые сообщения

все вопросы снимаются.

покопался в интернете и нашел ответы.

X8 + X5 + X4 + 1 - это число 0х31. и сдвигать нужно влево, проверяя старший бит.

1 - это X0

X8 - отбрасывается, показывает только степень полинома. в данном случае 8 - один байт.

"зеркальное" к нему число 0х8С, с которым сдвиг делается вправо и проверяется младший бит.

 

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

если интересно, то для тебя добавлю:

поскольку из датчика информация идет младшим битом вперед, то и считать контрольную сумму надо начинать с младшего бита.

а это означает, что сдвигать байты нужно вправо и использовать "зеркальное" число.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

14 часа назад, Starichok сказал:

а это означает, что сдвигать байты нужно вправо и использовать "зеркальное" число

При условии использования готовй библиотечной функции для подсчета CRC знать эти тонкости совсем не обязательно.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

человек на правильном пути. он нашел библиотеку, но ему интересно знать тонкости.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Здравствуйте @ARV  и @Starichok . Из приведенного Вами примера выше стал изучать указатели.

Еще раз спасибо Вам за участие и помощь.

Хотя по поводу использования локальных переменных в функциях в глобальной видимости пока ничего не нашел. 

В 25.06.2019 в 13:02, kostya_unix сказал:

Или есть другой способ отобразить, в данном случае, возвращаемые данные на LCD_дисплее?

Это по поводу моего вопроса и моих поисков ответа по нему - же.

Ссылка на комментарий
Поделиться на другие сайты

Только что, kostya_unix сказал:

Хотя по поводу использования локальных переменных в функциях в глобальной видимости пока ничего не нашел

У вас как-то, похоже, перепутано что-то.

Глобальная переменная в модуле видна везде "ниже по тексту". Если эта глобальная переменная описана, как static, она не видна в других модулях нигде, если не описана как static, то линкер найдет её, хотя, вероятно, будет warning (лучше стараться избегать такого путем описания в h-файле этой переменной с префиксом extern, тогда все будет идеально правильно).

Внутри функции вы можете использовать любые видимые переменные, включая локальные. Наружу из функции результат выдается традиционно - возвратом значения функции (при помощи return). Этот самый результат может быть помещен в месте обработки в переменную - локальную или глобальную, в зависимости от необходимости. Поскольку любая обработка ведется внутри другой функции, то жесткого требования для хранения результата в глобальной переменной нет - на ваш выбор. Но, как я уже писал, глобальные переменные - не очень хорошая штука, и, если можно, то лучше их избегать (без фанатизма, конечно).

Я понятно объяснил?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

27 минут назад, ARV сказал:

У вас как-то, похоже, перепутано что-то.

Глобальная переменная в модуле видна везде "ниже по тексту". Если эта глобальная переменная описана, как static, она не видна в других модулях нигде, если не описана как static, то линкер найдет её, хотя, вероятно, будет warning (лучше стараться избегать такого путем описания в h-файле этой переменной с префиксом extern, тогда все будет идеально правильно).

Внутри функции вы можете использовать любые видимые переменные, включая локальные. Наружу из функции результат выдается традиционно - возвратом значения функции (при помощи return). Этот самый результат может быть помещен в месте обработки в переменную - локальную или глобальную, в зависимости от необходимости. Поскольку любая обработка ведется внутри другой функции, то жесткого требования для хранения результата в глобальной переменной нет - на ваш выбор. Но, как я уже писал, глобальные переменные - не очень хорошая штука, и, если можно, то лучше их избегать (без фанатизма, конечно).

Я понятно объяснил?

Да @ARV  все понятно. Тем более, что после Вашего предыдущего ответа с примером по преобразованию числового значения в строковое еще раз перечитал по функциям (входящие аргументы, возвращение значения и то что в теле функции можно присвоить возвращающее значение глобальной переменно и при этом не использовать return).

Начал изучать указатели (только пока с большим скрипом в понимании).

И еще. Чем больше читаю как ваши и @Starichok ответы, как у меня в теме, так и в других, тем больше понимаю, что я не знаю в программировании ничего от слова совсем. Но это меня не расстраивает - есть к чему стремится.

Спасибо вам.

 

Ссылка на комментарий
Поделиться на другие сайты

@ARV здравствуйте. В вашем примере выше (вывод строки на дисплей) Вы использовали указатель. Подскажите пожалуйста, в  каких случаях предпочтительнее использовать указатели? 

В случае вывода строки на дисплей - очень удобно ( нет нужды использовать массив).

 

Ссылка на комментарий
Поделиться на другие сайты

Концептуально в Си практически отсутствует разница между массивом и указателем. Во всяком случае для одномерного массива разницы нет вообще, отличаются только формы записи - звездочки для разыменования или квадратные скобки.

Когда вы что-то выводите на дисплей, это "что-то" обязательно лежит в массиве, поэтому вы заблуждаетес, считая, что нужды в нем нет.

Указатель - это адрес начала области памяти, в которой находится что-то полезное. Массив - это область памяти, в которой последовательно размещено несколько одинаковых "полезных" элементов.

Идентификатор (имя) массива - это указатель на его (массива) начало в памяти, что эквивалентно началу нулевого элемента массива.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

есть еще одна принципиальная разница.

когда ты в функцию передаешь какую-то переменную (и массив в том числе), то создается копия этой переменной.

копию ты внутри функции можешь изменять как угодно, но сама переменная при этом остается без изменений.

а если ты в функцию передаешь указатель на ту же переменную, то все изменения переменной внутри функции делаются непосредственно над переменной через ее указатель.

поэтому передача параметра в функцию - дело самого программиста решать, будет ли в функции изменяться параметр (передавать тогда указатель), или же параметр следует сохранять без изменения (передавать копию параметра, а не его указатель).

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
В 09.06.2019 в 17:09, Starichok сказал:

дело в том, что при отработке паузы с помощью _delay_ms(750) МК больше НИЧЕГО в это время делать не может. это пустая трата процессорного времени.

точнее, МК во время отработки паузы может обрабатывать прерывания.

можно делать такую проверку. а можно и не делать.

например, у меня полный приборный цикл равен 1 секунде. но я точно знаю (и ты это знаешь), что 1 секунду преобразование температуры гарантированно закончится.

поэтому я без проверки считываю новую температуру и запускаю новую конвертацию.

что должен делать твой прибор, я не знаю. могу только сказать, что окончательное решение ты должен выбрать сам.

вариантов тут несколько.

1. тупо делать задержку с помощью delay.

2. тупо сидеть в цикле и по кругу проверять на завершение конвертации. этот вариант потребует те же самые 700-750 мс бесполезной потери времени.

3. делать, как я - 1 раз в секунду без проверки считывать новую температуру и запускать новую конвертацию.

может, чья-то фантазия придумает еще другие способы...

 

@Starichok здравствуйте. Сегодня реализовал команды измерения и считывания температуры с датчика через прерывание от Т/С_1. Написал две функции: первая для измерения, вторая для считывания температуры. В обработке таймера, с интервалом примерно в 1 секунду, выполнял операцию XOR над единицей (I ^= 1;). А уже в главном цикле программы, в проверке условия, проверял значение I. Если i==1 тогда функция измерения температуры, иначе считывание. Спасибо Вам за подсказку!

Ссылка на комментарий
Поделиться на другие сайты

ты меня не понял (не совсем понял).

у тебя получилось "через раз". первую секунду запускаешь конвертацию, вторую секунду читаешь температуру.

а у меня это делается КАЖДУЮ секунду. я прочитал температуру, и тут же запускаю конвертацию.

к следующей секунде конвертация уже завершена, и я опять читаю и запускаю...

таким образом, тебе не нужен этот признак работы "через раз". ты тоже можешь делать также - читать и запускать измерение КАЖДУЮ секунду.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Иными словами нужно так.

10 часов назад, kostya_unix сказал:

В обработке таймера, с интервалом примерно в 1 секунду, выполнял...

установку значения (I=1).

10 часов назад, kostya_unix сказал:

А уже в главном цикле программы, в проверке условия, проверял значение I. Если i==1 тогда...

функция чтения, потом функция запуска измерения и в конце сброс (I=0).

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, Starichok сказал:

ты меня не понял (не совсем понял).

у тебя получилось "через раз". первую секунду запускаешь конвертацию, вторую секунду читаешь температуру.

а у меня это делается КАЖДУЮ секунду. я прочитал температуру, и тут же запускаю конвертацию.

к следующей секунде конвертация уже завершена, и я опять читаю и запускаю...

таким образом, тебе не нужен этот признак работы "через раз". ты тоже можешь делать также - читать и запускать измерение КАЖДУЮ секунду.

Действительно так ! Прочитали, запустили конвертацию (именно в такой последовательности) и ушли "заниматься" другими, делами. А до следующего обращения к датчику, температура уже будет преобразована и ждать нашей команды считывания.

Дело в том, что первоначально меня смутила задержка между  командами конвертации и считывания температуры. Поэтому алгоритму я и реализовал получение температуры. В Вашем случае, @Starichok , получается более изящно - признаю. 

Подправил свой код по Вашему примеру. Спасибо!

И еще вопрос: критично ли запускать функцию конвертации/считывания непосредственно в обработчике прерывания или лучше использовать действие над переменной ( в обработчике прерывания) и уже исходя из результата обработки переменной выполнять какое либо действие в рабочем цикле программы?

Ссылка на комментарий
Поделиться на другие сайты

протокол обмена с датчиком очень медленный.

только операция инициализации занимает около 1 мс (2 раза по 480 мкс). передача каждого байта занимает около 500 мкс, а передать нужно несколько байтов и прочитать нужно несколько байтов.

вот, смотри сам, последовательность операций у меня такая:

инициализация (1 мс), запрос чтения (2 байта, 1 мс), чтение (2 байта, 1 мс), инициализация (1 мс), запуск конвертации (2 байта, 1 мс).

итого набегает примерно 5 мс. это очень не мало.

строго говоря, "сидеть" в прерывании так много времени не принято.

но я так понял, что твое устройство не критично к потерям времени во время прерывания по таймеру.

я не знаю логику работы твоей программы. я не знаю, с какой периодичностью "крутится" твой главный цикл в ожидании прерывания по таймеру.

повторяю еще раз. у меня самый главный цикл выполняется 1 раз в 1 секунду, поэтому мне не нужна переменная для термометра.

и время таймера у меня в некоторых устройствах равно 1 мс. это нужно для того, чтобы запускать измерения в АЦП и проверять энкодер.

потом программными таймерами время наращивается до 1 секунды, организуя главный цикл программы.

но у меня есть и просто термометр с экраном 1602, где таймер отрабатывает именно 1 секунду, поскольку там нет ни АЦП, ни энкодера - нет ничего, чтобы требовало быструю реакцию на события.

там у меня таймер просто в начало стека помещает адрес начала главного цикла, и больше ничего не делает.

я понимаю, что для простого термометра экран 1602 очень излишен, но у меня осталась плата от другого старого устройства, которая уже была мне не нужна.

и чтобы не распаивать плату, я пустил эту плату с припаянным экраном под термометр.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Мне достались , по случаю, несколько приборов безопасности ОНК-160 от автомобильных кранов, так в них стоят ЖКИ MT-20S4M. Четыре строки по 20 символов. Контроллер в нем идентичен с дисплеем 1602. За неимением другого экрана использую его.

1 час назад, Starichok сказал:

но я так понял, что твое устройство не критично к потерям времени во время прерывания по таймеру.

я не знаю логику работы твоей программы. я не знаю, с какой периодичностью "крутится" твой главный цикл в ожидании прерывания по таймеру.

Устройство у меня просто термометр. Но.... Началось вся эта история с термометром , как говорится, с выходом из-за печки. Живу в своем доме, местное отопление (котел, батареи и тому подобное). В один прекрасные день накрылся медным тазом центробежный насос, который гонял воду по батареям. Поставил другой. Так тот другой, на третьей скорости гудит, не сказать что сильно, но ночью , проснувшись слышишь и это мешает. Вставать переключать на 1 скорость нет никакого желания. Так вот собственно и зародилась мысль с помощью терморегулятора переключать, в зависимости от температуры, эти самые скоростя. Скажем от 25 до 40 градусов первая скорость, 40-60 вторая, ну и выше 60 уже третья. Но если температура ниже 20 что бы отключал насос совсем.

Опять же выставлять уставки температурные хочу через кнопки (3 штуки). 25 градусов дошла температура - нажал первую кнопку - значения записались в EEPROM на первую скорость. Дошла температура до второго рубежа - нажал вторую кнопку и т.д. Но с моим навыком и знаниями в пропграммировании понимаю, что без костылей не обойдусь. Зато опыт, какой никакой приобрету.

1 час назад, Starichok сказал:

запускать измерения в АЦП и проверять энкодер

А это в коком устройстве используется? Я с помощью АЦП хочу в дальнейшем сделать управление позиционирования задвижки в котельном оборудовании. Но это пока в далеких мечтах. 

1 час назад, Starichok сказал:

там у меня таймер просто в начало стека помещает адрес начала главного цикла, и больше ничего не делает.

А вот этот момент для меня вообще..... Вообщем понимаю, что я дуб как дерево. Но не боги горшки обжигают - сдюжим и мы. :rolleyes:

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, kostya_unix сказал:

А это в коком устройстве используется?

на Радио коте есть у меня 2 темы с использованием МК. одна из них есть и здесь, в разделе "Питание". это ЛБП из БП АТХ с цифровым модулем.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Скачайте себе книгу  по С, очень доходчиво все и с контрольными вопросами Дейтел П.Дж., Дейтел Х.М. Как программировать на С. и Евстифеев микроконтроллеры avr очень все расписано доходчиво, помогут разобраться что к чему.

Ссылка на комментарий
Поделиться на другие сайты

8 hours ago, elki said:

Скачайте себе книгу  по С, очень доходчиво все и с контрольными вопросами Дейтел П.Дж., Дейтел Х.М. Как программировать на С. и Евстифеев микроконтроллеры avr очень все расписано доходчиво, помогут разобраться что к чему.

@elki спасибо. Евстифеева скачал (5-е издание). 

Наверное в книгах есть ответы на многие вопросы. Но ,Вы знаете, живое общение ( а особенно со знающими и , главное, помогающим начинающим (@Starichok ,@ARV  особая благодарность) ) дорогого стоит.

Опять же и Вам @elki  спасибо большое.

Ссылка на комментарий
Поделиться на другие сайты

Живое общение конечно лучше, но книги стоит иметь под рукой, не всегда сразу можно получить ответ на свой вопрос на форуме, иногда приходится долго ждать.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Здравствуйте форумчане.При изготовлении одометра столкнулся с проблемой.Устройство на может определить датчик температуры DS18B20.На дисплее прочерки.Подключен датчик по схеме с паразитным питанием.Как не старался не получается.Подключал и по 3-х проводной схеме.Датчик работает в термометре.Схема на Atmega8

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

И снова здравствуйте. С момента публикации моего последнего комментария прошло 1,5 года. Многое за это время изменилось и в моей жизни (переболел то-ли короной, то-ли гормональный сбой в организме был (еле еле "вычухался")) и в жизни нашей страны.

Хотелось бы уточнить по поводу инициализации DS18B20. Понимаю, что тема избитая, но все же. Может кому ни будь да полезной будет.

Вся эта история началась с невозможности програмно определить присутствие датчика в схеме. По всей видимости (пришлось столкнуться с этим еще раз), проблема была в программе AVRDUDE_PROG. Заметил, что когда установлена галочка в FUSE автоматического программирования, тогда и вылазила проблема с присутствием датчика. А если программировать по отдельности (с начало fuse, а затем programm), то все проходит хорошо.

Всем крепкого здоровья и благополучия.

Ссылка на комментарий
Поделиться на другие сайты

очень вредная функция в твоем программаторе. забудь про нее и никогда не пользуйся.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...