Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at90s2313 + ds1302
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
mishail
Доброе время суток.
Коллеги, помогите, пожалуйста, разобраться с часами (ds1302).

На at90s2313 прицепил ds1302 соответственно #define'ов.(на ds1302 питание подал только на VCC1)
Написал программульку записи|чтения часов (в данном примере только памяти [той, которой там 31 байт]).
С помощью функции write_3w_mem "записываю" строку в память... потом читаю (read_3w_mem) - возвращает исключительно 0xFF.

Где грабли? В чём я неправ?

-----------------------------------------------------------

#define W3_SCLK PD3
#define W3_IO PD4
#define W3_CE PD5

void init_3w(void)
{
DDRD |= (1 << W3_IO) | (1 << W3_SCLK) | ( 1<< W3_CE);
reset_3w();
wbyte_3w(0x8E); //запись CONTROL REGISTER
wbyte_3w(0x00); //значение
reset_3w();
}

void reset_3w(void)
{
cbi(W3_SCLK);
cbi(W3_CE);
sbi(W3_CE);
}

void wbyte_3w(unsigned char byte)
{
DDRD |= (1 << W3_IO);
unsigned char i;
for (i=0; i<8; ++i)
{
cbi(W3_IO);
if (byte & 0x01)
sbi(W3_IO);
cbi(W3_SCLK);
sbi(W3_SCLK);
byte >>= 1;
}
}

unsigned char rbyte_3w(void)
{
unsigned char i, rbyte, tmp;
rbyte = 0;

DDRD &= ~(1 << W3_IO); //PD4 - вход
sbi(W3_IO); //включить pull-up-resistor

for(i=0; i<8; ++i)
{
sbi(W3_SCLK);
cbi(W3_SCLK);
tmp = (unsigned char)PIND;
tmp >>= W3_IO
tmp &= 0x01;
tmp <<= 7;
rbyte >>= 1;
rbyte |= tmp;
}
return rbyte;
}

void write_3w_mem(unsigned char addr, unsigned char data)
{
unsigned char REG = 0xC0 | addr << 1;
reset_3w();
wbyte_3w( REG );
wbyte_3w( data );
reset_3w();
}

unsigned char read_3w_mem(unsigned char addr)
{
unsigned char REG = 0xC0 | addr << 1 | 1;
reset_3w();
wbyte_3w( REG );
unsigned char res = rbyte_3w();
reset_3w();
return res;
}
GDI
В функции

void wbyte_3w(unsigned char byte)
{
DDRD |= (1 << W3_IO);
unsigned char i;
for (i=0; i<8; ++i)
{
cbi(W3_IO);
if (byte & 0x01)
sbi(W3_IO);
cbi(W3_SCLK);
sbi(W3_SCLK);
byte >>= 1;
}
}

между cbi(W3_SCLK); и sbi(W3_SCLK); нужно поставить задержку, наверное, чтобы выдерживать Fclk = 2 МГц
Правда могу и ошибаться, т.к. не знаю, что это за функции, и какова частота системного кварца
GDI
Тут еще предлагают библиотеку 3Wire.zip http://electronix.ru/forum/index.php?showtopic=10934&st=0
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.