Полная версия этой страницы:
DS1307 + ATMega32
hd44780
Jun 13 2006, 12:09
В цикле считываются все регистры и выводятся на LCD:
sec = ds1307_read ( 0 ); // секунды
min = ds1307_read ( 1 ); // минуты
hour = ds1307_read ( 2 ); // часы
day = ds1307_read ( 3 ); // день недели
date = ds1307_read ( 4 ); // число
month = ds1307_read ( 5 ); // месяц
year = ds1307_read ( 6 ); // год
.............
// считывание регистра DS1307
byte ds1307_read ( byte addr )
{
char value;
// send STOP
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //Tell TWCR (control register) to send STOP CONDITION
delay_ms (200);
// send START
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
//loop until TWINT is set
while(!((TWCR&0x80)==0x80))
{
} // while
//;SLAVE
//Send Slave address
TWDR = TARGET_ADDR;
TWCR = (1<<TWINT)|(1<<TWEN);
//loop until TWINT is set
while(!((TWCR&0x80)==0x80))
{ //do nothing but loop
} // while
//;DATA1
//Send DS1307 RAM address
TWDR = addr;
TWCR = (1<<TWINT)|(1<<TWEN);
//loop until TWINT is set
while(!((TWCR&0x80)==0x80))
{ //do nothing but loop
} // while
//SECOND START CONDITION to go into writing mode
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
//loop until TWINT is set
while(!((TWCR&0x80)==0x80))
{
} // while
//Send Address and write bit
TWDR = TARGET_ADDR | WRITE_FLAG;
TWCR = (1<<TWINT)|(1<<TWEN);
//loop until TWINT is set
while(!((TWCR&0x80)==0x80))
{ //do nothing but loop
} // while
delay_ms (300);
//;DATA
TWCR = (1<<TWINT)|(1<<TWEN);
//loop until TWINT is set
while(!((TWCR&0x80)==0x80))
{
} // while
//Store read back value
value = TWDR;
//NACK
TWCR = (1<<TWEA)|(1<<TWEN);
//STOP
TWCR = (1<<TWEA)|(1<<TWEN)|(TWSTO);
return value;
} // ds1307_read
проблема в том, что секунды на LCD обновляются раз в 8 (!) сек.
в цикле никаких задержек нету.
В чем м.б. причина?
unichorn
Jun 13 2006, 12:13
delay_ms (200);
200 * 7 = 1.4
delay_ms (300);
(200 + 300) * 7 = 3.5
сразу незаметил
GetSmart
Jun 13 2006, 12:18
Цитата
проблема в том, что секунды на LCD обновляются раз в 8 (!) сек.
в цикле никаких задержек нету.
Заметно!
delay_ms (200); + delay_ms (300);
и так 7 раз это ерунда.
какой-то странный опрос- while(!((TWCR&0x80)==0x80))
а просто while(!(TWCR&0x80) нельзя?
и ошибки возможные вы никак не обрабатываете.
И еще,вы больше ничего делать не предполагаете?а то у вас проц только с квадратной шиной и общается-имхо,лучше по прерываниям.
unichorn
Jun 13 2006, 12:21
Да.
И почему бы несчитать все регистры разом, намного быстрее получится.
hd44780
Jun 13 2006, 12:36
Спасибо, попробуем.
А есть примерчик работы с I2c по прерываниям?
Я видел кое-где, но одни обрывки ...
unichorn
Jun 13 2006, 13:18
IgorKossak
Jun 14 2006, 06:56
Удалил посты с бранью, оскорблениями и упоминанием пресловутого "курса".
=AK=, kertis и WHALE получили предупреждения.
haker_fox
Jun 14 2006, 07:36
Хотя уважаемый
unichorn и посоветовал Вам посмотреть материалы в прикрепленной теме, я бы хотел привести конкретные ссылки, дабы не запутаться в обилии всего материала)))
1.
Библиотека для работы с DS1307, на Си, под IAR, реально работает) Могут быть ошибки, за нахождение которых буду очень благодарен)
2.
Библиотека для работы с аппаратным модулем TWI, а также программная организация шины I2C по-желанию, выбирается строкой #define ....(не помню что там дальше).
hd44780
Jun 15 2006, 06:27
Спасибо всем огромное, попробую библиотеки.
А сейчас еще одна проблема всплыла ...
Без резервной баратеи хоть медленнно, но читается и часы идут.
Включил резервную батарею (даже менять пытался, у меня их 2).
Контроллер сразу повис, наверное на ожиданииях готовности при обмене.
Пытался вставлять батарею при включенной работающей схеме.
При "вставлянии" мгновенно виснет.
Никто не сталкивался?
IgorKossak
Jun 15 2006, 07:09
Если напряжение основного питания меньше или равно резервному, интерфейс часов отключается, чтобы не расходовать энергию резервного источника.
hd44780
Jun 15 2006, 08:53
Да это я знаю...
Основное питание 5 вольт, от LM7805. От него работает и МК и LCD и конвертер MAX232...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.