Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.07.2013, 20:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: ds18b20 + LCd
Сообщение от dosikus
|
Чегой ??? Полегче со штампами .
|
Ну не все ж не опытные ))))) но процентов 80... ))
|
|
|
|
25.07.2013, 20:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: ds18b20 + LCd
Сообщение от R360
|
Поинтересуюсь, а за какое время отрабатывается вывод чисел на индикаторы через регистры?
|
каждую 1 мс вызывается прерывание и происходит отображение 1-го разряда, получается за 3 мс 3-значное число.Примерно 333 Гц индикация вроде...
|
|
|
|
25.07.2013, 21:06
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
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
|
Чегой ??? Полегче со штампами .
|
Угу, ну, молодой ЫщО, просто не догадывается, что те, кто сейчас отвечают по основной работе находятся практически в том же ранге... Ну, да ладно, простим вьюноше...
Последний раз редактировалось Halex07; 25.07.2013 в 21:11.
|
|
|
|
25.07.2013, 21:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
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 или больше.....
|
|
|
|
25.07.2013, 21:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: ds18b20 + LCd
Сообщение от Halex07
|
зачем Вы опять растащили LCD на два порта?
|
Чегото я это выпустил из головы.... но это же не должно влиять на пропуски измерений?? Без регистров то всё норм работало. но я теперь понял что микруха обрабатывает порт целиком даже если я обращаюсь только к одному биту.....
|
|
|
|
25.07.2013, 22:01
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,975
Сказал спасибо: 2,554
Сказали Спасибо 11,852 раз(а) в 5,940 сообщении(ях)
|
Re: ds18b20 + LCd
miwutka, Вы бы нарисовали свой алгоритм на бумажке, многое прояснилось бы. В голове держать будете потом, когда привыкните. Сначала нарисуйте то, что хотите иметь, а потом то, что есть уже по факту и сравните.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
25.07.2013, 22:59
|
|
Временная регистрация
Регистрация: 17.07.2006
Сообщений: 70
Сказал спасибо: 20
Сказали Спасибо 8 раз(а) в 6 сообщении(ях)
|
Re: ds18b20 + LCd
Сообщение от Halex07
|
....
Бред номер раз...
....
Бред номер два...
|
Полностью согласен! Буквально через пару минут после того, как это всё отпостил, понял, что криво схему рассматривал ![Обрадован](images/smilies/icon_surprised.gif) Да только поленился извиняться за бредоносность высказывания ![Расстроен](images/smilies/icon_sad.gif)
Мало того, я ведь далее потому и не настаивал на изменении схемы
...а-то сразу "вот шашка, давай голову!", "нахрена" да "нахрена"... Это вы тут все сразу умные, а я потом (Мрак, "Трое из леса"(С))
Последний раз редактировалось aan20132; 25.07.2013 в 23:08.
|
|
|
|
26.07.2013, 07:09
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: ds18b20 + LCd
Сообщение от miwutka
|
Скажите так должно работать нормально?
|
Глянул бегло, некогда... Но сразу бросилось в глаза:
Если вы считываете температуру по таймеру ›=800, то команда для датчика 0x44 - (начать преобразование) должна отсылаться при таймере ==0, тогда все будет логично и корректно.
И еще, пока ехал на работу вспомнил, по поводу вывода -9999. У вас изначально определяется:
Код:
|
unsigned char rom_code[MAX_DEVICES][9]; |
Т.е. не один датчик. Ну и будет это иногда проскакивать, так вот простейший способ избежать проверять условие привыводе : если возвращена температура -9999 - не выводить на дисплей. Просто и надежно!
Последний раз редактировалось Halex07; 26.07.2013 в 09:55.
|
|
|
Сказали "Спасибо" Halex07
|
|
|
26.07.2013, 12:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
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;
};
|
Подскажите что я тут намутил что второй датчик не читает.....
|
|
|
|
26.07.2013, 12:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
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 может какоето левое проскачить....
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|