roboforum.ru

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


Помогите разобраться DS1302

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Помогите разобраться DS1302

Сообщение Raf00084 » 10 ноя 2011, 00:32

Привет всем помогите разобраться, не могу понять рабочий код или нет
Код: Выделить всёРазвернуть
void WriteDS_Sec (unsigned char sec) // При вызове функции в переменную сек пишу 135 
{
char adrDS=129; // адрес для записи секунд
char b=0;
char indexDS;
PORTA.3=1;       // 1 на ногу подключенную к ресет
delay_us(10);
   indexDS=adrDS;
   for(b=0;b<8;b++){   // тут я передаю адрес

     if(indexDS&0x80){
      PORTA.2=1;}
         
     else{
     PORTA.2=0;}         // PORTA.2 подключено в дата
     delay_us(10);
     PORTA.1=1;           // PORTA.1 подключено к CLk
     delay_us(10);
   
     PORTA.1=0;
     indexDS=indexDS<<1;}
   
    b=0;
     delay_us(20);
    indexDS=sec1;
   
    for(b=0;b<8;b++){ // тут передаю начальный счет секунд
    if(indexDS&0x80){
      PORTA.2=1;}   
    else{
     PORTA.2=0;}
     delay_us(10);
     PORTA.1=1;
 
   delay_us(10);
   
   PORTA.1=0;
   indexDS=indexDS<<1;}
delay_us(10);
PORTA.2=0;   
PORTA.3=0;   
 
}


В протеусе в настройках DS1302 убираю галочку автоматической инициализации, запускаю и часы начинают тикать с 00-00-00, я понимаю что протеус может глючить у меня есть отладочная плата с этими часами но прежде чем написать функцию чтения данных из часиков мне надо понять правильно я написал запись значения.
Помогите разобраться по осцилу протеуса вроде сигналы сходятся как в даташите.
Аватара пользователя
Raf00084
 
Сообщения: 50
Зарегистрирован: 19 янв 2009, 16:18
Откуда: Хренсбург

Re: Помогите разобраться DS1302

Сообщение RootAdmin » 10 ноя 2011, 16:42

Что-то не помню чтобы резет надо было поднимать перед началом записи.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Помогите разобраться DS1302

Сообщение Raf00084 » 10 ноя 2011, 23:43

Input. CE signal must be asserted high during a read or a write. This pin has an internal 40kΩ (typ) pulldown resistor to ground. Note: Previous data sheet revisions referred to CE as RST. The functionality of the pin has not changed.
Это из датшит про ресет, в изображении вырезаном из датшита видно что ету ногу поднимают перед началом записи или чтения
вроде все правильно прошил в железо тоже не работает помогите разобраться.
Код: Выделить всёРазвернуть
void ReadDS_Min (void)
{
char adrDS=131;
char b=0;
char indexDS;
PORTA.3=1;

   indexDS=adrDS;

   for(b=0;b<8;b++){

     if(indexDS&0x80){
      PORTA.2=1;}
     
     else{
     PORTA.2=0;}
   
   PORTA.1=1;
    delay_us(1);
   PORTA.1=0;
   
   indexDS=indexDS<<1;}
   
    b=0;
     delay_us(1);
   
    for(b=0;b<8;b++){

   if(PORTA.2==1){
   indexDS |= (1<<8);}
 
   else{
   indexDS &= (~(1<<8));}
   
   PORTA.1=1;
    delay_us(1);
   PORTA.1=0;
   indexDS=indexDS<<1;}
    delay_us(1);
   
PORTA.3=0;   
Rmin=indexDS; 
}

читаю из часиков вот так.

Добавлено спустя 1 час 26 минут 7 секунд:
Код: Выделить всёРазвернуть
void WriteDS_Sec (unsigned char sec) // При вызове функции в переменную сек пишу 135 
{
char adrDS=129; // адрес для записи секунд
char b=0;
char indexDS;
PORTA.3=1;       // 1 на ногу подключенную к ресет

   indexDS=adrDS;
   for(b=0;b<8;b++){   // тут я передаю адрес

     if(indexDS&0x1){
      PORTA.2=1;}
         
     else{
     PORTA.2=0;}         // PORTA.2 подключено в дата
     
     PORTA.1=1;           // PORTA.1 подключено к CLk
   
   
     PORTA.1=0;
     indexDS=indexDS>>1;}
   
    b=0;

    indexDS=sec1;
   
    for(b=0;b<8;b++){ // тут передаю начальный счет секунд
    if(indexDS&0x1){
      PORTA.2=1;}   
    else{
     PORTA.2=0;}
   
     PORTA.1=1;
   
     PORTA.1=0;
   indexDS=indexDS>>1;}

PORTA.2=0;   
PORTA.3=0;   
 
}


так ну я исправил код сейчас инициализирует и в значение секунд пишет то что я хочу но тикать не тикает, по дш написано что для старта надо записать 1 в седбмой бит секунд но тогда и значение сек будет 0??? Правильно
Вложения
Безымянный.jpg
Аватара пользователя
Raf00084
 
