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

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


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

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

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

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

1 - это X0

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

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

 

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

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

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

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

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

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

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

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

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

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

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

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

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

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

Здравствуйте @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 пользователей онлайн

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

  • Сообщения

    • Для домашних измерений можно ограничиться определением уровня свечения лампочки  "на глаз" - всё равно это будет точнее амперметров на снимке вверху .  Метод фотоамперметра применяется в метрологических лабораториях  для сложных и ВЧ сигналов . 
    • @korsajЧего то я не совсем понимаю как данную функцию вызывать проверять с конкретными данными. Тем более что у меня в большей части данные которые я буду получать я не знаю полученную информацию там только известны первые символы и последние символы, а в середине хранятся данные которые каждый раз разные. Вот в том то и вся суть приёма данных. Чтобы можно было получить данные и вывести на индикаторы. Так что вариант сравнения строк тут наверное мало поможет. Тут как я понимаю нужно сравнивать конкретные символы и всю информацию между этими символами отдавать уже в обработку программе для вывода на индикацию. Потому как известно что сколько символов занимают данные то есть длинна принятой посылки всегда одинакова для определённого типа информации.
    • И в чем проблема? управлять модулем атмегой16 смог?
    • Наверное существуют, но как реализовать данный алгоритм для самодельной конструкции ? Но постоянный и пульсирующий то же не одно и то же. В том то и проблема . КАК его мерить ?
    • Переменный и пульсирующий постоянный ток- не одно и то же.
    • Я не плавную регулировку тока. Я про увеличить ток заряда с 6 до 10 ампер, и всё. Подобрать ёмкости C14/C15 - по каким параметрам? Поменять ключи на более низкоомные - я хотел поставить например BUV48A или 2SC3320. Пойдут на замену 2SC2335 которые сейчас стоят? А вот этот самый "резистор обмоток связи R19" уже достал! На всех зарядках он набран из 8, бывает из 10 SMD резисторов под которыми выгорает текстолит. Падла греется до 150 градусов. В этом экземпляре, стыдно даже писать его название, Striver PW-150 всё по другому. Зарядка собрана этажеркой, да так криво и нелепо, что выглядит в 100 раз хуже многих самоделок. Так вот этот "резистор обмоток связи R19" тут стоит обычный на 1 или 2 Вт - кетайский, его хрен поймёшь. Я поставил керамический - цементный на 5 Вт - нагрев 75 градусов при 5 амперах. Что ж туда ставить то? 10-20 ваттные проволочные? А вот с делителем R4/R5/R6 я не согласен! Тут за пороги вкл-выкл циклов заряд - пауза отвечает другая часть микросхемы. В этом я уже убедился, регулировку порогов делаю подстроечным резистором на 2 ноге 393. В этих зарядках и схемах часто перепутаны компараторы. Ваше утверждение про 5, а точнее 6 ногу относиться к другим схемам и зарядкам.  Резистором R7 определяется разница между напряжением окончания и начала зарядки. А вот это ценная информация - никак не мог понять как сократить минимальный и максимальный порог заряда.
    • Вообщем буду моделировать цепи включения и авто выключения 
×
×
  • Создать...