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

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

Пн янв 06, 2020 18:08:57

sergsurf писал(а):Часы прошиты прошивкой указанной в начале темы.
Я насчитал штук 6 прошивок, и два или три типа контроллера. Конкретней, какая?

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

Ср янв 08, 2020 18:44:19

sergsurf писал(а):Часы прошиты прошивкой указанной в начале темы.
Я насчитал штук 6 прошивок, и два или три типа контроллера. Конкретней, какая?

Часы уже так давно работают что я уже не помню. Да и не стоит заморачиваться пусть себе и дальше так работают, Все уже привыкли. Спасибо за участие.

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

Чт янв 30, 2020 16:10:48

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

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

Чт янв 30, 2020 16:46:51

Часы работали.


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

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

Чт янв 30, 2020 16:59:41

Перепрошивка МК помогла но опять до тех пор пока не вытащил батарейку. Но это не выход. Нужно понять в чем дело.

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

Чт янв 30, 2020 17:17:29

Перепрошивка МК помогла но опять до тех пор пока не вытащил батарейку. Но это не выход. Нужно понять в чем дело.

Варианты:
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

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

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

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

Чт янв 30, 2020 18:24:11

Я думаю проблема в коде связанном с DS1307.

Проблема комплексная. Микросхема боится помех по питанию. Я когда делал макет, сначала у меня платка с часами висела на проводочках. Потом впаял в макетку. Один хрен, часы вставали, достаточно было дотронуться отверткой до питания или просто выводов деталей.
Поэтому, решение - написано выше. Проверять вывод IRQ. Если часы встали, считать это равнозначно вытаскиванию батарейки и сбою микросхемы. В таком случае полная переинициализация часов. Можно сделать какую-то индикацию, что микросхема сбойнула и нужно переустановить дату, время.

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

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

Чт янв 30, 2020 18:37:36

У многих эта проблема. Но решение так и не увидел. Проблема в SMD корпусе DS1307.

Дело в том, что при подаче питания на DS1307 начальное состояние всех регистров не определено. Поэтому необходимо принудительно включать тактовый генератор (СН = 0). Я в своих программах с использованием DS1307 настраиваю выход SQW на частоту 1 Гц и при старте МК проверяю данный выход… если он «не тикает» значит необходима инициализация часов с запуском тактового генератора. А если тикает, то инициализация не сброшена при замене батарейки...
Последний раз редактировалось Самсусамыч Чт янв 30, 2020 18:42:20, всего редактировалось 2 раз(а).

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

Чт янв 30, 2020 18:39:02

Дело в том, что при подаче питания на DS1307 начальное состояние всех регистров не определено. Поэтому необходимо принудительно включать тактовый генератор (СН = 0). Я в своей программах с использованием DS1307 настраиваю выход SQW на частоту 1 Гц и при старте МК проверяю данный выход… если он «не тикает» значит необходима инициализация часов с запуском тактового генератора. А если тикает, то инициализация не сброшена при замене батарейки.

Ну вот, о чем и речь. Кстати, в моем проекте микросхема считывается один раз, после включения устройства. В дальнейшем время тикает по выводу IRQ.

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

Чт янв 30, 2020 18:45:20

В дальнейшем время тикает по выводу IRQ.

Разве есть такой вывод у DS1307? :)

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

Чт янв 30, 2020 19:25:30

Прошу прощения, последнее время работал с микросхемами, у них выводы так обзываются. SQW/OUT

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

Пт янв 31, 2020 11:48:56

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

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

Пт янв 31, 2020 17:22:26

Лишняя сущность. Ввести пункт меню.

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

Сб фев 01, 2020 13:07:27

Лишняя сущность. Ввести пункт меню.


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

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

Сб фев 01, 2020 13:52:06

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

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

Сб фев 01, 2020 14:28:26

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

Добавлено after 13 minutes 47 seconds:
Если есть лишний вывод и желание разбирать корпус, чтобы ставить джампер,


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

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

Сб фев 01, 2020 14:55:23

CNCBaby, можно фото где прилеплен кварц DS1307? И откуда вы этот кварц взяли?

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

Сб фев 01, 2020 16:49:25

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

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

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

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

Сб фев 01, 2020 17:01:10

Я мог бы этим заняться.

Так что от нас нужно благославление? :)) Так это мы благославляем! :beer: :beer: :beer:
Ответить