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

 
 
> 1 секунда на С
ZLOI
сообщение Apr 29 2008, 07:45
Сообщение #1


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

Группа: Участник
Сообщений: 147
Регистрация: 7-03-07
Из: Славный город Шелехов
Пользователь №: 25 967



Здравствуйте, интересно бы увидеть фрагмент кода на С, который бы позволял на 16 пике с 4 МГц кварцем каждую секунду увеличивать значение какой-нибудь переменной на 1. Интересно, вдруг я делаю неправильно.

Сообщение отредактировал ZLOI - Apr 29 2008, 07:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Apr 30 2008, 14:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(ZLOI @ Apr 30 2008, 15:49) *
Знаю. Проблем со "сделать" нет. Не хочется быть умным программистом, который тупым кодом делает гениальные вещи. Хочется делать красиво. Вот Вы мне скажете. Я посмотрю и подумаю: "Ёлки палки, да ведь здесь же надо в таком направлении двигаться, такие книжки читать и т.д.".
Если у вас уже есть таймерное прерывание, то в нем просто инкрементируйте какую-либо беззнаковую переменную на величину тика таймера, выраженную, например, в миллисекундах.
Код
#define TICK_TIMER 10UL  // тик таймера 10 мс

volatile unsigned long time;

void interrupt Times(void)
{
  time+=TICK_TIMER;
...
}
Переменная time "тикает" себе в фоне потихоньку.
Когда вам нужно сделать задержку в main-е, то делаете такую конструкцию
Код
void main (void)
{ unsigned long tmpTime1, tmpTime2;
...
  _disable_interrupt();
  tmpTime1=time;
  _enable_interrupt();
  do
  { _disable_interrupt();
    tmpTime2=time;
    _enable_interrupt();
  } while ((tmpTime2-tmpTime1)<1000UL); //задержка на 1000мс=1с
...
}

Запрет прерываний перед считыванием переменной time требуется только, если другим образом нельзя обеспечить атомарность операции ее чтения. Например, когда вы пытаетесь на 8-ми битном MCU оперировать 32-х битными переменными. Все используемые в примере переменные должны быть беззнаковыми. Переменная time обязательно должна иметь квалификатор volatile. При исчислении в миллисекундах 32-х разрядной переменной хватает для измерения интервалов времени длительностью свыше 1,5 месяца.
P.S.
Для выполнения каких-либо действий по отметкам времени можно поступать аналогично.
Код
void main (void)
{ unsigned long tmpTime1, tmpTime2;
...
  _disable_interrupt();
  tmpTime2=time;
  _enable_interrupt();
  if ((tmpTime2-tmpTime1)>=1000UL) // прошло больше 1000мс?
  { funcDo1sPeriod(); // да, вызываем функцию
    _disable_interrupt();
    tmpTime1=time;  // обновляем значение переменной заданного интервала
    _enable_interrupt();
  }
...
}

Еще раз обращаю внимание, что переменные должны быть беззнаковыми. В этом случае корректно обрабатывается ситуация переполнения их максимального значения при сравнении этих чисел.
Go to the top of the page
 
+Quote Post



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

 


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


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