Page 1 of 1

Часы на ГРИ ин-14 (Atmega8-168)

Posted: 11 Feb 2018 14:59
by Denis_K
... на схем.нет попалась мне год-два назад статья http://cxem.net/mc/mc282.php. Сделал быстро плату, взял исходник из статьи, а он не "работает" или у меня ума не хватает заставить его работать... Автор не хочет категорически выходить на контакт.
В исходнике не могу наладить работу с часами реального времени, остальное вроде бы работает...
Ах да, исходник написан в какой то другой среде, отличной от синтаксиса GCC, поэтому я перевел как знал... может просто чего то упустил?

Re: Часы на ГРИ ин-14 (Atmega8-168)

Posted: 18 Feb 2018 20:36
by Denis_K
Не пойму с DS1307 происходит только инициализация, остальные функции похоже не работают... обмен данными по I2C проходит сначала, а потом тишина.

Re: Часы на ГРИ ин-14 (Atmega8-168)

Posted: 19 Feb 2018 18:33
by IYra
Denis_K wrote:Не пойму с DS1307 происходит только инициализация, остальные функции похоже не работают... обмен данными по I2C проходит сначала, а потом тишина.
Сравнил два файла I2c.c
IN-8_Clock

Code: Select all

#define I2C_SDA_PIN            PD1                         //линия SDA
#define I2C_SCL_PIN            PD0                         //линия SCL
IN-14clock

Code: Select all

#define I2C_SDA_PIN            PINC1                         //линия SDA
#define I2C_SCL_PIN            PINC0                         //линия SCL
Может надо

Code: Select all

#define I2C_SDA_PIN            PC1                         //линия SDA
#define I2C_SCL_PIN            PC0                         //линия SCL

Re: Часы на ГРИ ин-14 (Atmega8-168)

Posted: 19 Feb 2018 22:08
by Denis_K
Да пробовал и так и так. Работает что PC1, что PINC1...
При попытке настроить время в меню оно меняется, но не прописывается в ds-ку, так же сразу пытается показать истинное время из памяти ds, но тут же устанавливается на индикаторах 85 85. Может где-то по основной программе не вписано про чтение - запись? хотя вроде бы есть...

Re: Часы на ГРИ ин-14 (Atmega8-168)

Posted: 20 Feb 2018 18:10
by IYra
Denis_K wrote:Да пробовал и так и так. Работает что PC1, что PINC1...
И все равно лучше придерживаться оригинала.
Запустил в Протеусе оригинал - на И2с раз в секунду идет обмен.
На исправленном - нет обмена. Только в начале строка инициализации и зачем-то добавлена строка
считывания времени. После этого затык. А что если убрать вначале rtc_get_date(&D, &m, &Y);
Оригинал

Code: Select all

	/*******************************настройка переферии******************************/
	i2c_init(); // иництализация протокола i2c

	rtc_init(0, 1, 1); // иництализация DS1307

	ow_set_bus(&PINB, &PORTB, &DDRB, PB5); // иництализация протокола 1-wire

Исправленный

Code: Select all

	i2c_init(); // иництализация протокола i2c

	rtc_init(0, 1, 1); // иництализация DS1307

	rtc_get_date(&D, &m, &Y);

	ow_set_bus(&PIND, &PORTD, &DDRD, PIND4); // иництализация протокола 1-wire

Re: Часы на ГРИ ин-14 (Atmega8-168)

Posted: 21 Feb 2018 10:36
by Denis_K
на И2с раз в секунду идет обмен

это выход тактовой частоты с 1307... выставляется при инициализации rtc_init(0, 1, 1), кстати пробовал если rtc_init(0, 0, 1) то выхода нет, как и положено по ДШ. Значит И2С работает и инициализация тоже проходит. Мне кажется что-то не так с считыванием и записью даты дс1307...

Добавлено спустя 12 часов 50 минут 43 секунды:
IYra, здравствуйте. А вообще нормально что инициализация включена в основной программе? я так понимаю с циклом... а запись - чтение однократно. Или так и должно быть?

Re: Часы на ГРИ ин-14 (Atmega8-168)

Posted: 21 Feb 2018 19:40
by IYra
Denis_K wrote:А вообще нормально что инициализация включена в основной программе? я так понимаю с циклом... а запись - чтение однократно. Или так и должно быть?
Инициализация происходит однократно вначале до цикла while
Оригинал (оставил для наглядности только I2c)

Code: Select all

	/*******************************настройка переферии******************************/
	i2c_init(); // иництализация протокола i2c

	rtc_init(0, 1, 1); // иництализация DS1307

	_delay_ms(100);
	/********************************************************************************/
	
	sei();       // включаем прерывания

	set = 10;

	out[0] = 10; out[1] = 10; out[2] = 0; // ндикация текущего режима отображения при включении
	out[3] = vid+1; out[4] = 10; out[5] = 10;

	_delay_ms(2000);

	set = 0;

	rtc_get_date(&d, &m, &y); //чтение даты для нормальной работы режимов отображения

	while(1){
                             // чтение даты
        }

такой порядок в оригинале и желательно его придерживаться (вплоть до задержек _delay)