Вторник, 27.06.2017, 00:27
электроника
Форум Мой профиль
РегистрацияВход/Выход

Вы вошли как Гость · Группа "Гости"Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: SITH, Denis_K, Катран 
Форум » Учебка » Раздел для начинающих » как одним таймером отсчитать разные промежутки времени?
как одним таймером отсчитать разные промежутки времени?
belazovДата: Понедельник, 22.11.2010, 12:10 | Сообщение # 1
Новенький
Группа: Радиолюбитель
Сообщений: 4
Репутация: 0
Статус: Offline
никак не въеду:
таймер Т1 на тини2313. прерывание при совпадении дает мне счетчик времени.
использую флаг от прерывания для отсчета необходимых пауз. на паузе зависает.
как еще можно сделать паузу чтоб она не мешала ничему?
unsigned char x=0;
unsigned char y=0;
unsigned char z=0;
unsigned char N=0;

Code
//***вариант первый
       //флаг1 инвертируется каждое прерывание от таймера
       //число N задаю по ходу программы дл отработки пауз
       //разной длительности
       void wait(void)
       {
           z=N; //назначаю кол-во прерываний N для отсчета
           x=flag1; //начальное значение х
           y=0; //вспомагательная переменная
           if (y<z) //если y<z
           {
               while (x=flag1){}; //проверяю когда изменится flag1, т.е. произойдет прерывание
               //пока флаг не изм. крутится пустой цикл
               y=y+1; //как только flag1 изм., то инкремент y
           }
       else
       {
           N=0; //если y=z, то переход к следующей функции
       };
}

//******** или вариант второй

void wait(void)
{
      x=flag1;
      y=0;
      z=N;
      m1:
      if (y<z)
      {
          if (x==~flag1) {y=y=1;x=flag1;
      }
else   
      {
          goto m1;
      };

};
}

//********третий вариант
void wait(void)
{
      z=N; //назначаю кол-во прерываний N для отсчета
      x=flag1; //начальное значение х
      y=0;
      if (y<z) //если y<z
      {
          while (x=flag1){}; //проверяю когда изменится flag1, т.е. произойдет прерывание
          //пока флаг не изм. крутится пустой цикл
          y=y+1; //как только flag1 изм., то инкремент y
      }
else
      {
          N=0; //если y=z, то переход к следующей функции
      };
}


Сообщение отредактировал Катран - Понедельник, 22.11.2010, 17:22
 
КатранДата: Понедельник, 22.11.2010, 17:18 | Сообщение # 2
GOD
Группа: Администраторы
Сообщений: 1221
Репутация: 7801
Статус: Offline
Quote (belazov)
прерывание при совпадении дает мне счетчик времени.

Прерывание можно вызывать по переполнению счётчика
Что за компилятор?
Просьба оформлять так же как в компиляторе, а то читать невозможно.
раз уже используется один из таймеров, то можно создать функцию, по которой будет задаваться необходимая длительность, например:
Code
// перед задержками необходимо выключить все прерывания  
void milliseconds(void)
{
     функция которая формирует миллисекунду
}

//и вот наша функция формирующая задержку
void period(unsigned int kolichestvo)
{
     while(kolichestvo > 0)
     {
         milliseconds();
         kolichestvo--;
     }
}

 
belazovДата: Понедельник, 22.11.2010, 18:44 | Сообщение # 3
Новенький
Группа: Радиолюбитель
Сообщений: 4
Репутация: 0
Статус: Offline
не могу вставить всю прогу - форум пишет что текст сообщения превышает допустимый лимит.
прерывания думаю отключать нельзя, т.к. используется динамическая индикация на ТО и счет времени от прерываний Т1.
если использую delay то вырубается индикация.
This program was produced by the CodeWizardAVR V2.04.9a Evaluation


Сообщение отредактировал belazov - Понедельник, 22.11.2010, 18:51
 
КатранДата: Понедельник, 22.11.2010, 23:24 | Сообщение # 4
GOD
Группа: Администраторы
Сообщений: 1221
Репутация: 7801
Статус: Offline
Если не критичен компилятор - лучше в этом случае CodeVisionAVR там есть уже готовые функции delay_ms(); и delay_us();
 
belazovДата: Понедельник, 22.11.2010, 23:49 | Сообщение # 5
Новенький
Группа: Радиолюбитель
Сообщений: 4
Репутация: 0
Статус: Offline
если использую delay то вырубается индикация.
 
КатранДата: Вторник, 23.11.2010, 08:51 | Сообщение # 6
GOD
Группа: Администраторы
Сообщений: 1221
Репутация: 7801
Статус: Offline
Для чего необходима пауза?
В данном случае тогда только по таймеру, как я предлагал, только без запрещения прерывания.
 
belazovДата: Вторник, 23.11.2010, 11:46 | Сообщение # 7
Новенький
Группа: Радиолюбитель
Сообщений: 4
Репутация: 0
Статус: Offline
Т0 прерывание по переполнению - динамическая индикация времени процедуры.
Т1 - прерывание по совпадению с OCR1A - для отсчета времени процедуры.
1) через 5 минут включить зв.сигнал-пауза 0,5с-отключить зв.сигнал, включить реле1, включить-2сек-выключить реле2
2) через 5 минут включить зв.сигнал-пауза 0,5с-отключить зв.сигнал, выключить реле1, включить-2сек-выключить реле2
3) п.1 и п.2 повторяются до окончания времени процедуры каждые 5 минут.
нужны паузы 0,2с; 0,5с; 2с без запрета прерываний.
потому как зашел в тупик-вижу 2 варианта: поставить еще тини15 рядом или убрать тини2313 поставить мегу8 или мегу 88 с тремя таймерами.

а программу на 250 строк сюда в форум вставить не получается. поэтому вставляю отдельным файлом

Прикрепления: 12.c(8Kb)


Сообщение отредактировал belazov - Вторник, 23.11.2010, 11:48
 
КатранДата: Среда, 24.11.2010, 22:11 | Сообщение # 8
GOD
Группа: Администраторы
Сообщений: 1221
Репутация: 7801
Статус: Offline
Зашел в тупик, потому, что реализовал все функции в прерывании. В прерывании по таймеру для времени необходимо только отсчитывать временные интервалы с наименьшей дискретностью равной, в данном случае, 0.2с, а в основной задавать необходимые события, т.е. формировать задачи.
 
Форум » Учебка » Раздел для начинающих » как одним таймером отсчитать разные промежутки времени?
Страница 1 из 11
Поиск: