Вт июн 27, 2017 17:28:15
Вт июн 27, 2017 19:37:31
Вт июн 27, 2017 23:20:09
Цикл ожидания пишется в пару строчек. Значения вычисляются по ассемблерным командам или подгоняются с помощью осциллографа.
Ср июн 28, 2017 04:55:18
Ср июн 28, 2017 10:33:35
Чт июн 29, 2017 13:52:28
Чт июн 29, 2017 14:08:08
Чт июн 29, 2017 14:29:07
Чт июн 29, 2017 19:28:01
Пт июн 30, 2017 09:01:39
По поводу этого я скажу,что он частично не мой. Нужно же мне как- то найти проблему.Методом исключения решил проверить рабочий код(хотя я не проверял на работоспособность его), может я сам пишу не правильно.И тебя даже не оправдывает то, что код не твой
Вначале проверь, что в часы пишешь - насколько диаграмма передачи соответствует таковой из даташита.
Пт июн 30, 2017 09:46:52
// DS1302 RTC IC
#include "ds1302.h"
unsigned char readbyte (void)
{
unsigned char b, i = 8;
while (i)
{
b >>= 1;
DS_SCLK = 0;
_nop_();
if (DS_IO) b |= 0x80; // set bit
else b &= 0x7F; // clear bit
i--;
if (i) DS_SCLK = 1;
_nop_();
}
return b;
}
void writebyte (unsigned char b)
{
unsigned char i = 8;
while (i)
{
DS_SCLK = 0;
DS_IO = (b & 1);
DS_SCLK = 1;
b >>= 1;
i--;
}
}
unsigned char ds_readbyte(unsigned char addr)
{
// ds1302 single-byte read
unsigned char b;
DS_CE = 0;
DS_SCLK = 0;
DS_CE = 1;
delay1us();
writebyte(addr); // send command
b = readbyte(); // read byte
return b;
}
void ds_writebyte(unsigned char addr, unsigned char dta)
{
// ds1302 single-byte write
DS_CE = 0;
DS_SCLK = 0;
DS_CE = 1;
delay1us();
writebyte(addr); // send command
writebyte(dta); // send data
}
void ds_readburst(void)
{
// ds1302 burst-read 8 bytes into array
unsigned char i;
DS_CE = 0;
DS_SCLK = 0;
DS_CE = 1;
delay1us();
writebyte(0xBF); // send cmd byte
// Read on falling edge.
for (i=0; i < 9; i++) // Shift bytes
{
ds_rtc[i] = readbyte(); // read
if (i < 8) DS_SCLK = 1; // If not the last byte, otherwise DS_SCLK remains low.
}
DS_CE = 0;
DS_SCLK = 0;
DS_IO = 0;
}
void ds_writeburst(void)
{
// ds1302 burst-write 8 bytes into array
unsigned char b, i;
b = 0xBE;
DS_CE = 0;
DS_SCLK = 0;
DS_CE = 1;
delay1us();
writebyte(b); // send cmd byte
for (i = 0; i < 8; i++) // Shift bytes
{
writebyte(ds_rtc[i]); // write bytes
}
DS_CE = 0;
DS_SCLK = 0;
DS_IO = 0;
}
//++++++++++++++++++++
// Common functions
//++++++++++++++++++++
void ds_init()
{
unsigned char b;
// Ток заряда может изменяться от большего к меньшему значениями
// A5h, A6h, A7h, A9h, AAh, ABh, либо отключен записью нуля.
if (ds_readbyte(0x8F)) ds_writebyte(0x8E,0); // Clear Write Protection bit if it's set.
if (ds_readbyte(0x91)) ds_writebyte(0x90,0); // Trickle charger off.
b = ds_readbyte(0x81);
if (b & 0x80) ds_writebyte(0x80, (b & 0x7F)); // clear "Clock Halt" bit.
b = ds_readbyte(0x85);
if (b & 0x80) ds_writebyte(0x84, (b & 0x7F)); // Set 24 hour mode.
}
void ds_reset_clock() // reset date, time
{
ds_writebyte(0x80, 0x00); // Clock halt off
ds_writebyte(0x82, 0x00); // 00 minutes
ds_writebyte(0x84, 0x07); // 07 hours
ds_writebyte(0x86, 0x01); // 01
ds_writebyte(0x88, 0x01); // January
ds_writebyte(0x8A, 0x05); // Friday
ds_writebyte(0x8C, 0x16); // 2016
ds_writebyte(0x8E, 0x00); // Write protect off
ds_writebyte(0x90, 0x00); // Trickle charger off
}
void delay1us (void) //@11.0592MHz
{
_nop_();
}
Пт июн 30, 2017 11:58:26
Можете пробовать.
Пт июн 30, 2017 12:26:56
Пт июн 30, 2017 12:54:44
По схеме, надеюсь: сигнал "земля" у часов, а также "земля", "питание" и кварц у AVR не показаны лишь на схеме?
По твоему коду вообще нет установки сигнала CE - он как встал в "1", так и стоит там.
Пт июн 30, 2017 13:01:47
Пт июн 30, 2017 13:06:02
Поясни в чем глубокий смысл обнулять передаваемый бит сразу после нарастающего фронта CLK?
я его сохранил, но на форум не идет пишет, чт о администраторы запретили добавлять файл подобного расширенияПравый верхний угол окна "Options - Save capture".
Пт июн 30, 2017 13:13:03
Пт июн 30, 2017 13:17:04
Пт июн 30, 2017 13:37:05
zip/rar, иначе никак.
Покажи на своей осциллограмме переход CE из "0" и "1" и сброс в "0" по окончанию обмена?
Там английским по белому сказано установить CE из "0" в "1" перед обменом и сбросить в "0" по окончанию. Т.е. между обменом держать в "0".
Пт июн 30, 2017 13:43:46