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

 
 
> Часы, немного переделал и стали отставать
_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
Ответов
DpInRock
сообщение Dec 11 2008, 04:03
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



В прерывании, сначала решайте вопросы индикатора (и звука), а потом все остальные. Тогда время индикации будет постоянным.
Особенно это заметно, если звук по прерыванию генериться.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
777777
сообщение Dec 11 2008, 05:28
Сообщение #3


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

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



Цитата(DpInRock @ Dec 11 2008, 07:03) *
В прерывании, сначала решайте вопросы индикатора (и звука), а потом все остальные. Тогда время индикации будет постоянным.

Обычно делают наоборот: фонвая программа занимается динамической индикацией и обработкой кнопок, так как для нее не критично изменение частоты на 10...20%, а все остальное делается в прерываниях.
Цитата(DpInRock @ Dec 11 2008, 07:03) *
Особенно это заметно, если звук по прерыванию генериться.

Не проще ли генерить его таймером?
Go to the top of the page
 
+Quote Post
_Diman_
сообщение Dec 11 2008, 22:44
Сообщение #4


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

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



Да как то уже все сделано, возвращаться неохота и нет времени.
Яркость тоже сидит в прерывании, всего их два, яркость и часы.
Звук примитивный пищит только, 1 таймером.
Вот писание часов http://startcd.narod.ru/clock/clock.html если интересно
только эти на ид10, а так они у меня с 2004 года уже трудятся.

Поменял коррекцию, не помогло.
Код
ISR(SIG_OVERFLOW0){
    if (++lcd_time_switch==light_isr)
        PORTLCD=lcd_buffer[znakomesto];
}
//**************************************
ISR(SIG_OVERFLOW2)
{
clock_++;
if (clock_==128)
    {                                                          
    clock_=correct;
    isr_1sek_=1;
      }
}

//**************************************
void clock(void){
  if ( isr_1sek_ )//прошла секунда
    {
    correct=0;
    if (++hour[h_sek]==60)
        {
        if (++hour[h_min]==60)
            {
            if ( setup.corr_flag&BIT(fl_corr_znak_pl) )//корекция часов
                correct=setup.correction;//для убыстрения
                else
                correct= 0x00-setup.correction;
            
            hour[h_min] =0;
            hour[h_hour]++;


Вообщем пока забросил.

Во блин, сейчас опять решил проверить уход, до синхронизации с интернетом за два дня секунд 13, после синхронизации 1 секунда. Получается у меня, что то с компом.
Извините, что ненароком мозги пудрил sad.gif
Go to the top of the page
 
+Quote Post



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

 


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


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