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

Обсуждаем контроллеры компании Atmel.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

sergsurf писал(а):Часы прошиты прошивкой указанной в начале темы.
Я насчитал штук 6 прошивок, и два или три типа контроллера. Конкретней, какая?
Реклама
sergsurf
Родился
Сообщения: 9
Зарегистрирован: Вт мар 15, 2016 12:04:12

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

Сообщение sergsurf »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3769201#p3769201"]
sergsurf писал(а):Часы прошиты прошивкой указанной в начале темы.
Я насчитал штук 6 прошивок, и два или три типа контроллера. Конкретней, какая?[/uquote]
Часы уже так давно работают что я уже не помню. Да и не стоит заморачиваться пусть себе и дальше так работают, Все уже привыкли. Спасибо за участие.
Еще не придумал.
Реклама
CNCBaby
Родился
Сообщения: 17
Зарегистрирован: Ср дек 25, 2019 14:36:28

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

Сообщение CNCBaby »

Всем. Привет.
Может кто подскажет в чем дело. Часы работали. Решил поменять батарейку. Вставил новую. На часах надпись "Fn:d0" и висит до бесконечности. В режим часов не переходит.
Аватара пользователя
samand587
Поставщик валерьянки для Кота
Сообщения: 2312
Зарегистрирован: Вт фев 21, 2017 18:59:21
Откуда: Седой Урал

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

Сообщение samand587 »

[uquote="CNCBaby",url="/forum/viewtopic.php?p=3782326#p3782326"]Часы работали.[/uquote]

У меня так же часы работали, но из-за чужих кривых рук по настройкам зависли. Помогла перепрошивка МК. :))
Реклама
Эиком - электронные компоненты и радиодетали
CNCBaby
Родился
Сообщения: 17
Зарегистрирован: Ср дек 25, 2019 14:36:28

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

Сообщение CNCBaby »

Перепрошивка МК помогла но опять до тех пор пока не вытащил батарейку. Но это не выход. Нужно понять в чем дело.
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="CNCBaby",url="/forum/viewtopic.php?p=3782343#p3782343"]Перепрошивка МК помогла но опять до тех пор пока не вытащил батарейку. Но это не выход. Нужно понять в чем дело.[/uquote]
Варианты:
1 - Не выставлены фьюзы BODEN и BODLEVEL. Из-за этого, когда передергиваете питание, происходит программный сбой, программа могла улететь куда угодно и записать что-то в EEPROM. Отсюда, при включении питания считываются неверные параметры и зависание часов. Методы решения: выставить фьюзы. Я не знаю, какое напряжение питания МК. Исходить из этого. Идем дальше. Никогда не использовать нулевой (первый по порядковому номеру) байт EEPROM. В конце каждого обращения к EEPROM выставлять указатель EEPROM в нуль.
Пример на ассемблере
Спойлер

Код: Выделить всё

//************************************************************************
//========= EEPROM ===================
//************************************************************************

// Так как возможна случайная запись в EEPROM в случае сбоя питания, то:
// 1 - В микроконтроллере включить контроль снижения напряжения питания. 
// 2 - Первый (0x00) байт никогда не используется. 
// 3 - После ресета обнулить указатель адреса EEPROM. 
// Решения для увеличения ресурса EEPROM:
// 4 - Перед записью считывается байт, предназначенный для записи,
// проверяется на равенство с записываемым, если байты равны, то переход
// к записи следующего байта. 
// 5 - В конце работы с EEPROM обнулить указатель адреса. 

// В программе, в нужном месте:
// .eseg
// .org 0x01
// bla-bla - пошли данные.
// BRIGHT_BUF: ; Значение яркости VFD.
// .byte	1

#if (EEPROM==YES)

.macro Read_EEPROM
	ldix	@0 // Указатель адреса EEPROM.
	ldiy	@1 // Указатель адреса SRAM.
	ldi		r17,@2
	rcall	_Read_EEPROM
.endmacro

_Read_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Read_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	sbi		EECR,EERE
	sbi		EECR,EERE
	in		EEDREG,EEDR
	st		Y+,EEDREG
	adiw	XL,1
	dec		r17
	brne	_Read_EEPROM
_Read_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Read_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

EERead:
	sbic	EECR,EEWE
	rjmp	EERead
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	sbi		EECR,EERE
	sbi		EECR,EERE
	in		EEDREG,EEDR
EERead_1:
	sbic	EECR,EEWE
	rjmp	EERead_1
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

EEWrite:
	sbic	EECR,EEWE
	rjmp	EEWrite
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	out		EEDR,EEDREG
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
EEWrite_1:
	sbic	EECR,EEWE
	rjmp	EEWrite_1
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

.macro Write_EEPROM
	ldiy	@0 // Указатель адреса SRAM.
	ldix	@1 // Указатель адреса EEPROM.
	ldi		r17,@2
	rcall	_Write_EEPROM
.endmacro

_Write_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Write_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	ld		EEDREG,Y+
	out		EEDR,EEDREG
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
	adiw	XL,1
	dec		r17
	brne	_Write_EEPROM
_Write_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Write_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

.macro	Clear_EEPROM
	ldx		@0
	ldy		@1
	rcall	_Clear_EEPROM
.endmacro

_Clear_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Clear_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	out		EEDR,RCLR
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
	adiw	XL,1
	sbiw	YL,1
	brne	_Clear_EEPROM
_Clear_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Clear_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

#endif
//************************************************************************
Пример на си
Спойлер

Код: Выделить всё

//==================
//#pragma location = 0x01

/*
__eeprom u08 ee_empty_val @ 0x0100 = 0;
__eeprom u16 ee_tim_heat_val @ 0x0101 = 10;
__eeprom u16 ee_tim_formovka_val @ 0x0103 = 10;
__eeprom u16 ee_tim_pnevmosyem_val @ 0x0105  = 10;

__eeprom u16 ee_timout_sens_1_val @ 0x0107  = 30;
__eeprom u16 ee_timout_sens_2_val @ 0x0109  = 30;
__eeprom u16 ee_timout_sens_3_val @ 0x010B  = 30;
__eeprom u16 ee_timout_sens_4_val @ 0x010D  = 30;

__eeprom u32 ee_sett_quant @ 0x010F  = 1000;
__eeprom u32 ee_curr_quant @ 0x0113  = 0;
*/

__eeprom u08 ee_empty_val = 0;
__eeprom u16 ee_tim_heat_val = 12;
__eeprom u16 ee_tim_formovka_val = 12;
__eeprom u16 ee_tim_pnevmosyem_val = 6;

__eeprom u16 ee_timout_sens_1_val = 30;
__eeprom u16 ee_timout_sens_2_val = 30;
__eeprom u16 ee_timout_sens_3_val = 30;
__eeprom u16 ee_timout_sens_4_val = 30;

__eeprom u32 ee_sett_quant = 10000;
__eeprom u32 ee_curr_quant = 5304;

__eeprom u16 ee_quant_products = 777;

__eeprom u08 ee_state_tens = 0<<TEN_1 | 0<<TEN_2;
//==================

//==================
void read_proc_eds_param (void)
{
   tim_heat_val = ee_tim_heat_val;
   tim_formovka_val = ee_tim_formovka_val;
   tim_pnevmosyem_val = ee_tim_pnevmosyem_val;

   timout_sens_1_val = ee_timout_sens_1_val;
   timout_sens_2_val = ee_timout_sens_2_val;
   timout_sens_3_val = ee_timout_sens_3_val;
   timout_sens_4_val = ee_timout_sens_4_val;

   sett_quant = ee_sett_quant;
   curr_quant = ee_curr_quant;

   quant_products = ee_quant_products;

   outputs_buf [1] = ee_state_tens;

   volatile u08 a = ee_empty_val; // В конце каждого обращения указатель EEPROM в 0.
}
//==================

//==================
void save_parameters_eeprom (void)
{
   if (ee_tim_heat_val != tim_heat_val) ee_tim_heat_val = tim_heat_val;

   if (ee_tim_formovka_val != tim_formovka_val) ee_tim_formovka_val = tim_formovka_val;

   if (ee_tim_pnevmosyem_val != tim_pnevmosyem_val) ee_tim_pnevmosyem_val = tim_pnevmosyem_val;
//------------------------------------------------------------------------
   if (ee_timout_sens_1_val != timout_sens_1_val) ee_timout_sens_1_val = timout_sens_1_val;

   if (ee_timout_sens_2_val != timout_sens_2_val) ee_timout_sens_2_val = timout_sens_2_val;

   if (ee_timout_sens_3_val != timout_sens_3_val) ee_timout_sens_3_val = timout_sens_3_val;

   if (ee_timout_sens_4_val != timout_sens_4_val) ee_timout_sens_4_val = timout_sens_4_val;
//------------------------------------------------------------------------
   if (ee_sett_quant != sett_quant) ee_sett_quant = sett_quant;
//------------------------------------------------------------------------
   if (ee_curr_quant != curr_quant) ee_curr_quant = curr_quant;
//------------------------------------------------------------------------
   if (ee_quant_products != quant_products) ee_quant_products = quant_products;
//------------------------------------------------------------------------
   if (ee_state_tens != outputs_buf [1]) ee_state_tens = outputs_buf [1];
//------------------------------------------------------------------------
   volatile u08 a = ee_empty_val; // В конце каждого обращения указатель EEPROM в 0.
}
//==================
В идеале, в начале программы нужно сделать проверку данных на корректность. Я думаю здесь проблемы. Параметры вышли за пределы, а проверки на валидность нет.

Мне некогда и лень искать архив. Дайте ссылку на исходники часов. Посмотрю, что да как.

Посмотрел схемы часов в начале темы. Речь о батарейке для DS3107? Эта микросхема капризная, я от нее отказался. Встает раком чуть ли не от чиха. Решение. Переинициализация микросхемы. Щупать ее как-то, проверять, жива ли. Использовать вывод IRQ, часы настроить на дрыгание выводом IRQ с частотой 1 Гц.

Есть еще решение. Считывать управляющий регистр микросхемы, проверять его. Но, может быть такой вариант, что в часах может оказаться полная каша. Я, когда баловался, пробовал часы сделать, делал полную переинициализацию микросхемы. Запуск, настройка, задание времени указанное в проекте. Скажем, 6.00. Если вывод IRQ замолчал, можно считать, что микросхема зависла.
Реклама
CNCBaby
Родился
Сообщения: 17
Зарегистрирован: Ср дек 25, 2019 14:36:28

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

Сообщение CNCBaby »

Да речь идет о DS1307. Прочитал половину форума. Сколько осилил. У многих эта проблема. Но решение так и не увидел. Проблема в SMD корпусе DS1307. Другие часы с Dip корпусом DS1307 без проблем переносят извлечение батарейки. Исходники есть на первой странице.

Добавлено after 6 minutes 11 seconds:
Собрал 3 шт. часов на платах из одной партии. У у всех одна и та же "болезнь" с извлечением батарейки. Что самое удивительное после перепрошивке все работает. Я думаю проблема в коде связанном с DS1307.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="CNCBaby",url="/forum/viewtopic.php?p=3782374#p3782374"]Я думаю проблема в коде связанном с DS1307.[/uquote]
Проблема комплексная. Микросхема боится помех по питанию. Я когда делал макет, сначала у меня платка с часами висела на проводочках. Потом впаял в макетку. Один хрен, часы вставали, достаточно было дотронуться отверткой до питания или просто выводов деталей.
Поэтому, решение - написано выше. Проверять вывод IRQ. Если часы встали, считать это равнозначно вытаскиванию батарейки и сбою микросхемы. В таком случае полная переинициализация часов. Можно сделать какую-то индикацию, что микросхема сбойнула и нужно переустановить дату, время.

Нашел, кстати видеоотчет одного своего проекта. Часы заменил на DS3231. Обращение к микросхеме в основном идентично, есть пара нюансов. В этом проекте у меня комплексная проверка работоспособности микросхемы. При первом включении устройства после прошивки, перепрошивки. После сбоя микросхемы. После сбоя по питанию устройства.
Самсусамыч

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

Сообщение Самсусамыч »

[uquote="CNCBaby",url="/forum/viewtopic.php?p=3782374#p3782374"]У многих эта проблема. Но решение так и не увидел. Проблема в SMD корпусе DS1307.[/uquote]
Дело в том, что при подаче питания на DS1307 начальное состояние всех регистров не определено. Поэтому необходимо принудительно включать тактовый генератор (СН = 0). Я в своих программах с использованием DS1307 настраиваю выход SQW на частоту 1 Гц и при старте МК проверяю данный выход… если он «не тикает» значит необходима инициализация часов с запуском тактового генератора. А если тикает, то инициализация не сброшена при замене батарейки...
Последний раз редактировалось Самсусамыч Чт янв 30, 2020 18:42:20, всего редактировалось 2 раза.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3782392#p3782392"]Дело в том, что при подаче питания на DS1307 начальное состояние всех регистров не определено. Поэтому необходимо принудительно включать тактовый генератор (СН = 0). Я в своей программах с использованием DS1307 настраиваю выход SQW на частоту 1 Гц и при старте МК проверяю данный выход… если он «не тикает» значит необходима инициализация часов с запуском тактового генератора. А если тикает, то инициализация не сброшена при замене батарейки.[/uquote]
Ну вот, о чем и речь. Кстати, в моем проекте микросхема считывается один раз, после включения устройства. В дальнейшем время тикает по выводу IRQ.
Самсусамыч

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

