Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 10.10.2010, 11:57  
dimanfet
Частый гость
 
Регистрация: 18.07.2007
Сообщений: 16
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
dimanfet на пути к лучшему
Вопрос Обработка данных с термодатчика

Доброго времени суток!
И сразу к проблеме.
Разрабатываю термометр на PIC'е, датчик DS18S20, и трёх разрядный семисегмент. Вывод цифр на семисегмент я уже освоил. данные с датчика идут в МК, но мой алгоритм (взятый из описания библиотеки OneWire из компилятора microc pro) показывает крокозябры на индикаторе. Дело не в перепутанных ношках или полярностях...
Вот функция, которая в экзэмпле отправляет данные на lcd:
Код:
...
const unsigned short TEMP_RESOLUTION = 9;

char *text = "000.0000";
unsigned temp;

void Display_Temperature(unsigned int temp2write) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  char temp_whole;
  unsigned int temp_fraction;

  // Check if temperature is negative
  if (temp2write & 0x8000) {
     text[0] = '-';
     temp2write = ~temp2write + 1;
     }

  // Extract temp_whole
  temp_whole = temp2write ›› RES_SHIFT ;

  // Convert temp_whole to characters
  if (temp_whole/100)
     text[0] = temp_whole/100  + 48;
  else
     text[0] = '0';

  text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
  text[2] =  temp_whole%10     + 48;             // Extract ones digit

  // Extract temp_fraction and convert it to unsigned int
  temp_fraction  = temp2write ‹‹ (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;

  // Convert temp_fraction to characters
  text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
  text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
  text[7] =  temp_fraction%10      + 48;         // Extract ones digit

  // Print temperature on LCD
  Lcd_Out(2, 5, text);
}
И аргумент, с которым вызывается эта функция:
Код:
...
temp =  Ow_Read(&PORTE, 2);
    temp = (Ow_Read(&PORTE, 2) ‹‹ 8) + temp;

    //--- Format and display result on Lcd
    Display_Temperature(temp);
...
Всё. это для меня была отправная точка. Моему индикатору требуется 3 цыфры. я их получить никак не могу... сказывается отсутсвие знаний по битовой логике и опираций с битами/байтами.
Как этот алгоритм можно переделать для получения числа в формате '00.0'?

Я пытался так, но ничего не вышло:
Код:
...
 temp =  Ow_Read(&PORTA, 4); //получил dWord с датчика, здесь первый байт - знак(+/-) а второй - температура
 temp = temp && 0x00FF; //здесь записываю в temp только второй байт
 а дальше просто не знаю как делать.. что мне даст temp[0], temp[1] и т.д.... единицы и нули, или цифры десятичного числа?
простите, может не очень ясно изложил свои мысли... если что спрашивайте.
Очень прошу помощи... и не отсылайте пожалуйста на готовые проекты... хочется понять как работать с принятыми байтами и таки сделать самому.

---Дополнено---
Забыл упомянуть, индикатор работает от прерываний TMR0. так что я пологаю, достаточно что б конечное число просто фигурировало в теле программы... а прервывания его возьмут и покажут)
Реклама:

Последний раз редактировалось dimanfet; 10.10.2010 в 12:00.
dimanfet вне форума  
Сказали "Спасибо" dimanfet
warel (27.06.2019)
Непрочитано 10.10.2010, 19:05  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

все чуть сложнее. Прерывания от таймера будут размазывать временные слоты, необходимые для термодатчика, поэтому пока на время измерения запрещайте индикацию.
Дальше, получаем 3 цифры из Вашей функции, которые будут поступать на индикатор
Код:
void Display_Temperature_7_seg(unsigned int temp2write) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  char temp_whole;
  unsigned int temp_fraction;

  // Check if temperature is negative
  if (temp2write & 0x8000) {
     text[0] = '-';
     temp2write = ~temp2write + 1;
     }

  // Extract temp_whole
  temp_whole = temp2write ›› RES_SHIFT ;

  // Convert temp_whole to characters
  if (temp_whole/100)
     text[0] = temp_whole/10  ;/* здесь убираем 48, потому что Ваш знакогенератор наверняка начинаeтся с 0*/
  else
     text[0] = 0 ;
