реклама на сайте
подробности

 
 
> Применение DS1820 и LCD44780 для начинающих, Подключение нескольких DS1820 на шину.
SasaVitebsk
сообщение Nov 20 2006, 23:11
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Исследовал работу нескольких DS18B20/DS1820 "сидящих" на одной шине, а также возможность динамического подключения/замены данных датчиков на шине. Не нашёл. Некоторые библиотеки, в том числе выложенные на этом форуме являются нерабочими. Написал библиотеки, проверил и выложил их в виде библиотек в соответствующем разделе форума.

А здесь предлагаю для начинающих полный учебный проект использования данных библиотек. Написаны и проверены на стенде Nix-06 для начинающих который обсуждался в топике "getting started ..." и расположен по nix-06.nm.ru. Проект написан на IAR C и закончен, а то многие писали, что хотелось бы понять как применять те или иные библиотеки. Мои или другие.

Подключается несколько датчиков DS1820/ds18b20/ds18s20 в любом сочетании. На LCD дисплей выводится их количество и температура каждого. Допустимо подключения датчиков по двух-проводной схеме включения. Используется динамическое выделение памяти под ROM датчиков.

Библиотека LCD написана таким образом что допускает использование стандартных функций вывода outs и printf с элементами форматирования. Что и пременено в проекте. Имеется прямая индексация курсора и прочие вещи, которые облегчают написание меню и многоуровневых меню. В принципе должно работать для 4-ёх строчных дисплеев, но я не проверял.
Прикрепленные файлы
Прикрепленный файл  ds18b20.zip ( 17.94 килобайт ) Кол-во скачиваний: 522
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GDI
сообщение Jan 19 2007, 10:44
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



В CV в примерах есть подобный проект с использованием встроенных библиотек 1-wire и HD44780. А еще там есть встроенные функции задержки delay_ms(N) и delay_us(N) где N - это число милли- или микросекунд, соответственно, доступны при подключении delay.h.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 20 2007, 05:20
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(GDI @ Jan 19 2007, 11:44) *
В CV в примерах есть подобный проект с использованием встроенных библиотек 1-wire и HD44780. А еще там есть встроенные функции задержки delay_ms(N) и delay_us(N) где N - это число милли- или микросекунд, соответственно, доступны при подключении delay.h.


Использование нескольких датчиков одновременно? Дело в том что не нашёл нигде.

А в общем встроенные библиотеки конечно хороши. Но если они не на Си, то это не облегчает работу (для неначинающих). Дело в том что редко какая-нибудь аппаратная хрень используется точно так как прописано. Обычно надо "почти так, но вот тут чуть чуть подправить". smile.gif И в этом смысле Си-шные библиотеки это позволяют делать.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 20 2007, 14:02
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(SasaVitebsk @ Jan 20 2007, 05:20) *
Использование нескольких датчиков одновременно? Дело в том что не нашёл нигде.
А в общем встроенные библиотеки конечно хороши. Но если они не на Си, то это не облегчает работу (для неначинающих).

В CV они на C. Но вот сама возможность подключения нескольких датчиков, с использованием в дальнейшем их поиска на шине, кмк вещь бесполезная. Как их отличать? Простейший пример - один датчик на улице, другой в квартире. Хочется не просто получить две температуры, но и знать, какая из них на улице, а какая в доме. Или есть способ? Подключение по очереди с запоминанием серийного номера - простейший, но это не требует поиска на шине, то есть не совсем то.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 20 2007, 15:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Qwertty @ Jan 20 2007, 15:02) *
В CV они на C. Но вот сама возможность подключения нескольких датчиков, с использованием в дальнейшем их поиска на шине, кмк вещь бесполезная. Как их отличать? Простейший пример - один датчик на улице, другой в квартире. Хочется не просто получить две температуры, но и знать, какая из них на улице, а какая в доме. Или есть способ? Подключение по очереди с запоминанием серийного номера - простейший, но это не требует поиска на шине, то есть не совсем то.


Возможно Вы правы, хотя абсолютных решений не бывает. Вы предлагаете использовать по одному входу на каждый датчик. Тогда каждый датчик чётко связан со своим местом(номером). Это тоже выход. Но у меня их до 10. Использовать 10 входов не всегда возможно. А программа позволяет использовать колличество датчиков ограниченное только свободной памятью (точнее памятью кучи). Например у меня в проекте под кучу выделено 256 байт. Это позволяет использовать 31 датчик из под меги 8.

А вообще я писал проект как учебный. (В смысле я использовал п/п для него в реальном проекте, а этот использовал для отладки) На мой взгляд он простой и наглядный. Возможно кто-нибудь найдёт в нём что-нибудь для себя интересное. Или оптимизирует его для себя и почуствует радость первой победы. smile.gif С ним просто можно проводить эксперименты. Я применил динамическое выделение памяти, хотя мог бы просто ограничить число датчиков разумным и создать массив. Зато некоторые увидят, как используется динамическая память и указатели.

