Страница 1 из 2
DS 1302
Добавлено: Вт июн 27, 2017 17:28:15
ROMan2947
Приветствую!!!
пытаюсь прикрутить ds1302 к МК.Да что-то непонятных вещей полно. одна из них тайминги. В даташите большинство из них в наносекундах, так в студии задержки в наносекундах нет. ну и быть наверное не может у меня кварц 8 Мгц отсюда 1 такт длится 125 нс... что делают обычно с этим? вообще без задержки работать? Спасибо
Re: DS 1302
Добавлено: Вт июн 27, 2017 19:37:31
mas123
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3134171#p3134171"]одна из них тайминги. В даташите большинство из них в наносекундах[/uquote]В даташите указаны минимальное и/или максимальное время.
Соответственно, нужно обеспечить все временные диаграммы в этом диапазоне.
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3134171#p3134171"]в студии задержки в наносекундах нет[/uquote]Цикл ожидания пишется в пару строчек. Значения вычисляются по ассемблерным командам или подгоняются с помощью осциллографа.
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3134171#p3134171"]что делают обычно с этим?[/uquote]Зависит от ожидаемого результата.
Если хочется, чтобы всё работало - стоит соблюдать даташит.
Re: DS 1302
Добавлено: Вт июн 27, 2017 23:20:09
ROMan2947
Цикл ожидания пишется в пару строчек. Значения вычисляются по ассемблерным командам или подгоняются с помощью осциллографа.
В шите такие параметры как 50,60,70 нс. время 1 цикла МКна частоте 8 Мгц 125 нс...какими ассемблерными командами мне заставить МК работать быстрее?или я что-то не правильно понимаю?
Re: DS 1302
Добавлено: Ср июн 28, 2017 04:55:18
akl
Да, неправильно.
Например, время предустановки линии I/O относительно активного фронта SCLK должно быть не менее 50ns при напряжении питания 5V (200ns при 2V), а на максимальное время оной никаких ограничений не накладывается. Или, момент начала обмена должен быть задержан относительно фронта CE не менее чем на 1us (4us при 2V). Всё остальное по аналогии.
Re: DS 1302
Добавлено: Ср июн 28, 2017 10:33:35
Zhuk72
В ДШ на стр.11 есть параметр, на который надо ориентироваться: CLK Frequency, максимальное значение которой равно 2 МГц при питании от 5 В и 0.5 МГц при питании от 2 В. Соответственно меньше может быть, больше - нет.
2 МГц равно периоду 0.5 мкс, значит половина периода (состояние 0 или 1) максимально может быть 250 нс. Но если будете "дергать" такты каждую микросекунду (0.5 МГц), 1302 также возражать не будет.
Re: DS 1302
Добавлено: Чт июн 29, 2017 13:52:28
ROMan2947
Три раза перевел Даташит в переводчике google. никак не могу прикрутить ds1302 к МК. Взял новый модуль 1302 с кварцем и батарейкой. подключил к МК. напсиал функции записи и чтения. Отправляю ему байт команды 0b10000001 на чтение. и смотрю по осциллографу че мне он пишет...так он выдает корявенькие импульсы синхронные с CSLK напряжением 2 В. Никак не могу допедрить что да как с ним общаться.Подскажите пожалуйста что я делаю не так.

Re: DS 1302
Добавлено: Чт июн 29, 2017 14:08:08
mas123
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135243#p3135243"]что я делаю не так.

