Пт июн 30, 2017 14:01:31
Да, на время обмена CE=1, после обмена CE=0. Причем, в таташите указаны ВСЕ времена: пауза после CE=1, после CE=0 и т.д. и т.п.
И эти времена необходимо выдерживать.
Теперь реши загадку, почему передача байта в часы у тебя с каждым тактом всё медленнее.
Пт июн 30, 2017 14:04:39
Пт июн 30, 2017 14:09:55
ну он сдвигает сам байт команды я так понял. у него не меняется количество тактов в цикле вот и все, вот и диаграмма у него более ровнаяСледующий вопрос - а зачем так делать? Посмотри на пример от Zhuk72.
Сб июл 01, 2017 09:05:29
Вс июл 02, 2017 07:26:01
Вс июл 02, 2017 08:33:47
#include "io430.h"
#define DATA P1OUT_bit.P1
#define DATA_DIR P1DIR_bit.P1
#define DATA_IN P1IN_bit.P1
#define SCLK P1OUT_bit.P0
#define CE P1OUT_bit.P2
void write_ds1302(unsigned char reg_addr, unsigned char reg_value)
{
unsigned int i;
DATA_DIR = 1;
CE = 0;
SCLK = 0;
DATA = 0;
CE = 1;
reg_addr &= ~(0x01); // write command
reg_addr |= 0x80; // must be 1
DATA = (reg_addr & 0x01);
for (i=0 ; i<8 ; ++i) {
SCLK = 1;
reg_addr >>= 1;
SCLK = 0;
DATA = (reg_addr & 0x01);
}
DATA = (reg_value & 0x01);
for (i=0 ; i<8 ; ++i) {
SCLK = 1;
reg_value >>= 1;
SCLK = 0;
DATA = (reg_value & 0x01);
}
DATA = 0;
SCLK = 0;
CE = 0;
}
unsigned char read_ds1302(unsigned char reg_addr)
{
unsigned int i;
unsigned char result = 0;
CE = 0;
SCLK = 0;
DATA = 0;
CE = 1;
reg_addr |= 0x81; // must be 1 for read
DATA = (reg_addr & 0x01);
for (i=0 ; i<7 ; ++i) {
SCLK = 1;
reg_addr >>= 1;
SCLK = 0;
DATA = (reg_addr & 0x01);
}
SCLK = 1;
DATA_DIR = 0;
for (i=0 ; i <8 ; ++i) {
result >>= 1;
SCLK = 0;
result |= (DATA_IN == 1) ? 0x80 : 0x00 ;
SCLK = 1;
}
SCLK = 0;
DATA = 0;
DATA_DIR = 1;
CE = 0;
return result;
}
current_time.seconds = read_ds1302(0x81);
if (current_time.seconds != last_second) {
last_second = current_time.seconds;
current_time.seconds = utc_time.seconds = read_ds1302(0x81);
current_time.minutes = utc_time.minutes = read_ds1302(0x83);
current_time.hours = utc_time.hours = read_ds1302(0x85);
current_time.date = utc_time.date = read_ds1302(0x87);
current_time.month = utc_time.month = read_ds1302(0x89);
current_time.weekday = utc_time.weekday = read_ds1302(0x8b);
current_time.year = utc_time.year = read_ds1302(0x8d);
Вс июл 02, 2017 09:08:31
Вс июл 02, 2017 09:21:04
Вс июл 02, 2017 13:18:36
перепаял, результатов нет...собрался было бежать за новой микросхемой. да рашил прогнать свой код в протеусе, что там я увижу...так там осцилограф улавливает обратную связь и время правильно кодируется. интересный момент то, что после передачи комбайта я сбрасываю ножку DATA в 0, а часы возвращают ее в 2 В. это так понимаю уровень лог.0 у часов.СЕ после комбайта не сбрасываю а подтяжку на DATA подключаю. завожу свой код на железе диаграмма с анализатора при обратке показывает только синхронные импульсы с SCLK.uldemir
Вы были правы.Щуп с кондером дал результат.Теперь хоть знаю, что кварц исправен.Допустим, что микросхема исправна,Какие еще могут быть нюансы?Скорее, подключая осциллограф, генерация просто срывается.
Вс июл 02, 2017 13:43:04
Вс июл 02, 2017 15:24:25
Вс июл 02, 2017 15:34:35
Вс июл 02, 2017 15:38:41
Пн июл 03, 2017 01:24:59
Вс авг 27, 2017 13:37:11
Вс авг 27, 2017 15:01:26
void ReadAllDS()
{
char i, cData, cAddr;
for(i=0; i<10; i++)
{
cAddr = (i << 1);
cAddr |= 0x81;
uartPrintChar('(');
uartHex(cAddr);
uartPrintChar(')');
uartPrintChar('=');
cData = ds1302_readData(cAddr);
uartHex(cData);
uartPrintChar(' ');
uartPrintChar(' ');
}
uartPrintChar('\r');
uartPrintChar('\n');
}
__noreturn void main(void)
{
SPCR = 0;
SPSR = 0;
sei();
UartInit();
ds1302_init();
// !!! Вот так делать нельзя.
// Прошла пара месяцев, а я уже не помню что означают эти числа, а тем более зачем паузы - надо даташит смотреть.
ds1302_writeData(0x80, 0x03);
__delay_cycles(DELAY_10ms);
ds1302_writeData(0x82, 0x45);
__delay_cycles(DELAY_10ms);
ds1302_writeData(0x84, 0x55);
while(1)
{
ReadAllDS();
__delay_cycles(DELAY_1000ms);
};
}
#include "main.h"
#include "ds1302.h"
#define DS1302_DDR DDRC
#define DS1302_PORT PORTC
#define DS1302_PIN PINC
#define DS1302_CS PC0
#define DS1302_CLK PC2
#define DS1302_DATA PC1
void ds1302_init()
{
DS1302_DDR |= (1<<DS1302_CS) | (1<<DS1302_CLK) | (1<<DS1302_DATA);
DS1302_PORT &= ~( (1<<DS1302_CS) | (1<<DS1302_CLK) | (1<<DS1302_DATA) );
}
static void ds1302_write(char cData)
{
char i = 8;
do
{
DS1302_PORT &= ~(1<<DS1302_CLK); // 250 ns == 4 такта
asm ("nop");
DS1302_PORT &= ~(1<<DS1302_DATA);
if( cData & 0x01 )
DS1302_PORT |= (1<<DS1302_DATA);
asm ("nop");
asm ("nop"); // tDC = 50 ns
DS1302_PORT |= (1<<DS1302_CLK); // 250 ns == 4 такта
cData >>= 1;
asm ("nop");
asm ("nop");
asm ("nop");
}while( --i );
}
static char ds1302_read()
{
char cData;
char i = 8;
DS1302_PORT &= ~(1<<DS1302_DATA);
DS1302_DDR &= ~(1<<DS1302_DATA);
do
{
DS1302_PORT &= ~(1<<DS1302_CLK);
// 200 ns - мин. 3 такта!
cData >>= 1;
asm ("nop");
asm ("nop");
asm ("nop");
asm ("nop");
if( DS1302_PIN & (1<<DS1302_DATA) )
cData |= 0x80;
DS1302_PORT |= (1<<DS1302_CLK);
asm ("nop");
asm ("nop");
asm ("nop");
asm ("nop");
asm ("nop");
}while( --i );
DS1302_DDR |= (1<<DS1302_DATA);
return cData;
}
void ds1302_writeData(char cAddr, char cData)
{
DS1302_PORT |= (1<<DS1302_CS);
DS1302_PORT &= ~(1<<DS1302_CLK);
__delay_cycles(DELAY_1mks);
ds1302_write(cAddr);
ds1302_write(cData);
DS1302_PORT &= ~(1<<DS1302_CLK);
asm ("nop");
DS1302_PORT &= ~(1<<DS1302_CS);
}
char ds1302_readData(char cAddr)
{
char cData;
DS1302_PORT |= (1<<DS1302_CS);
DS1302_PORT &= ~(1<<DS1302_CLK);
__delay_cycles(DELAY_1mks);
ds1302_write(cAddr);
cData = ds1302_read();
DS1302_PORT &= ~(1<<DS1302_CLK);
asm ("nop");
DS1302_PORT &= ~(1<<DS1302_CS);
return cData;
}
Вс авг 27, 2017 16:26:23