Сообщение Самсусамыч »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3782394#p3782394"]В дальнейшем время тикает по выводу IRQ.[/uquote]
Разве есть такой вывод у DS1307? :)
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Прошу прощения, последнее время работал с микросхемами, у них выводы так обзываются. SQW/OUT
CNCBaby
Родился
Сообщения: 17
Зарегистрирован: Ср дек 25, 2019 14:36:28

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

Сообщение CNCBaby »

Провел ряд экспериментов. Питание, фьзы здесь ни причем. При замене батарейки не происходит иницилизация DS1307. У автора есть условия проверки на сбой микросхемы. Там он через 1,5 секунд сравнивает время. Если одинаковое то запускает генератор. Это если есть что сравнивать. Выход из этой ситуации вижу пока так. На свободный пин подцепить джампер, и программно отследить, если джампер в нуле то инициализировать DS (режим первого вкл.).
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Лишняя сущность. Ввести пункт меню.
CNCBaby
Родился
Сообщения: 17
Зарегистрирован: Ср дек 25, 2019 14:36:28

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

Сообщение CNCBaby »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3782961#p3782961"]Лишняя сущность. Ввести пункт меню.[/uquote]

Интересно, как Вы в это меню попадете. В режиме "Fn:d0" кнопки не активны. Выше я предложил поставить джампер и вкл. питание. Это и будет условием для инициализации DS.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Я не знаю, что это за функция. И глупо делать режим, в котором все кнопки не активны. Я предложил вариант. Исхожу из оптимизации. Если есть лишний вывод и желание разбирать корпус, чтобы ставить джампер, ради бога. Можно джампер, можно потайную кнопку, а можно пункт меню.
CNCBaby
Родился
Сообщения: 17
Зарегистрирован: Ср дек 25, 2019 14:36:28

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

Сообщение CNCBaby »

Какой пункт меню. Я Вам объясняю. При замене батарейки появляется надпись "Fn:d0" и на на этом все. На кнопки нет никакой реакции. И как попасть в Ваше "предполагаемое" меню, даже не предполагаю. ЕСть вариант использовать кнопки БУД1 или БУД2. ЕСли удерживать какуюто из кнопок и при этом вкл. питание, то все нормально заходит в нужный режим. ВЫбор типа индикатора или запись в ячеки епрома.

Добавлено after 13 minutes 47 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3783312#p3783312"]Если есть лишний вывод и желание разбирать корпус, чтобы ставить джампер,[/uquote]

Интересно. А для замены батарейки, корпус разбирать не нужно? Ели корпус при замене батарейки уже разобран, то почему не поставить джампер, а после вкл. его снять и собрать корпус.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

CNCBaby, можно фото где прилеплен кварц DS1307? И откуда вы этот кварц взяли?
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Я про то, чтобы переделать проект. Перепрошивать каждый раз после сбоя или замены батарейки это как то не нормально, не находите?

Добавлено after 3 minutes 7 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3783383#p3783383"]Я про то, чтобы переделать проект. Перепрошивать каждый раз после сбоя или замены батарейки это как то не нормально, не находите?[/uquote]
Я мог бы этим заняться. Вижу, что тема живая, многие повторили поделку. Создать новый проект с нуля, легко редактируемый. Исходники этого проекта сырые. Программа плохо структурирована, и плохо предназначена для дальнейшей работы.
Аватара пользователя
samand587
Поставщик валерьянки для Кота
Сообщения: 2312
Зарегистрирован: Вт фев 21, 2017 18:59:21
Откуда: Седой Урал

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

Сообщение samand587 »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3783383#p3783383"]Я мог бы этим заняться.[/uquote]
Так что от нас нужно благославление? :)) Так это мы благославляем! :beer: :beer: :beer:
Ответить

Вернуться в «AVR»