[/uquote]Гм, вот знаешь - все штатные телепаты сейчас в отпуске, лето же.
Может быть покажешь,
что ты делаешь? Например, схему подключения и код работы с DS...
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135243#p3135243"]выдает корявенькие импульсы синхронные с CSLK напряжением 2 В.[/uquote]Есть подозрение, что у тебя выход на выход замкнуты.
Ногу МК, по которой передаёшь что-то наружу, на вход-то переводишь до момента начала приема?
Re: DS 1302
Добавлено: Чт июн 29, 2017 14:29:07
ROMan2947
Вот что написано
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#define DDR_ds1302 DDRC
#define PORT_ds1302 PORTC
#define PIN_ds1302 PINC
#define CE_ds1302 2
#define SCLK_ds1302 4
#define IO_ds1302 3
void ds1302_write(unsigned char cmd)
{
DDR_ds1302 |= (1<<CE_ds1302) | (1<<SCLK_ds1302);
PORT_ds1302 |= (1<<CE_ds1302);//E=1
_delay_us(1);
DDR_ds1302 |= (1<<IO_ds1302);//выход
for(char i=0; i<8; i++)
{
if((cmd&(1<<i)) == 1<<i)
{
PORT_ds1302 |= (1<<IO_ds1302);
}
else
{
PORT_ds1302&= ~(1<<IO_ds1302);
}
PORT_ds1302 |= (1<<SCLK_ds1302);
_delay_us(1);
PORT_ds1302 &= ~(1<<IO_ds1302);
PORT_ds1302 &= ~(1<<SCLK_ds1302);
}
}
//вызываем после записи байта данных в часы
void ds1302_end_write_data()
{
PORT_ds1302 &= ~(1<<CE_ds1302);
}
char ds1302_read()
{
char readbyte;
char i;
char readbyte=0;
DDR_ds1302 &= ~(1<<IO_ds1302);
for(int i=0;i<8;i++)
{
PORT_ds1302 |= 1<<SCLK_ds1302;
if((PIN_ds1302 & (1<<IO_ds1302))==0)
{
readbyte &= ~(1<<i);
}
else
{
readbyte |= 1<<i;
}
_delay_us(1);
PORT_ds1302 &= ~(1<<SCLK_ds1302);
_delay_us(1);
}
PORT_ds1302 &= ~(1<<CE_ds1302);
_delay_us(1);
return 0;
}
int main(void)
{
DDR_ds1302|=((1<<CE_ds1302)|(1<<IO_ds1302)|(1<<SCLK_ds1302));
PORT_ds1302&=~((1<<CE_ds1302)|(1<<IO_ds1302)|(1<<SCLK_ds1302));
DDRC=0xFF;
PORTC=0x00;
ds1302_write(0x81);
DDR_ds1302 &= ~(1<<IO_ds1302);
for(int x=0;x<8:x++)
{
PORT_ds1302 |= 1<<SCLK_ds1302;
_delay_us(1);
PORT_ds1302&=~(1<<SCLK_ds1302);
_delay_us(1);
}
}
Re: DS 1302
Добавлено: Чт июн 29, 2017 19:28:01
mas123
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135270#p3135270"]Вот что написано[/uquote]Код, конечно, жуткий. Я за такой код расстреливал бы. И тебя даже не оправдывает то, что код не твой.
Вроде, должно работать, хоть и
такое.
Реальную схему подключения покажи.
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135243#p3135243"]Отправляю ему байт команды 0b10000001 на чтение. и смотрю по осциллографу че мне он пишет...[/uquote]Вначале проверь, что в часы пишешь - насколько диаграмма передачи соответствует таковой из даташита.
Надо порыть даташит - вывод I/O с открытым коллектором или же полноценный? В том плане, что нужна ли ему подтяжка в "1".
Re: DS 1302
Добавлено: Пт июн 30, 2017 09:01:39
ROMan2947
И тебя даже не оправдывает то, что код не твой
По поводу этого я скажу,что он частично не мой. Нужно же мне как- то найти проблему.Методом исключения решил проверить рабочий код(хотя я не проверял на работоспособность его), может я сам пишу не правильно.
Добавлено after 25 minutes 5 seconds:
Вначале проверь, что в часы пишешь - насколько диаграмма передачи соответствует таковой из даташита.
Начнем сначала: вот мой код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#define DDR_ds1302 DDRC
#define PORT_ds1302 PORTC
#define PIN_ds1302 PINC
#define CE 2
#define SCLK 3
#define DATA 4
void WRITE_ds1302(int comdata)
{
PORT_ds1302|=1<<CE;
DDR_ds1302|=1<<DATA; //на выход
for(char i=0;i<8;i++)
{
if((comdata&(1<<i)))
{
PORT_ds1302|=1<<DATA;
}
else
{
PORT_ds1302&=~(1<<DATA);
}
PORT_ds1302|=1<<SCLK;
PORT_ds1302&=~(1<<DATA);
PORT_ds1302&=~(1<<SCLK);
}
}
void see(void)
{
//PORT_ds1302|=1<<DATA;
for(char i=0;i<8;i++)
{
PORT_ds1302|=1<<SCLK;
_delay_us(1);
PORT_ds1302&=~(1<<SCLK);
_delay_us(1);
}
}
int main(void)
{
DDR_ds1302=0xFF;
PORT_ds1302&=~0xFF;
WRITE_ds1302(0x83);
DDR_ds1302&=~(1<<DATA);
see();
PORT_ds1302&=~(1<<CE);
}
[img]
[img]http://img.radiokot.ru/files/112412/thumbnail/1b9x8qvtp9.jpg[/img][/img]
[img]
[img]http://img.radiokot.ru/files/112412/thumbnail/1b9x4cmrpm.jpg[/img][/img]
Re: DS 1302
Добавлено: Пт июн 30, 2017 09:46:52
Zhuk72
Можете пробовать.
Это писалось мной под 8051, соответственно переключений вход-выход у даты нет, поскольку порт имеет двунаправленный режим (quasi-bidirectional). Настройку портов и переключение даты добавите самостоятельно.
Заголовочный файл не даю, там ничего существенного нет.
Спойлер
Код: Выделить всё
// 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_();
}
Добавлено after 13 minutes 11 seconds:
Кстати, относительно изначального вопроса про скорость работы хочу заметить, что задержка в конце листинга имеет чисто формальное название. Сколько там было в реальности я не помню, а диаграмму с ЛА я выкладывал
здесь.
Re: DS 1302
Добавлено: Пт июн 30, 2017 11:58:26
ROMan2947
Можете пробовать.
Спасибо за код! но я боюсь меня точно расстреляют за это

