Страница 126 из 148
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пт окт 06, 2017 20:18:41
Serzh2000
точно забыл щааааааа..........
Добавлено after 14 minutes 50 seconds:
ну... ну... ваще ОГРОМНОЕ СПАСИБО!!!!!!!!!!!!!
5 минут глядел ни одного косяка
месяц моих мучений закончился, огромное спасибо
маленькая просьба, так чтобы понять, что ВЫ написали пркоментируйте
Код: Выделить всё
while((temperature = ds18x20_temperature(&rom_code[i][0])) == -9999)
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пт окт 06, 2017 22:11:36
philosoraptor
Цикл, который крутится, пока значение в скобках истинно(или наоборот, если !=).
Я этот цикл в своих программах не использую без счетчика таймаута, но здесь собака сработает, если оно вдруг зависнет. А вообще вчерашний вариант программы не работал только из-за того вашего косяка в ds18x20_v3.lib, и он лучше, на вашем месте я бы использовал именно его.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пн окт 16, 2017 22:30:14
Serzh2000
Всем привет!
забыл в пятницу выключить будильник, а в субботу он всех разбудил рано.....
решил исправить ситуацию
воял-воял правил-правил программу, все тупик, прошу помощи в следующем:
если открыть протеус нажать кнопку "уст" год вроде правильно, но месяцы 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 - работа будильника по выходным
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт окт 19, 2017 19:12:49
Serzh2000
прошу сильно не ругать, я забыл в библиотечке датчика отключить все cli() и sei() во вложении от 16.10.17
Спойлер
/*
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]);
}
}
//-------------------------------------------------
или скачать исправленное вложение
Добавлено 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 в которых сохраняются переменные
#define MEM_T_IND_DATE = 63
пишем
rtc_write(MEM_T_IND_DATE,23);
и наша библиотека ds1307_twi.h переводит число в 8 битное двоичное исчисление 00010111 и закидывает в 63 ячейку
так???
прокомментируйте мои мысли вслух что так что нет
киньте ссылку что еще почитать только на русском по английски для меня трудно
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт окт 19, 2017 22:09:53
philosoraptor
Лучше юзать флешку, чем еепром меги, ессно, у флешки ресурс выше на порядок. Обращение через функцию rtc_write() работать не будет, у флешки другой адрес.
Выкладывал на прошлых страницах несколько лет назад код с i2c либой, подправленной специально под связку 3231+24C32.
А еще писал как-то свою либу для одного проекта, там сразу и побайтово, и блоками по 16 байт можно флеш писать/читать, заодно и все функции 3231, включая считывание температуры с встроенного датчика. Если интересно, поищу ее.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Сб окт 21, 2017 09:01:49
Serzh2000
Выкладывал на прошлых страницах несколько лет назад код с i2c либой, подправленной специально под связку 3231+24C32
да я видел на 103 стр. но там нет исходника если сохранился покажите код.
Если интересно, поищу ее.
очень интересно
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Сб окт 21, 2017 11:38:23
Martin76
philosoraptor писал(а):Лучше юзать флешку, чем еепром меги,
24С - нисколько не флешь память, а ЕЕПРОМ. У МК Атмел вполне долговечная ЕЕПРОМ, не хуже , чем в 24С по ресурсу, задолбаетесь его исчерпывать.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Сб окт 21, 2017 12:53:29
philosoraptor
Serzh2000
Хорошо, сегодня-завтра попробую порыться в старых флешках.
Martin76 писал(а):У МК Атмел вполне долговечная ЕЕПРОМ, не хуже , чем в 24С по ресурсу
Дайте угадаю: в дэташиты
мы не заглядываем, ибо не барское это дело.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пн ноя 06, 2017 15:06:06
Serzh2000
все привет!
пока жду из китая ds3231 решил сделать по красивше корпус для часов
и вот подумал очень много у нас кнопок аж 7 штук
надо переделать на 4 согласны?
вопрос : одно нажатие на кнопку попадаем в настройку часов
if (key == KEY_SET) {
indicate = IND_SET_H;
}
одно долгое нажатие (больше 3 сек) попадаем в настройку будильника
if (???????? == KEY_SET) {
indicate = IND_SET_AL1_H;
}
как это написать ?
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пн ноя 06, 2017 15:08:54
Demiurg
Конечные автоматы, MicroMenu.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вт ноя 07, 2017 18:35:43
Serzh2000
точно нужно сделать меню
примерно так
set CLOC:
sec – часы;
– минуты;
– секунды
– коррекция ( хотя коррекция наверно вообще не нужна на ds3231)
set ALAr:
sec – А1 будильник
– часы
– минуты
– А0 будильник
– часы
– минуты
set diSP:
sec – время индикации текущего времени.
– время индикации даты.
– время индикации температуры.
set LiGH:
sec – минимальный порог яркости
– максимальный порог яркости
кажется ничего не забыл
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Ср ноя 08, 2017 19:50:04
LukaS_St
Всем привет. В программировании АВР я новичок, и мои попытки переделать код по д себя не увенчались успехом( Хотел бы поинтересоваться: может быть кто-то правил код под индикатор такого плана(фото прилагаю): +/- температуры отображается в первом разряде, дата отображается с точкой между числом и месяцем.

Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Ср ноя 08, 2017 20:56:01
Serzh2000
индикатор такого плана(фото прилагаю)
на таком индикаторе не будет высвечиваться десятки температуры, только целые числа
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Ср ноя 08, 2017 21:30:13
LukaS_St
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3227840#p3227840"]
индикатор такого плана(фото прилагаю)
на таком индикаторе не будет высвечиваться десятки температуры, только целые числа[/uquote]
Десятки и не требуются. Главное уменьшить размер и сохранить "+".
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт ноя 09, 2017 15:06:53
Serzh2000
Десятки и не требуются.
ежели так ща попробую
Добавлено after 18 minutes 2 seconds:
на попробуй, в протеусе работает в железе не знаю
вертикальная палочка у плюса подключается вместо точки на четвертом разряде
и еще сделал отрицательную температуру показывает с нолем (-05 градусов) ,
а положительную без ноля (+ 5 градусов )
прикинь как лучше с нолем или без я поправлю потом
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Чт ноя 09, 2017 22:03:16
LukaS_St
Serzh2000, спасибо!!! Ваши правки помогли мне сориентироваться в коде.
Я все же решил что дробная часть нужна, вернул ее, добавил точку в индикации даты. Может кому пригодится, прикрепляю архив.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пт ноя 10, 2017 17:35:52
Serzh2000
я рад, что смог помочь
если не секрет где брали такой большой индикатор и сколько стоит?
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Сб ноя 11, 2017 10:21:56
LukaS_St
Индикатор буду изготавливать самостоятельно: корпус из композитного материала отдам на фрезеровку, повставляю, распаяю диоды. Потом покажу что получится.
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Вт ноя 28, 2017 12:19:20
Serzh2000
изготавливать самостоятельно: корпус из композитного материала отдам на фрезеровку,
похвалитесь результатом, очень интересно посмотреть
Re: Часы-календарь-термометр (Mega8+DS1307+DS18B20+4LED)
Добавлено: Пн дек 04, 2017 09:32:03
vadzik
Всем привет собрал уже трое чесов работают отлично.
Но есть один вопрос по поводу датчиков температуры как сделать
чтоб было видно какой датчик в данный момент показывает хотябы один.