Обсуждаем контроллеры компании Atmel.
Ответить

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Вт сен 26, 2017 20:56:53

добрый вечер.

Все спаял и уложил в корпус. И случайно получился такой приятный момент.
изначально, по задумке 5 мм зеленые светодиоды в сегменты, но в наличии их не оказалось в достаточном количестве и я решил будет белый циферблат (их у меня много )

белый цвет цифр мне не понравился, залепил их зеленым скотчем, и накрыл тетрадочным листом, чтоб не видно было скотча.

Красиво, спокойный ярко-зеленый цвет циферок.

Получились часы как у всех....... на глаза попался оранжевый приклеил, ёёёёёёёёёёёёёё красота!!!

Черный корпус, крупные сочно-яркие оранжевые цифры как морковка !!!!!

а с другой стороны надоедят, схожу в магазин куплю серо-буро-малиново-вишнево-персикового цвета скотч
и будет другой цвет у циферок.

осталось нарисовать переднюю панель, там над кнопочками название, циферки обвести, абстракцию ,что б белого не было
потом в школе на цветном принтере распечатаю и вместо клетчатого листа.



Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение
Вложения
часы динамика день_ночь.7z
(242.09 KiB) Скачиваний: 381
плата.7z
(32.88 KiB) Скачиваний: 253

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Ср сен 27, 2017 12:45:56

Всеравно ночью 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[i][0]);
if (temperature!=-9999){yarkost_down(); view_term(); yarkost_up();}
delay_200ms(tt3);

помогите написать правильно, пожалуйста.


и если нетрудно объясните почему в часах такой конфликт яркости с датчиками
это из-за подключения по трем проводам кнопок пошло все на наперекосяк или от универсальности подключения датчиков

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Чт сен 28, 2017 04:58:38

Нужно использовать аппаратный ШИМ, и управлять общими анодами или катодами. У вас динамика, вывода аппаратного ШИМ-а нет, значит программный ШИМ, а он всегда чреват нюансами.
Как бы сделал я: либо расширение ввода-вывода (регистры) , в этом случае высвобождается вывод аппаратного ШИМ-а. либо специальную микросхему, которая сама рулит индикаторами. В этом случае высвобождаются ресурсы МК и вывод ШИМ.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Чт сен 28, 2017 10:26:04

так то оно так, однако я не силен в написании кода.
кто бы взялся написать код под идеальнее часы.

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

я так понимаю вот этой переменной devices=w1_search(0xf0,rom_code);

devices serch - переводится как- поиск устройств. Название переменной говорит само за себя, т.е. сколько найдено температурных датчиков. В момент старта количество найденных датчиков выводится после "Fnd " (От слова Find - находить)

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Чт сен 28, 2017 20:11:14

спасибо.
я как то не догадался, конечно же temperature=ds18x20_temperature(&rom_code[i][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[i][0]);
if (temperature!=-9999){yarkost_down(); view_term(); yarkost_up();}
delay_200ms(tt3);
}
}

правда если так написать то перед тем как показать температуру где то 2 секунды темный экран.
почему? так долго выщитывается температура, да? может кто поумнее меня напишет

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Пт сен 29, 2017 06:07:19

Основная проблема этого проекта - опрос температурного датчика. 1-wire протокол с жесткими времянками. А также вся программа в целом. Выполнение всех участков программы от и до, вдобавок задержки delay, который тормозят МК на все время выполнения временных интервалов. То есть, если задержка delay_ms (200) - это значит, что микроконтроллер тупо считает такты все 200 мс.

Это лечится двумя вариантами. Статический режим дисплея, а это значит, что нужны сдвиговые регистры на каждый разряд. Либо дисплей должен быть самостоятельным модулем.

Есть еще один способ, совершенно другой подход в программе. Дробление всех процессов и программные таймеры. А это уже автоматное программирование. Конечные автоматы.

То есть, чтобы получить идеальный проект, легко повторяемый даже малоопытными, создать проект с нуля.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Пт сен 29, 2017 09:01:02

Статический режим дисплея, а это значит, что нужны сдвиговые регистры на каждый разряд.

4 микросхемы 7-8 выходов на сегменты 32 ключа ........ очень много деталей
дисплей должен быть самостоятельным модулем.

это как ????????
Дробление всех процессов и программные таймеры.
получить идеальный проект, легко повторяемый даже малоопытными, создать проект с нуля

вот это интересно, если можно поподробнее

Типа модуль установок , модуль часы, модуль меню, модуль кнопки, модуль датчики, модуль будильник.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Пт сен 29, 2017 09:33:37

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

Это в случае динамики. Модуль дисплея принимает готовые данные, рулит светодиодами сам. Отдельный МК либо специализированная микросхема.

покажете ссылку, мне кажется много переделывать не надо будет в часах

Выполнение кода кусочками. Это достигается условиями, флагами, состояниями конечных автоматов.

а яркость она ж что в часах что на температуре программный ШИМ
опрос температурного датчика. 1-wire протокол с жесткими времянками.
и все сново-здарова???

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Сб сен 30, 2017 11:40:57

В случае аппаратного шима в регистр сравнения загружаем нужное значение, настраиваем таймер на нужную частоту и логику поведения внешнего пина. Как только включили ШИМ, таймер работает самостоятельно.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Вс окт 01, 2017 08:45:12

Всеравно ночью max_yarkost = 64; ярко светит, всю комнату освещает.

Так выставьте 8 или 4, в чем проблема-то?

Добавлено after 9 minutes 45 seconds:
Дробление всех процессов и программные таймеры. А это уже автоматное программирование. Конечные автоматы.

Preemptive coding это называется. Свои проекты именно так и пишу, даже простые, но скорее чисто в силу привычки. Тут же, строго говоря, необходимости в этом нет, поскольку отсутствует одновременная обработка сложного пользовательского интерфейса и объемных массивов данных.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Вс окт 01, 2017 10:47:49

Так выставьте 8 или 4, в чем проблема-то?


max_yarkost = 64; если ставить цифры меньше 64 то
перед сменой показаний на термометр и сразу после смены на мили секунду ярко засвечиваются некоторые сегменты светящихся тускло цифр в ночном режиме.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Вс окт 01, 2017 17:00:32

max_yarkost = 64; если ставить цифры меньше 64 то
перед сменой показаний на термометр и сразу после смены на мили секунду ярко засвечиваются некоторые сегменты


1. В библиотечке датчика комментим все cli() и sei()

2. В основном цикле меняем формат опроса датчика, теперь опрашиваем его несколько раз в цикле for() с break если != 0

Теперь температура иногда будет выводиться с задержкой, зато мерцаний больше не будет.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Вс окт 01, 2017 19:21:10

для новичка это сложно
комментим

и что это слово означает?

если не сложно поправьте код , а я протестирую
за одно уму разуму подучусь

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Вс окт 01, 2017 19:45:29

Ставите перед строчкой //, или берете ее в /* */, ну или же можно вообше ее просто стереть.
Если все будут делать за вас, вы ничему не научитесь.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Вс окт 01, 2017 20:51:26

ни чего сложного

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Пн окт 02, 2017 03:13:41

комментим cli и sei.

Вы сами то хоть пробовали этот проект собрать и сделать как написали?

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Пн окт 02, 2017 10:29:34

пробовали этот проект собрать и сделать как написали?


Да, причем года три назад примерно, и дивайс с тех пор работает без нареканий.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)

Пн окт 02, 2017 11:32:26

так покажите свой исходник ,неужели жалко

Добавлено 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

чуть поподробней для новичка, можно
Ответить