Страница 138 из 148

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

Добавлено: Пн янв 06, 2020 18:08:57
Dimon456
sergsurf писал(а):Часы прошиты прошивкой указанной в начале темы.
Я насчитал штук 6 прошивок, и два или три типа контроллера. Конкретней, какая?

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

Добавлено: Ср янв 08, 2020 18:44:19
sergsurf
[uquote="Dimon456",url="/forum/viewtopic.php?p=3769201#p3769201"]
sergsurf писал(а):Часы прошиты прошивкой указанной в начале темы.
Я насчитал штук 6 прошивок, и два или три типа контроллера. Конкретней, какая?[/uquote]
Часы уже так давно работают что я уже не помню. Да и не стоит заморачиваться пусть себе и дальше так работают, Все уже привыкли. Спасибо за участие.

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

Добавлено: Чт янв 30, 2020 16:10:48
CNCBaby
Всем. Привет.
Может кто подскажет в чем дело. Часы работали. Решил поменять батарейку. Вставил новую. На часах надпись "Fn:d0" и висит до бесконечности. В режим часов не переходит.

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

Добавлено: Чт янв 30, 2020 16:46:51
samand587
[uquote="CNCBaby",url="/forum/viewtopic.php?p=3782326#p3782326"]Часы работали.[/uquote]

У меня так же часы работали, но из-за чужих кривых рук по настройкам зависли. Помогла перепрошивка МК. :))

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

Добавлено: Чт янв 30, 2020 16:59:41
CNCBaby
Перепрошивка МК помогла но опять до тех пор пока не вытащил батарейку. Но это не выход. Нужно понять в чем дело.

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

Добавлено: Чт янв 30, 2020 17:17:29
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 замолчал, можно считать, что микросхема зависла.

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

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

Добавлено after 6 minutes 11 seconds:
Собрал 3 шт. часов на платах из одной партии. У у всех одна и та же "болезнь" с извлечением батарейки. Что самое удивительное после перепрошивке все работает. Я думаю проблема в коде связанном с DS1307.

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

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

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

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

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

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

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

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

Добавлено: Чт янв 30, 2020 18:45:20
Самсусамыч
[uquote="Demiurg",url="/forum/viewtopic.php?p=3782394#p3782394"]В дальнейшем время тикает по выводу IRQ.[/uquote]
Разве есть такой вывод у DS1307? :)

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

Добавлено: Чт янв 30, 2020 19:25:30
Demiurg
Прошу прощения, последнее время работал с микросхемами, у них выводы так обзываются. SQW/OUT

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

Добавлено: Пт янв 31, 2020 11:48:56
CNCBaby
Провел ряд экспериментов. Питание, фьзы здесь ни причем. При замене батарейки не происходит иницилизация DS1307. У автора есть условия проверки на сбой микросхемы. Там он через 1,5 секунд сравнивает время. Если одинаковое то запускает генератор. Это если есть что сравнивать. Выход из этой ситуации вижу пока так. На свободный пин подцепить джампер, и программно отследить, если джампер в нуле то инициализировать DS (режим первого вкл.).

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

Добавлено: Пт янв 31, 2020 17:22:26
Demiurg
Лишняя сущность. Ввести пункт меню.

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

Добавлено: Сб фев 01, 2020 13:07:27
CNCBaby
[uquote="Demiurg",url="/forum/viewtopic.php?p=3782961#p3782961"]Лишняя сущность. Ввести пункт меню.[/uquote]

Интересно, как Вы в это меню попадете. В режиме "Fn:d0" кнопки не активны. Выше я предложил поставить джампер и вкл. питание. Это и будет условием для инициализации DS.

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

Добавлено: Сб фев 01, 2020 13:52:06
Demiurg
Я не знаю, что это за функция. И глупо делать режим, в котором все кнопки не активны. Я предложил вариант. Исхожу из оптимизации. Если есть лишний вывод и желание разбирать корпус, чтобы ставить джампер, ради бога. Можно джампер, можно потайную кнопку, а можно пункт меню.

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

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

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

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

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

Добавлено: Сб фев 01, 2020 14:55:23
Dimon456
CNCBaby, можно фото где прилеплен кварц DS1307? И откуда вы этот кварц взяли?

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

Добавлено: Сб фев 01, 2020 16:49:25
Demiurg
Я про то, чтобы переделать проект. Перепрошивать каждый раз после сбоя или замены батарейки это как то не нормально, не находите?

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

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

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