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

 
 
> TIMER1 в mega8, не могу заставить работать в СТС
Метценгерштейн
сообщение May 7 2010, 22:10
Сообщение #1


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вот его определение

Код
        TCCR1A= (1<<COM1A0);
        TCCR1B= (0<<CS02)|(0<<CS01) |(1<<CS00)|(1<<WGM12); //CTC mode, no prescaled
        TIMSK = (1<<TOIE0)|(1<<OCIE1A);   //for counter 0 and counter 1 (1<<TICIE1)|
        OCR1AL= 150; //init OCR1AL for CTC mode
        OCR1AH= 0;

хочу, чтобы счетчик досчитывал до 150, прерывался, там я инк. переменную, дальше он обнуляется и снова считает до 150...

пробовал без
Код
TCCR1A= (1<<COM1A0);

та же фигня.

моя переменная, кот. должна инк. =0 постоянно

вроде как ничего в коде не упустил?

Сообщение отредактировал rezident - May 8 2010, 23:53
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Метценгерштейн
сообщение May 22 2010, 07:55
Сообщение #2


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



к сожалению, модератор перенес тему сюда, а что я хотел спросить в ней- не указал, поэтому немного мысль потеряна осталась.

здесь мне интересно, как лучше в программе мигать светодиодом, и при этом не тормозить основную прогу. Т.е. можно было бы просто зажечь его, вставить noop, погасить. Интересует как это делает народ.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 22 2010, 18:28
Сообщение #3


Гуру
******

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



Цитата(Метценгерштейн @ May 22 2010, 13:55) *
Интересует как это делает народ.
Идея у вас правильная, но реализация не совсем корректная. Не нужно в main-е или любой другой функции сбрасывать "тиковую" переменную, которая инкрементируется (считает тики прерывания, выраженные в единицах времени) в прерывании. Достаточно иметь в функции свою статическую (для которой выделяется постоянная память) переменную временной отметки/засечки, значение которой в свою очередь сравнивать с "тиковой" переменной беззнаковым вычитанием. Естественно обе этих переменных должны быть беззнаковыми, а "тиковая" еще глобальной с квалификаторлм volatile. Если переделать ваш вариант, то будет примерно так

Код
#define LED_BLINK_PERIOD 200U

volatile unsigned int CntMC;

#pragma vector = TIMER1_COMPA_vect
__interrupt void overflow_timer1(void)
{
  CntMC++; // инкремент "тиковой" переменной
}

void main(void)
{ BOOL active = TRUE;
  static unsigned int timeStamp=CntMC;
  initTickTimer(); // инициализация таймера, выделенного под счет времени
  for (;;)
  { if (active)   // устанавливаем состояние LED в соответствии с состоянием переменной active
      on (LED);
    esle
      off (LED);
    if ((CntMC-timeStamp)>=LED_BLINK_PERIOD) // проверяем окончание выделенного инетервала времени
    { if (active)
        active=FALSE;
      else
        active=TRUE;
      timeStamp=CntMC; // синхронизируем текущее состояние переменной временной отметки
    }
  }
}

Достоинство такого способа в том, что у вас в системе будет только один источник времени - "тиковая" переменная. В то же время переменных для временных засечек вы можете сделать столько, сколько вам будет нужно по количеству процессов, требующих временных отсчетов. Только следует учитывать два нюанса.
1. максимальный измеряемый временной период определяется периодом переполнения "тиковой" переменной. Если нужен сравнительно большой период, то нужна 32-х битная или даже 64-х битная переменная. Из этого следует второй нюанс.
2. если разрядность "тиковой" переменной превышает нативную разрядность архитектуры, то следует специальными методами обеспечит атомарность доступа к "тиковой" переменной. Атомарность доступа предполагает, что при копирования значения переменной по частям ее значение не может (не должно) изменяться (в прерывании, где она инкрементируется)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   TIMER1 в mega8   May 7 2010, 22:10
- - Палыч   Цитата(Метценгерштейн @ May 8 2010, 02:10...   May 8 2010, 04:54
- - Метценгерштейн   т.е. поменять местами КодOCR1AL= 150; //init OCR1A...   May 8 2010, 05:36
|- - Палыч   Цитата(Метценгерштейн @ May 8 2010, 09:36...   May 8 2010, 06:39
- - Метценгерштейн   Кодchar __low_level_init (void) { //this...   May 8 2010, 06:45
|- - Палыч   Цитата(Метценгерштейн @ May 8 2010, 10:45...   May 8 2010, 06:58
- - Метценгерштейн   в этой таблице говорится, что если я хочу режим СТ...   May 8 2010, 07:20
|- - Палыч   Цитата(Метценгерштейн @ May 8 2010, 11:20...   May 8 2010, 09:57
|- - Метценгерштейн   "TOV1 Flag Set on" одного не пойму, в та...   May 8 2010, 17:22
- - Метценгерштейн   заработало все- почему- то копирование из даташита...   May 8 2010, 19:30
- - sigmaN   При использовании Си, чтобы не париться с порядком...   May 9 2010, 16:57
|- - demiurg_spb   Цитата(sigmaN @ May 9 2010, 20:57) При ис...   May 18 2010, 17:14
- - Метценгерштейн   можно на примере, напрмиер, для UBRRL = ((OSC / ...   May 18 2010, 14:25
- - Метценгерштейн   это понятно, имел ввиду указатель на адрес. Тут не...   May 18 2010, 17:20
|- - demiurg_spb   Цитата(Метценгерштейн @ May 18 2010, 21:2...   May 18 2010, 17:36
- - Метценгерштейн   все, понял, что нельзя для меги так   May 19 2010, 07:05
|- - demiurg_spb   Уффф.... :-)   May 19 2010, 07:54
- - Метценгерштейн   думаю, надо делать на прерываниях, например вот та...   May 21 2010, 21:18
|- - demiurg_spb   Цитата(Метценгерштейн @ May 22 2010, 11:5...   May 22 2010, 09:14
- - sigmaN   по-моему это вечный спор: лучше ли делать таймер г...   May 23 2010, 12:54
|- - rezident   Цитата(sigmaN @ May 23 2010, 18:54) по-мо...   May 23 2010, 19:06
- - Метценгерштейн   Спасибо за развернутый ответ. т.к. здесь использов...   May 24 2010, 07:20
- - rezident   Цитата(Метценгерштейн @ May 24 2010, 13:2...   May 24 2010, 18:13


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

 


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


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