Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Таймеры/счётчики в AVR

Сообщение zero648 »

Таблицу режимов таймера 1 в даташите посмотрите, тогда поймете, почему в вашем случае флаг переполнения не включается, а в моём включается. По совпадению OCR1A кстати тоже можно ловить.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

Давно хотел проверить, как теперь протеус ардуину симулирует, а тут как раз этот случай. Загнал все в симуляцию и действительно, в FastPWM top=OCR0A вызываются и прерывание по совпадению "А" и прерывание по переполнению. Причем, сначала идет прерывание по совпадению, а потом уже по переполнению.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

a5021 писал(а):Давно хотел проверить, как теперь протеус ардуину симулирует, а тут как раз этот случай. Загнал все в симуляцию и действительно, в FastPWM top=OCR0A вызываются и прерывание по совпадению "А" и прерывание по переполнению. Причем, сначала идет прерывание по совпадению, а потом уже по переполнению.

Если можно, выложите листинг программы на Си, которую вы проверяете. Я её пропущу через симулятор VMLab, где будет видно какие и когда прерывания вызываются, типа вот так:

Изображение
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

Код ардуиновский, в чистый си переделайте сами, благо не сложно.
Спойлер

Код: Выделить всё

/* Main.ino file generated by New Project wizard
 *
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */

volatile unsigned char bFlag;
 
ISR(TIMER2_COMPA_vect){
  bFlag = 1;
}

ISR(TIMER2_COMPB_vect){
  bFlag = 0;
}
 
ISR(TIMER2_OVF_vect){
  bFlag = 2;
}
 
void setup()  {
// put your setup code here, to run once:

   // Timer/Counter 2 initialization
   // Clock source: System Clock
   // Clock value: 62,500 kHz
   // Mode: Fast PWM top=OCR2A
   // OC2A output: Disconnected
   // OC2B output: Disconnected
   // Timer Period: 4 ms
   ASSR=(0<<EXCLK) | (0<<AS2);
   TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (1<<WGM20);
   TCCR2B=(1<<WGM22) | (1<<CS22) | (1<<CS21) | (0<<CS20);
   TCNT2=0x00;
   OCR2A=0xF9;
   OCR2B=0xA0;
   
   // Timer/Counter 2 Interrupt(s) initialization
   TIMSK2=(1<<OCIE2B) | (1<<OCIE2A) | (1<<TOIE2);
   
}

void loop() { // put your main code here, to run repeatedly:
}


gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

a5021 писал(а):Код ардуиновский, в чистый си переделайте сами, благо не сложно.
Спойлер

Код: Выделить всё

/* Main.ino file generated by New Project wizard
 *
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */

volatile unsigned char bFlag;
 
ISR(TIMER2_COMPA_vect){
  bFlag = 1;
}

ISR(TIMER2_COMPB_vect){
  bFlag = 0;
}
 
ISR(TIMER2_OVF_vect){
  bFlag = 2;
}
 
void setup()  {
// put your setup code here, to run once:

   // Timer/Counter 2 initialization
   // Clock source: System Clock
   // Clock value: 62,500 kHz
   // Mode: Fast PWM top=OCR2A
   // OC2A output: Disconnected
   // OC2B output: Disconnected
   // Timer Period: 4 ms
   ASSR=(0<<EXCLK) | (0<<AS2);
   TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (1<<WGM20);
   TCCR2B=(1<<WGM22) | (1<<CS22) | (1<<CS21) | (0<<CS20);
   TCNT2=0x00;
   OCR2A=0xF9;
   OCR2B=0xA0;
   
   // Timer/Counter 2 Interrupt(s) initialization
   TIMSK2=(1<<OCIE2B) | (1<<OCIE2A) | (1<<TOIE2);
   
}

void loop() { // put your main code here, to run repeatedly:
}



А какой язык у Ардуиновского кода? Вы задали три вектора прерывания таймера2. Если вы разрешили общие прерывания, то прерывания будут происходить согласно их приоритетам. В чём проблема?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

Я, вроде, ни на какие проблемы не жаловался. COMPA в списке векторов выше, значит у него и приоритет выше, чем у OVF. Сомнения у меня было возникли по поводу вызывается ли OVF вообще, но теперь я выяснил, что в отличие от режима CTC, FastPWM вызывает и этот вектор, фактически по одному и тому же событию, что, на мой взгляд, немного не логично.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

a5021 писал(а):Сомнения у меня было возникли по поводу вызывается ли OVF вообще,

Вообще он вызывается по-всякому, - Вы же его прописали в программе. Инициализация прошла ,вектор установлен, - только жди общих прерываний, а там OVF возмёт своё.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

В CTC-режиме не вызывается, хоть прописывай, хоть жди.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

a5021 писал(а): FastPWM вызывает и этот вектор

Акромя программиста вектор прерывания никто не вызывает и не устанавливает. Априори он устанавливается по программе в самом начеле адресного поля, но программист может изменить адрес вектора по своим убеждениям, как он хочет.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

a5021 писал(а):В CTC-режиме не вызывается, хоть прописывай, хоть жди.

Что такое СТС-режим?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

In Clear Timer on Compare or CTC mode (WGM13:0 = 4 or 12), the OCR1A or ICR1 Register
are used to manipulate the counter resolution. In CTC mode the counter is cleared to zero when
the counter value (TCNT1) matches either the OCR1A (WGM13:0 = 4) or the ICR1 (WGM13:0 =
12). The OCR1A or ICR1 define the top value for the counter, hence also its resolution. This
mode allows greater control of the Compare Match output frequency. It also simplifies the oper-
ation of counting external events.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