хотелось бы самому со своим кодом разобраться во всем.
Снял диаграмму как у Вас, с подтяжкой формируются какие то импульсы вроде как...как можно проверить их достоверность? чет добавить файл с ЛА не могу

Re: DS 1302
Добавлено: Пт июн 30, 2017 12:26:56
mas123
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135743#p3135743"]Начнем сначала: вот мой код:[/uquote]Теперь смотрим на осциллограмму.
Хотелось бы увидеть полную картинку - от выдачи сигнала CE (который ты обозвал RST на схеме - так он назывался в старом даташите!

)
По твоему коду вообще нет установки сигнала CE - он как встал в "1", так и стоит там.
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135743#p3135743"]PORT_ds1302|=1<<SCLK;
PORT_ds1302&=~(1<<DATA);
PORT_ds1302&=~(1<<SCLK);[/uquote]Поясни в чем глубокий смысл обнулять передаваемый бит сразу после нарастающего фронта CLK?
И сравни с примером функции передачи данных от
Zhuk72.
По схеме, надеюсь: сигнал "земля" у часов, а также "земля", "питание" и кварц у AVR не показаны лишь на схеме?
Re: DS 1302
Добавлено: Пт июн 30, 2017 12:54:44
ROMan2947
По схеме, надеюсь: сигнал "земля" у часов, а также "земля", "питание" и кварц у AVR не показаны лишь на схеме?
да,без них уж глупо чет ожидать)
Добавлено after 5 minutes 23 seconds:
По твоему коду вообще нет установки сигнала CE - он как встал в "1", так и стоит там.
Смысл моего кода, указанного выше в том, чтоб отправить команду на часы и увидеть обратную связь. ничего более. остальное уже допишем как надо.Мне нужно видеть, что часы меня слышать и отвечают. согласно даташиту я выставляю СЕ в 1 и шлю командный байт, затем перевожу ножку DATA на вход и наблюдаю по диаграмме что да как....ну и в конце main я сбрасываю ее для приличия. это не правильно?
Re: DS 1302
Добавлено: Пт июн 30, 2017 13:01:47
Zhuk72
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135861#p3135861"]чет добавить файл с ЛА не могу[/uquote]
Правый верхний угол окна "Options - Save capture".
Re: DS 1302
Добавлено: Пт июн 30, 2017 13:06:02
ROMan2947
Поясни в чем глубокий смысл обнулять передаваемый бит сразу после нарастающего фронта CLK?
в даташите на диаграмме я вижу,что: после считывания бита данных по нарастающему фронту SCLK нужно сбросить в исходное положение затем снова выставить бит...это может и лишняя операция,но на работоспособность думаю не влияет...
Добавлено after 1 minute 19 seconds:
Правый верхний угол окна "Options - Save capture".
я его сохранил, но на форум не идет пишет, чт о администраторы запретили добавлять файл подобного расширения
Re: DS 1302
Добавлено: Пт июн 30, 2017 13:13:03
Zhuk72
zip/rar, иначе никак.
Смотрю на свой код и не пойму за каким чертом я делал эти проверки последнего бита

