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

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

  • Ответов 58
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

зачем это нужно ?

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

Слава антисионистам Владимиру Путину и Владимиру Квачкову!

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

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

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

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

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

Давайте тогда разберемся, от чего зависит временная константа. По-моему от времени, затрачиваемого на нагревание корпуса, который находится непосредственно вокруг самого датчика.

Слава антисионистам Владимиру Путину и Владимиру Квачкову!

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

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

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

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

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

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

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

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

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

"Дельта Тэ", около 30 секунд. Разница во времени между изменением температуры среды и получением результатов измерения на выходе датчика.

Слава антисионистам Владимиру Путину и Владимиру Квачкову!

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

У меня почему-то сразу реагирует на изменение температуры, ну разве что доли секунды.

Не цитируите полностью предыдущее сообщение!!!

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

Почему когда я в протеусе изменяю температуру, получаю в результате или 0, или 2, или 4.

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

Где я не так сделал?

// Частота процесора 4 Mhz
// DS18B20 підключений(і) до PORTCbits.RC0
// Кількість підключених DS18B20 8шт.
//ANDCON1 = 7; //ЦИФРОВИЙ для PORTA
//...............................................................................
#include "p18f452.h"
#include "delays.h"
#pragma config WDT = OFF   //Turn off watchdog timer

//...............
#define PBit PORTCbits.RC0
#define PTris TRISCbits.TRISC0
//...............
#define max_dev 8                     //підключені 8 шт.
#define FALSE 0
#define TRUE 1
//===============================================================================================
unsigned char ROM[8];                //ROM біт
unsigned char FoundROM[1+max_dev][8];  //значення знайдених ROM кодів ---> +1 для ROM[0]
unsigned char numROMs;
unsigned char lastDiscrep=0;         //останнє розгалуження
unsigned char doneFlag=0;            //прапорець завершення

unsigned char dowcrc;
unsigned char dscrc_table[] = {   //unsigned char code dscrc_table[] = {
         0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
         157,192,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
//         35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
//         190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
//         70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
//         219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
//         101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
//         248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
//         140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
//         17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
//         175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
//         50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
//         202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
//         87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
//         233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
         116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53};

char temp_c[8];      //значення зчитаних температур
//===============================================================================================
unsigned char ow_reset(void);

unsigned char read_bit(void);        // зчитування біту
void write_bit(char bitval);         // запис біту
unsigned char read_byte(void);       // зчитування байту
void write_byte(char val);           // запис байту (команди) на шину

void FindDevices(void);              //FIND
unsigned char First(void);
unsigned char Next(void);
unsigned char ow_crc(unsigned char x);

void select_device(unsigned  char dev_num);   // звернення до конкретного ds18b20

void Read_Temperature(void);         // зчитування температури
//===============================================================================================



//***********************************************************************************************
//  ГОЛОВНИЙ КОД
//***********************************************************************************************
void main()
 {

  FindDevices();

//while(1)
//   {
   Read_Temperature();
//   }
 }


//===============================================================================================
//                         Іпмульс RESET і імпульс присутності DS18B20
//    presence = 0 - присутні(й);
//    presence = 1 - відсутні(й). 
//===============================================================================================
unsigned char ow_reset()      //reset one-wire line
{
 unsigned char presence;

   PBit = 0;
   PTris = 0;         //підтягуємо до нуля
   Delay10TCYx(48);   // 480 мкс (us)
   PTris = 1;         //звільняємо шину
   Delay10TCYx(8);    // 80 мкс

   presence = PBit;
   Delay10TCYx(40);   // 400 мкс
   return(presence);
//   presence:   0 = device(s) present, 
//               1 = no device presen
}

//===============================================================================================
//                    Зчитування біту з 1-wire
//===============================================================================================
unsigned char read_bit()
  {
   unsigned char d_data;
   PBit = 0;
   PTris = 0;
   Delay1TCY();      // 1 мкс 
   PTris = 1;        // вхід - відновлення лінії
   Delay10TCYx(2);   // 20 мкс 

   d_data = PBit;
   Delay10TCYx(3);   // 30 мкс
   return(d_data);
  }

//===============================================================================================
//                    Запис біту на 1-wire
//===============================================================================================
void write_bit(char bitval)
 {
  PBit = 0;
  PTris = 0;
  if(bitval==1)
    {
     PTris = 1;
    } 
  Delay10TCYx(6);      // 60 мкс
  PTris = 1;
 }

//===============================================================================================
//                    Зчитування бaйту з 1-wire
//===============================================================================================
unsigned char read_byte(void)
 {
  unsigned char bt;
  unsigned char value=0;

  for(bt=0;bt<8;bt++)
     {
      if(read_bit())    //якщо на шині 1
        {
         value|=0x01<<1;
        }
      Delay10TCYx(12);      // 120 мкс
     }
  return(value);
 }

//===============================================================================================
//                    Запис бaйту на 1-wire - передача команди
//===============================================================================================
void write_byte(char val)
 {
  unsigned char bt;
  unsigned char temp;

  for(bt=0;bt<8;bt++)
     {
      temp=val>>bt;
      temp &= 0x01;
      write_bit(temp);
     }
  Delay10TCYx(1);      // 10 мкс
 }

//===============================================================================================
//                    Функція пошуку serial ROM DS18B20 на шині
//===============================================================================================
void FindDevices()
 {
  unsigned char num;
  if(!ow_reset())
    {  //якщо ds18b20 присутні
     if(First())
       {  // якщо хоча б один ds18b20 присутній
        numROMs=0;
        do
          {
           numROMs++;
           for(num=0;num<8;num++)
              {
               FoundROM[numROMs][num]=ROM[num];
              }
          }
        while(Next()&&(numROMs<10));  //поки не знайде віс пристрої, число яких може бути до 10
       }
    }
 }

//...............................................................................................
// first функція обнулює всі результати для нового пошуку ds18b20 на шині
// next - пошук першого ds18b20 на шині
unsigned char First()
 {
  lastDiscrep=0;
  doneFlag=0;
  return Next();
 }
//...............................................................................................
//контрольна сума на шині
unsigned char ow_crc(unsigned char x)
 {
  dowcrc=dscrc_table[dowcrc^x];
  return dowcrc;
 } 
//...............................................................................................
// функція шукає наступні ds18b20 на шині.
// якщо більше немає на шині, то повертається false
unsigned char Next()
 {
  unsigned char m=1;        //ROM bit index
  unsigned char n=0;        //ROM byte index
  unsigned char k=1;        //bit mask
  unsigned char x=0;        //змінна для зчитування значень прямого і інвертованого бітів
  unsigned char discrepMarker=0;  //discrepancy marker
  unsigned char g;          //output bit
  unsigned char nxt;        //return value
  int flag;



  nxt=FALSE;                //set the next flag to false
  dowcrc=0;                 //reset the dowcrc

  flag=ow_reset();          //reset the 1-wire
  if(flag||doneFlag)        //немає ds18b20
    {
     lastDiscrep=0;
     return FALSE;
    }
  write_byte(0xF0);         //команда Search ROM

  do
    {  //для всіх 8 байтів
     x=0;
     if(read_bit()==1)      //прямий біт
       {
        x=2;
        Delay10TCYx(12);      // 120 мкс
       }
     if(read_bit()==1)      //інвертований біт
       {
        x|=1;
       }
       if(x==3)      //сигнал 11 - активні ds18b20 на шині відсутні
         {
          break;
         }
       else
         {
          if(x>0)    //всі активні ds18b20 мають 0 або 1 
            { 
             g=x>>1; //запис біту для пошуку
            }
          else
            { //якщо поточна розбіжність такаж як і попереднього разу, 
              //виберемо так як і попереднього разу
             if(m<lastDiscrep)
               {
                g=((ROM[n]&k)>0);
               }
             else
               {
                g=(m==lastDiscrep);
               }
             if(g==0)
               {
                discrepMarker=m;
               }
            }
          if(g==1)             //isolate bit in ROM[n] with mask k
            {
             ROM[n]|=k;
            }
          else
            {
             ROM[n]&=~k;
            }
          write_bit(g);       //ROM Search write

          m++;                //increment bit counter m (збільшуємо лічильник m)
          k=k<<1;             //зсуваємо бітову маску k

          if(k==0)            //якщо маска 0, починаємо новий ROM
            {
             ow_crc(ROM[n]);  //
             n++;
             k++;
            }
         }
    }
  while(n<8);                 // цикл для всіх 0-7 байт
  if(m<65||dowcrc)            // якщо пошук не повний
    {                         // обнулимо останнє розгалуження
     lastDiscrep=0;
    }
  else                        //якщо пошук повний, встановимо LastDiscrep
    {
     lastDiscrep=discrepMarker;
     doneFlag=(lastDiscrep==0);
     nxt=TRUE;                //пошук ще не завершений. Є ще ds18b20
    }
  return nxt;
 }

//===============================================================================================
//                    Match ROM - звернення до конкретного ds18b20 на 1-wire
//===============================================================================================
void select_device(unsigned char dev_num)
{
 unsigned char bt;

 ow_reset();
 write_byte(0x55);
 for(bt=0;bt<8;bt++)
    {
     write_byte(FoundROM[dev_num][bt]);
    }
}

//===============================================================================================
//          Read Scratch RAM - зчитування температури конкретного ds18b20 на 1-wire
//===============================================================================================
void Read_Temperature()
 {
  char get[9];
  char temp_lsb,temp_msb;      //старший і молодший байти зчитаних температур
  unsigned char k;

  ow_reset();
  write_byte(0xCC);          //Skip Rom - звернення до всіх ds18b20
  write_byte(0x44);          //Start Conversion - сприймання температури

  Delay10TCYx(100);      // 1000 мкс=1мc

  for(numROMs=1;numROMs<=8;numROMs++)  //працюємо з ds18b20 з FoundROM[1-8] (ROM[0] не беремо)
     {
      select_device(numROMs); //звертаємося до конкретного ds18b20
      write_byte(0xBE);       //Read Scratch RAM - зчитування температури з ОЗУ

      for(k=0;k<9;k++)        //зчитуємо 9 байт даних із ОЗУ
         {
          get[k]=read_byte();
         }
      temp_msb=get[1];
      temp_lsb=get[0];
//.....................................................................................
      temp_c[numROMs]=temp_lsb+temp_msb; //значення температур із ds18b20
     }        

 }

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

     temp_c[numROMs]=temp_lsb+temp_msb; //значення температур із ds18b20

Вот это не совсем понятно, склодывать MSB и LSB не надо.

Не цитируите полностью предыдущее сообщение!!!

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

     temp_c[numROMs]=temp_lsb+temp_msb; //значення температур із ds18b20

Вот это не совсем понятно, склодывать MSB и LSB не надо.

Да это я пока просто посмотреть считывает хоть что-то или нет.

Так даже если их складывать, то разве значение temp_c[numROMs] не будет изменяться при изменении температуры?

И еще при считывании temp_c[numROMs] из одного из датчиков не читает вообще..........Где это я мог напортачить?

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

Начинаите, запись и чтение в массивы с нулевых ячеек. массив начинается с нулевого элемента. А то у вас в циклах отчет с нуля, но в массив пишите с первои ячеики, трудно читать код.Полюбому где-то в этом и кроется ошибка, приведите в нормальный вид и выложите сюда, а мож уже и сами наидете косяк:)

Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

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

Помогите кто-то с кодом...................что-то у меня ничего не получается :(

Вроде всё делаю как надо, а где-то есть ошибка.

//===============================================================================================
//                    Match ROM - звернення до конкретного ds18b20 на 1-wire
//===============================================================================================
void select_device(unsigned char dev)
{
 unsigned char bt;

 ow_reset();
 write_byte(0x55);
 for(bt=0;bt<8;bt++)
    {
     write_byte(FoundROM[dev][bt]);
    }
}

//===============================================================================================
//          Read Scratch RAM - зчитування температури конкретного ds18b20 на 1-wire
//===============================================================================================
void Read_Temperature()
 {
  unsigned char otr[10];
  unsigned char dev;
  unsigned char bt;
  unsigned char lsb, msb;        //старший і молодший байти зчитаних температур

  ow_reset();
  write_byte(0xCC);          //Skip Rom - звернення до всіх ds18b20
  write_byte(0x44);          //Start Conversion - сприймання температури

  Delay10TCYx(100);      // 1000 мкс=1мc
//цикл опрацювання отримання значення із всіх пристроїв
  for(dev=0;dev<=max_dev;dev++)
     {
      //опрацювання кожного пристрою індивідуально
      select_device(dev);     //звертаємося до конкретного ds18b20
      write_byte(0xBE);       //Read Scratch RAM - зчитування температури з ОЗУ
      for(bt=0;bt<9;bt++)
         {
          otr[bt]=read_byte();//9 байт iнформацii з ОЗУ
         }
//................................................................
      lsb=otr[0];
      msb=otr[1];


      temperature[dev] = msb+lsb;  //ДЛЯ ПОЧАТКУ І ТАК ПІДЕ))))
     }

 }

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

wi3ik, когда Вы научитесь правильно вопросы задавть ?

Вопрос типа - "У меня не работает !!! Помогите !!!" не прокатывает...

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

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

wi3ik, когда Вы научитесь правильно вопросы задавть ?

Вопрос типа - "У меня не работает !!! Помогите !!!" не прокатывает...

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

Извините, в следующий раз буду стараться более конкретно задавать вопрос.

А пока что спасибо...........уже разобрался где я накосячил...........пока спасибо.

Будут дальше разбираться

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

Ну и что, где была ошибка?

Я делал:

//===============================================================================================
//                    Зчитування бaйту з 1-wire
//===============================================================================================
unsigned char read_byte(void)
 {
  unsigned char bt;
  unsigned char value=0;

  for(bt=0;bt<8;bt++)
     {
      if(read_bit())    //якщо на шині 1
        {
         value|=0x01<<1;
        }
      Delay10TCYx(12);      // 120 мкс
     }
  return(value);
 }

А нужно было:

//...............
value|=0x01<<bt;
//...............

Теперь нужно преобразовать полученные два байта в значение температуры <_< .

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

Теперь нужно преобразовать полученные два байта в значение температуры

temperature[dev] = msb*256+lsb;
temperature[dev] /=16;

А если я хочу выводить на индикатор знак(+ или -), значение температуры, точку, и три знака после точки......

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

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

Зачем выводить десятые отдельно ? Нужно выводить число, умноженное на 10 и ставить точку в нужном месте.

Ну а с минусом ещё проще. Проверил число на отрицательность и вывел на индикатор знак минуса.

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

Кто-то может мне показать пример. как выводить на жк-индикатор число, в моем случае это

temperature[dev]

, в зависимости от клавиши, которую нажимаю (номер DS18B20 это dev).

А то я никак не могу разобраться..................сначала использовал библиотеку XLCD.H............но окончательно запутался.

Меня интересует какой вид будет иметь команда для выведения значения.

И еще...........помогите в протеусе разобраться с жк-индикатором 2х16.......как выводить информацию в две строчки? Я так понимаю, нужно вводить адрес DDRAMaddress, где будет выводиться первый символ, но что-то совсем ничего не могу сделать

Из этой библиотеки:

 //.............................
 temperature[dev] = msb*256+lsb;
 temperature[dev] /=16;
 data = temperature[dev];
 WriteDataXLCD(data);

Строку и символ я могу вывести :(

//................
 OpenXLCD( FOUR_BIT & LINE_5X7 );
 while(BusyXLCD());

 WriteCmdXLCD(DON);                //Display on
 WriteCmdXLCD(CURSOR_OFF);         //CURSOR off
 WriteCmdXLCD(BLINK_OFF);          //BLINK off
 WriteCmdXLCD(SHIFT_CUR_LEFT);
 WriteCmdXLCD(SHIFT_DISP_RIGHT);

  SetDDRamAddr(0x8B);
//   WriteDataXLCD('*');
//data = 125;
//WriteDataXLCD(data);
putsXLCD(messag);
//................

и кат адресовать вторую строку? (в протеусе ее адрес С0-СF)? но если я пишу SetDDRamAddr(0xСС); - ничего нету :(

xlcd.rar

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

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

Прочитав даташит на контроллер HD4478 от жк станет все сразу понятно.Есть описание на русском. Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

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

  • 1 месяц спустя...

Добрый день.

Моя проблема:

по команде searchrom F0 не отзываются Ds1820 сенсоры.

У меня на проводе 2 дачтика.

По сбросу они отзываются. При подаче команды searchrom F0, в ответ получаю: FF FF FF FF FF FF FF FE !!! Т.е. пакет, в котором все 1 за иссключением самого младшего бита - 0.

См. осцилограммы.

На команду readrom 33 датчики отзываются вместе и по отдельности каждый.

Что же не так?

Как много времени я убил... Уже думаю, что считаю ром каждого по отдельности и затем зашью в ПО, что не есть гуд. И тогда сразу буду к каждому обращаться, минуя их поиск.

post-136749-0-99963700-1312203632_thumb.png

post-136749-0-44065000-1312203650_thumb.png

post-136749-0-42968900-1312203661_thumb.png

post-136749-0-13254300-1312203677_thumb.png

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

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

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

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

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

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

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

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

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

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

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

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