Перейти к содержанию

Скорость таймера с прерыванием на Arduino Uno


Alex_fish

Рекомендуемые сообщения

Здравствуйте.

Захотел я посмотреть как на Arduino Uno (mega328P С кварцем на 16МГц) можно сделать простой генератор меандра, библиотечными digitalWrite() и delay() она начала привирать частоту гдето от 1-2кГц, решил написать на обычном Си.

Взял таймер TIM1 с тактировкой от 16МГц с прерыванием по совпадению, и в прерывании обнулял счетчик и просто переключал ножку.

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    static unsigned char flag=0;//флаг лог. уровня пина
    TCNT1H=0x00;//обнуляем счетчик таймера
    TCNT1L=0x00; 
    
    // Place your code here
    if (flag==0){
        PORTB = 0x01;//лог 1
        flag=1;    
    } else {
        PORTB = 0x00;//лог 0
        flag=0;
    }
}

Ожидал что работа с таймером и прерываниями отъест тактов 30-50, на отработку прерывания, заход и выход из него, один if и т.п. И будет у меня максимум килогерц 300 а дальше пойдет врать частоту.  Но был удивлен тем что такая система начала привирать частоту уже на 10кГц, где давала 9.7кГц, а на 20кГц уже показывала 19кГц. (проверял точность осцилом).

Вот и вопрос неужели таймер с прерыванием настолько медленные ? или я что-то делаю не так ?

Полный код на Си если нужно прикреплен.

 

boroda.c

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Как вы считаете - уму не растяжимо. Из ваших предположений выходит, что 50 тактов вы теряете на прерывании, а хотите получить 300 килогерц. Делим 16 мегагерц на 300 килогерц, чтобы узнать, сколько тактов остается на работу... и получаем 53 с хвостиком. И это без учета того, что вы один вход в прерывание включаете, а второй вход - выключаете, то есть у вас потери будут УДВОЕНЫ.

На самом деле все не так плохо, но не так, как у вас. Меандр генерируется аппаратным режимом таймера, и даже при помощи режима СТС и обработчика прерываний при помощи PORTB ^=1; код получается более экономный, а если вспомнить, что можно переключать пин записью в регистр PINB, то и вообще...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Спасибо, за ценные советы, переделал по вашему - улучшил скорость в 5 раз!  На асемблере наверно можно и дальше разогнаться но пожалуй НЕТ :)

В программе - 50кГц  на осцыле 49,7кГц (при 80кГц ан осцыле 79,3кГц)

Изменил таймер на работу в режиме СТС и переписал прерывание:

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    PORTB ^= 0x01;//переключение пина

}

Не слышал про изменение пина с помощью записи в PINx регистр. Это же регистр чтения ?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

19 minutes ago, Alex_fish said:

На асемблере наверно можно и дальше разогнаться но пожалуй НЕТ

В режиме СТС счетчик сбрасывается аппаратно, поэтому ничего не улучшится. Похоже при расчете частоты забыли единицу.  Формула для расчета

5ab50f3d6eef4_.jpg.f287714b8f16ddb3a5f507dea77e0c29.jpg

В коде у вас OCR1A = 0х320, а надо 0х321

Ссылка на комментарий
Поделиться на другие сайты

43 минуты назад, Alex_fish сказал:

В программе - 50кГц  на осцыле 49,7кГц (при 80кГц ан осцыле 79,3кГц)

Как-то слабенько. Mega16 должна свободно пару мегагерц выдавать. и это с кварцем на 8МГц.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...