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

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

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

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

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

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

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

 
Опции темы
Непрочитано 25.07.2013, 20:05  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Сообщение от dosikus Посмотреть сообщение
Чегой ??? Полегче со штампами .
Ну не все ж не опытные ))))) но процентов 80... ))
Реклама:
miwutka вне форума  
Непрочитано 25.07.2013, 20:07  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Сообщение от R360 Посмотреть сообщение
Поинтересуюсь, а за какое время отрабатывается вывод чисел на индикаторы через регистры?
каждую 1 мс вызывается прерывание и происходит отображение 1-го разряда, получается за 3 мс 3-значное число.Примерно 333 Гц индикация вроде...
miwutka вне форума  
Непрочитано 25.07.2013, 21:06  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Сообщение от miwutka Посмотреть сообщение
Вот нарисовал как подключеновсё у меня.
Ну, и... За что боролись, на то и напоролись. Ну объясните Вы мне старому упертому дураку - зачем Вы опять растащили LCD на два порта? Это что, особая форма мазохизма, "микроконтроллерная"? Четыре копыта порта С спокойно "отдыхают", зато порт B трудится "по полной" программе. Он должен обслуживать и управление LCD - а это своя отдельная задача и выполняется на скоростях 250-270кГц и попутно "грузить" сдвиговые регистры, причем в таком варианте Вам требуется обновлять их со скоростью хотя-бы ~80-120Гц (ну, чтобы не мерцали) на один разряд, т.е. если у Вас четыре семисегментника, то гнать в них инфу надо будет с частотой в четыре раза большей, соответственно 320-480Гц. Вас не смущает, что это надо увязать во времени на одном порту? На АСМе это в общем-то довольно легко "распихивается по углам", а вот какой фортель выкинет компиллятор Си, тем более, такой "непредсказуемый, как CodeVision - не берусь предугадать.
---------------------------------------------------------------------------
Сообщение от aan20132 Посмотреть сообщение
На схеме информация на регистр выбора разряда подается с выхода регистра, хранящего число. Вот лажа и получается - вместо того, чтобы по очереди переключать разряды, он их крутит как рулетку. На этот регистр свои линии данных и управления нужны, их нельзя последовательно подключать.
Бред номер раз... (посмотри на картинку - и это работает уже года три-четыре в железе, ну ест-но с некоторыми схемотехническими коррекциями выходов регистров, резисторы и т.п.).
Сообщение от aan20132 Посмотреть сообщение
только байт целиком грузить придецца, независимо от того, что всего три выхода задействовано.
Бред номер два... Словесно, персонально для miwutka, поясняю в чем тут бред... Пусть у нас есть байт данных (код цифры и запятой(точки) в одном разряде четырехразрядного индикатора). Организуем прерывание с частотой как сказал выше ~ 400Гц. В этом прерывании обновляем один разряд индикатора, т.е. загоняем в два регистра код цифры (байт) и двоичный код отображаемого в этот момент индикатора (четыре разряда), например, 0001b. В следующем прерывании загоняем следующий с кодом 0010b. И так по кругу до 1000b и сначала. Каждый раз дергаем ногу Shift (11) регистра 12 раз. На ноге Data (14)в этот момент должны быть реальные данные. Загнали, дернули один раз ногу Ind(12) - данные "защелкнулись" в выходных триггерах и будут отображаться до следующего прерывания. В следующем прерывании опять гоним 12 разрядов, а те, что были раньше "уедут" как бы дальше, в следующие 12 разрядов, из которых у нас в наличии только 4 во втором регистре, да и те не подключены по выходам. Ну, и... (это уже к aan20132) какого хрена про полную загрузку второго регистра???
Сообщение от miwutka Посмотреть сообщение
Значит мне можно убрать задержку 750 мс из библиотеки, а вместо нее вставить чтото типа if (PORTA.0==1)
При одном датчике смело... НО, опять не понимаю, что Вас так беспокоит "разгон" датчика. Нельзя до бесконечности разгонять скорость на шине one-wire, она стандартизована. Излишнее увлечение здесь тоже чревато приключениями на ту самую с большой буквы Ж..у.
Сообщение от miwutka Посмотреть сообщение
Частота МК 8МГц. Хотелось бы както так изменить библтотеку чтобы ждать таймером а не delay. Чтобы можно было во время ожидания чтото другое делать.
Ну, так я уже обрисовал Вам положение с индикацией на LED, счетчик (переменную) в прерывание того таймера и по достижении... пнуть в майне чтение температуры с DS и обнулить этот счетчик - чего проще.
---------------------------------------------------------------------------------------------------
Сообщение от R360 Посмотреть сообщение
Поинтересуюсь, а за какое время отрабатывается вывод чисел на индикаторы через регистры? Я когда себе подобное делал, задержку выполнял с помощью оператора if else и переменной, т.е. на 1 увеличивал значение и при совпадении опрашивал датчик.
Ответил выше, чаще можно, реже - чревато порчей Срения.
---------------------------------------------------------------------------------------------------
Сообщение от dosikus Посмотреть сообщение
Чегой ??? Полегче со штампами .
Угу, ну, молодой ЫщО, просто не догадывается, что те, кто сейчас отвечают по основной работе находятся практически в том же ранге... Ну, да ладно, простим вьюноше...
Миниатюры:
Нажмите на изображение для увеличения
Название: Pic_07_25_006.gif
Просмотров: 110
Размер:	28.0 Кб
ID:	49993  

Последний раз редактировалось Halex07; 25.07.2013 в 21:11.
Halex07 вне форума  
Непрочитано 25.07.2013, 21:20  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Halex07, вы всё правильно написали. Так много что еще всё не переварил. Ну КИПовцы которые опытные обычно не вызывают чтобы настроить какй-нибудь не сложный контроллер или регулятор - я про таких имел ввиду, да и про МК они вообще только по наслышке )) Ну я еще молод в этом деле вот и спотыкаюсь...
Я так понимаю алгоритм примерный, но не хватает опыта написать правильно... Подскажите плиз.
Вот в библиотеке есть такая функция:
PHP код:
float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (
ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register››5) & 3;
if (
ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (
ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((
int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;

Так как я использую пока готовую, то думаю вот так ее изменить:

PHP код:
float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (
ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register››5) & 3;
if (
ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
//delay_ms(conv_delay[resolution]);
//if (ds18b20_read_spd(addr)==0) return -9999;
//w1_init();
//return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;

вместо того что я закоментировал написать примерно такое:
PHP код:
В таймере счетчик timer++;
в основном цикле где главный WHILE написать
if (timer›=800
{
   
ds18b20_read_spd(addr);
   
w1_init();
   
temp1=(*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
   
timer=0;
}; 
Скажите так должно работать нормально? Датчика у меня будет точно 2 или больше.....
miwutka вне форума  
Непрочитано 25.07.2013, 21:23  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Сообщение от Halex07 Посмотреть сообщение
зачем Вы опять растащили LCD на два порта?
Чегото я это выпустил из головы.... но это же не должно влиять на пропуски измерений?? Без регистров то всё норм работало. но я теперь понял что микруха обрабатывает порт целиком даже если я обращаюсь только к одному биту.....
miwutka вне форума  
Непрочитано 25.07.2013, 22:01  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,975
Сказал спасибо: 2,554
Сказали Спасибо 11,852 раз(а) в 5,940 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: ds18b20 + LCd

miwutka, Вы бы нарисовали свой алгоритм на бумажке, многое прояснилось бы. В голове держать будете потом, когда привыкните. Сначала нарисуйте то, что хотите иметь, а потом то, что есть уже по факту и сравните.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 25.07.2013, 22:59  
aan20132
Временная регистрация
 
Регистрация: 17.07.2006
Сообщений: 70
Сказал спасибо: 20
Сказали Спасибо 8 раз(а) в 6 сообщении(ях)
aan20132 на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Сообщение от Halex07 Посмотреть сообщение
....
Бред номер раз...
....
Бред номер два...
Полностью согласен! Буквально через пару минут после того, как это всё отпостил, понял, что криво схему рассматривал Да только поленился извиняться за бредоносность высказывания
Мало того, я ведь далее потому и не настаивал на изменении схемы

...а-то сразу "вот шашка, давай голову!", "нахрена" да "нахрена"... Это вы тут все сразу умные, а я потом (Мрак, "Трое из леса"(С))

Последний раз редактировалось aan20132; 25.07.2013 в 23:08.
aan20132 вне форума  
Непрочитано 26.07.2013, 07:09  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Сообщение от miwutka Посмотреть сообщение
Скажите так должно работать нормально?
Глянул бегло, некогда... Но сразу бросилось в глаза:
Код:
w1_write(0x44);
Если вы считываете температуру по таймеру ›=800, то команда для датчика 0x44 - (начать преобразование) должна отсылаться при таймере ==0, тогда все будет логично и корректно.
И еще, пока ехал на работу вспомнил, по поводу вывода -9999. У вас изначально определяется:
Код:
unsigned char rom_code[MAX_DEVICES][9];
Т.е. не один датчик. Ну и будет это иногда проскакивать, так вот простейший способ избежать проверять условие привыводе : если возвращена температура -9999 - не выводить на дисплей. Просто и надежно!

Последний раз редактировалось Halex07; 26.07.2013 в 09:55.
Halex07 вне форума  
Сказали "Спасибо" Halex07
miwutka (26.07.2013)
Непрочитано 26.07.2013, 12:29  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Изменил код. Теперь первый датчик читает, (есть дергание индикатора) а второй не читает.....
Вот в таймере код:
PHP код:
if (y==0) {                               //измерение каждую секунду
               
resolution=(__ds18b20_scratch_pad.conf_register››5) & 3;
               
ds18b20_select(&ds1820_rom_codes[0][0]);
               
w1_write(0x44);
               
resolution=(__ds18b20_scratch_pad.conf_register››5) & 3;
               
ds18b20_select(&ds1820_rom_codes[1][0]);
               
w1_write(0x44);
               
//temp1=ds18b20_temperature(&ds1820_rom_codes[0][0]);
               //temp2=ds18b20_temperature(&ds1820_rom_codes[1][0]);
               
               
};
y++; 
а такой в основном майне:
PHP код:
if (y›=800) {
      
      
ds18b20_select(&ds1820_rom_codes[0][0]);
      
ds18b20_read_spd(&ds1820_rom_codes[0][0]); 
w1_init();
temp1= (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
     
// ds18b20_read_spd(&ds1820_rom_codes[1][0]);
      
ds18b20_select(&ds1820_rom_codes[1][0]);
      
ds18b20_read_spd(&ds1820_rom_codes[1][0]); 
w1_init();
temp2= (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
      
y=0;
      }; 
Подскажите что я тут намутил что второй датчик не читает.....
miwutka вне форума  
Непрочитано 26.07.2013, 12:58  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: ds18b20 + LCd

Исправил всё. Теперь всё читает, но индикатор моргает 1 раз в секунду. Наверно из-за того что в прерывании таймера куча всего, и выводл на регистр и команда на измерение температуры. Это я попробую исправить...
Можно ли чегото тут оптимизировать?
это код в майне осномном:
PHP код:
if (y›=800
{
      if (
ds18b20_read_spd(&ds1820_rom_codes[0][0])==0
      { 
      
w1_init();
      } else 
        {
        
w1_init();
        
resolution=(__ds18b20_scratch_pad.conf_register››5) & 3;
        
temp1= (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
        };
     
      if (
ds18b20_read_spd(&ds1820_rom_codes[1][0])==0)
      { 
      
w1_init();
      } else 
        {
        
w1_init();
        
resolution=(__ds18b20_scratch_pad.conf_register››5) & 3;
        
temp2= (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
        };
y=0;
}; 
Это в таймере:
PHP код:
if (y==0) {                               //измерение каждую секунду
               
ds18b20_select(&ds1820_rom_codes[0][0]);
               
w1_write(0x44);
               
               
ds18b20_select(&ds1820_rom_codes[1][0]);
               
w1_write(0x44);
             };
y++; 
Ну и раз в 5 минут проскакивает число 85, а раз в минут 15 может какоето левое проскачить....
miwutka вне форума  
 

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение LCD (KS0066U) к AVR микроконтроллерам серии mega eez Микроконтроллеры, АЦП, память и т.д 47 27.09.2013 14:10
ЖКИ и CodeVision: 8-ми битный режим vikpol Микроконтроллеры, АЦП, память и т.д 33 09.03.2009 21:55
Подключение LCD Nokia 3310 vsvetlov Микроконтроллеры, АЦП, память и т.д 0 24.09.2007 21:25
ATmega8 и DS18B20, не определяется датчик butman Микроконтроллеры, АЦП, память и т.д 21 09.06.2007 22:05
На чём написано ??? Koka Proteus, KiCAD и другие ECAD 18 08.10.2006 15:50


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


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