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

 
 
 
Reply to this topicStart new topic
> ATMega8L - RTC на внешнем 32768Hz сильно отстают..., В чём м.б. причина?
pr0m
сообщение Sep 27 2006, 12:09
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Порядка 1 сек в минуту. Иногда больше. Иногда меньше. Но совершенно недопустимые значения...
Тактовая ЦПУ - internal RC-oscillator 1MHz, на внешние ноги для кристалла - 32768Hz, по 22пФ внешние кондёры. Внутренние (CKOPT) отключены. Впрочем пробовал без внешних и включенный CKOPT с тем же результатом.
Главный цикл делает какую-то работку в пределах 6000 тактов (6 мс) - выводит на индикатор MT-10T7 дату-время, а затем уходит в PowerSafe - просыпается по прерыванию раз в секунду от Timer2. Обработчик прерывания совсем коротенький..... Инкремент long-а.

Пробовал менять кварц (др. производителя) - то же.

Может кто-нить поделится соображениями..? Я в прострации sad.gif

Ещё моментец - конструкция на одной плате с сетевым импульсничком на TNY264, подумал - может тот зловредно влияет - запитал внешним параметрическим. Пофиг.


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
otrog
сообщение Sep 27 2006, 12:30
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Ошибка настройки таймера скорей всего.
Приведите исходник.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
pr0m
сообщение Sep 27 2006, 13:09
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Цитата(otrog @ Sep 27 2006, 16:30) *
Ошибка настройки таймера скорей всего.
Приведите исходник.


Думаю, причина не в этом... Однако привожу )

//Файл timer2.cpp
CTimer2 g_Timer2;

void CTimer2::Init(PfnOnTimer2Interrupt pfnOnInterrupt)
{
m_pfnOnInterrupt = pfnOnInterrupt;
ASSR= 1<<AS2; // Enable asynchronous
// mode
// Clear timer on compare match / Timer Clock =
// system clock / 1024
TCCR2 = (1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20);
TIFR= 1<<OCF2; // Clear OCF2/ Clear
// pending interrupts
TIMSK= 1<<OCIE2; // Enable Timer2 Output
// Compare Match Interrupt
OCR2= 32; // Set Output Compare
// Value to 32

while (ASSR&(1<<OCR2UB)); // Wait for registers to update

// Wait 1sec for 32768Hz crystal to stabilize
__delay_cycles(1000000UL);
}

#pragma vector=TIMER2_COMP_vect
__interrupt void Timer2InterruptHandler()
{
// TIFR= 1<<OCF2;
g_Timer2.m_pfnOnInterrupt();
}



// Файл main.c
int main()
{
g_Lcd.Init();

g_Uart.Init();
printf("\r\nProgram started.\r\n");

g_Timer2.Init(OnTimer2Interrupt);


__enable_interrupt();

uint8_t n = 0;
DATETIME dt;

while(true)
{
__disable_interrupt();
g_SystemTime.ToDateTime(dt);
__enable_interrupt();

if( (n++%10) < 3 )
{
g_Lcd.ShowDate(dt);
}
else
{
g_Lcd.ShowTime(dt);
}


/* Разрешаем Sleep-режим, PowerSafe mode */
MCUCR = (1<<SE) | (1<<SM1) | (1<<SM0);
__no_operation();
__sleep();
__no_operation();

}
}



void OnTimer2Interrupt()
{
g_SystemTime.Tick();
}


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 27 2006, 15:18
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(pr0m @ Sep 27 2006, 15:09) *
Порядка 1 сек в минуту. Иногда больше. Иногда меньше. Но совершенно недопустимые значения...
Тактовая ЦПУ - internal RC-oscillator 1MHz, на внешние ноги для кристалла - 32768Hz, по 22пФ внешние кондёры. Внутренние (CKOPT) отключены. Впрочем пробовал без внешних и включенный CKOPT с тем же результатом.
Обычно часовые кварцы расчитаны на меньшую нагрузочную емкость 6...12пф


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 27 2006, 15:43
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Сергей Борщ @ Sep 27 2006, 19:18) *
Цитата(pr0m @ Sep 27 2006, 15:09) *

Порядка 1 сек в минуту. Иногда больше. Иногда меньше. Но совершенно недопустимые значения...
Тактовая ЦПУ - internal RC-oscillator 1MHz, на внешние ноги для кристалла - 32768Hz, по 22пФ внешние кондёры. Внутренние (CKOPT) отключены. Впрочем пробовал без внешних и включенный CKOPT с тем же результатом.
Обычно часовые кварцы расчитаны на меньшую нагрузочную емкость 6...12пф

Обычно часовые кварцы расчитаны на работу без нагрузочной емкости (внешней) smile.gif
Вот цитата из Datasheta на ATmega16:
Timer/Counter Oscillator
For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the
crystal is connected directly between the pins. No external capacitors are needed. The
Oscillator is optimized for use with a 32.768 kHz watch crystal.



Цитата(pr0m @ Sep 27 2006, 17:09) *
Цитата(otrog @ Sep 27 2006, 16:30) *

Ошибка настройки таймера скорей всего.
Приведите исходник.


