термометр в codevision ds18b20
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18675
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
получать надо не 2 байта, а все 8. как это делать - написано в даташите, который вы, судя по всему, читали...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
-
QZ_
- Открыл глаза
- Сообщения: 70
- Зарегистрирован: Чт дек 20, 2007 14:47:31
- Откуда: Челябинск
- Контактная информация:
Здравтсвтуйте, мучители DS'ок))
вот недавно замутил часы с термометром (7 семисегментных индикаторов + DS18B20 ). Пишу в Code Vision.
Проблема вот в чем:
Сначала у меня вывод на индикатор на прерывании от таймера был, все было хорошо, кроме измерения температуры (или ваще не мерилась или через раз).
Потом кое как выдрал вывод в главный цикл, избавился от обозначенной CCCP паузы, но всеравно дисп помигивает. это сильно достает. как бы мне избавиться от такой проблемы?
PS: ах вот, забыл, глав железка - M16 + часы DS1307
вот недавно замутил часы с термометром (7 семисегментных индикаторов + DS18B20 ). Пишу в Code Vision.
Проблема вот в чем:
Сначала у меня вывод на индикатор на прерывании от таймера был, все было хорошо, кроме измерения температуры (или ваще не мерилась или через раз).
Потом кое как выдрал вывод в главный цикл, избавился от обозначенной CCCP паузы, но всеравно дисп помигивает. это сильно достает. как бы мне избавиться от такой проблемы?
PS: ах вот, забыл, глав железка - M16 + часы DS1307
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18675
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если бы понимали - не говорили бы такой ерунды. пакет из 8-и байт позволяет при помощи CRC определить - верные данные пришли, или из-за помехи или иных причин они исказились. читая только первые 2 байта вы никогда не узнаете, что датчик у вас пургу несет...CCCP писал(а):Зачем 8, когда температура в 2х?
Я понимаю, что всё написано в даташите и нескольких учебниках по СИ...
Последний раз редактировалось ARV Вт фев 03, 2009 20:45:33, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18675
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
верните индикацию в прерывания! откорректируйте (или напишите сами) функции обмена по 1-wire так, чтобы прерывания запрещались не на целую функцию, а только на момент передачи-приема одного бита. в конце-концов, поищите в интернете - библиотек для 1-wire с исходниками множество!QZ_ писал(а):Потом кое как выдрал вывод в главный цикл, избавился от обозначенной CCCP паузы, но всеравно дисп помигивает. это сильно достает. как бы мне избавиться от такой проблемы?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
QZ_
- Открыл глаза
- Сообщения: 70
- Зарегистрирован: Чт дек 20, 2007 14:47:31
- Откуда: Челябинск
- Контактная информация:
diehard писал:
щас чета жестокое замутил (вроде дисп почти не дергается, но и термометр не робит пока). исходник прилагается. щас работаю над ним.
ARV на насчет запрета прерываний, так, в code vision'ской реализации 1-wire вообще все идет без запрета, наверно потому и через раз работал датчик.
к сожалению не осталось той версии исходникаИсходник покажи.
щас чета жестокое замутил (вроде дисп почти не дергается, но и термометр не робит пока). исходник прилагается. щас работаю над ним.
вот ща если толку не выйдет, завтра все назад верну (индикацию в прерывание)Вывод на семисегментник из прерывания по таймеру делай, а считывание температуры из main.
ARV на насчет запрета прерываний, так, в code vision'ской реализации 1-wire вообще все идет без запрета, наверно потому и через раз работал датчик.
- Вложения
-
- clock2_main.c
- вот v0.4b
- (17.85 КБ) 625 скачиваний
-
diehard
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Вт дек 05, 2006 23:17:02
- Откуда: Краснодарский край
Пока не вернешь динамическую индикацию в прерывание, у тебя так и будет изображение на семисегментнике дергаться!QZ_ писал(а):diehard писал:к сожалению не осталось той версии исходникаИсходник покажи.![]()
щас чета жестокое замутил (вроде дисп почти не дергается, но и термометр не робит пока). исходник прилагается. щас работаю над ним.
вот ща если толку не выйдет, завтра все назад верну (индикацию в прерывание)Вывод на семисегментник из прерывания по таймеру делай, а считывание температуры из main.
-
QZ_
- Открыл глаза
- Сообщения: 70
- Зарегистрирован: Чт дек 20, 2007 14:47:31
- Откуда: Челябинск
- Контактная информация:
Вернул индикацию на прерывание. Вроде стало лучше, щас температуру норм меряет, но из-за запрета прерываний, дисп всетаки слегка помигивает (почти незаметно).
- Вложения
-
- clock2_main.c
- вот последняя версия
- (14.58 КБ) 433 скачивания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18675
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
запрещайте прерывания только на время приема/передачи БИТА, а не байта
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
diehard
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Вт дек 05, 2006 23:17:02
- Откуда: Краснодарский край
+1
ARV прав на 100%. Общее правило при работе с прерываниями такое: если используются прерывания, то запрещать их нужно на _МИНИМАЛЬНОЕ_ время. Еще лучше оптимизировать или разбить код так, что бы действия не мешали прерываниям. Например можно разбить код на части и выполнять эти части между прерываниями.
ЗЫ: Посмотрел твой исходник и сразу бросилась в глаза задержка в таймере0.
1. Задержек в побработчиках рерываниях быть не должно!
2. Таймер для обновления семисегментника заведен на 1150 Гц. Не лучше ли завести его примерно на 200Гц???
3. В таймере зажигай разряд семисегментика, а при следующем входе в таймер гаси его и зажигай следующий и т.д.
4. Зачем перезагружаешь счетчик таймера в конце обработчика прерывания TCNT0 = T0_VAL;??? Наверное потому, что если будешь перезагружвать в начале, то из таймера вообще не выскочишь! Перезагружай счетчик в самом начале, это поможет тебе сделать функцию прерывания короче! Так ты поймешь, что выходить из таймера не успеваешь и твой обработчик прерывания _ОЧЕНЬ_ДЛИННЫЙ_.
Итого:
Исправив процедуру обработчика прерывания по таймеру0 IMHO снимется большинство проблем!
ARV прав на 100%. Общее правило при работе с прерываниями такое: если используются прерывания, то запрещать их нужно на _МИНИМАЛЬНОЕ_ время. Еще лучше оптимизировать или разбить код так, что бы действия не мешали прерываниям. Например можно разбить код на части и выполнять эти части между прерываниями.
ЗЫ: Посмотрел твой исходник и сразу бросилась в глаза задержка в таймере0.
1. Задержек в побработчиках рерываниях быть не должно!
2. Таймер для обновления семисегментника заведен на 1150 Гц. Не лучше ли завести его примерно на 200Гц???
3. В таймере зажигай разряд семисегментика, а при следующем входе в таймер гаси его и зажигай следующий и т.д.
4. Зачем перезагружаешь счетчик таймера в конце обработчика прерывания TCNT0 = T0_VAL;??? Наверное потому, что если будешь перезагружвать в начале, то из таймера вообще не выскочишь! Перезагружай счетчик в самом начале, это поможет тебе сделать функцию прерывания короче! Так ты поймешь, что выходить из таймера не успеваешь и твой обработчик прерывания _ОЧЕНЬ_ДЛИННЫЙ_.
Итого:
Исправив процедуру обработчика прерывания по таймеру0 IMHO снимется большинство проблем!
-
QZ_
- Открыл глаза
- Сообщения: 70
- Зарегистрирован: Чт дек 20, 2007 14:47:31
- Откуда: Челябинск
- Контактная информация:
пасиба за советы, ща попробую все поправить.
а насчет TCNT0 = T0_VAL; в конце прерывания, то я его туда сунул в самый последний момент (всегда в начале было)
.
.
.
во, щас все путем
теперь вот еще вопрос: если DS18B20 повесть на паразитное питание, то когда запускаю преобразование (0х44) надо включить подтяжку на ногу, так?
а насчет TCNT0 = T0_VAL; в конце прерывания, то я его туда сунул в самый последний момент (всегда в начале было)
.
.
.
во, щас все путем
теперь вот еще вопрос: если DS18B20 повесть на паразитное питание, то когда запускаю преобразование (0х44) надо включить подтяжку на ногу, так?
- Вложения
-
- clock2_main_v05final.c
- так вот сделал
- (15.03 КБ) 578 скачиваний
Несколько грубовато и высокомерно. Вопрос был именно о чтении температуры, а не о CRC. Понять достоверные данные или нет, труда то не составит, показания, скорее всего, будут напоминать генератор случайных чисел. Когда речь идёт о работе датчиков на значительном удалении, при сильном уровне помех, да, нужно убеждаться в верности данных, но когда разбираешься в принципе работы, об этом можно и не думать. А вообще, я уже давно во всём разобрался, в том числе и с CRC.ARV писал(а):если бы понимали - не говорили бы такой ерунды. пакет из 8-и байт позволяет при помощи CRC определить - верные данные пришли, или из-за помехи или иных причин они исказились. читая только первые 2 байта вы никогда не узнаете, что датчик у вас пургу несет...CCCP писал(а):Зачем 8, когда температура в 2х?
Я понимаю, что всё написано в даташите и нескольких учебниках по СИ...
ARV рекомендую научиться для начала правильно понимать вопросы, и вести себя посдерженее.
Точность и разрешение это разные вещи. 12bit и разрешающая способность 1/16 градуса, ну а исходник есть в CV.Тарас писал(а):У меня вопросик по теме как получить данные с датчика с точностью 0.1 градус?
Можно посмотреть исходник такой реализации?
Из даташита:
ОПИСАНИЕ
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
- Откуда: Новочеркасск
- Контактная информация:
научитесь задавать вопросы, если уж на то пошло.CCCP писал(а):ARV рекомендую научиться для начала правильно понимать вопросы, и вести себя посдерженее.
для начала.
а потом будете мне давать рекомендации. когда я вас об этом попрошу. договорились?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Ребятки, не ссорьтесь!
Лучше подскажите как мне попроще сделать преобразование двух байтного слова температуры ДС-ки с разрещением в 12 бит в простой флоат
я делаю пока что так
но это ж примитивно
знаю что можно просто разделить на 0.0625 но откуда возьмётся знак и куда прилепить старший байт?
Лучше подскажите как мне попроще сделать преобразование двух байтного слова температуры ДС-ки с разрещением в 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);
-
atlantix_xp
- Родился
- Сообщения: 4
- Зарегистрирован: Вс авг 16, 2009 12:21:49
Это ты определенно перемудрил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 раз.