//в текст0 - десятки ввели
  text[1] = temp_whole%10 ;             
 // здесь единицы

  // Extract temp_fraction and convert it to unsigned int
  temp_fraction  = temp2write ‹‹ (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;

  // Convert temp_fraction to characters
  text[2] =  temp_fraction/1000 ; // здесь десятые градуса
__________________
warez

Последний раз редактировалось urry; 10.10.2010 в 19:10.
urry вне форума  
Эти 2 пользователя(ей) сказали Спасибо urry за это сообщение:
dimanfet (10.10.2010), warel (27.06.2019)
Непрочитано 10.10.2010, 22:31  
dimanfet
Частый гость
 
Регистрация: 18.07.2007
Сообщений: 16
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
dimanfet на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

Спасибо) сдвинулось дело... про "+ 48" я успел догадаться сам, но вот помаргивание и изредка пробегание ложных показаний на индикаторе не могу устранить... дело в том, что опрос датчика по даташиту, идёт через каждие 750мс... у меня в программе делай 500мс.
А если, как вы говорите на время измерений запрещять прерывания, то не будут ли эти измерения занимать много времени?, может стоит поставить кварц? насколько я понимаю при большей частоте время на выполнение команд будет тратится меньше, т.к. тактов в секунду будет значительно больше?
Мои размышления верны?)
dimanfet вне форума  
Сказали "Спасибо" dimanfet
warel (27.06.2019)
Непрочитано 10.10.2010, 22:53  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

Нет, даже при высокой частоте будет видно мерцание разрядов.
Запретить прерывание - промаргивание будет, не будет ложной выдачи.
Единственный выход для комфортной работы - ручками переписать библиотеку чтения с датчика, в конце прерывания таймера ставить флаг - разрешение выдачи байта, в основном цикле анализировать - сбрасывать его и выдавать байт на шину, укладываясь в эти 5 миллисекунд или сколько Вы там выделили на регенерацию дисплея.
__________________
warez
urry вне форума  
Сказали "Спасибо" urry
warel (27.06.2019)
Непрочитано 10.10.2010, 23:08  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

Проще вывод индикации написать на асме. Задержка в 20мкс врядли испортит показания датчика.
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
warel (27.06.2019)
Непрочитано 10.10.2010, 23:58  
dimanfet
Частый гость
 
Регистрация: 18.07.2007
Сообщений: 16
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
dimanfet на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

ОК, на асм буду переводить, когда доделаю на С, так легче для понимания.

Теперь вопрос следующий. в даташите есть формула расчёта более точных показаний датчика, т.е. порог будет 0,1 гр.Ц. а не 0,5 как обычно при считывании 0-го и 1-го байта.

формула такая:
Код:
Temperature = Tc_100 – 0.25 + (COUNT_PER_C - COUNT_REMAIN)/ COUNT_PER_C
здесь:
Tc_100 - вычисленная температура с точностью 0,5 гр.Ц
COUNT_PER_C - содержится в седьмом байте // и дописано (A0h) - это, как я понял указание на бит? поясните плиз ктонить
COUNT_REMAIN - шестой байт и так же подписано 0Ch.
так вот, как мне получить с этот шестой и седьмой байты в синтаксисе C?
dimanfet вне форума  
Сказали "Спасибо" dimanfet
warel (27.06.2019)
Непрочитано 11.10.2010, 08:37  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

Вы не можете принять только первые 2 байта, для вычисление кс принимаете весь пакет в массив. Т.е. где-то они есть. Где именно - разбирать библиотеку чтения.
И не обольщайтесь особенно насчет точности -0.1 градуса не будет.
В шите написано - полградуса, значит, полградуса.
И второй вопрос - читаете Вы как 18В20, а у Вас 18S20 ?
__________________
warez

Последний раз редактировалось urry; 11.10.2010 в 10:19.
urry вне форума  
Непрочитано 11.10.2010, 11:38  
dimanfet
Частый гость
 
Регистрация: 18.07.2007
Сообщений: 16
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
dimanfet на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

Будем читать разбирать
а что именно я читаю не так? даташит по 18s20, а в программе врде читаю как S, т.к. TEMP_RESOLUTION изначально приравниваю 9 - а это и есть разрядность датчика. у 18B20 она 12 бит. Я ответил на ваш вопрос?
dimanfet вне форума  
Непрочитано 11.10.2010, 15:16  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Обработка данных с термодатчика

