Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

AVR, меняется время срабатывания прерывания

Непрочитано 04.03.2013, 17:40  
Vitiril
Прохожий
 
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Vitiril на пути к лучшему
По умолчанию AVR, меняется время срабатывания прерывания

Прошу сообщество посмотреть простейшую программу:
#include ‹mega8535.h›
unsigned char Cnt;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// TCNT0=0;
PORTD = Cnt;
}
...
void main(void)
{
...
PORTD=0x00;
DDRD=0x01;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
...
while (1)
{
// #asm("wdr");
if (PIND & 1) Cnt = 0; else Cnt = 1;
};
Осциллографом смотрим PORTD.0. Без операции TCNT0=0 в обработчике сигнал частотой 15617 Hz, с разрешенным TCNT0=0 сигнал на выходе частотой 15014 Hz. И вообще, изменение объема тела обработчика вызывает изменение частота сигнала на выходе. Всегда считал, что после вызова обработчика таймер продолжает тикать и сигнал на выходе должен иметь одну, установленную, частоту независимо от тела обработчика (в разумных пределах). В чем может быть проблема? Используется CVAVR.
Реклама:
Vitiril вне форума  
Непрочитано 04.03.2013, 18:24  
lsa
Почётный гражданин KAZUS.RUN
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,479
Сказал спасибо: 3,193
Сказали Спасибо 2,982 раз(а) в 682 сообщении(ях)
lsa на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

Так проблемы нет. Что написали так и работает.
Происходит прерывание, внутри прерывания вы трогаете TCNT0, таймер считает заново и частота уменьшается.
Изменение объема тела обработчика вызывает опять же изменение TCNT0. Поставьте другие команды (не меняющие таймер) и ничего не изменится.
lsa вне форума  
Непрочитано 04.03.2013, 18:55  
Vitiril
Прохожий
 
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Vitiril на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

Уверяю Вас, что изменяется. Этот пример я привел как первое, что пришло в голову. У коллеги, который обнаружил это и попросил меня проверить это недоразуменье, операции с TCNT0 нет, а есть пара простых операций присваиванья значений (делал на atmega8, CVAVR).
Vitiril вне форума  
Непрочитано 04.03.2013, 19:02  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

К тому моменту, как процессор перейдет по вектору прерывания, тцнт успеет после обнуления насчитать еще десятки циклов, после чего ты его обнуляешь - т.к. проц НЕ МОЖЕТ мгновенно перейти на вектор прерывания, и в итоге получается что он кроме своего значения считает ещё и эти десятки = частота уменьшается. Все правильно...
niXto вне форума  
Непрочитано 04.03.2013, 19:04  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,459
Сказал спасибо: 3,227
Сказали Спасибо 3,513 раз(а) в 2,394 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

Сообщение от Vitiril Посмотреть сообщение
Этот пример я привел как первое, что пришло в голову.
Ваш пример так и должен работать. Можете привести реальный пример Вашего коллеги?
Как вариант - если разрешено более одного прерывания, то
Сообщение от Vitiril Посмотреть сообщение
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
не будет вызван, если МК уже обрабатывает другое прерывание. Надо либо согласиться с джиттером, либо использовать вложенные прерывания (в менее важных обработчиках ставить в начале SEI).
ForcePoint вне форума  
Непрочитано 04.03.2013, 19:17  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

Чудес не бывает - как у маленьких детей.

С очисткой счетчика таймера Вы теряете 10 - 11 тактов процессора - это как раз и занимает время вхождения в прерывание, сохранение регистра в стеке, обнуление регистра и запись регистра в счетчик.
Boba_spb вне форума  
Непрочитано 04.03.2013, 19:51  
Vitiril
Прохожий
 
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Vitiril на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

Благодарю ответивших. С задержкой по входу в обработчик согласен, но...
Привожу программу коллеги:

...
#define p_out PORTD.0
unsigned int main_count;
unsigned char ind_count;


// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//main_count++;
main_count++;
if(main_count ›= p_off)
{
p_out = 0;
//p_out = p_out^1;
}
if(main_count ›= 800)
{
p_out = 1;
main_count = 1;
ind_count++;
if (ind_count == 3) ind_count = 0;
}
}

...
main
{
...
// Clock value: 16000,000 kHz
TCCR0=0x01;
TCNT0=0xAA;
...
}
В программе реализовано только прерывание таймера0, иных нет. В приведенном виде частота на PORTD.0 78,3210Hz. Раскомментариваем еще один main_count++; и получаем на выходе 78,1251Hz. Никаких переинициализаций TCNT0 нет.
Vitiril вне форума  
Непрочитано 04.03.2013, 20:09  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,459
Сказал спасибо: 3,227
Сказали Спасибо 3,513 раз(а) в 2,394 сообщении(ях)
ForcePoint на пути к лучшему
Стрелка Re: AVR, меняется время срабатывания прерывания

Если задержка в один период некритична, то можно поставить вывод в порт в самом начале обработчика и выводить значение, рассчитанное в предыдущем цикле.
Если критична:
  1. Как-нибудь прикрутить режимы сравнения или ШИМ.
  2. Переписывать обработчик на ассемблере с выравниванием времён исполнения всех веток.
ForcePoint вне форума  
Непрочитано 04.03.2013, 20:21  
Vitiril
Прохожий
 
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Vitiril на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

Признаться сам по себе разбег времянки в данном контексте не так для меня важен. Получается, что использование кварцованного таймера как формирователя точных временных интервалов невозможно. Вот это для меня после нескольких лет использования Atmel`овских девайсов новость. Хотя вроде никогда не была нужна особая точность.
Vitiril вне форума  
Непрочитано 04.03.2013, 20:30  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

все возможно, только надо понимать что Вы пишите .

Поспорим что p_off у вас четное число?
Boba_spb вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита БП по току. Время срабатывания DK Источники питания и свет 8 14.02.2011 01:05
AVR Studio 4 не симулирует прерывания? kvark85 Микроконтроллеры, АЦП, память и т.д 6 12.01.2011 12:07
Прерывания в AVR uk8amk Микроконтроллеры, АЦП, память и т.д 3 17.10.2008 14:25
Как реализовать точное время в сети из AVR? Don_Ambrosio Микроконтроллеры, АЦП, память и т.д 44 15.08.2008 14:02
Впервые за все время попался глючный AVR (Мега64) nml Коллекция глюков 10 19.05.2008 17:18


Часовой пояс GMT +4, время: 20:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.