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

 
 
> Часы, немного переделал и стали отставать
_Diman_
сообщение Dec 7 2008, 19:40
Сообщение #1


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

Группа: Свой
Сообщений: 92
Регистрация: 8-03-05
Пользователь №: 3 160



Раньше в прерывании было
Код
ISR(SIG_OVERFLOW2)
{
clock_++;
if (clock_==128)
    {                                                          
    clock_=0;
    hour[h_sek]++;
      }
}

Функция часов
Код
if (hour[h_sek]==60)
   {
       hour[h_sek] =0;
    hour[h_min]++;
….


Сделал
Код
ISR(SIG_OVERFLOW2)
{
clock_++;
if (clock_==128)
    {                                                          
    clock_=0;
    isr_1sek_=1;
      }
}


Код
void clock(void){
cli();    
  if ( isr_1sek_ )//прошла секунда
    {
       isr_1sek_=0;
    sei();
    if (++hour[h_sek]==60)
        {
        hour[h_sek] =0;
        hour[h_min]++;
        if (hour[h_min]==60)
….
sei();


Часы начали отставать. Не могу понять почему? Ведь событие происходит раз в секунду, пропустить его ни как нельзя, даже если программа зависнет на пол секунды, чего нет на самом деле. Вот, чешу репу, чего я не так сделал?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
777777
сообщение Dec 8 2008, 06:33
Сообщение #2


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Я бы вообще все сделал в прерывании:
Код
ISR(SIG_OVERFLOW2)
{
if (++clock_==128)
    {
    clock_= 0;
    if(++hour[h_sek] == 60)
        {
        hour[h_sek] = 0;
        if(++hour[h_min] == 60)
            {
            hour[h_min] = 0;
            if(++hour[h_hour] == 24)
                {
                // ... и т.д.
                }
            }
        }
      }
}

Неужели несколько микросекунд нахлждения в прерывании так критичны?
Go to the top of the page
 
+Quote Post
_Diman_
сообщение Dec 8 2008, 15:01
Сообщение #3


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

Группа: Свой
Сообщений: 92
Регистрация: 8-03-05
Пользователь №: 3 160



Меня больше интересовало почему это случилось. А разве такое построение, с установкой флага в прерывании, не рабочие? По моему по барабану сколько пройдет времени до выполнения этой функции, главное чтоб было меньше секунды.
Если все делать в прерывании, то скорей всего яркость индикатора будет плавать на минимальном значении яркости, поэтому я не сделал так.
Go to the top of the page
 
+Quote Post



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

 


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


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