-=FISHER=-

Members
  • Публикации

    673
  • Зарегистрирован

  • Посещение

Репутация

5 Обычный

О -=FISHER=-

  • Звание
    Завсегдатай

Информация

  • Город
    Уфа

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Автоэлектрика

Посетители профиля

1 067 просмотров профиля
  1. DS18B20 выдает неадекватные показания при паразитном питании

    А значение подбирать эксперементально?
  2. DS18B20 выдает неадекватные показания при паразитном питании

    @ARV @technik-1017 @Геннадий Спасибо товарищи!))) У меня успешно получилось прочитать и записать данные в EEPROM датчика DS18B20 !
  3. DS18B20 выдает неадекватные показания при паразитном питании

    В частности вы имеете ввиду добавить функцию проверки контрольной суммы при чтении данных?
  4. DS18B20 выдает неадекватные показания при паразитном питании

    Ну хотелось бы с правильными)) Я верно описал суть это проверки с помощью ? А потом на Марсе начинают происходить события по мотивам DOOM3 )))
  5. DS18B20 выдает неадекватные показания при паразитном питании

    Данные будут достоверны, только если после считывания всех байтов, crc останется равной 0 ? А если не останется, то? И почему настолько важно считать CRC?
  6. DS18B20 выдает неадекватные показания при паразитном питании

    Поторопился... char dt_readcbyte(void) // функция, которая вернет значение регистра конфигурации { char c_byte[8]=0; //объявим переменную в которую будет считан байт конфигурации if(dt_testdevice()==1) //ШАГ 1. Определим, есть ли устройство на шине { dt_sendbyte(0xCC); //ШАГ 2. Пропустим идентификацию dt_sendbyte(0xBE); //ШАГ 3. Команда чтения for(int i=0; i<9; i++) // последовательно прочитаем 5 байт в одну и ту же переменную // и остановимся на пятом (Configuration Register) { if(i==4){c_byte=dt_readbyte();} else{dt_readbyte();} } } return c_byte; } А вы можете намекнуть, как проверить CRC? (Это контрольная сумма, я правильно понял?)
  7. DS18B20 выдает неадекватные показания при паразитном питании

    Боюсь даташитов, сам не знаю почему... В общем прочитал про чтение. В голове сложилась вот такая последовательность: char dt_readcbyte(void) // функция, которая вернет значение регистра конфигурации { char c_byte; //объявим переменную в которую будет считан байт конфигурации dt_testdevice(void) //ШАГ 1. Определим, есть ли устройство на шине dt_sendbyte(0xCC); //ШАГ 2. Пропустим идентификацию dt_sendbyte(0xBE); //ШАГ 3. Команда чтения for(int i=0; i<5; i++) // последовательно прочитаем 5 байт в одну и ту же переменную // и остановимся на пятом (Configuration Register) { c_byte=dt_readbyte(); } //дальше чиать память нет необходимости, значит нужно послать импульс сброса, вот так? DDRTEMP |= 1<<BITTEMP; //притягиваем шину к 0 _delay_us(485); //задержка как минимум на 480 микросекунд DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину return c_byte; } Сработает такая последовательность?
  8. DS18B20 выдает неадекватные показания при паразитном питании

    В яблочко Смотрите, если я буду выводить на дисплей и время и температуру и при этом часы будут иметь кнопки, чтобы сработала кнопка, придётся её удерживать значительное время. Вот в этом заключается неудобство 12 битного режима в частности. А ещё у меня уже появился спортивный интерес программно перевести DS18B20 в 9 битный режим, потому что конкретного примера на Си, мне не удалось найти в Сети.
  9. DS18B20 выдает неадекватные показания при паразитном питании

    Огромной задержкой в 750 мс Этот вариант я вижу как единственный возможный, но я читал даташит и как я понял чтение из регистра конфигурации - задача не из лёгких. Не могли бы вы пожалуйста привести пример?
  10. DS18B20 выдает неадекватные показания при паразитном питании

    Да хотелось бы это реализовать именно в устройстве, чтобы при замене термодатчика, он автоматически вставал в 9 битный режим. Дак как же это сделать единожды? Получается вот эта функция? dt_testdevice(void)
  11. DS18B20 выдает неадекватные показания при паразитном питании

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

    Ну вот, значит с учетом паразитного питания ещё добавятся строчки для установки 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" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора }
  13. DS18B20 выдает неадекватные показания при паразитном питании

    Итак сначала нужно послать команду записи в EEPROM (0x4E), затем нужно передать 3 байта (TH, TL и байт конфигурации), после чего выполнить команду копирования блокнота (0x48), причём на время выполнения этой команды необходимо подать на шину "честную 1". То есть если я не хочу ничего записывать в регистры 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" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора } Будьте добры пролейте свет, я правильно размышляю?
  14. DS18B20 выдает неадекватные показания при паразитном питании

    Значит мне нужно отправить сначала байт команды записи в память: dt_sendbyte(0x4E); //отправляем команду записи в память А затем как -то отправить данные в 4-ый байт EEPROM, так что бы в битах R1 и R0 стали ноли, но как именно это сделать? Никак не соображу... Для этого наверное лучше нужно написать отдельную функцию?
  15. DS18B20 выдает неадекватные показания при паразитном питании

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