Здравствуйте.
Захотел я посмотреть как на 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