Сообщения: 50
Зарегистрирован: 19 янв 2009, 16:18
Откуда: Хренсбург

Re: Помогите разобраться DS1302

Сообщение Michael_K » 11 ноя 2011, 00:14

Что это значит "не работает"???

1. Сигналы точно такие, как надо? (есть чем посмотреть? А что в симуляторе?)
2. Адрес правильный?
3. Окей, часики не тикают, а если записать в регистр и его же прочитать, значение сохраняется?
4. Может быть кварц не очень подходящий (хотя эти часики довольно стабильно кварцы заводят, хоть и медленно).

Raf00084 писал(а):по дш написано что для старта надо записать 1 в седбмой бит секунд но тогда и значение сек будет 0??? Правильно

Наоборот! Чтобы часы пошли, нужно записать нолик. Да, секунды при этом сбросятся. Если часы уже идут, просто не записывайте туда нолик, и они не будут сбрасываться.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Помогите разобраться DS1302

Сообщение RootAdmin » 11 ноя 2011, 00:48

Старший бит разве значащий? Не могу исходик найти от такого чипа - игрался давно.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Помогите разобраться DS1302

Сообщение Raf00084 » 11 ноя 2011, 00:58

Все разобрался часы пошли с той секунды какую задаю, но вот теперь считать значение и поместить его в переменную Rmin не получается, на дисплее 00, в протеусе на осциле картинка есть но не могу понять походу что-то с задержками надо мутить,
Подскажите правильно ли я понял дш на DS что при чтении значения я
1. сначала передаю в микру адрес какой буду читать т.е мин (0х83) (таким же образом как записываю секунды)
2. после того как дерну CLK 1/0
3. потом считываю состояние I/0 ноги мк и при помощи не хитрых манипуляций записяваю его в переменную
Код: Выделить всёРазвернуть
 (if(PORTA.2==1){
   indexDS |= (1<<8);}
   else{
   indexDS &= (~(1<<8));}
   PORTA.1=1;
   delay_us(1);
   PORTA.1=0;
   indexDS=indexDS<<1;}

4. и потом значение переменной пишу в Rmin/

Правильно???
Аватара пользователя
Raf00084
 
Сообщения: 50
Зарегистрирован: 19 янв 2009, 16:18
Откуда: Хренсбург

Re: Помогите разобраться DS1302

Сообщение Michael_K » 11 ноя 2011, 01:07

После адреса (по спаду clk) ногу назначить на вход.
Читаь нужно не PORTA, а PINA
(чему вас только в школе учат :))
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Помогите разобраться DS1302

Сообщение Raf00084 » 11 ноя 2011, 01:41

Вот фак так и знал что гдето мелочь, как говорится слона та я и не приметил!
ща пробую спасибо думаю это решит мою проблему.

Добавлено спустя 16 минут 7 секунд:
читаю вот так
Код: Выделить всёРазвернуть
void ReadDS_Min (void)
{
char adrDS=0x81;
char b=0;
char indexDS;

PORTA.3=1;

   indexDS=adrDS;

   for(b=0;b<8;b++){

     if(indexDS&0x1){
      PORTA.2=1;}
     
     else{
     PORTA.2=0;}
   
   PORTA.1=1;
   
   PORTA.1=0;
   
   indexDS=indexDS>>1;}
   
    b=0;
    delay_us(2);

    indexDS=0;

    DDRA=0x0A;

    for(b=0;b<8;b++){
   
   PORTA.1=1;
   delay_us(2);
   PORTA.1=0;
   
   if(PINA.2==1){
   indexDS |= (1<<8);}
 
   else{
   indexDS &= (~(1<<8));}
   
   indexDS=indexDS>>1;}

   
PORTA.3=0;
 
Rmin=indexDS;

DDRA=0x0E;
}


на дисплее 00 уже адрес секунд забил для наглядности 0x81, что я мог забыть

Добавлено спустя 15 минут 22 секунды:
в протеусе по осцилу смотрю сигналы все сходится с значением которое я задаю неужели как-то не правильно в переменную пишу??
Аватара пользователя
Raf00084
 
Сообщения: 50
Зарегистрирован: 19 янв 2009, 16:18
Откуда: Хренсбург

Re: Помогите разобраться DS1302

Сообщение Michael_K » 11 ноя 2011, 01:50

Не гадайте! Отлаживайте!
Может задержки кое-где воткнуть?
(Смущают честно говоря такие последовательности:
PORTA.1=1;
PORTA.1=0;
)
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Помогите разобраться DS1302

Сообщение Raf00084 » 11 ноя 2011, 01:56

нет осциллографа, можету меня на отладке микра или кварц не рабочий поэтому и 00, скажите процедура записи в переменную правильная?
По поводу
PORTA.1=1;
PORTA.1=0;
мега прошита на внутренний 1 мгц
а часики по дш работаю до 2 мгц
так что я думаю успевают
Аватара пользователя
Raf00084
 
Сообщения: 50
Зарегистрирован: 19 янв 2009, 16:18
Откуда: Хренсбург


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8