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

 
 
> 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
 
Start new topic
Ответов
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



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

 


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


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