Сообщение от dimanfet Посмотреть сообщение
А если, как вы говорите на время измерений запрещять прерывания, то не будут ли эти измерения занимать много времени?
Такие задачи я делаю методом мультиплексирования обработки задач требующих синхронизации:

Я совместил обработку 1WIRE и вывод на АЛС в одном прерывании.
Прерывание таймера 500 микросекунд. В каждом прерывании происходит отсчёт счётчика вывода на АЛС. А в основной програме делать ничего не остаётся.

Например период вывода на индикатор = 15 милисек, для исключения мерцаний инидкатора видимых глазом. Счётчик считает до 15000/500 = 30. Вывод на каждый сегмент в течение 1-2-3-4-5 прерываний, от этого зависит яркость. Для уменьшения пульсаций вывод разрядов распределить равномерно по времени. Каждый разряд выводится с временем кратным 500 микросек, от количества проходв в которых выводится состояние разрядов - зависит яркость.

например:
Счётчик=1, вывод на 1 разряд
Счётчик=11, вывод на 2 разряд
Счётчик=21, вывод на 3 разряд
в остальные отсчёты счётчика ничего не выводим на АЛС, то есть гасим все сегменты.

или так, яркость в 2 раза больше.
Счётчик=1,2, вывод на 1 разряд
Счётчик=11,12, вывод на 2 разряд
Счётчик=21,22, вывод на 3 разряд

или так, яркость в 3раза больше.
Счётчик=1,2,3 - вывод на 1 разряд
Счётчик=11,12,13 - вывод на 2 разряд
Счётчик=21,22,23 - вывод на 3 разряд

Из 500 микросекунд тратится 10-20 на обработку АЛС.

обработка 1WIRE.
С периодом в 500 микросек выводятся таймслоты чтения и записи.

То есть за одно прерывание таймера пишется или читается 1 бит... шина 1WIRE это позволяет, делать паузы между таймслотами. Таким образом из 500 микросекунд на обработку шины будет тратится максимум 120 микросекунд для формирования таймслота записи в шину бита.
А в остальное время 20-30 микросеунд.

Организовываем счётчик = 800000микросек(время имерения)/500(период прерывания)= 1600 проходов прерывания таймера это время для измерения датчиком температуры.

Теперь счётчик проходов считывания значения температуры из датчика =
50(проходов)*500 (прерывания таймера) = 25 милисек:

1 проход - старт формирование импульса сброса
2 проход - окончение формирование импульса сброса и считывание импульса присутствия, если его нет то переходим к времени ожидания между опросами.
3-10 проходы на запись команды пропуска сравниения номера
11-18 проходы на запись команды чтения температуры
19-26 проходы на чтения 1 го байта температуры
27-34 проходы на чтения 2 го байта температуры
35-42 проходы на запись команды пропуска сравниения номера
43-50 проходы на запись команды пуска измерения температуры датчиком
и далее опять 1600 проходов для ожидания конца измерения.

Возможно конечно добавить и чтение всей РАМ датчика для отсчёта контрольной суммы, но обычно для такой задачи хватает простого счётчика повторов считаных значений и вывод на индикацию только повторяющиеся несколько раз значения температуры.

Таким образом процессы вывода на АЛС и опроса датчика синхронны и не мешают друг другу.
Естественно период можно взять и другой, в пределах 100 -1000 микросекунд, в зависимости от того что ещё нужно обрабатывать.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов

Последний раз редактировалось picavr; 11.10.2010 в 15:26.
picavr вне форума  
Сказали "Спасибо" picavr
dimanfet (13.10.2010)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка массива данных Zemlyanov Микроконтроллеры, АЦП, память и т.д 47 09.09.2010 18:59
Передача 8-битных данных через мобильник begun Микроконтроллеры, АЦП, память и т.д 9 12.07.2010 13:36
Контроль целостности передаваемых данных ksd034 Микроконтроллеры, АЦП, память и т.д 4 08.07.2010 21:46
Последовательный вывод данных Mitrar Микроконтроллеры, АЦП, память и т.д 9 14.05.2010 11:57
AVR USART+прерывания=потеря данных umgah Микроконтроллеры, АЦП, память и т.д 54 10.04.2010 16:22


Часовой пояс GMT +4, время: 18:51.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot