реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> DS1307 и день недели
TarasG
сообщение May 9 2008, 10:15
Сообщение #31


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(arttab @ May 9 2008, 07:12) *
Кстати, пока twi не готов его статус 0xff. вот где собачка порылась.
надо
while ( (TWCR&(1<<TWINT)==1) && (TWCR!=0xff) ) {;} // wait set START on the TWI

А зачем? Ведь если TWCR = 0xFF, то и бит TWINT в нём однозначно 1. Т.е. проверки (TWCR & (1 << TWINT) == 1 вполне достаточно.
Или Вы имеете ввиду статус (TWSR) 0xFF? Только я при инициализации этот регистр обнуляю:
Код
void i2c_init(void)
{
    TWSR = 0;
    TWDR = 0;
    TWAR = 0;
    TWBR = TWI_TWBR; //установить скорость шины i2c
    TWCR = ((1 << TWEN) | (1 << TWINT)); //включить модуль i2c
    i2c_error = 0; //первоначально ошибок нет
    return;
}

Вообще-то это не я придумал, а скачал билиотеку с этого форума. Но я её немного переделал smile.gif
Go to the top of the page
 
+Quote Post
GrayCat
сообщение May 9 2008, 19:31
Сообщение #32


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342



Цитата(TarasG @ May 6 2008, 15:24) *
Кстати, ещё интересно, есть ли такая функция в PCF8583 от Philips?

Нету. Там, насколько я помню, еще хуже: под год выделено 2 бита, т.е. только 4-годичный цикл отслеживается.

Цитата(kolobok0 @ May 6 2008, 18:44) *
+1 бОльшая проблема будет когда будет 2070 год...от тогда проблема будет..а пока...фигня енто всё...

А что будет в 2070? Вот в 2038 эпоха UNIX-а закончится.


--------------------
Gray©at
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 9 2008, 20:08
Сообщение #33


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(GrayCat @ May 9 2008, 22:31) *
Нету. Там, насколько я помню, еще хуже: под год выделено 2 бита, т.е. только 4-годичный цикл отслеживается.

Вообще-то я имел ввиду вычисление дня недели. А 4-годичный цикл хоть и не очень приятно, но терпимо smile.gif
Цитата(GrayCat @ May 9 2008, 22:31) *
Вот в 2038 эпоха UNIX-а закончится.

Ну это спорный вопрос. Ничего не мешает к тому времени перевести время на 64-битное число. Тогда эта дата отодвинется на несколько миллиардов лет smile.gif Не знаю, но в 64-битных система возможно так уже сделано smile.gif

Сообщение отредактировал TarasG - May 9 2008, 20:09
Go to the top of the page
 
+Quote Post
GrayCat
сообщение May 10 2008, 08:18
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342



Цитата(TarasG @ May 9 2008, 23:08) *
Вообще-то я имел ввиду вычисление дня недели.

Я тоже. Т.к. PCF8583 микросхема еще более старая чем Даллас 1307, то фичей в ней меньше, а потребление от батарейки больше. Смысла ее использовать вообще нет.

Цитата
Ну это спорный вопрос. Ничего не мешает к тому времени перевести время на 64-битное число. Тогда эта дата отодвинется на несколько миллиардов лет smile.gif Не знаю, но в 64-битных система возможно так уже сделано smile.gif

Так сделано даже в хорошо продуманных изначально 32-бит системах. Например, в QNX есть в документации такая строка: "Внимание! Этот 64-битный счетчик наносекунд переполнится в 2483 году! Если вы планируете использование ваших программ после 2483, обязательно предусмотрите соответствующие проверки!" 1111493779.gif maniac.gif yeah.gif smile3046.gif krapula.gif


--------------------
Gray©at
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 10 2008, 09:15
Сообщение #35


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(GrayCat @ May 10 2008, 11:18) *
Я тоже. Т.к. PCF8583 микросхема еще более старая чем Даллас 1307, то фичей в ней меньше, а потребление от батарейки больше. Смысла ее использовать вообще нет.

А мне из даташита показалось, что в неё как раз больше функциональность. Например, сотые доли секунды, таймеры и т.д. В моём случае это, конечно, не нужно. Но в других может и понадобится...
Цитата(GrayCat @ May 10 2008, 11:18) *
Так сделано даже в хорошо продуманных изначально 32-бит системах. Например, в QNX есть в документации такая строка: "Внимание! Этот 64-битный счетчик наносекунд переполнится в 2483 году! Если вы планируете использование ваших программ после 2483, обязательно предусмотрите соответствующие проверки!" 1111493779.gif maniac.gif yeah.gif smile3046.gif krapula.gif

Значит проблема разрешима wink.gif Думаю, когда реально припечёт - за пару лет до даты Х - быстро выйдут соответствующие патчи и проблема будет решена smile.gif
Go to the top of the page
 
+Quote Post
arttab
сообщение May 11 2008, 03:53
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Цитата
А зачем? Ведь если TWCR = 0xFF, то и бит TWINT в нём однозначно 1. Т.е. проверки (TWCR & (1 << TWINT) == 1 вполне достаточно. Или Вы имеете ввиду статус (TWSR) 0xFF? Только я при инициализации этот регистр обнуляю:

Ляпнул, позабыв чего делал в эксперементе.
Мне не понравилось что необходима задержка после выстакления флага готовности прежде чем я могу нормально забрать данные из TWSR.

Цитата
А зачем? Ведь если TWCR = 0xFF, то и бит TWINT внём однозначно 1. Т.е. проверки (TWCR & (1 << TWINT) == 1 вполне достаточно. Или Вы имеете ввиду статус (TWSR) 0xFF? Только я при инициализации этот регистр обнуляю:

Ляпнул, позабыв чего делал в эксперементе.
Мне не понравилось что необходима задержка после выставления флага готовности прежде чем я могу нормально забрать данные из TWSR.
Вот я и спросил про задержку. толи мне бракованные образцы попались


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 11 2008, 09:07
Сообщение #37


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



По-моему, задержка там нужна не после выставления флага, а пока он ещё не установлен. Другими словами, чтоб выполнить действие (например, что-то отправить) нужно установить этот флаг в 1. На отправку данных уходит какое-то время, поэтому TWI некоторое время занят. По завершении действия флаг TWINT автоматически установтся в 0. Но пока он 1 - надо ждать, для чего и вводится задержка. Ещё раз привожу рабочий код:
Код
unsigned char i2c_error;
void i2c_start(void)
{
    if (i2c_error)
        return;
    TWCR = ((1 << TWEN) | (1 << TWINT) | (1 << TWSTA));
    i2c_delay();
    if ((TWSR != START) && (TWSR != REP_START))
        i2c_error = 1;
    return;
}
void i2c_delay(void)
{
    if (i2c_error)
        return;
    for (unsigned char i = 0; i < 100; i++) {
        if (TWCR & (1 << TWINT))
            return;
        _delay_loop_1(0.000001 * F_CLK);
    }
    i2c_error = 1;
    return;
}


Сообщение отредактировал TarasG - May 11 2008, 09:31
Go to the top of the page
 
+Quote Post
arttab
сообщение May 11 2008, 13:13
Сообщение #38


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



про что и речь. надо ждать готовности twi. о готовности его говорит выставленный флаг TWINT.
но у меня чтобы получить корректные данные нужно ждать после выставления флага. где то ляп. у меня или в микрухе.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 11 2008, 13:50
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(TarasG @ May 11 2008, 13:07) *
По-моему, задержка там нужна не после выставления флага, а пока он ещё не установлен. Другими словами, чтоб выполнить действие (например, что-то отправить) нужно установить этот флаг в 1. На отправку данных уходит какое-то время, поэтому TWI некоторое время занят. По завершении действия флаг TWINT автоматически установтся в 0. Но пока он 1 - надо ждать, для чего и вводится задержка.

Ну , не совсем так

При формировании какого либо действия на шине TWI Вы дожны TWCR записать , что Вы собственно хотите от TWI ,
Код
  ldi      temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); формирование сигнала START
          sts      TWCR, temp

Как только выполниться команда STS - дальнейшее от Вас не зависит ибо , TWINT сбросится в 0 , сформируется Start , а вот дальше придётся ждать когда TWINT снова станет 1 и в регистре TWSR появиться код выполнения операции ( в данном случае старт) .
Лучше просто проверять TWINT на 1 - просмотреть код возврата , и принять решение, что делать дальше


Код
;*************************************************
;*                                               *
;*       Подпрограмма Init TWI_START             *
;*     Формирование START и проверка ответа.     *
;*                                               *
;*                                               *
;*************************************************

TWI_START:
        
           ldi      temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); формирование сигнала START
       sts      TWCR, temp
        
waitST:
        lds      temp,TWCR   ; Проверка бита TWINT
        sbrs     temp,TWINT
        rjmp     waitST                                    ; Не получен -цикл
        lds    temp,TWSR; Проверка кода ответа
        andi    temp,$F8    ;
        cpi    temp,START                            ;code=08
        breq    RETURN     ; Правильный код -выход из подпрограммы
        brne    TWI_START                             ; Нет - повтор.
RETURN:    ret


И код 0xFF я в TWI не нашёл? есть F8 - не сформирован START (STOP) - вообще-то просто промежуточный код и есть 00- ошибка на шине
Остальные коды есть в DS на каждый проц , но они стандартны для всех

В такой режиме Вы не пропустите данные и всегда знаете , что делать с шиной.

Сообщение отредактировал ILYAUL - May 11 2008, 13:51


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zheka
сообщение Apr 8 2011, 20:12
Сообщение #40


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Господа, пытаюсь прочесть день недели - все время выдает 0.
Работаю в CodeVision, там функции чтения дня недели нет, поэтому я использую отрытую на просторах интернета функцию day=rtc_read(0x03); Возвращает все время ноль. А вообще микросхема сама расчитывает день недели, или его нужно раз выставить, а потом мироксхема просто будет считать до 7 и обнуляться?
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Apr 8 2011, 20:24
Сообщение #41


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(zheka @ Apr 9 2011, 00:12) *
А вообще микросхема сама расчитывает день недели, или его нужно раз выставить, а потом мироксхема просто будет считать до 7 и обнуляться?

Надо выставить, про календарь она ничего не знает.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 8 2011, 20:26
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Не рассчитывает - это просто счетчик.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 21:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016