-=FISHER=-

DS18B20 выдает неадекватные показания при паразитном питании

79 сообщений в этой теме

-=FISHER=-    5
17 минут назад, technik-1017 сказал:

а PINTEMP это случайно не PINx?

#define PORTTEMP PORTC
#define DDRTEMP DDRC
#define PINTEMP PINC
#define BITTEMP 2

Изменил код на

		DDRTEMP |= 1<<BITTEMP;
		PORTTEMP |= (1<<BITTEMP); //выставляем 1 на шине, шина к этому моменту уже отпущена
		_delay_ms(100); //в 9 битном режиме преобразования - 750 милисекунд
		PORTTEMP &= ~(1<<BITTEMP); //выставляем 0 на шине
		DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину

Результат тот же...

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

Иначе говоря, датчик не получил команду, но отвечает корректно.

Интересно как же это так?..

Изменено пользователем -=FISHER=-

Поделиться сообщением


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

надо заменить в последнем коде PINTEMP на PORTTEMP

PINTEMP это чтение значения, PORTTEMP - запись

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5
2 минуты назад, technik-1017 сказал:

надо заменить в последнем коде PINTEMP на PORTTEMP

Заменил..

Поделиться сообщением


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

Для 9-битного режима время конвертации температуры составляет чуть меньше 100mS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

-=FISHER=-    5
Только что, Геннадий сказал:

время конвертации температуры составляет чуть меньше 100mS.

Ну, а я поставил с запасом 100 мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
39 минут назад, -=FISHER=- сказал:

Изменил код на

не в вашем коде, а в моём, так

DDRTEMP &= ~ (1<<BITTEMP); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
PORTTEMP |= (1<<BITTEMP);   // включаем подтяжку к "1" внутри контроллера
DDRTEMP |= 1<<BITTEMP; 	   // настраиваем порт на вывод, появляется честная "1"
_delay_ms(750); //в 12 битном режиме преобразования - 750 милисекунд
DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
PORTTEMP &= ~(1<<BITTEMP);  // отключаем подтяжку к "1" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора

а вы точно уверены, что в датчике установлен 9-битный режим? Может пока оставить 750 млсек

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5
8 минут назад, technik-1017 сказал:

не в вашем коде, а в моём, так

Гениально! Ваш код заработал, а смысл то был только лишь в перестановке мест слагаемых! Правда только в 12 битном режиме:(

 

9 минут назад, technik-1017 сказал:

а вы точно уверены, что в датчике установлен 9-битный режим? Может пока оставить 750 млсек

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

Поделиться сообщением


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

нет, битность задаётся записью в соответствующий регистр памяти (eeprom) датчика

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    463
2 минуты назад, -=FISHER=- сказал:

Я так понимаю

Тут понимать следует только то, что написано в даташите, собственные домыслы надо отключить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5
3 минуты назад, ARV сказал:

собственные домыслы надо отключить.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5
5 минут назад, technik-1017 сказал:

нет

Значит, я просто не включил 9 битный режим и хочу чтобы он работал?)))

Поделиться сообщением


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

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

Например, с помощью этой программы

https://musbench.com/e_digital/ds18b20.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5
18 минут назад, Геннадий сказал:

Значит мне нужно отправить сначала байт команды записи в память:

dt_sendbyte(0x4E); //отправляем команду записи в память

А затем как -то отправить данные в 4-ый байт EEPROM, так что бы в битах R1 и R0 стали ноли, но как именно это сделать? Никак не соображу... Для этого наверное лучше нужно написать отдельную функцию?

Изменено пользователем -=FISHER=-

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5

Итак сначала нужно послать команду записи в EEPROM (0x4E), затем нужно передать 3 байта (TH, TL и байт конфигурации), после чего выполнить команду копирования блокнота (0x48), причём на время выполнения этой команды необходимо подать на шину "честную 1".

ee.JPG.db1561d946a6626e90d7bd1f1be24dc5.JPG

То есть если я не хочу ничего записывать в регистры TH и TL и мне необходимо выставить разрешение на 9 бит. Я должен послать подряд три "нулевых" байта 0x00 ?

void Set_Resolution (void)
{  
	dt_sendbyte(0xCC); //пропустить идентификацию, тк у нас только одно устройство на шине
	dt_sendbyte(0x4E); //отправляем команду записи в память
	dt_sendbyte(0x00); //записываем нули в TH регистр
	dt_sendbyte(0x00); //записываем нули в TL регистр
	dt_sendbyte(0x00); //записываем нули в регистр конфигурации
	DDRTEMP &= ~ (1<<BITTEMP); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
	PORTTEMP |= (1<<BITTEMP);   // включаем подтяжку к "1" внутри контроллера
	DDRTEMP |= 1<<BITTEMP; 	   // настраиваем порт на вывод, появляется честная "1"
	dt_sendbyte(0x48); //отправляем команду копирования ОЗУ в EEPROM
	DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
	PORTTEMP &= ~(1<<BITTEMP);  // отключаем подтяжку к "1" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора  
}

Будьте добры пролейте свет, я правильно размышляю?

Изменено пользователем -=FISHER=-

Поделиться сообщением


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

у меня так

      MicroLAN_Reset();                           // сброс на линии 1-wire
      MicroLAN_Write(SKIP_ROM);                   // адресация к одному датчику
      MicroLAN_Write(WRITE_SCRATCHPAD);           // запись 3-х байт в SCRATCHPAD
      MicroLAN_Write(0);                          // запись TH/USER BYTE 1
      MicroLAN_Write(0);                          // запись TL/USER BYTE 2
      MicroLAN_Write(0x7F);                       // запись CONFIG (R0=1,R1=1 - разрядность 12 бит)
      MicroLAN_Reset();                           // сброс на линии 1-wire
      MicroLAN_Write(SKIP_ROM);                   // адресация к одному датчику
      MicroLAN_Write(COPY_SCRATCHPAD);            // запись байтов в E2 RAM
      DELAY_MS(10);                               // задержка 10 млсек (необходима после выполнения команды COPY_SCRATCHPAD)

 

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5
29 минут назад, technik-1017 сказал:

