П З (1230299), страница 3
Текст из файла (страница 3)
Прерыванием называют вызов определенных функций, генерируемый главным образом аппаратной частью микроконтроллера. В момент возникновения прерывания выполнение основной программы останавливается и происходит переход к соответствующей подпрограмме обработки прерывания. Прерывания разделяются на две группы: внешние и внутренние. Внешние прерывания могут быть вызваны сбросом МК (RESET) или сигналами предустановленного уровня на выходах INT. Причинами внутренних прерываний являются встроенные модули микроконтроллера (таймер/счетчик или сторожевой таймер и др.).
Семейство микроконтроллеров PIC18 имеет два уровня прерываний: низкоприоритетное и высокоприоритетное. Вектор низкоприоритетного прерывания располагается в памяти программ по адресу 0х000018, а вектор высокоприоритетного – 0х000008. Когда одновременно возникает два прерывания, в первую очередь обслуживается то, приоритет которого выше. В случае если оба прерывания имеют равный приоритет, то они будут обслуживаться по очереди. Если в момент обслуживания низкоприоритетного прерывания возникает высокоприоритетное – в этом случае высокоприоритетное прерывание прервет обработку низкоприоритетного. Каждому прерыванию соответствует свой флаг (оповещение), который необходимо сбрасывать программно после выполнения подпрограммы обработки прерывания, поскольку в противном случае прерывание сразу же повторится. Также каждое прерывание можно разрешить или запретить при помощи регистров управления.
В PIC18F452 для управления прерываниями используется десять регистров:
- RCON – специальный функциональный регистр, содержащий бит включения приоритетной системы прерываний и флаги прерываний;
- INTCON/INTCON2/INTCON3 – специальные функциональные регистры, содержащие биты разрешения прерываний, флаги прерываний и биты приоритета прерываний;
- PIE1/PIE2 – специальные функциональные регистры, содержащие индивидуальные биты разрешения периферийных прерываний;
- PIR1/PIR2 – специальные функциональные регистры, содержащие индивидуальные флаги периферийных прерываний;
- IPR1/IPR2 – специальные функциональные регистры, содержащие индивидуальные биты приоритета периферийных прерываний.
2.6 Таймеры/счетчики
Основное применение таймера/счетчика – подсчет числа внешних событий и измерение времени. Используемый микроконтроллер содержит 4 таймера/счетчика TMR0, TMR1, TMR2, TMR3. Для реализации прерывания по переполнению таймера, используется таймер/счетчик TMR0. Особенностями данного таймера являются возможность работы в 8-разрядном и 16-разрядном режимах, а так же программируемый предделитель, способный делить частоту, входящего в него сигнала на 256. Работая в 16-ти разрядном режиме, таймер имеет два регистра хранения чисел – TMR0H и TMR0L. Таймер можно использовать двумя способами. Первый способ – это работа по переполнению, то есть 8-разрядный таймер досчитает от 0 до 255 и прекратит свою работу, а 16-разрядный – от 0 до 65535, не использовав функции предделителя. Второй способ – изначально посчитать по формуле 2.1 исходное значение, которое должно быть загружено в регистр TMR0H и TMR0L в двоичном виде, до момента переполнения таймера.
, (2.1)
где
– время до момента переполнения, мкс;
K – коэффициент деления частоты, предделитель;
– тактовая частота кварцевого резонатора, МГц;
B –количество чисел, которые вмещает таймер.
2.7 Семисегментные индикаторы
Семисегментные индикаторы, применяемые преимущественно для отображения числовой информации, получили широкое распространение, поскольку являются очень удобными и простыми в использовании. Индикатор представляет собой несколько объединенных в одном корпусе одиночных светодиодов, соединенных, как правило, вместе либо анодом (общий анод), либо катодом (общий катод). На рисунке 2.3 а приведено общепринятое обозначение сегментов светодиодного индикатора.
В программе Proteus 7.5 SP3 имеется целый ряд семисегментных индикаторов. В качестве примера на рисунке 2.3 б приведен индикатор с общим анодом 7SEG-COM-AN и его электрическая схема.
Рисунок 2.3 – Семисегментный индикатор: а – обозначение сегментов;
б – внешний вид в программе Proteus 7.5; в – электрическая схема
2.8 Динамическая индикация
На практике отображение информации при помощи одной единственной цифры используется редко, в большинстве случаев возникает необходимость использовать индикаторы, состоящие из нескольких цифр. При этом зажигание каждой цифры индикатора осуществляется с помощью динамического управления, предполагающего быстрый вывод чисел на все разряды индикатора по очереди. Если этот процесс выполнить с правильной скоростью, то в силу инерционности человеческого зрения будет казаться, что все цифры разрядов индикатора светятся одновременно. На рисунке 2.4 приведена временная диаграмма, поясняющая принцип метода динамической индикации на примере четырехзначного индикатора. Как видим, в момент времени, когда на разряд 1 подается высокий уровень напряжения, все другие разряды (2–4) обесточены. После того как на первом разряде закончился переходной процесс и установилась логическая единица, на каналы управления сегментами индикатора подается код числа, которое необходимо зажечь. Продолжительность импульса управления разрядами должна находиться в диапазоне от 5 до 15 мс. Выключение числа происходит в обратном порядке: сначала отключается код числа с каналов управления сегментами, затем на разряде 1 устанавливается низкое значение напряжения. Остальные разряды числа (2–4) включаются аналогичным образом.
Рисунок 2.4 – Временная диаграмма управления разрядами четырехзначного индикатора
Основные преимущества метода динамической индикации заключаются в снижении потребляемой мощности и сокращении количества используемых портов ввода/вывода микроконтроллера.
Рисунок 2.5 – Электрическая схема индикатора 7SEG-MPX4-CA
В данном дипломном проекте используется четырехзначный семисегментный индикатор 7SEG-MPX4-CA. В названии индикатора последние два символа обозначают тип соединения светодиодов: CA – общий анод (Common Anode), CC – общий катод (Common Cathode). На рисунке 2.5 приведена электрическая схема индикатора 7SEG-MPX4-CA. На рисунке 2.4 видно, что аноды диодов каждой цифры индикатора подключаются к шине питания через свой транзистор (VT1-VT4), а однотипные сегменты всех четырех цифр объединяются на одном из выводов (A-G, DP – точка).
3 РАЗРАБОТКА АЛГОРИТМА ИЗМЕРЕНИЯ ЧАСТОТЫ
3.1 Алгоритм основной функции
Алгоритм представляет собой блок схему, у которой обязательно есть начало и конец.
Для начала работы нужно подключить стандартные библиотеки. Это библиотека полного функционала микроконтроллера и библиотека функции задержек.
Затем настроить динамическое управления, для управления разрядами тысяч, сотен, десятков и единиц.
Далее следует настроить такие параметры микроконтроллера, как выбор режим генератора, включить/отключить сторожевой таймер, разрешить/запретить переключения источника такового сигнала, разрешить/запретить работу таймера включения питания, разрешить/запретить сброс микроконтроллера по снижению напряжения питания, разрешить/запретить сброс микроконтроллера при переполнении стека, разрешить/запретить низковольтное программирование.
Затем нужно ввести переменные для подсчета входящих импульсов и самой частоты электрического тока.
Следом вводим массив для вывода цифр на экран. Каждая цифра семисегметного индикатора – это набор из семи 0 и 1.
Затем следует настроить подпрограмму прерываний, то есть определить прерывание высокого уровня, дать понять микроконтроллеру куда следует переходить, если поднялся флаг прерывания, а так же куда вернуться после выполнения прерывания.
После следует настроить порты ввода и вывода сигналов, некоторые ножки нужно настроить на ввод информации в микроконтроллер, а некоторые на вывод.
Следом настраиваем прерывание по таймеру 0, для подсчета импульсов, поступающих в микроконтроллер в течении 1 секунды, а затем таймеру 1, который через каждые 5 мс переключает разряд динамической индикации. После разрешаем глобальное прерывание и на этом алгоритм зацикливается.
Рисунок 3.1 – Алгоритм основной функции
3.2 Алгоритмы прерывания
Алгоритмы прерывания тесно связаны друг с другом, поэтому используются переходы с алгоритма на алгоритм.
Алгоритм подсчета входного сигнала по ножке RB0 представлен на рисунке 3.2. Если на ножку RB0 пришел сигнал, то флаг прерывания сбрасывается (программно) и значение counter становится больше на единицу. Значение counter будет расти до того момента, пока не произойдет прерывание по таймеру 0.
В таймер 0 записано значение, при котором только спустя ровно 1 секунду произойдет прерывание, после чего флаг прерывания по таймеру 0 обнуляется и в него вновь записывается число, которое заставляет его через секунду прерваться.
Следом мы обнуляем переменные thousand, hundred, ten и one. Если значение counter меньше тысячи, то переходим ниже на два блока. Если переменная counter приобрела значение больше 1000, то от этого значения вычитаем тысячу и переменную thousand увеличиваем на единицу. Затем проверяем не стало ли значение переменной counter меньше, либо равно тысячи, если равно или больше, то операции, описанные выше, повторяем, до того момента, пока значение не станет меньше тысячи.
Когда значение counter становится меньше тысячи, проверяем больше ли оно сотни, если меньше, то переходим на два блока ниже, если нет, то вычитаем из значения counter число 100, при этом увеличивая переменную hundred на единицу. Это происходит до тех пор, пока значение counter не станет меньше 100.
Далее проверяем, чтобы значение counter было больше десяти, если условие не выполняется, то нужно перейти на два блока ниже, а если выполняется, то вычитаем из значения counter число 10, при этом увеличивая значение переменной ten на единицу. Это происходит до тех пор, пока значение counter не станет менее 10.
Когда это произошло, нужно проверить больше ли значение counter единицы или нет, если нет, то значение counter обнуляем и переходим к выводу на экран частоты. Если больше единицы, то считаем так же, как описывалось выше. Алгоритм прерывания по таймеру 0, который отвечает за подсчета разрядов динамической индикации, представлен на рисунке 3.3.
Для вывода на экран используется таймер 1. Если сработал флаг прерывания по переполнению таймера 1, то флаг сбрасывается, в таймер записывается число, равно 5 мс, а затем по очереди выводятся на экран разряды thousand, hundred, ten, one. Алгоритм прерывания по таймеру 1, который отвечает за вывод на динамический индикатор, представлен на рисунке 3.4.
Рисунок 3.2 – Алгоритм прерывания по таймеру 0
Рисунок 3.3 – Алгоритм подсчета входного сигнала по порту RB0
Рисунок 3.4 – Алгоритм прерывания по таймеру 1
4 РАЗРАБОТКА ПРОГРАММЫ РАБОТЫ ЧАСТОТОМЕРА
4.1 Введение в систему разработки MPLAB IDE
MPLAB – это интегрированная среда разработки, позволяющая осуществлять написание программ на языках ассемблера и С, а также производить тестирование и имитацию программного кода с использованием инструментальных средств отладки. MPLAB включает в себя ряд отдельных компонентов:
- текстовый редактор – обеспечивает возможность ввода текста и позволяет распознавать основные элементы языка программирования, обозначая команды, метки, комментарии разными цветами, что делает программный код более наглядным и читаемым;
- менеджер проекта – группирует все файлы, относящиеся к одному проекту вместе, а также обеспечивает их обновление и корректное взаимодействие друг с другом;
- компоновщик – объединяет файлы проекта воедино, присваивая каждому фрагменту правильные адреса памяти, обеспечивая при этом корректные переходы и обращения от одного файла к другому;















