Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.07.2010, 15:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
В циклах динамической индикации можно проверять состояние кнопок,причем, в одном разряде первую кнопку, в следующем-вторую и т.д.
При этом автоматически подавляется дребезг, так как цикл динамической индикации имеет период сотни миллисекунд.
|
|
|
|
06.07.2010, 16:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Цитата:
|
а что мешает сделать все в одном прерывании по таймеру и индикацию и опрос кнопок и антидребезг. еще и отсчет "точного" времени и еще кучу всего в одном прерывании. даже функцию delay?
|
Блин третий раз с начала.
Таймер 0 делат прерывания с частотой 125Гц т.е. каждые 0,008 секунд. Это прерывание делает динамическую индикацию.
Антидребезг 0,05 сек у каждой кнопки.
Если кнопки не нажимаются больше чем 5 секунд выходим из функции работы с кнопками. Каждая кнопка устанавливает свой параметр хрен знает сколько времени скажем пару минут. Если эту всю кашу запхать в обработчик прерываний то время выполнения этого обработчика растянется на пару минут. И это при генерации прерываний 125 раз в секунду. Таким образом мы начнем прерывать обработчик прерываний. Ну чтож не понятно. Это не заработает.
Читайте выше объяснял дважды.
Ладно КАК ПРАВИЛЬНО НАПИСАТЬ чтоб прерывание возникало при изменении состояния пина который опрашиваеся в main.
|
|
|
|
06.07.2010, 16:11
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Сообщение от 7Fantomas7
|
Не прерывание из прерывания. А есть главное прерывание и второстепеное прерывание. Второстепенное прерывание включается когда нет главного прерывания по событию и прерывается главным прерыванием когда таковое случается. А потом продолжает выполняться.
|
Блин, да все я понимаю.
Не надо прикручивать прерывание там, где оно нафиг не нужно. Как вы будете отслеживать нажатие кнопки? По фронту-спаду? Да их, со скорострельностью МК, будут подхвачены сотни - из-за дребезга.
Ну не стыкуются понятия "прерывание" и "кнопка, опрашиваемая в main"
2 baiderin Если цикл динамической индикации будет сотни ms, глазки вывалятся через 10.000.000 ms ![Весело](images/smilies/icon_laugh.gif) Надо герц 100, как минимум
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
06.07.2010, 16:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
nml,
Цитата:
|
Не надо прикручивать прерывание там, где оно нафиг не нужно. Как вы будете отслеживать нажатие кнопки? По фронту-спаду? Да их, со скорострельностью МК, будут подхвачены сотни - из-за дребезга.
Ну не стыкуются понятия "прерывание" и "кнопка, опрашиваемая в main"
|
Все въехал надо было так сразу.
Тогда еще пару вопросов
как правильно оформить
void main(void)
{
while (1)
{
if (mode==0){//ВЫБОР РЕЖИМА
delay_ms (50);//выдержка времени 0,05 сек для подавления дребезга
Чтото сюда написать чтоб возникло прерывание
};
}
mode- это та самая злая кнопка.
и мне откровенно начхать что в конечном счете delay будет 55мс. значит дребезга и тем более не замечу.
Последний раз редактировалось 7Fantomas7; 06.07.2010 в 16:36.
|
|
|
|
06.07.2010, 16:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Мал мал перепутал герцы с миллисекундами.
Опрос кнопок в динамической индикации позволяет избавиться от антидребезговых задержек- что очень хорошо.
Я писал в прошлый раз Вам про флаги, устанавливаемые в прерывании, а опрашиваемые в основном цикле программы. Таким образом можно и с дребезгом побороться и сделать процесс любой длительности.
|
|
|
|
06.07.2010, 16:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Можно прицепить кнопки на вход внешнего прерывания, если уж очень хочется.
|
|
|
|
06.07.2010, 16:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Вот как-то так
while(1)
{
if(!mode) progr_mode();
else
if(!more) progr_more();
else
if (!less) progr_less();
};
|
|
|
Сказали "Спасибо" baiderin
|
|
|
06.07.2010, 16:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Не знаю поможет или нет ![Улыбка](images/smilies/icon_smile.gif)
Делаю так: Если есть свободный таймер то выделяю под подавление дребезга,если нет то можно задержку в другом рабочем уже таймером или взять за основу рабочую программу(которая как известно работает в зациклености,зная выполнение одного прохода).Выделяю структуру с состояниями(как минимум два нажата и отжата).При нажатии уменьшаем состояние начальное до нуля за каждый вызов или проход,пока не будет ноль и уже в где надо смотрем состояние.
Вот на коде так примерно(конечно в зависимости уровней на входах и кнопках,у меня подтянуто к + через резистор,акнопка замыкает на -) :
main.h
Код:
|
struct knopka_setup {
uint open; //контакт разомкнут
uint close; //контакт замкнут
} struct_setup,*ykaz_setup;
struct knopka_razrad {
uint open; //контакт разомкнут
uint close; //контакт замкнут
} struct_razrad,*ykaz_razrad; |
прерывания
Код:
|
//Это обработчик кнопок вызывается через 65 мs
#int_timer0
void timer0()
{
//на кнопку установка,задержка 65*3=195 мс
if (input(setup))
{
if (ykaz_setup-›open) --ykaz_setup-›open;
ykaz_setup-›close=3;
}
else
{
if (ykaz_setup-›close) --ykaz_setup-›close;
ykaz_setup-›open=3;
}
//на кнопку разряд,задержка 65*3=195 мс
if (input(razrad))
{
if (ykaz_razrad-›open) --ykaz_razrad-›open;
ykaz_razrad-›close=3;
}
else
{
if (ykaz_razrad-›close) --ykaz_razrad-›close;
ykaz_razrad-›open=3;
}
} |
main.c
Код:
|
ykaz_setup=&struct_setup;
ykaz_razrad=&struct_razrad;
//Проверка кнопки setup на нажатие,для обработки уставки
if(!ykaz_setup-›close)
;//setup_fun(); делаем что надо |
__________________
Глаза боятся,а руки делают.
|
|
|
|
06.07.2010, 17:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
baiderin,
Я прекрасно помню что Вы писали и буду это пытаться использовать если не получится так как хочу. Но я всетаки хотел бы сделать так как написано выше. Мне необходимо знать это возможно или нет. Если возможно то как.
baiderin,
Цитата:
|
Можно прицепить кнопки на вход внешнего прерывания, если уж очень хочется.
|
А можно взять схему готового тахометра с хексом и не морочить голову, не нужно и вобше Си изучать, а можно купить готовый тахометр китайцы всеравно дешевле сделают. И ненужно и электроникой заниматься.
|
|
|
|
06.07.2010, 17:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
И сидеть, пить пиво?
Не уж.Я луше посижу, поковыряюсь в программе, но сделаю сам то, что смогу.
Чего и Вам желаю.
Просто прерывания в прерываниях- это плохо прогнозируемая вещь.
Опрос кнопок в динамической индикации, а обработка в основном цикле, это прозрачно и хорошо делится на отдельные понятные куски.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Прерывания ATMega8
|
7Fantomas7 |
Микроконтроллеры, АЦП, память и т.д |
21 |
03.07.2010 10:41 |
ATMega8 VS USB
|
SkyProc |
Микроконтроллеры, АЦП, память и т.д |
28 |
28.04.2010 17:01 |
Вложенные прерывания HITECH PIC16
|
picavr |
Микроконтроллеры, АЦП, память и т.д |
17 |
07.03.2010 17:39 |
Вход в прерывания для PIC микроконтроллеров
|
dimmich |
Микроконтроллеры, АЦП, память и т.д |
4 |
06.12.2009 17:17 |
Котроллер дисплея на Atmega8
|
kosant |
Микроконтроллеры, АЦП, память и т.д |
24 |
30.11.2009 20:57 |
Часовой пояс GMT +4, время: 18:51.
|
|