у меня так

Ну вот, значит с учетом паразитного питания ещё добавятся строчки для установки 1 на шине для записи в EEPROM.

А вот такой интересный вопрос, EEPROM у DS18B20 по даташиту выдерживает 50k циклов записи. А как сделать, чтобы лишний раз не дёргать память и записывать 9 битное разрешение, только если есть в соответствующих битах конфигурации стоят единички? Неужели придётся читать байт конфигурации и сравнить его значение с интересующим меня значением 0x1F (0b00011111)?

А функция сброса на линии MicroLAN_Reset(); притягивает шину к нулю?

DDRTEMP |= 1<<BITTEMP; //притягиваем шину

Итого в моем случае так? Проверьте пожалуйста последовательность действий при записи в  EEPROM

void Set_Resolution (void)
{  
//********************ЗАПИСЬ В ОЗУ**************************
  
	DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод
	dt_sendbyte(0xCC); //пропустить идентификацию, тк у нас только одно устройство на шине
	dt_sendbyte(0x4E); //отправляем команду записи в память
	dt_sendbyte(0); //записываем нули в TH регистр
	dt_sendbyte(0); //записываем нули в TL регистр
	dt_sendbyte(0x1F); //записываем нули в регистр конфигурации R0=0, R1=0, разрешение 9 бит
  
//********************ЗАПИСЬ В ПЗУ (EEPROM)**************************
  
	DDRTEMP &= ~ (1<<BITTEMP); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
	dt_sendbyte(0x48); //отправляем команду копирования ОЗУ в EEPROM
	PORTTEMP |= (1<<BITTEMP);   // включаем подтяжку к "1" внутри контроллера
	DDRTEMP |= 1<<BITTEMP; 	   // настраиваем порт на вывод, появляется честная "1"
	DELAY_MS(10);  // задержка 10 млсек (необходима после выполнения команды COPY_SCRATCHPAD)
	DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
	PORTTEMP &= ~(1<<BITTEMP);  // отключаем подтяжку к "1" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора  
}

 

Изменено пользователем -=FISHER=-

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
-=FISHER=-    5
6 минут назад, Геннадий сказал:

Нет необходимости

В последней строчке кода получается нет необходимости? А последовательность команд верная?

Изменено пользователем -=FISHER=-

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
KomSoft    309

По-моему 9 или 12 битный режим выбирается один раз при инициализации. Потом датчик работает как есть, ведь значение уже хранится в еепром

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, Геннадий сказал:

Нет необходимости отключать внутреннюю подтяжку.

надо обязательно отключать внутреннюю подтяжку, т.к. формирование "0" происходит сменой режима работы пина (ввод/вывод)

1 минуту назад, KomSoft сказал:

По-моему 9 или 12 битный режим выбирается один раз при инициализации. Потом датчик работает как есть, ведь значение уже хранится в еепром

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

40 минут назад, -=FISHER=- сказал:

А функция сброса на линии MicroLAN_Reset(); притягивает шину к нулю?

у вас это проверка датчика на линии

Поделиться сообщением


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

В режиме "вывод" это уже не подтяжка, а логическое состояние выхода, которое включается при формировании сигнала, а до этого момента обеспечивает "честную 1" на линии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, Геннадий сказал:

В режиме "вывод" это уже не подтяжка, а логическое состояние выхода, которое включается при формировании сигнала, а до этого момента обеспечивает "честную 1" на линии.

а никто и не говорил о подтяжке в режиме вывода

Поделиться сообщением


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

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

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Увы не позволяет. Октавный фильтр с включенной компенсацией будет давать соответствующий подъём, а не горизонтальную линию. 
    • то просто проседает с 12 до 9 вольт
    • Андрюх, ты читать умеешь? Ее Админ закрыл, а не я. несколько раз порывался с ним это обсудить. Я тоже там никаких особо грешных грехов не нашел. Мож напишем совместное письмо? Народ, подключайтесь!
    • Точка совпадения фаз в пас фильтре может находится в стороне . И никто не не знает толком где она , ведь никто не проверяет . В активном фильтре совпадение полное во всей полосе совместной работы головок . И главное , прозрачность звучания на высоте . Можно услышать в фонограмме много нового на заднем плане .
    • Плохо, что по факту невозможно определить очередность (если она есть) выгорания элементов. Сгорание диода преобразователя вообще в ступор вводит - ведь накопительный конденсатор играет роль развязки между двумя, работающими в импульсном режиме, частями схемы. Мысль про то, что виноват какой-то поплывший, но работающий элемент в схеме правильная - те что сгорали как раз могут быть не при чем, их уже меняли. А не хочешь попробовать поездить по схеме с постоянно включенным на время искры верхним транзистором или, как вариант, с включением его только на время искрения? Вдруг не заметишь разницы в работе двигателя. Время импульсов для нижнего придется конечно изменить, но это уже делалось и знакомо, как их настроить.
    • Для ремонта схем с 38хх редко применяю осцил, обхожусь тестером. А вот посмотреть форму сигнала выходных ключей это да, нужен иной. DCO 150 развязанный от сети и ему ничего не случится, если он достоверно показывает форму сигнала то пойдет, а технику безопасности в любом случае нужно соблюдать. Я пользую старенький С1-112А. Но для ремонта сварочников этого мало, нужны ЗНАНИЯ и другие приспособления.