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

Alex_fish

Members
  • Постов

    11
  • Зарегистрирован

  • Посещение

Электроника

  • Стаж в электронике
    Менее года

Достижения Alex_fish

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Спасибо, за ценные советы, переделал по вашему - улучшил скорость в 5 раз! На асемблере наверно можно и дальше разогнаться но пожалуй НЕТ В программе - 50кГц на осцыле 49,7кГц (при 80кГц ан осцыле 79,3кГц) Изменил таймер на работу в режиме СТС и переписал прерывание: interrupt [TIM1_COMPA] void timer1_compa_isr(void) { PORTB ^= 0x01;//переключение пина } Не слышал про изменение пина с помощью записи в PINx регистр. Это же регистр чтения ?
  2. Здравствуйте. Захотел я посмотреть как на 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
×
×
  • Создать...