a5021 писал(а):In Clear Timer on Compare or CTC mode (WGM13:0 = 4 or 12), the OCR1A or ICR1 Register
are used to manipulate the counter resolution. In CTC mode the counter is cleared to zero when
the counter value (TCNT1) matches either the OCR1A (WGM13:0 = 4) or the ICR1 (WGM13:0 =
12). The OCR1A or ICR1 define the top value for the counter, hence also its resolution. This
mode allows greater control of the Compare Match output frequency. It also simplifies the oper-
ation of counting external events.

I" m none the better for it. Пожалуйста, на русском в одном предложении.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

Это цитата из манула. Прочтите со словарем.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

a5021 писал(а):Это цитата из манула. Прочтите со словарем.

А Вы здесь зачем?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение ARV »

gavrasio писал(а):Акромя программиста вектор прерывания никто не вызывает и не устанавливает. Априори он устанавливается по программе в самом начеле адресного поля, но программист может изменить адрес вектора по своим убеждениям, как он хочет.

круто.

а вот если я установлю флаг разрешения прерываний по переполнению таймера, и не определю обработчик этого прерывания - что будет? я (программист) ничего вызывать и устанавливать не буду - что произойдет?

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

Мой уютный бложик... заходите!
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

ARV писал(а):
gavrasio писал(а):а вот если я установлю флаг разрешения прерываний по переполнению таймера, и не определю обработчик этого прерывания - что будет? я (программист) ничего вызывать и устанавливать не буду - что произойдет?

и еще: очень хотелось бы увидеть код, который разместит адрес вектора прерывания по переполнению нулевого таймера на ячейку с адресом 0xF000 - в качестве примера, конечно.

Наконец то тяжёлая артиллерия прибыла. Второй вопрос я изучу и отпишу. Потом.
По первому вопросу. Где Вы устанавливаете любые флаги, можно, при инициализации( ясно чего) или же в ходе исполнения программы( бери обработщик прерываний).
Если Вы не определите "обработщик этого прерывания" - ничего не будет. Что Вы понимаете за термином "определить обработщик"?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

Теперь, похоже, мне нужен словарь, чтобы перевести это.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Таймеры/счётчики в AVR

Сообщение B@R5uk »

gavrasio писал(а):Акромя программиста вектор прерывания никто не вызывает и не устанавливает.
Забавное утверждение. Забавное в своей абсурдности.

Прерывание -- это событие и связанные с ним процессы, которые заключаются в следующем. Некоторое внешнее или внутреннее устройство (периферия) посылает ядру микроконтроллера сигнал о том, что должно произойти прерывание (извините за "сепульки"). Если флаг обработки прерываний установлен, то микроконтроллер останавливает обработку текущего кода, сохраняет текущий адрес, на котором он остановился (вернее, адрес следующей команды, которую он будет выполнять) и начинает выполнение команды с адреса где-то в начале ПЗУ. Точное значение адреса зависит от номера прерывания. Обычно по этому адресу располагается либо команда выхода RETI, либо команда перехода RJMP/JMP. Эта последовательность действий происходит вне зависимости от того, что запрограммировал программист, поскольку она (последовательность действий) заложена в МК производителем. Что будет если программист забыл расположить в нужном месте команду перехода к обработчику прерывания? Контроллеру наплевать: он будет интерпретировать всё, чтобы там ни было как команду процессора. Реально, если программист программирует на си, то обычно компилятор вставляет за программиста затычки на все не объявленные программистом обработчики прерываний. Затычка может быть как бесконечным циклом (что позволит отловить вызываемые, но не обрабатываемые прерывания), так и просто командой возврата. Программист на ассемблере обычно копипастит начало своей программы из какого-нибудь шаблона, так как программы для одного и того же МК обычно начинаются почти одинаково: таблица прерываний и инициализация периферии. Так что программист так или иначе, действительно устанавливает вектор прерываний, но никак его не вызывает. Переход к вектору осуществляет ядро МК в соответствующих условиях.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

ARV писал(а):
gavrasio писал(а):
и еще: очень хотелось бы увидеть код, который разместит адрес вектора прерывания по переполнению нулевого таймера на ячейку с адресом 0xF000 - в качестве примера, конечно.

Практически во всех микроконтроллерах семейства Mega, заисключением модели ATmega48x, положение таблицы векторов прерываний может быть изменено. Таблица может располагаться не только в начале памяти программ,но также и в начале области загрузчика, причем перемещение таблицы можетбыть осуществлено непосредственно в ходе выполнения программы. Это цитата из книги Евстивеева А.В. Но с Вами согласен.
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

B@R5uk писал(а):
gavrasio писал(а):Акромя программиста вектор прерывания никто не вызывает и не устанавливает.
Забавное утверждение. Забавное в своей абсурдности.

Так что программист так или иначе, действительно устанавливает вектор прерываний, но никак его не вызывает. Переход к вектору осуществляет ядро МК в соответствующих условиях.

Естественно! Я устанавливаю, а вызывает какая-то движуха в программе.
З.Ы. Вам книги надо писать, - получается нормально. Хорошая книга никому не помешает.
Ответить

Вернуться в «AVR»