roboforum.ru

Технический форум по робототехнике.

DS12887

Re: DS12887

Dmitry__ » 19 мар 2012, 14:17

Ну, я расписал то, что бросилось в глаза при беглом просмотре кода.
Опыта работы с DS12887 у меня нет. Понять, что как переключается, из приведенного кода сможет только телепат :pardon:
Выкладывай весь код, да с комментами...

Re: DS12887

Flint » 19 мар 2012, 18:24

Да оно переключается по крайней мере на выходе МК так как надо, но вот воспринимает ли это микросхема часов неизвестно. А что код выкладывать - это практически он весь и есть. Остальное перевод числа в строку и вывод на LCD.
Порт D - порт с линиями управления AS (PD4), DS (PD6), R/W (PD5), CS(PD3)
Порт C - шина адреса-данных.

Re: DS12887

Dmitry__ » 19 мар 2012, 23:04

Ну, если тебе жалко свое время, давай тратить мое :D
Код: Выделить всёРазвернуть
PORTD = PORTD & 0b10111111; //DS_CLR

_delay_us(5);

PORTD = PORTD | 0b01000000; //DS_SET  строб считывания данных с шины

sec=PORTC;

Тут ты считываешь данные после пассивного состояния DS.
А надо перед самым спадом, ведь после пассивного состояния данные остаются только tDHR, который тенется целых 10-80 наносекунд. :)
Код: Выделить всёРазвернуть
PORTD = PORTD & 0b10111111; //DS_CLR

_delay_us(5);

sec=PORTC;

PORTD = PORTD | 0b01000000; //DS_SET  строб считывания данных с шины


Пойду дальше читать pdf на DS12887

Добавлено спустя 14 минут 47 секунд:
и кто такой "AD_DDR", какое он имеет отношение к "Порт C - шина адреса-данных."
И убери из вечного цикла настройку порта на выход, это делается один раз.
Аналогично не надо устанавливать ресет и cs

Re: DS12887

Flint » 20 мар 2012, 08:38

Тут ты считываешь данные после пассивного состояния DS.

Вот тут у меня тоже возникли сомнения, когда считывание происходит - написано было по отрицательному импульсу, т.е. вроде по переходу 1->0. Пробовал и так...
и кто такой "AD_DDR", какое он имеет отношение к "Порт C - шина адреса-данных."

Регистр порта С, определяет на вход или на выход работает.
Да, но если мне надо сначала выдать в шину адрес, а потом с нее что-то считать, то мне по-любому необходимо менять направление работы порта. В своем примере я использовал адрес ячейки, где хранятся секунды и пытался раз в секунду считывать значения этого регистра - если часы рабочие и идут, то логично, что значение там каждый раз меняться.
Аналогично не надо устанавливать ресет и cs

Ну это, да, можно и один раз сделать. Пойду пробовать.

Re: DS12887

Dmitry__ » 20 мар 2012, 13:30

Flint писал(а):Вот тут у меня тоже возникли сомнения, когда считывание происходит - написано было по отрицательному импульсу, т.е. вроде по переходу 1->0. Пробовал и так...

Дело не в том, что когда DS переходит: 1\0 или 0/1, а в том, что после такого перехода данные остаются на шине всего 10-80нс. У авр на 8 мгц. однотактная команда длиннее = 1/8мгц =125 ns
Данные надо считывать до перехода...

Re: DS12887

Flint » 20 мар 2012, 21:11

что после такого перехода данные остаются на шине всего 10-80нс

Да ну! :no: По-моему фиксирование данных на шине может происходить либо по полжительному импульсу(0->1) или по отрицательному (1->0). После чего можно спокойно считывать данные.
данные остаются на шине всего 10-80нс

А какже они могут на шине держаться только какие-то 10 наносекунд? Врядли...
Вот из того линка что я приводил, не думаю, что здесь что-то не правильно
Видим, что положительным импульсом на входе AS микросхеме указывается, что на шине данных находится номер регистра, с которым мы хотим работать. А далее положительным импульсом на входе DS указываем микросхеме, что нужно прочитать или записать данные из выбранного регистра на шину данных

Вот
...положительным импульсом на входе AS микросхеме указывается...
именно этот положительный импульс, т.е. 0->1 и фиксирует на шине - адрес, после такого перепада часы должны у себя это зафиксировать. Далее другим управляющим сигналом, тоже именно перепадом указываем, что делать (читать/писать). Это по Мотороловскому алгоритму, по Интеловскому чуть по-другому, но сути не меняет

Re: DS12887

Dmitry__ » 20 мар 2012, 21:46

Flint писал(а):Да ну! По-моему фиксирование данных на шине может происходить либо по полжительному импульсу(0->1) или по отрицательному (1->0). После чего можно спокойно считывать данные.

Он считывает данные из часов после DS...
открываем пдф, смотрим:
Figure 5. BUS TIMING FOR MOTOROLA INTERFACE
Figure 7. BUS TIMING FOR INTEL INTERFACE READ CYCLE

tDHR - "Read-Data Hold Time" = 10 - 80ns.

Добавлено спустя 11 минут 13 секунд:
Если режим "BUS TIMING FOR INTEL INTERFACE READ CYCLE", то это tDHR и считывать данные надо до "DS_SET строб считывания данных с шины"
А если режим "Figure 5. BUS TIMING FOR MOTOROLA INTERFACE", то это tDDR
"Output Data Delay Time From DS/E or RD" и он не 0 нс. а 20-120 нс. т.е авр может успеть сосчитать данные, которые еще не устаканились и надо делать задержку чтения.
Т.е при любом режиме DS12887, чтение сделано неправильно

Re: DS12887

Flint » 20 мар 2012, 22:05

Вот, действительно, если внимательно посмотреть, то это надо понимать так, что данные на шине сами по себе не пропадают. Шина может перейти в друго состояние, соответственно, с потерей данных на шине по нашей воле, напрмер, изменили сигнал CS. Хотя в даташите момент изменения состояния шины не привязан ни к какому моменту по отношению к другим сигналам (максимум что заметно это к CS). А нет, привязан, к перходу DS от 0 к 1. Но к этому моменту данные на шине уже появились после перхода DS от 1 к 0 с задержкой tDDR. В моем первом примере действительно ошибка была - я считывал после цикла DS 1->0->1. Хотя я уже все варианты перебирал - результата не было. Еще один момент. Если даже внутрення батарея села, то можгут ли часы работать хоть от наличия внешнего напряжения (естественно, без сохранения данных при выключения питания)?

Re: DS12887

Dmitry__ » 20 мар 2012, 22:18

Flint писал(а):А нет, привязан, к перходу DS от 0 к 1. Но к этому моменту данные на шине уже появились после перхода DS от 1 к 0 с задержкой tDDR.

Появившиеся данные после tDDR уже не интересны, т.к. после tDHR "DS от 0 к 1", шина данных переходит в высокоомное состояние и вы считываете погоду на луне :)

Re: DS12887

Flint » 21 мар 2012, 08:20

Да, неинтересно. Поэтому считывать надо после DS 1->0. В первоначальном примере я уже упомянул, что там ошибка, но пробовал все варианты.


Rambler\'s Top100 Mail.ru counter