Доброе время суток.
Коллеги, помогите, пожалуйста, разобраться с часами (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;
}