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