| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Индикатор импульсных помех |
| Автор: jimmi 31.3.2005, 08:55 |
| |
| Автор: PILOT 31.3.2005, 18:42 |
| Я рекомендую сделать это на ПЛИС. У меня есть счетчик импульсов (отлов глитчей) но схему найти не смог Смысл там прост: на входе резистор через диод на землю, сигнал берем между резистором и диодом, на вход плис. Далее, в ПЛИС реализован счетчик (8 триггеров), и преобразователь числа в Семисегментный код. Итог, прикасаюсь к отлаживаемой схеме и жду набежит чтонить или нет. СУВ. |
| Автор: jimmi 31.3.2005, 20:23 |
| |
| Автор: PILOT 31.3.2005, 20:26 |
| Никак... Просто программно в теле прерывания разрешать прерывания (вложенные прерывания получаются). СУВ. |
| Автор: jimmi 11.7.2005, 14:15 |
| |
| Автор: PILOT 11.7.2005, 18:10 |
| Если ты подцепил кварц, то считай на здоровье себе время там же (таймер сделай на 1 мс, а там увеличивай 5-ти байтную переменную, на всю жизнь хватит СУВ. |
| Автор: jimmi 12.7.2005, 09:56 |
| |
| Автор: 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 раз меньшей частотой. Это заказчик не заметит. Думаю как это сделать. |
| Автор: jimmi 12.7.2005, 15:01 |
| |
| Автор: jimmi 12.7.2005, 15:43 |
| |
| Автор: PILOT 12.7.2005, 16:12 |
| Еще раз: 1) Начинай обработку сразу в таблице прерываний, никуда не прыгай. Ты же не используешь других прерываний. 2) время выполнения каждой команды (в тактах) есть например в даташите на мегу128 (гарантированно), в самом конце документа (почти) есть таблица инструкций, последний столбик тебя заинтересует. 3) если за 1 мкс приходит 15 импульсов, то гарантированно ничего не получится хорошего и второй контроллер тебя тоже не спасет. Можно сделать так. Снаружи поставить быстрый счетчик двоичный (который поделит частоту входных сигналов в 256 раз например, или на меньше), его выход на вход int0 тогда ты гарантированно все подсчитаешь. По поводу рейтинга тебе нужно набрать 100 сообщений по моему СУВ. |
| Автор: jimmi 12.7.2005, 16:30 |
| |
| Автор: jimmi 12.7.2005, 19:37 |
| |
| Автор: PILOT 12.7.2005, 19:46 |
| Если тебе принципиален каждый импульс, то придется использовать счетчик с последовательным считыванием (я правда не пользовал их). Если же точности в +-8 импульсов достаточно, то можно сделать так: Поставь быстрый счетчик, который считает до 16-ти и меняет на выходе состояние (отлавливаем фронт), как только фронт изменился: в контроллере к числу +16 импульсов. Причем погрешность у тебя не набегает, а все время работы остается неизменной, равной по сумме 16-ти. СУВ. |
| Автор: jimmi 13.7.2005, 10:48 |
| |
| Автор: PILOT 13.7.2005, 18:17 |
| Все так, только зачем ждать 4мкс? Неопределенность возникла бы если бы ты не считывал Q0-Q3 (т.е. использовал только одну ногу от счетчика, ты говорил что ног у тебя мало), а так все правильно! Выводить на ЖКИ никто не мешает постоянно в общем цикле, так же как и опрашивать клаву. СУВ. |
| Автор: jimmi 25.7.2005, 19:42 |
| |
| Автор: ManiaK 26.7.2005, 14:02 | ||
Это и предлагать не надо - этим надо пользоваться |
| Автор: jimmi 26.7.2005, 15:47 |
| |
| Автор: PILOT 26.7.2005, 17:20 |
| Мне то за что спасибо СУВ. ЗЫ. Репу ты уже можешь другим менять сам (по-моему). |
| Автор: jimmi 26.7.2005, 17:37 |
| |
| Автор: cardinal 26.7.2005, 17:50 |
| jimmi, как ты делал пункты 9 и 10? Если можно то с кусочком схемы, плиз. Можно screenshot Просто интересно как это реализовано... |
| Автор: jimmi 26.7.2005, 18:04 |
| |
| Автор: jimmi 1.8.2005, 09:25 |
| |
| Автор: cardinal 1.8.2005, 13:02 | ||
У меня был таймер (процедура обработки прерывания) вот так сделан:
То есть каждый раз попадая сюда, я выключал таймер, засовывал в него новые значения отсчета, потом включал таймер. Если при это глобальная переменная iCtr1ms_g не равна нулю (= кто-то сказал, что надо ждать столько то ms), то из нее вычитаем 1. Больше ничего как видишь не делал, не CLI, не SEI... |
| Автор: PILOT 1.8.2005, 17:05 | ||||
Если случается событие, то устанавливается флаг прерывания и ставится в "очередь" в порядке приоритетов (адресов векторов), обрабатывается как только воявляется возможность (т.е. разрешаются глобально прерывания). СУВ. |
| Автор: jimmi 1.8.2005, 17:28 |
| |
| Автор: PILOT 1.8.2005, 17:35 |
| CLI по моему только в UART нужно использовать. СУВ. |
| Автор: jimmi 1.8.2005, 17:42 |
| |
| Автор: PILOT 1.8.2005, 17:50 |
| А где ж тут прерывания? СУВ. |
| Автор: jimmi 1.8.2005, 17:55 |
| |
| Автор: cardinal 1.8.2005, 19:30 | ||
А это что такое? |
| Автор: PILOT 1.8.2005, 20:24 |
| А кто будет SREG сохранять? Дядя Вася? СУВ. |
| Автор: jimmi 1.8.2005, 20:34 |
| |
| Автор: PILOT 1.8.2005, 21:10 |
| Я так понял, что август пора отпусков и фиг кого соберешь СУВ. |