Просто неохота опять в это возвращаться и сравнивать с ДШ.
Re: DS 1302
Добавлено: Пт июн 30, 2017 13:17:04
mas123
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135896#p3135896"]согласно даташиту я выставляю СЕ в 1 и шлю командный байт[/uquote]Сравни диаграмму из даташита и свою.
Там английским по белому сказано установить CE из "0" в "1" перед обменом и сбросить в "0" по окончанию. Т.е. между обменом держать в "0".
Покажи на своей осциллограмме переход CE из "0" и "1" и сброс в "0" по окончанию обмена?
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135913#p3135913"]в даташите на диаграмме я вижу,что: после считывания бита данных по нарастающему фронту SCLK нужно сбросить в исходное положение затем снова выставить бит...[/uquote]Ну-ка, ну-ка покажи где ты такое нашёл?
Я вижу, что на нарастающему фронту происходит запись бита в сдвиговый регистр. А все изменения значения бита происходят только при низком уровне CLK.
Мелкий совет: когда что-то не получается, то стоит сделать всё по даташиту с "точностью до секунды"(с).
Re: DS 1302
Добавлено: Пт июн 30, 2017 13:37:05
ROMan2947
zip/rar, иначе никак.
Добавлено after 3 minutes 1 second:
Покажи на своей осциллограмме переход CE из "0" и "1" и сброс в "0" по окончанию обмена?
Добавлено after 11 minutes 3 seconds:
Там английским по белому сказано установить CE из "0" в "1" перед обменом и сбросить в "0" по окончанию. Т.е. между обменом держать в "0".
в том то и дело что на английском)) кажется я въезжаю.мне нужно после комбайта СE 0 и снова все сначала да? тогла что за импульсы мне шлют часы?МУСОР?
Re: DS 1302
Добавлено: Пт июн 30, 2017 13:43:46
mas123
Вот сейчас видно - и передача "туда" и ответ "обратно".
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135941#p3135941"]в том то и дело что на английском))[/uquote]В этом деле увы - необходимо умение читать технический английский...
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135941#p3135941"]нужно после комбайта СE 0 и снова все сначала да?[/uquote]Да, на время обмена CE=1, после обмена CE=0. Причем, в таташите указаны ВСЕ времена: пауза после CE=1, после CE=0 и т.д. и т.п.
И эти времена необходимо выдерживать.
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3135941#p3135941"]тогла что за импульсы мне шлют часы?МУСОР?[/uquote]Сейчас я вижу, что часы тебе отвечают. И отвечают значением "минуты".
Теперь реши загадку, почему передача байта в часы у тебя с каждым тактом всё медленнее.
