термометр в codevision ds18b20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
CCCP
Родился
Сообщения: 4
Зарегистрирован: Пт янв 09, 2009 19:36:22

Сообщение CCCP »

Зачем 8, когда температура в 2х?
Я понимаю, что всё написано в даташите и нескольких учебниках по СИ...
Реклама
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

Здравтсвтуйте, мучители DS'ок))
вот недавно замутил часы с термометром (7 семисегментных индикаторов + DS18B20 ). Пишу в Code Vision.
Проблема вот в чем:
Сначала у меня вывод на индикатор на прерывании от таймера был, все было хорошо, кроме измерения температуры (или ваще не мерилась или через раз).
Потом кое как выдрал вывод в главный цикл, избавился от обозначенной CCCP паузы, но всеравно дисп помигивает. это сильно достает. как бы мне избавиться от такой проблемы?
PS: ах вот, забыл, глав железка - M16 + часы DS1307
diehard
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

1. Исходник покажи.
2. Вывод на семисегментник из прерывания по таймеру делай, а считывание температуры из main.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

CCCP писал(а):Зачем 8, когда температура в 2х?
Я понимаю, что всё написано в даташите и нескольких учебниках по СИ...
если бы понимали - не говорили бы такой ерунды. пакет из 8-и байт позволяет при помощи CRC определить - верные данные пришли, или из-за помехи или иных причин они исказились. читая только первые 2 байта вы никогда не узнаете, что датчик у вас пургу несет...
Последний раз редактировалось ARV Вт фев 03, 2009 20:45:33, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

QZ_ писал(а):Потом кое как выдрал вывод в главный цикл, избавился от обозначенной CCCP паузы, но всеравно дисп помигивает. это сильно достает. как бы мне избавиться от такой проблемы?
верните индикацию в прерывания! откорректируйте (или напишите сами) функции обмена по 1-wire так, чтобы прерывания запрещались не на целую функцию, а только на момент передачи-приема одного бита. в конце-концов, поищите в интернете - библиотек для 1-wire с исходниками множество!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

diehard писал:
Исходник покажи.
к сожалению не осталось той версии исходника :?
щас чета жестокое замутил (вроде дисп почти не дергается, но и термометр не робит пока). исходник прилагается. щас работаю над ним.
Вывод на семисегментник из прерывания по таймеру делай, а считывание температуры из main.
вот ща если толку не выйдет, завтра все назад верну (индикацию в прерывание)

ARV на насчет запрета прерываний, так, в code vision'ской реализации 1-wire вообще все идет без запрета, наверно потому и через раз работал датчик.
Вложения
clock2_main.c
вот v0.4b
(17.85 КБ) 625 скачиваний
diehard
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

QZ_ писал(а):diehard писал:
Исходник покажи.
к сожалению не осталось той версии исходника :?
щас чета жестокое замутил (вроде дисп почти не дергается, но и термометр не робит пока). исходник прилагается. щас работаю над ним.
Вывод на семисегментник из прерывания по таймеру делай, а считывание температуры из main.
вот ща если толку не выйдет, завтра все назад верну (индикацию в прерывание)
Пока не вернешь динамическую индикацию в прерывание, у тебя так и будет изображение на семисегментнике дергаться!
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

Вернул индикацию на прерывание. Вроде стало лучше, щас температуру норм меряет, но из-за запрета прерываний, дисп всетаки слегка помигивает (почти незаметно).
Вложения
clock2_main.c
вот последняя версия
(14.58 КБ) 433 скачивания
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

запрещайте прерывания только на время приема/передачи БИТА, а не байта
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
diehard
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

+1
ARV прав на 100%. Общее правило при работе с прерываниями такое: если используются прерывания, то запрещать их нужно на _МИНИМАЛЬНОЕ_ время. Еще лучше оптимизировать или разбить код так, что бы действия не мешали прерываниям. Например можно разбить код на части и выполнять эти части между прерываниями.

ЗЫ: Посмотрел твой исходник и сразу бросилась в глаза задержка в таймере0.
1. Задержек в побработчиках рерываниях быть не должно!
2. Таймер для обновления семисегментника заведен на 1150 Гц. Не лучше ли завести его примерно на 200Гц???
3. В таймере зажигай разряд семисегментика, а при следующем входе в таймер гаси его и зажигай следующий и т.д.
4. Зачем перезагружаешь счетчик таймера в конце обработчика прерывания TCNT0 = T0_VAL;??? Наверное потому, что если будешь перезагружвать в начале, то из таймера вообще не выскочишь! Перезагружай счетчик в самом начале, это поможет тебе сделать функцию прерывания короче! Так ты поймешь, что выходить из таймера не успеваешь и твой обработчик прерывания _ОЧЕНЬ_ДЛИННЫЙ_.
Итого:
Исправив процедуру обработчика прерывания по таймеру0 IMHO снимется большинство проблем!
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

пасиба за советы, ща попробую все поправить.
а насчет TCNT0 = T0_VAL; в конце прерывания, то я его туда сунул в самый последний момент (всегда в начале было)
.
.
.
во, щас все путем :))
теперь вот еще вопрос: если DS18B20 повесть на паразитное питание, то когда запускаю преобразование (0х44) надо включить подтяжку на ногу, так?
Вложения
clock2_main_v05final.c
так вот сделал
(15.03 КБ) 578 скачиваний
diehard
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

Пришлось скачать даташит и смотреть. Чего и тебе советую.
Даташит страница 4. Тебе туда. Написано и нарисовано очень хорошо.
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

я видел. как я понял, надо просто ногу МК включать, когда отдал команду 0x44 или 0х48 на нужное время. щас это опробую.

хмм, чета странно... не хочет на паразитном питании работать..

ухх, разобрался.., все работает.
CCCP
Родился
Сообщения: 4
Зарегистрирован: Пт янв 09, 2009 19:36:22

Сообщение CCCP »

ARV писал(а):
CCCP писал(а):Зачем 8, когда температура в 2х?
Я понимаю, что всё написано в даташите и нескольких учебниках по СИ...
если бы понимали - не говорили бы такой ерунды. пакет из 8-и байт позволяет при помощи CRC определить - верные данные пришли, или из-за помехи или иных причин они исказились. читая только первые 2 байта вы никогда не узнаете, что датчик у вас пургу несет...
Несколько грубовато и высокомерно. Вопрос был именно о чтении температуры, а не о CRC. Понять достоверные данные или нет, труда то не составит, показания, скорее всего, будут напоминать генератор случайных чисел. Когда речь идёт о работе датчиков на значительном удалении, при сильном уровне помех, да, нужно убеждаться в верности данных, но когда разбираешься в принципе работы, об этом можно и не думать. А вообще, я уже давно во всём разобрался, в том числе и с CRC.
ARV рекомендую научиться для начала правильно понимать вопросы, и вести себя посдерженее.
Аватара пользователя
Тарас
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 04, 2008 01:20:54
Откуда: Украина, Винница
Контактная информация:

Сообщение Тарас »

У меня вопросик по теме как получить данные с датчика с точностью 0.1 градус?
Можно посмотреть исходник такой реализации? :)
Мяу-у-у-у-у
CCCP
Родился
Сообщения: 4
Зарегистрирован: Пт янв 09, 2009 19:36:22

Сообщение CCCP »

Тарас писал(а):У меня вопросик по теме как получить данные с датчика с точностью 0.1 градус?
Можно посмотреть исходник такой реализации? :)
Точность и разрешение это разные вещи. 12bit и разрешающая способность 1/16 градуса, ну а исходник есть в CV.
Из даташита:
ОПИСАНИЕ
DS18B20 цифровой термометр с программируемым разрешением, от 9 до 12–bit, которое может сохраняться в EEPROM памяти прибора. Диапазон измерений от –55°C до +125°C и точностью 0.5°C в диапазоне от –10°C до +85°C. Основные функциональные возможности DS18B20 - его температурный преобразователь. Разрешающая способность температурного преобразователя может быть изменена пользователем и составляет 9, 10, 11, или 12 битов, соответствуя приращениям (дискретности измерения температуры) 0.5 °C, 0.25°C, 0.125°C, и 0.0625°C, соответственно. Разрешающая способность по умолчанию установлена 12-бит.
Даташит около 1MB, и я не знаю как его прицепить.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

CCCP писал(а):ARV рекомендую научиться для начала правильно понимать вопросы, и вести себя посдерженее.
научитесь задавать вопросы, если уж на то пошло.
для начала.
а потом будете мне давать рекомендации. когда я вас об этом попрошу. договорились?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Ребятки, не ссорьтесь!
Лучше подскажите как мне попроще сделать преобразование двух байтного слова температуры ДС-ки с разрещением в 12 бит в простой флоат
я делаю пока что так

Код: Выделить всё

// обработаем старший байт - если он отрицателен то все биты надо инвертировать
                  temp = ds_scratch_pad.temp_msb;
                  if((temp>>6)&1)
                    {
                        below=1;
                        temp = temp^0b11111111;
                    }
                  else
                    below=0;
                  
                  ds_temp = (float)((temp&1)*16+((temp>>1)&1)*32+((temp>>2)&1)*64);             
                  
                  // теперь младший
                  temp = ds_scratch_pad.temp_lsb;
                  // если число отрицательно - инвертируем
                  if(below)
                    temp=temp^0b11111111;
                              
                  ds_temp = ds_temp + (float)((temp&1)*0.0625+((temp>>1)&1)*0.125+((temp>>2)&1)*0.25+((temp>>3)&1)*0.5+((temp>>4)&1)+((temp>>5)&1)*2+((temp>>6)&1)*4+((temp>>7)&1)*8);
                                    
                  if(below)
                    ds_temp = (float)(0-ds_temp);             
                  
но это ж примитивно :) знаю что можно просто разделить на 0.0625 но откуда возьмётся знак и куда прилепить старший байт?
atlantix_xp
Родился
Сообщения: 4
Зарегистрирован: Вс авг 16, 2009 12:21:49

Сообщение atlantix_xp »

clawham писал(а):Ребятки, не ссорьтесь!
Лучше подскажите как мне попроще сделать преобразование двух байтного слова температуры ДС-ки с разрещением в 12 бит в простой флоат
я делаю пока что так

Код: Выделить всё

// обработаем старший байт - если он отрицателен то все биты надо инвертировать
                  temp = ds_scratch_pad.temp_msb;
                  if((temp>>6)&1)
                    {
                        below=1;
                        temp = temp^0b11111111;
                    }
                  else
                    below=0;
                  
                  ds_temp = (float)((temp&1)*16+((temp>>1)&1)*32+((temp>>2)&1)*64);             
                  
                  // теперь младший
                  temp = ds_scratch_pad.temp_lsb;
                  // если число отрицательно - инвертируем
                  if(below)
                    temp=temp^0b11111111;
                              
                  ds_temp = ds_temp + (float)((temp&1)*0.0625+((temp>>1)&1)*0.125+((temp>>2)&1)*0.25+((temp>>3)&1)*0.5+((temp>>4)&1)+((temp>>5)&1)*2+((temp>>6)&1)*4+((temp>>7)&1)*8);
                                    
                  if(below)
                    ds_temp = (float)(0-ds_temp);             
                  
но это ж примитивно :) знаю что можно просто разделить на 0.0625 но откуда возьмётся знак и куда прилепить старший байт?
Это ты определенно перемудрил :)
1. все данные приходят в нормальном формате, их только нужно преобразовать то есть отделить знаковые биты от цифровых десятки единицы и дробную часть
(например число +25,5 приходит к нам в виде 0000 0001 1001 1000
из этого всего первые пять нулей знак 0000 0 ** 001 1001 ** 1000
потом 7 бит число 25 в двоичной форме (1 1001) и затем 0,5 в виде какого то значения соответствующего таблице и все и ничего нигде не нужно умножать)
2. при отрицательном значении проверяеться бит наличия минуса и потом инвертируться данные.
3. на 0,0625 ничего делить не нужно!!!!!!!!!!!!!!!!!
пишеться массив
static signed char x[16] = {0,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
указателем в котором будут являться последние 4 бита дробных долей градуса.
короче вот текст пробуйте кому интересно пишите постараюсь обьяснить 147038414
тексты взяты из даташита на сайте MAXIM схема Микроконтроллерное управление звуком 2
****************************
Изменил и несколько обновил программу теперь обрабатываеться два датчика в принципе можнои 4 сколько хватит экрана
выводить можно куда угодно сообветственно переработав функцию вывода :)
все функции независимы есть несколько дополнительных функций, таких как вывод ID кода на экран и так далее, думаю будет полезно и удобно :)
Вложения
2xDS18B20.rar
(14.46 КБ) 473 скачивания
TEST2.rar
(12.87 КБ) 378 скачиваний
Последний раз редактировалось atlantix_xp Вс сен 13, 2009 11:22:08, всего редактировалось 6 раз.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»