В программировании не всё очевидно. Вот пример прототипа который я брал за основу.
Код
//Чтение температуры
uint8_t read_temp(void)
{
    uint8_t scratchpad[9];
    uint8_t crc = 0;
    // initiate array to 0
    for (uint8_t a1 = 0; a1 < 9; a1++) scratchpad[a1] = 0;
   // __delay_cycles(F_CLK); //time measurement temperature in DS18B20 (780ms)
    OW_reset();
    OW_write_byte(SKIP_ROM); // skip ROM
    OW_write_byte(READ_SCRATCHPAD); // read scratchpad 0xBE
//Recive data  in 1 Wire
    for (uint8_t c1 = 0; c1 < 9; c1++)
    {
        scratchpad[c1] = OW_read_byte();
    }
//Check CRC8  to 1 Wire data
    for(uint8_t i = 0; i < 8; i++)
      {
         crc =  OW_ComputeCRC8(scratchpad[i], crc);
       }
       if (crc == scratchpad[8])
       {
        return  ((scratchpad[1] << 4) | (scratchpad[0] >> 4));
        }
  return ( ERROR_CRC); // Message -80
}


А вот что получилось у меня.

Код
//Чтение температуры
int8_t    read_scratchpad(uint8_t tip)
{
uint8_t    scratchpad[8];
uint8_t    crc    = 0;

OW_write_byte(READ_SCRATCHPAD);                // читаем scratchpad 0xBE
for    (uint8_t c1    = 0; c1    < 8; c1++)
{
    scratchpad[c1] = OW_read_byte();            // Принять данные с    1 Wire шины
    crc    =  OW_crc8(crc, scratchpad[c1]);        // Посчитать CRC8  для 1 Wire шины
}
crc=OW_crc8(crc, OW_read_byte());
OW_reset();
if (crc == 0)                                    // Проверить CRC8  для 1 Wire шины
{
   if(tip==DS18B20TIP)
     return ((scratchpad[1] << 4) | ((scratchpad[0]+8) >> 4));
   else    
     return ((scratchpad[1] & 0x80) |    ((scratchpad[0]+1) >> 1));
}
else return ( ERROR_CRC);                        // Message -80
}

//Чтение температуры (для одного датчика на шине)
int8_t    read_temp_short(void)
{
    OW_reset();
    OW_write_byte(SKIP_ROM);                    // пропусь ROM
    return (read_scratchpad(DS18B20TIP));        // Чтение температуры
}


Найдите три различия. smile.gif
Не забывайте - это проект для начинающих.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   Применение DS1820 и LCD44780 для начинающих   Nov 20 2006, 23:11
- - SasaVitebsk   Несколько человек обращалось по поводу сложности п...   Jan 19 2007, 01:31
- - bodja74   Саша ,сделай что то типа этого (проверка BUSY),и н...   Jan 19 2007, 01:58
- - SasaVitebsk   Я использую BUSY. А задержки всё равно нужны. 1) д...   Jan 19 2007, 02:54
|- - Andy Great   Цитата(Qwertty @ Jan 20 2007, 14:02) Прос...   Jan 21 2007, 19:06
|- - SasaVitebsk   Цитата(Andy Great @ Jan 21 2007, 20:06) Я...   Jan 21 2007, 19:20
|- - Qwertty   Цитата(SasaVitebsk @ Jan 21 2007, 19:20) ...   Jan 21 2007, 23:35
|- - SasaVitebsk   Цитата(Qwertty @ Jan 22 2007, 00:35) По а...   Jan 22 2007, 02:50
|- - Qwertty   Цитата(SasaVitebsk @ Jan 22 2007, 02:50) ...   Jan 22 2007, 04:03
|- - SasaVitebsk   Цитата(Qwertty @ Jan 22 2007, 05:03) Поче...   Jan 22 2007, 12:38
|- - Qwertty   Цитата(SasaVitebsk @ Jan 22 2007, 12:38) ...   Jan 22 2007, 14:25
- - GDI   Цитата(GDI @ Jan 19 2007, 11:44) * В CV в примера...   Jan 22 2007, 11:48
|- - WHALE   [quote name='GDI' date='Jan 22 2007, 1...   Jan 22 2007, 12:50
- - GDI   ЦитатаВ CV все либы доступны именно на С,посмотрит...   Jan 22 2007, 13:20
- - GDI   Признаю, что с HD44780 я ошибся   Jan 22 2007, 14:37
- - boez   Поделюсь опытом развешивания по дому DS18B20 в кол...   Jan 22 2007, 16:05
- - SasaVitebsk   Я же уже говорил моя библиотека удобна если издели...   Jan 22 2007, 17:08
- - WHALE   ЗвиняюсЬ,1-wire в CV действительно встроенная функ...   Jan 22 2007, 21:22
- - GDI   2 WHALE именно это я и имел ввиду, что в Си ее нет...   Jan 23 2007, 12:43
- - SasaVitebsk   Цитата(GDI @ Jan 23 2007, 13:43) 2 WHALE ...   Jan 23 2007, 14:15


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 08:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016