Думаю, причина не в этом... Однако привожу )

// Compare Match Interrupt
OCR2= 32; // Set Output Compare

Причина в этом.
OCR2 должно быть 31 !
Go to the top of the page
 
+Quote Post
pr0m
сообщение Sep 27 2006, 16:02
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



// Compare Match Interrupt
OCR2= 32; // Set Output Compare
[/quote]
Причина в этом.
OCR2 должно быть 31 !
[/quote]

Была у меня така мысля, но не стал проверять - вчитался вдумчиво в datasheet и в диаграммы работы таймера2 - оттуда следует, что регистр-счётчик обнуляется синхронно с достижением значения OCR2, то есть лишнего такта не возникает, но счаз проверю...


Цитата(Сергей Борщ @ Sep 27 2006, 19:18) *
Цитата(pr0m @ Sep 27 2006, 15:09) *

Порядка 1 сек в минуту. Иногда больше. Иногда меньше. Но совершенно недопустимые значения...
Тактовая ЦПУ - internal RC-oscillator 1MHz, на внешние ноги для кристалла - 32768Hz, по 22пФ внешние кондёры. Внутренние (CKOPT) отключены. Впрочем пробовал без внешних и включенный CKOPT с тем же результатом.
Обычно часовые кварцы расчитаны на меньшую нагрузочную емкость 6...12пф


По этому поводу другой вопрос - насколько сильно влияет нагрузочная ёмкость на точность частоты кварца?
Кстати, один из кварцев ваще отказался запускаться без доп. емкостей. К сожалению, производитель неизвестен, так что "сколько точно вешать" выяснить не предст. возможным smile.gif


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
pr0m
сообщение Sep 27 2006, 16:27
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233



Цитата(singlskv @ Sep 27 2006, 19:43) *
Цитата(Сергей Борщ @ Sep 27 2006, 19:18) *

Цитата(pr0m @ Sep 27 2006, 15:09) *

Порядка 1 сек в минуту. Иногда больше. Иногда меньше. Но совершенно недопустимые значения...
Тактовая ЦПУ - internal RC-oscillator 1MHz, на внешние ноги для кристалла - 32768Hz, по 22пФ внешние кондёры. Внутренние (CKOPT) отключены. Впрочем пробовал без внешних и включенный CKOPT с тем же результатом.
Обычно часовые кварцы расчитаны на меньшую нагрузочную емкость 6...12пф

Обычно часовые кварцы расчитаны на работу без нагрузочной емкости (внешней) smile.gif
Вот цитата из Datasheta на ATmega16:
Timer/Counter Oscillator
For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the
crystal is connected directly between the pins. No external capacitors are needed. The
Oscillator is optimized for use with a 32.768 kHz watch crystal.



Цитата(pr0m @ Sep 27 2006, 17:09) *
Цитата(otrog @ Sep 27 2006, 16:30) *

Ошибка настройки таймера скорей всего.
Приведите исходник.


Думаю, причина не в этом... Однако привожу )

// Compare Match Interrupt
OCR2= 32; // Set Output Compare

Причина в этом.
OCR2 должно быть 31 !


Ура! Так и есть! Где тут книга благодарностей? cheers.gif
Кста, кусок кода инициализации почерпнул из Atmel-овского документа DOC2505.pdf AVR130: Setup and Use the AVR® Timers. Там именно 32. Репу до крови практически расчесал из-за них....

Спасибо всем ответившим, вопрос снят.


--------------------
Правильно поставленный вопрос - половина ответа...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 27 2006, 16:29
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(pr0m @ Sep 27 2006, 20:02) *
Была у меня така мысля, но не стал проверять - вчитался вдумчиво в datasheet и в диаграммы работы таймера2 - оттуда следует, что регистр-счётчик обнуляется синхронно с достижением значения OCR2, то есть лишнего такта не возникает, но счаз проверю...

В datasheet имели ввиду что следуещее значение будет 0, но через такт.
Чтобы проверить, запрограммируйте любой таймер в режиме CTC и просимулируйте
в AVR Studio.

Цитата
По этому поводу другой вопрос - насколько сильно влияет нагрузочная ёмкость на точность частоты кварца?
Кстати, один из кварцев ваще отказался запускаться без доп. емкостей. К сожалению, производитель неизвестен, так что "сколько точно вешать" выяснить не предст. возможным smile.gif

Для обычных кварцев >1МГц не сильно, на порядки отличается от "1сек за 1мин"
Для часового кварца может быть по другому (он принципиально отличается).
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 27 2006, 17:20
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(pr0m @ Sep 27 2006, 22:27) *
Ура! Так и есть! Где тут книга благодарностей? cheers.gif
Кста, кусок кода инициализации почерпнул из Atmel-овского документа DOC2505.pdf AVR130: Setup and Use the AVR® Timers. Там именно 32. Репу до крови практически расчесал из-за них....

Спасибо всем ответившим, вопрос снят.

Нуль в счетчике таймера это не отсутствие чего-либо, а самое первое его состояние, которое длиться один такт. Так что 31 такт плюс 0-й такт это и будет 32 такта счета таймера.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:36
Рейтинг@Mail.ru


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