Страница 124 из 148
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вт сен 26, 2017 20:56:53
Serzh2000
добрый вечер.
Все спаял и уложил в корпус. И случайно получился такой приятный момент.
изначально, по задумке 5 мм зеленые светодиоды в сегменты, но в наличии их не оказалось в достаточном количестве и я решил будет белый циферблат (их у меня много )
белый цвет цифр мне не понравился, залепил их зеленым скотчем, и накрыл тетрадочным листом, чтоб не видно было скотча.
Красиво, спокойный ярко-зеленый цвет циферок.
Получились часы как у всех....... на глаза попался оранжевый приклеил, ёёёёёёёёёёёёёё красота!!!
Черный корпус, крупные сочно-яркие оранжевые цифры как морковка !!!!!
а с другой стороны надоедят, схожу в магазин куплю серо-буро-малиново-вишнево-персикового цвета скотч
и будет другой цвет у циферок.
осталось нарисовать переднюю панель, там над кнопочками название, циферки обвести, абстракцию ,что б белого не было
потом в школе на цветном принтере распечатаю и вместо клетчатого листа.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Ср сен 27, 2017 12:45:56
Serzh2000
Всеравно ночью max_yarkost = 64; ярко светит, всю комнату освещает.
буду копать код дальше, от помощи не откажусь, или мыслей вслух.
выше грамотные люди пояснили, огромное спасибо им, откуда засветы
я так понимаю вот этой переменной devices=w1_search(0xf0,rom_code);
А в этот момент "приспичило" температуру измерить,
откуда следует нужно объяснить ей......... на языке С , что
в этом куске кода
(подождать пока OCR2 = max_yarkost будет >=15)
if (
(OCR2 !>15)&&(
devices >= 1) && (indicate == IND_CLOCK) && (t_ind_term != 0)) {
for
(OCR2 !>15)&& (i=0;i<
devices;i++) {
temperature=ds18x20_temperature(&rom_code
[0]);
if (temperature!=-9999){yarkost_down(); view_term(); yarkost_up();}
delay_200ms(tt3);
помогите написать правильно, пожалуйста.
и если нетрудно объясните почему в часах такой конфликт яркости с датчиками
это из-за подключения по трем проводам кнопок пошло все на наперекосяк или от универсальности подключения датчиков
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт сен 28, 2017 04:58:38
Demiurg
Нужно использовать аппаратный ШИМ, и управлять общими анодами или катодами. У вас динамика, вывода аппаратного ШИМ-а нет, значит программный ШИМ, а он всегда чреват нюансами.
Как бы сделал я: либо расширение ввода-вывода (регистры) , в этом случае высвобождается вывод аппаратного ШИМ-а. либо специальную микросхему, которая сама рулит индикаторами. В этом случае высвобождаются ресурсы МК и вывод ШИМ.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт сен 28, 2017 10:26:04
Serzh2000
так то оно так, однако я не силен в написании кода.
кто бы взялся написать код под идеальнее часы.
1 Выбор типа индикатора делается удержанием одной из четырех кнопок ("+", "-", "сек", "уст"). это гениально
2 - индикация незначащего нуля в десятках часов
3 - отбрасывание десятых долей при индикации температуры и добавление символа "С"
4 - включение плавной смены показаний
5 - "0" регулятор яркости (фоторезистор) / "1" день-ночь
6 - работа с двумя видами точек
7 - "пятый" разряд (знак температуры)
8
9 - автоперевод стрелок лето/зима (0 - отключено, 1 - включено т.е. по умолчанию включено)
а - максимальный уровень яркости (от 10 до 200) и минимальный уровень яркости если вкл день ночь
будильник 1 по дням недели звенит 1 мин (чтобы не будил по выходным)
будильник 2 по дням недели, продолжительность 01-99 ( подключить можно не только унылую открытку,а и плеер мп-3 или если релюшку то FM приемник или телик или .............
как то вот так
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт сен 28, 2017 16:44:59
zseer64
я так понимаю вот этой переменной devices=w1_search(0xf0,rom_code);
devices serch - переводится как- поиск устройств. Название переменной говорит само за себя, т.е. сколько найдено температурных датчиков. В момент старта количество найденных датчиков выводится после "Fnd " (От слова Find - находить)
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт сен 28, 2017 20:11:14
Serzh2000
спасибо.
я как то не догадался, конечно же temperature=ds18x20_temperature(&rom_code[0]);
ну если нельзя яркость трогать, тогда надо погасить экран
if ((devices >= 1) && (indicate == IND_CLOCK) && (t_ind_term != 0)) {
digit_out[0]=PROBEL;
digit_out[1]=PROBEL;
digit_out[2]=PROBEL;
digit_out[3]=PROBEL;
for (i=0;i<devices;i++) {
temperature=ds18x20_temperature(&rom_code[0]);
if (temperature!=-9999){yarkost_down(); view_term(); yarkost_up();}
delay_200ms(tt3);
}
}
правда если так написать то перед тем как показать температуру где то 2 секунды темный экран.
почему? так долго выщитывается температура, да? может кто поумнее меня напишет
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пт сен 29, 2017 06:07:19
Demiurg
Основная проблема этого проекта - опрос температурного датчика. 1-wire протокол с жесткими времянками. А также вся программа в целом. Выполнение всех участков программы от и до, вдобавок задержки delay, который тормозят МК на все время выполнения временных интервалов. То есть, если задержка delay_ms (200) - это значит, что микроконтроллер тупо считает такты все 200 мс.
Это лечится двумя вариантами. Статический режим дисплея, а это значит, что нужны сдвиговые регистры на каждый разряд. Либо дисплей должен быть самостоятельным модулем.
Есть еще один способ, совершенно другой подход в программе. Дробление всех процессов и программные таймеры. А это уже автоматное программирование. Конечные автоматы.
То есть, чтобы получить идеальный проект, легко повторяемый даже малоопытными, создать проект с нуля.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пт сен 29, 2017 09:01:02
Serzh2000
Статический режим дисплея, а это значит, что нужны сдвиговые регистры на каждый разряд.
4 микросхемы 7-8 выходов на сегменты 32 ключа ........ очень много деталей
дисплей должен быть самостоятельным модулем.
это как ????????
Дробление всех процессов и программные таймеры.
получить идеальный проект, легко повторяемый даже малоопытными, создать проект с нуля
вот это интересно, если можно поподробнее
Типа модуль установок , модуль часы, модуль меню, модуль кнопки, модуль датчики, модуль будильник.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пт сен 29, 2017 09:33:37
Demiurg
Serzh2000 писал(а):
4 микросхемы 7-8 выходов на сегменты 32 ключа ........ очень много деталей
Если обычные индикаторы - то достаточно только микросхем регистров, так как нагрузка сегмент. Общие выводы идут либо напрямую на питание, либо, если есть регулировка яркости на 1 ключ. Если сегменты сборные, значит регистры плюс ULN2803. Такая схема выходит чреватой по количеству комплектующих.
Serzh2000 писал(а):
дисплей должен быть самостоятельным модулем.
это как ????????
Это в случае динамики. Модуль дисплея принимает готовые данные, рулит светодиодами сам. Отдельный МК либо специализированная микросхема.
Serzh2000 писал(а):
Дробление всех процессов и программные таймеры.
получить идеальный проект, легко повторяемый даже малоопытными, создать проект с нуля
вот это интересно, если можно поподробнее
Типа модуль установок , модуль часы, модуль меню, модуль кнопки, модуль датчики, модуль будильник.
Выполнение кода кусочками. Это достигается условиями, флагами, состояниями конечных автоматов. То есть: за итерацию основного цикла все программные модули выполняют кусочки, части кода. Итерация основного цикла программы должна с запасом выполняться за системный такт. Скажем, за 1 мс. Пусть у нас такой основной цикл:
Код: Выделить всё
__C_task main (void)
{
wdt_enable (WDTO_15_MS);
init_sys_timer ();
__enable_interrupt ();
Init_Events ();
while (1)
{
__watchdog_reset ();
Proc_KBD (); // Обработка кнопок.
Proc_Display ();
Proc_Device (); // Собссно, ядро проекта.
Process_Events ();
}
}
Вошли в модуль, проверка условий, выполнение кода в зависимости от условий, выход. Никаких долгих циклов.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Сб сен 30, 2017 08:48:48
Serzh2000
Это в случае динамики. Модуль дисплея принимает готовые данные, рулит светодиодами сам. Отдельный МК либо специализированная микросхема.
покажете ссылку, мне кажется много переделывать не надо будет в часах
Выполнение кода кусочками. Это достигается условиями, флагами, состояниями конечных автоматов.
а яркость она ж что в часах что на температуре программный ШИМ
опрос температурного датчика. 1-wire протокол с жесткими времянками.
и все сново-здарова???
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Сб сен 30, 2017 11:40:57
Demiurg
В случае аппаратного шима в регистр сравнения загружаем нужное значение, настраиваем таймер на нужную частоту и логику поведения внешнего пина. Как только включили ШИМ, таймер работает самостоятельно.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вс окт 01, 2017 08:45:12
philosoraptor
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3193137#p3193137"]Всеравно ночью max_yarkost = 64; ярко светит, всю комнату освещает.[/uquote]
Так выставьте 8 или 4, в чем проблема-то?
Добавлено after 9 minutes 45 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3194373#p3194373"]Дробление всех процессов и программные таймеры. А это уже автоматное программирование. Конечные автоматы.[/uquote]
Preemptive coding это называется. Свои проекты именно так и пишу, даже простые, но скорее чисто в силу привычки. Тут же, строго говоря, необходимости в этом нет, поскольку отсутствует одновременная обработка сложного пользовательского интерфейса и объемных массивов данных.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вс окт 01, 2017 10:47:49
Serzh2000
Так выставьте 8 или 4, в чем проблема-то?
max_yarkost = 64; если ставить цифры меньше 64 то
перед сменой показаний на термометр и сразу после смены на мили секунду ярко засвечиваются некоторые сегменты светящихся тускло цифр в ночном режиме.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вс окт 01, 2017 17:00:32
philosoraptor
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3195781#p3195781"]max_yarkost = 64; если ставить цифры меньше 64 то
перед сменой показаний на термометр и сразу после смены на мили секунду ярко засвечиваются некоторые сегменты[/uquote]
1. В библиотечке датчика комментим все cli() и sei()
2. В основном цикле меняем формат опроса датчика, теперь опрашиваем его несколько раз в цикле for() с break если != 0
Теперь температура иногда будет выводиться с задержкой, зато мерцаний больше не будет.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вс окт 01, 2017 19:21:10
Serzh2000
для новичка это сложно
комментим
и что это слово означает?
если не сложно поправьте код , а я протестирую
за одно уму разуму подучусь
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вс окт 01, 2017 19:45:29
philosoraptor
Ставите перед строчкой //, или берете ее в /* */, ну или же можно вообше ее просто стереть.
Если все будут делать за вас, вы ничему не научитесь.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вс окт 01, 2017 20:51:26
Mishany
ни чего сложного
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пн окт 02, 2017 03:13:41
Demiurg
комментим cli и sei.
Вы сами то хоть пробовали этот проект собрать и сделать как написали?
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пн окт 02, 2017 10:29:34
philosoraptor
пробовали этот проект собрать и сделать как написали?
Да, причем года три назад примерно, и дивайс с тех пор работает без нареканий.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пн окт 02, 2017 11:32:26
Serzh2000
так покажите свой исходник ,неужели жалко
Добавлено after 37 minutes 10 seconds:
1. В библиотечке датчика комментим все cli() и sei()
в этой библиотеке снял запреты, да завет исчез
Спойлер
/*
CodeVisionAVR C Compiler
*/
#include <delay.h>
#include <ds18x20_v3.h>
//-------------------------------------------------
struct __ds18x20_scratch_pad_struct __ds18x20_scratch_pad;
//-------------------------------------------------
//-------------------------------------------------
// temp. conversion time [ms] depending on the resolution
static flash int conv_delay[4]={100,200,400,800};
// valid temp. bit mask depending on the resolution
static flash unsigned bit_mask[4]={0xFFF8,0xFFFC,0xFFFE,0xFFFF};
//-------------------------------------------------
//-------------------------------------------------
unsigned char ds18x20_select(unsigned char *addr){
unsigned char i;
if (w1_init()==0) return 0;
if (addr) {
//#asm("cli")
w1_write(0x55);
//#asm("sei")
i=0;
do {
//#asm("cli")
w1_write(*(addr++));
//#asm("sei")
} while (++i<8);
} else {
//#asm("cli")
w1_write(0xcc);
//#asm("sei")
}
return 1;
}
//-------------------------------------------------
//-------------------------------------------------
unsigned char ds18x20_read_spd(unsigned char *addr){
unsigned char i;
unsigned char *p;
if (ds18x20_select(addr)==0) return 0;
//#asm("cli")
w1_write(0xbe);
//#asm("sei")
i=0;
p=(char *) &__ds18x20_scratch_pad;
do {
//#asm("cli")
*(p++)=w1_read();
//#asm("sei")
} while (++i<9);
return !w1_dow_crc8(&__ds18x20_scratch_pad,9);
}
//-------------------------------------------------
//-------------------------------------------------
int ds18x20_temperature(unsigned char *addr){
unsigned char resolution;
if (ds18x20_select(addr)==0) return -9999;
if (addr[0] == DS18B20_FAMILY_CODE) {
resolution=(__ds18x20_scratch_pad.conf_register>>5) & 3;
}
//#asm("cli")
w1_write(0x44);
//#asm("sei")
if (addr[0] == DS18S20_FAMILY_CODE) {
delay_ms(550);
}
if (addr[0] == DS18B20_FAMILY_CODE) {
delay_ms(conv_delay[resolution]);
}
if (ds18x20_read_spd(addr)==0) return -9999;
//#asm("cli")
w1_init();
//#asm("sei")
if (addr[0] == DS18S20_FAMILY_CODE) {
return ((int)__ds18x20_scratch_pad.temp_msb<<8|__ds18x20_scratch_pad.temp_lsb)<<3;
}
if (addr[0] == DS18B20_FAMILY_CODE) {
return (*((int *) &__ds18x20_scratch_pad.temp_lsb) & bit_mask[resolution]);
}
}
//-------------------------------------------------
В основном цикле меняем формат опроса датчика, теперь опрашиваем его несколько раз в цикле for() с break если != 0
чуть поподробней для новичка, можно