Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к 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.RU
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
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.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: AVR, меняется время срабатывания прерывания

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

Сообщение от Vitiril Посмотреть сообщение
Этот пример я привел как первое, что пришло в голову.
Ваш пример так и должен работать. Можете привести реальный пример Вашего коллеги?
Как вариант - если разрешено более одного прерывания, то
Сообщение от Vitiril Посмотреть сообщение
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
не будет вызван, если МК уже обрабатывает другое прерывание. Надо либо согласиться с джиттером, либо использовать вложенные прерывания (в менее важных обработчиках ставить в начале SEI).
ForcePoint вне форума  
Непрочитано 04.03.2013, 19:17  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,744
Сказал спасибо: 2,885
Сказали Спасибо 3,094 раз(а) в 2,092 сообщении(ях)
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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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, время: 04:42.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot