Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Индикатор импульсных помех


Автор: jimmi 31.3.2005, 08:55
smile

Автор: PILOT 31.3.2005, 18:42
Я рекомендую сделать это на ПЛИС.
У меня есть счетчик импульсов (отлов глитчей) но схему найти не смог smile
Смысл там прост:
на входе резистор через диод на землю, сигнал берем между резистором и диодом, на вход плис.
Далее, в ПЛИС реализован счетчик (8 триггеров), и преобразователь числа в Семисегментный код.
Итог, прикасаюсь к отлаживаемой схеме и жду набежит чтонить или нет.

СУВ.

Автор: jimmi 31.3.2005, 20:23
smile

Автор: PILOT 31.3.2005, 20:26
Никак...
Просто программно в теле прерывания разрешать прерывания (вложенные прерывания получаются).

СУВ.

Автор: jimmi 11.7.2005, 14:15
smile

Автор: PILOT 11.7.2005, 18:10
Если ты подцепил кварц, то считай на здоровье себе время там же (таймер сделай на 1 мс, а там увеличивай 5-ти байтную переменную, на всю жизнь хватит smile ), это я к тому что нафиг еще один контроллер?

СУВ.


Автор: jimmi 12.7.2005, 09:56
smile

Автор: PILOT 12.7.2005, 11:35
inc не трогает перенос! Будь осторожен!
Во-вторых не стоит прыгать с таблицы прерываний куда-то! Время дорого.
И еще в этом обработчике не стоит проверять переполняемость, лучше сделать так чтобы гарантированно int0 не смог вызваться более 255 раз без выполнения в основном цикле сложения накопленного в прерывании числа к общему числу импульсов.

СУВ.

Автор: Guest 12.7.2005, 13:40
Спасибо за подсказку с inc.
Да, время дорого.
На вход счетчика при несущей радиоимпульса 15 мксек за 1мксек с выхода компаратора поступит 15 импульсов. Время паузы 1/30 мксек.
На все про все в теле main_loop и обработке прерывания у меня иммеется 19 тактов при 20МГц тактовой частоты. Это с учетом сброса флага внешнего прерывания инт0. Вопрос первый, где найти таблицу времени выполнения комманд в тактах? Ну я так понял время входа в прерывание 4 такта и время выполнения reti также 4 такта.
Однопроцессорная система никак не получается, т.к. в теле main_loop
придется еще и переменной таймера заниматься. Ну в Атмега 16 есть возможность подключения 2 кварцев, но там только 16 МГц тактовая.
Итак у меня есть 12 тактов на 32 разрядный счетчик из четырех регистров. Хотя нужно только с младшим регистром успеть. Второй разряд переполняется с в 256 раз меньшей частотой. Это заказчик не заметит. smile
Думаю как это сделать.

Автор: jimmi 12.7.2005, 15:01
smile

Автор: jimmi 12.7.2005, 15:43
smile

Автор: PILOT 12.7.2005, 16:12
Еще раз:

1) Начинай обработку сразу в таблице прерываний, никуда не прыгай. Ты же не используешь других прерываний.
2) время выполнения каждой команды (в тактах) есть например в даташите на мегу128 (гарантированно), в самом конце документа (почти) есть таблица инструкций, последний столбик тебя заинтересует.
3) если за 1 мкс приходит 15 импульсов, то гарантированно ничего не получится хорошего и второй контроллер тебя тоже не спасет. Можно сделать так.
Снаружи поставить быстрый счетчик двоичный (который поделит частоту входных сигналов в 256 раз например, или на меньше), его выход на вход int0 тогда ты гарантированно все подсчитаешь.

По поводу рейтинга тебе нужно набрать 100 сообщений по моему smile т.е. пока никак smile Забей.

СУВ.

Автор: jimmi 12.7.2005, 16:30
smile

Автор: jimmi 12.7.2005, 19:37
smile

Автор: PILOT 12.7.2005, 19:46
Если тебе принципиален каждый импульс, то придется использовать счетчик с последовательным считыванием (я правда не пользовал их).
Если же точности в +-8 импульсов достаточно, то можно сделать так:

Поставь быстрый счетчик, который считает до 16-ти и меняет на выходе состояние (отлавливаем фронт), как только фронт изменился: в контроллере к числу +16 импульсов. Причем погрешность у тебя не набегает, а все время работы остается неизменной, равной по сумме 16-ти.

СУВ.

Автор: jimmi 13.7.2005, 10:48
smile

Автор: PILOT 13.7.2005, 18:17
Все так, только зачем ждать 4мкс? Неопределенность возникла бы если бы ты не считывал Q0-Q3 (т.е. использовал только одну ногу от счетчика, ты говорил что ног у тебя мало), а так все правильно!

Выводить на ЖКИ никто не мешает постоянно в общем цикле, так же как и опрашивать клаву.

СУВ.

Автор: jimmi 25.7.2005, 19:42
smile

Автор: ManiaK 26.7.2005, 14:02
Цитата(jimmi @ 25.7.2005, 20:42)
Потанцевать с бубном?

Это и предлагать не надо - этим надо пользоваться smile

Автор: jimmi 26.7.2005, 15:47
smile

Автор: PILOT 26.7.2005, 17:20
Мне то за что спасибо smile Ты ж сам все сделал! smile

СУВ.
ЗЫ. Репу ты уже можешь другим менять сам (по-моему).

Автор: jimmi 26.7.2005, 17:37
smile

Автор: cardinal 26.7.2005, 17:50
jimmi, как ты делал пункты 9 и 10? Если можно то с кусочком схемы, плиз. Можно screenshot smile
Просто интересно как это реализовано...

Автор: jimmi 26.7.2005, 18:04
smile

Автор: jimmi 1.8.2005, 09:25
smile

Автор: cardinal 1.8.2005, 13:02
У меня был таймер (процедура обработки прерывания) вот так сделан:
Код

void timer1ms_isr (void) interrupt 3 using 1       // Timer 1
{
   TR1 = 0;      // stop Timer 1
   TL1 = STL1;             
   TH1 = STH1;
   TR1 = 1;      // run Timer 1
   if(iCtr1ms_g)                             
      iCtr1ms_g--;
}

То есть каждый раз попадая сюда, я выключал таймер, засовывал в него новые значения отсчета, потом включал таймер. Если при это глобальная переменная iCtr1ms_g не равна нулю (= кто-то сказал, что надо ждать столько то ms), то из нее вычитаем 1.
Больше ничего как видишь не делал, не CLI, не SEI...

Автор: PILOT 1.8.2005, 17:05
Цитата(jimmi @ 1.8.2005, 06:25)
to PILOT
помнишь этот парень делал частотомер и у него неправильно шло время в процессоре?
http://forum.vingrad.ru/index.php?showtopic=38738&st=15
В этой статье написано про два типа прерываний у АТМЕЛ
http://www.compitech.ru/html.cgi/arhiv/03_04/stat_112.htm
Цитата
При входе в прерывние бит общего разрешения прерываний сбрасывается и все прерывания запрещаются. В программе-обработчике прерывания можно снова установить этот бит, и, таким образом, вновь разрешить прерывания. В этом случае вновь поступившее прерывание останавливает работу обработчика текущего прерывания. Бит общего разрешения прерываний устанавливается при выходе из прерывания. Существует два типа прерываний. Первый тип — триггерный, при этом устанавливается флажок прерывания. Второй тип прерываний не имеет соответствующего флажка, и такое прерывание может быть потеряно, если в это время бит общего разрешения прерываний был сброшен. Для запрещения и разрешения прерываний в системе команд есть соответствующие инструкции — CLI и STI.


типа РЕАЛ ТАЙМ и когда флаг теряется.
Собака роется имеено тут, нужно правильно расставлять CLI и SEI.
Вычислил на макете, что за 5 мин таймера1 и частоте внешнего прерывания 62,5 кГц эти 5 мин отсчитываются точно секунда в секунду и ни один импульс не теряется smile

Если случается событие, то устанавливается флаг прерывания и ставится в "очередь" в порядке приоритетов (адресов векторов), обрабатывается как только воявляется возможность (т.е. разрешаются глобально прерывания).

СУВ.

Автор: jimmi 1.8.2005, 17:28
smile

Автор: PILOT 1.8.2005, 17:35
CLI по моему только в UART нужно использовать.

СУВ.

Автор: jimmi 1.8.2005, 17:42
smile

Автор: PILOT 1.8.2005, 17:50
А где ж тут прерывания?

СУВ.

Автор: jimmi 1.8.2005, 17:55
smile

Автор: cardinal 1.8.2005, 19:30
Цитата(jimmi @ 1.8.2005, 15:55)
...на одном АВР процессоре.

А это что такое?

Автор: PILOT 1.8.2005, 20:24
А кто будет SREG сохранять? Дядя Вася? smile

СУВ.

Автор: jimmi 1.8.2005, 20:34
smile

Автор: PILOT 1.8.2005, 21:10
Я так понял, что август пора отпусков и фиг кого соберешь smile

СУВ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)