Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 46 99

SAK: ....Т. е. после выполнения каждых 256 команд происходит приращение значения счетчика таймера. .... Неужели заданный аппаратным таймером период прерываний =20мс. зависит от количества выполняемых команд?
Что касается "..не успели.." , если я правильно понял, речь идет о случае, когда не успели выйти из прерывания к моменту следующего такого прерывания? Такие случаи недопустимы. За этим программист следит....
Т.е. максимальное время (ход по самой длинной ветке) выполнения команд в прерывании, всяко должно быть меньше заданного периода прерываний. Это очевидно!
ИМХО на asm эти вещи виднее...
Я ответил на вопрос?

 

Vlad_Petr: Что касается "..не успели.." , если я правильно понял

Вы неправильно поняли. SAK абсолютно прав.

Представьте таймер без предделителя. И загрузку значения счётчика в конце процедуры прерывания. Причём процедура прерывания выполняется, скажем, от 20 до 40 тактов, в зависимости от условий. Так вот, в этом случае, следующее прерывание возникнет не через счётчик тактов после текущего, как бы мы хотели, а через счётчик+20 или счётчик+40 тактов!
То есть, мало того, что мы имеем неправильный период таймера, так ещё и джиттер.
По-хорошему, надо учитывать даже время входа в прерывание, и грузить в счётчик соответственно меньшее значение...

 

Zandy: Годится! Это можно быстренько сляпать. Какой критерий выберем? Что будем считать, длительность полупериода (периода) или количество периодов (полупериодов) за фиксированное время?
Уточнение. Если F = 50 +/- 25% Гц, то горит постоянно. Если более 50%, то гаснет. Так? 25% и 50% - не слишком большие цифры?

Если подойдет, то будем считать кол-во периодов за ед. времени. Если F=50+/- 25% (можно изменить соотношение, например на 10%), то с/д горит постоянно, при дальнейшем снижении до +/- 50% (25%)мигает с частотой 1 Гц. При еще большем снижении частоты - гаснет. Для простоты можнго считать, что на вход подается последовательность положительных импульсов с частотой следования 50 Гц, скважность от 0,1 -0,5 (в принципе - по барабану).

Впрочем это только предложение. Возможно есть другие задачи.

 

АНТОХА, а для чего счетчик в конце обработчика грузить? В таких случаях, вообще-то, счетчик готовят заранее в предыдущем вызове обработчика, в текущем вызове немедленно, первыми же командами разбираются с таймером (сбрасывают сигнал прерывания, грузят новое значение счетчика), и уж потом, параллельно с работой таймера, готовят нужные данные для будущего прерывания. Любую задачу в 90% случаев можно перестроить под такую работу. Плюс ко всему у "грузить в конце" есть еще один, практически неустранимый недостаток - если в обработчике, не дай бог, есть команды условных переходов, время работы обработчика перестает быть величиной постоянной и тут учитывай/не учитывай вход/выход - программа будет врать. В этом плане, кстати, система прерываний AVR реализована более корректно - там анализа источника прерываний не требуется, поскольку векторы прерываний индивидуальны на каждый источник

 

chav1961: АНТОХА, а для чего счетчик в конце обработчика грузить?

Я как раз объяснял, почему так делать не надо

 

Вижу, что процесс идёт полным ходом. Отлично!
Zandy, граф нарисован верно. Так что бояться было нечего.

Splav56: F=50+/- 25%
А зачем такой большой допуск? В нормальных условиях частота электрического тока в энергосистеме должна поддерживаться на уровне 50Гц с нормально-допустимым отклонением +-0.05 Гц и кратковременно с максимально-допустимым отклонением не более +-0,2Гц. Вот так и сделать. При достижении частоты 49,95 Гц и продолжающемся её снижении диспетчер может объявить режим «аварийной ситуации» в энергосистеме. Ниже 49,8 - это уже 100% аварийная ситуация. В этом случае немедленно принимаются все меры для восстановления частоты.

 

picmaniac: А зачем такой большой допуск?

Это не для контроля частоты сети. Это может быть полезно для контроля частоты вращения.

 

Splav56: будем считать кол-во периодов за ед. времени
Если, допустим, выбрать длительность интервала 1 сек., то поместится туда всего лишь 50 периодов. Стало быть, точность не выше 2%, так? Делать интервал больше? По-моему лучше при столь низкой частоте длительность периода измерять - заполнять измеряемый временной интервал импульсами с достаточно высокой частотой, и затем их подсчитывать. Тогда можно добиться высокой точности, особенно с хорошим кварцованным тактовым генератором.

 

picmaniac: Если, допустим, выбрать длительность интервала 1 сек., то поместится туда всего лишь 50 периодов. Стало быть, точность не выше 2%, так? Делать интервал больше? По-моему лучше при столь низкой частоте длительность периода измерять - заполнять измеряемый временной интервал импульсами с достаточно высокой частотой, и затем их подсчитывать. Тогда можно добиться высокой точности, особенно с хорошим кварцованным тактовым генератором

В принципе о точности речи пока не было, но если нужна бОльшая точность, то, думаю, это справедливо. Я не против измерения длительности периода.

 

Мне кажется в обучающих целях надо сделать точность поболее, чтобы научиться работать с двухбайтовым числом.
Алгоритм предлагается такой. Делаем маленькое колечко, охватывающее проверку бита порта В и инкрементирования или декрементирования двухразрядного счетчика. Счетчик тикает в течении, допустим положительного полупериода (это проще) или всего периода (немного сложнее). Счетчик может иметь предустановку. Затем с помощью команд subwf и (или) sublw c организацией двухбайтового вычитателя выясняем, в каком интервале находится состояние счетчика. По результатам, либо зажигаем светодиод, либо заставляем его мигать. Возвращаемся опять к подсчету. Период мигания светодиода можно сделать кратным времени всего цикла программы, включив такты таймера "мигания" в общий цикл. Светодиод можно вывести на какой-нибудь бит порта А (что проще) или на бит порта В (что немного сложнее). Прерывания не трогаем. Или в учебных целях с помощью прерываний делать будем?
Ну, если уж совсем демократию "разводить", то кто за, кто против, кто воздержался? Или я вообще неверный алгоритм предложил? Предлагаю высказываться по алгоритму.
P.S. Насчет двухбайтового я наверное поторопился. Счетчик то может и двухбайтовый, но анализировать имеет смысл только один байт - в нем весь диапазон изменений будет.
И еще. Все-таки мы делаем два предела измерения (горит - мигает) или три (горит - мигает - не горит)? А также прошу окончательно уточнить проценты пределов измерений. Ну и все-таки предлагаю picmaniacу окончательно сформулировать задание.
Splav56, вы опять в строю, или как?