AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.03.2013, 17:40
|
|
Прохожий
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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.
|
|
|
|
04.03.2013, 18:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
Так проблемы нет. Что написали так и работает.
Происходит прерывание, внутри прерывания вы трогаете TCNT0, таймер считает заново и частота уменьшается.
Изменение объема тела обработчика вызывает опять же изменение TCNT0. Поставьте другие команды (не меняющие таймер) и ничего не изменится.
|
|
|
|
04.03.2013, 18:55
|
|
Прохожий
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
Уверяю Вас, что изменяется. Этот пример я привел как первое, что пришло в голову. У коллеги, который обнаружил это и попросил меня проверить это недоразуменье, операции с TCNT0 нет, а есть пара простых операций присваиванья значений (делал на atmega8, CVAVR).
|
|
|
|
04.03.2013, 19:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
К тому моменту, как процессор перейдет по вектору прерывания, тцнт успеет после обнуления насчитать еще десятки циклов, после чего ты его обнуляешь - т.к. проц НЕ МОЖЕТ мгновенно перейти на вектор прерывания, и в итоге получается что он кроме своего значения считает ещё и эти десятки = частота уменьшается. Все правильно...
|
|
|
|
04.03.2013, 19:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,744
Сказал спасибо: 2,885
Сказали Спасибо 3,094 раз(а) в 2,092 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
Сообщение от Vitiril
|
Этот пример я привел как первое, что пришло в голову.
|
Ваш пример так и должен работать. Можете привести реальный пример Вашего коллеги?
Как вариант - если разрешено более одного прерывания, то
Сообщение от Vitiril
|
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
|
не будет вызван, если МК уже обрабатывает другое прерывание. Надо либо согласиться с джиттером, либо использовать вложенные прерывания ( в менее важных обработчиках ставить в начале SEI).
|
|
|
|
04.03.2013, 19:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
Чудес не бывает - как у маленьких детей.
С очисткой счетчика таймера Вы теряете 10 - 11 тактов процессора - это как раз и занимает время вхождения в прерывание, сохранение регистра в стеке, обнуление регистра и запись регистра в счетчик.
|
|
|
|
04.03.2013, 19:51
|
|
Прохожий
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 нет.
|
|
|
|
04.03.2013, 20:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,744
Сказал спасибо: 2,885
Сказали Спасибо 3,094 раз(а) в 2,092 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
Если задержка в один период некритична, то можно поставить вывод в порт в самом начале обработчика и выводить значение, рассчитанное в предыдущем цикле.
Если критична: - Как-нибудь прикрутить режимы сравнения или ШИМ.
- Переписывать обработчик на ассемблере с выравниванием времён исполнения всех веток.
|
|
|
|
04.03.2013, 20:21
|
|
Прохожий
Регистрация: 05.01.2008
Сообщений: 7
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
Признаться сам по себе разбег времянки в данном контексте не так для меня важен. Получается, что использование кварцованного таймера как формирователя точных временных интервалов невозможно. Вот это для меня после нескольких лет использования Atmel`овских девайсов новость. Хотя вроде никогда не была нужна особая точность.
|
|
|
|
04.03.2013, 20:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: AVR, меняется время срабатывания прерывания
все возможно, только надо понимать что Вы пишите .
Поспорим что p_off у вас четное число?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:42.
|
|