Добавлено after 14 minutes 50 seconds: ну... ну... ваще ОГРОМНОЕ СПАСИБО!!!!!!!!!!!!! 5 минут глядел ни одного косяка месяц моих мучений закончился, огромное спасибо маленькая просьба, так чтобы понять, что ВЫ написали пркоментируйте
Цикл, который крутится, пока значение в скобках истинно(или наоборот, если !=). Я этот цикл в своих программах не использую без счетчика таймаута, но здесь собака сработает, если оно вдруг зависнет. А вообще вчерашний вариант программы не работал только из-за того вашего косяка в ds18x20_v3.lib, и он лучше, на вашем месте я бы использовал именно его.
Всем привет! забыл в пятницу выключить будильник, а в субботу он всех разбудил рано.....
решил исправить ситуацию воял-воял правил-правил программу, все тупик, прошу помощи в следующем: если открыть протеус нажать кнопку "уст" год вроде правильно, но месяцы 1.2.3.4.5.6.7.8.9.0A.0b.0C дни вроде правильно на часа в протеусе трехзначное число в днях или годе получается кнопки неправильно myday=day_from_data(); rtc_set_date(myday, mydate, mymonth, myyear); записывают ячейки или что куда копать???
Добавлено after 44 minutes 56 seconds: получается я не правильно считаю дни недели
//---------- вычисление дня недели по дате ----------
unsigned int day_from_data () { unsigned int a,y,m,day; mymonth=bcd2bin(mymonth); a=(14-bcd2bin(mymonth))/12; y=(bcd2bin(myyear)+2000)-a; m=bcd2bin(mymonth)+12*a-2; day=(7000+(bcd2bin(mydate)+y+y/4-y/100+y/400+(31*m)/12))%7; day=bin2bcd(day+1); return day;
если поставить в код myday=day_from_data(); просто myday=2; (сегодня понедельник) то все работает четко
другой вопрос как высчитать по другому день недели????????
Добавлено after 1 hour 9 minutes 35 seconds: Извиняюсь за беспокойство, решено // ---------- вычислить день недели по дате ---------- void day_from_data(void) { unsigned int y, m;
y = bcd2bin(myyear); m = bcd2bin(mymonth);
if (m > 2) { m -= 2; } else { m += 10; y--; }
myday = (unsigned char)((bcd2bin(mydate) + y + (y>>2) + ((31 * m) / 12)) % 7);
if (myday == 0) myday = 7; }//----------
пока больше глюков в прошивке не нашел если кто желает пробуйте изменено:
последовательность индикации: время/число+ день недели/температура,
Будильники: два светодиода - индикация активности будильника(ов) будильник "Б1" время срабатывания PORT_ALARM_BIPER будильник "Б2" время отключения PORT_ALARM_BIPER (если "Б2"-- 24 часа в сутки будет петь )
установки будильников кнопкой будильник "Б1" кнопка "Б2" большая красная на верху будильника ОТКЛЮЧЕНИЕ СИГНАЛА (мне показалось не совсем удобно с просони искать кнопки "+ и -" хотя они также работают как и у автора)
номера ячеек EEPROM и их значение (на индикаторе номер ячейка Е2 - Е9 и ее значение): 2 - индикация незначащего нуля в десятках часов 3 - отбрасывание десятых долей при индикации температуры и добавление символа "С" 4 - включение плавной смены показаний 5 - включение ночного режима с 22-00 до 6-00 6 - работа с двумя видами точек 7 - "пятый" разряд (знак температуры) 8 - режим индикации состояния ADC (0 - кнопки, 1 - фоторезистор, F - откл.) 9 - автоперевод стрелок лето/зима (0 - отключено, 1 - включено т.е. по умолчанию включено) а - минимальный уровень яркости (от 10 до 200) индикация в десятках т.е. на индикаторе от 1 до 20 b - работа будильника по выходным
//---------- // 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}; //----------
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]); } } //---------- или скачать исправленное вложение
Добавлено after 1 hour 12 minutes 47 seconds: часы за месяц убежали на полторы минуты в перед, коррекция дело хорошее, но хотелось бы более точный девайс. выписал у китайцв DS3231 AT24C32 IIC модуль пока жду его изучаю литературу.
возникли несколько вопросов, прокомментируйте где лучше хранить данные в энергонезависимой памяти атмеги 8 или AT24C32
ds1307 допустим мне надо сохранить в ОЗУ в ячейке 12 число 23 смотрим код в наших часах
// ячейки памяти DS1307 в которых сохраняются переменные
#define MEM_T_IND_DATE = 12 пишем rtc_write(MEM_T_IND_DATE,23); и наша библиотека ds1307_twi.h переводит число в 8 битное двоичное исчисление 00010111 и закидывает в 12 ячейку
так???
ds 33231 структура ячеек похожа за исключением будильников однако памяти своей нет воспользуемся AT24C32 в инструкции к ней написано первая ячейка с номером 0x57 (в каком исчислении я не понял Десятичная или Шестнадцатиричная) в этой микросхеме можно писать 8 битную информацию 8 одна ячейка , 16 одна и переползет на следующую , 32 одна и переползет на 3 следующих нам такие не нужны пишем только 8 битные числа ( тут я не понял, сколько в ней ячеек по восемь бит )
допустим мне надо сохранить в AT24C32 в ячейке 63 число 23 // ячейки памяти AT24C32 в которых сохраняются переменные
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Лучше юзать флешку, чем еепром меги, ессно, у флешки ресурс выше на порядок. Обращение через функцию rtc_write() работать не будет, у флешки другой адрес. Выкладывал на прошлых страницах несколько лет назад код с i2c либой, подправленной специально под связку 3231+24C32. А еще писал как-то свою либу для одного проекта, там сразу и побайтово, и блоками по 16 байт можно флеш писать/читать, заодно и все функции 3231, включая считывание температуры с встроенного датчика. Если интересно, поищу ее.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
set CLOC: sec – часы; – минуты; – секунды – коррекция ( хотя коррекция наверно вообще не нужна на ds3231)
set ALAr: sec – А1 будильник – часы – минуты – А0 будильник – часы – минуты
set diSP: sec – время индикации текущего времени. – время индикации даты. – время индикации температуры. set LiGH: sec – минимальный порог яркости – максимальный порог яркости
Всем привет. В программировании АВР я новичок, и мои попытки переделать код по д себя не увенчались успехом( Хотел бы поинтересоваться: может быть кто-то правил код под индикатор такого плана(фото прилагаю): +/- температуры отображается в первом разряде, дата отображается с точкой между числом и месяцем.
Добавлено after 18 minutes 2 seconds: на попробуй, в протеусе работает в железе не знаю вертикальная палочка у плюса подключается вместо точки на четвертом разряде и еще сделал отрицательную температуру показывает с нолем (-05 градусов) , а положительную без ноля (+ 5 градусов ) прикинь как лучше с нолем или без я поправлю потом
Serzh2000, спасибо!!! Ваши правки помогли мне сориентироваться в коде. Я все же решил что дробная часть нужна, вернул ее, добавил точку в индикации даты. Может кому пригодится, прикрепляю архив.
Индикатор буду изготавливать самостоятельно: корпус из композитного материала отдам на фрезеровку, повставляю, распаяю диоды. Потом покажу что получится.
Зарегистрирован: Чт мар 22, 2012 08:30:22 Сообщений: 34
Рейтинг сообщения:0
Всем привет собрал уже трое чесов работают отлично. Но есть один вопрос по поводу датчиков температуры как сделать чтоб было видно какой датчик в данный момент показывает хотябы один.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения