|
DS1307 и день недели |
|
|
|
May 9 2008, 10:15
|

Участник

Группа: Новичок
Сообщений: 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; } Вообще-то это не я придумал, а скачал билиотеку с этого форума. Но я её немного переделал
|
|
|
|
|
May 9 2008, 19:31
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 9 2008, 20:08
|

Участник

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

|
Цитата(GrayCat @ May 9 2008, 22:31)  Нету. Там, насколько я помню, еще хуже: под год выделено 2 бита, т.е. только 4-годичный цикл отслеживается. Вообще-то я имел ввиду вычисление дня недели. А 4-годичный цикл хоть и не очень приятно, но терпимо Цитата(GrayCat @ May 9 2008, 22:31)  Вот в 2038 эпоха UNIX-а закончится. Ну это спорный вопрос. Ничего не мешает к тому времени перевести время на 64-битное число. Тогда эта дата отодвинется на несколько миллиардов лет  Не знаю, но в 64-битных система возможно так уже сделано
Сообщение отредактировал TarasG - May 9 2008, 20:09
|
|
|
|
|
May 10 2008, 08:18
|

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

|
Цитата(TarasG @ May 9 2008, 23:08)  Вообще-то я имел ввиду вычисление дня недели. Я тоже. Т.к. PCF8583 микросхема еще более старая чем Даллас 1307, то фичей в ней меньше, а потребление от батарейки больше. Смысла ее использовать вообще нет. Цитата Ну это спорный вопрос. Ничего не мешает к тому времени перевести время на 64-битное число. Тогда эта дата отодвинется на несколько миллиардов лет  Не знаю, но в 64-битных система возможно так уже сделано  Так сделано даже в хорошо продуманных изначально 32-бит системах. Например, в QNX есть в документации такая строка: "Внимание! Этот 64-битный счетчик наносекунд переполнится в 2483 году! Если вы планируете использование ваших программ после 2483, обязательно предусмотрите соответствующие проверки!"
--------------------
Gray©at
|
|
|
|
|
May 10 2008, 09:15
|

Участник

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

|
Цитата(GrayCat @ May 10 2008, 11:18)  Я тоже. Т.к. PCF8583 микросхема еще более старая чем Даллас 1307, то фичей в ней меньше, а потребление от батарейки больше. Смысла ее использовать вообще нет. А мне из даташита показалось, что в неё как раз больше функциональность. Например, сотые доли секунды, таймеры и т.д. В моём случае это, конечно, не нужно. Но в других может и понадобится... Цитата(GrayCat @ May 10 2008, 11:18)  Значит проблема разрешима  Думаю, когда реально припечёт - за пару лет до даты Х - быстро выйдут соответствующие патчи и проблема будет решена
|
|
|
|
|
May 11 2008, 03:53
|

Профессионал
    
Группа: Свой
Сообщений: 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....
|
|
|
|
|
May 11 2008, 09:07
|

Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
May 11 2008, 13:50
|

Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|