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

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

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

Ещё моментец - конструкция на одной плате с сетевым импульсничком на TNY264, подумал - может тот зловредно влияет - запитал внешним параметрическим. Пофиг.
otrog
Ошибка настройки таймера скорей всего.
Приведите исходник.
pr0m
Цитата(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();
}
Сергей Борщ
Цитата(pr0m @ Sep 27 2006, 15:09) *
Порядка 1 сек в минуту. Иногда больше. Иногда меньше. Но совершенно недопустимые значения...
Тактовая ЦПУ - internal RC-oscillator 1MHz, на внешние ноги для кристалла - 32768Hz, по 22пФ внешние кондёры. Внутренние (CKOPT) отключены. Впрочем пробовал без внешних и включенный CKOPT с тем же результатом.
Обычно часовые кварцы расчитаны на меньшую нагрузочную емкость 6...12пф
singlskv
Цитата(Сергей Борщ @ 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 !
pr0m
// 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
pr0m
Цитата(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. Репу до крови практически расчесал из-за них....

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

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

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

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

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

Нуль в счетчике таймера это не отсутствие чего-либо, а самое первое его состояние, которое длиться один такт. Так что 31 такт плюс 0-й такт это и будет 32 такта счета таймера.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.