3.2 Функция инициализации init( )
Функция init() используется для инициализации МКС после включения электропитания или сброса МК при помощи кнопки «Сброс», расположенной на пульте управления. БСА этой функции приведена на рисунке 3.2.
Сначала необходимо настроить линии портов МК на ввод или вывод согласно требованиям подключенных к ним внешних устройств. Далее нужно вывести нулевые начальные значения управляющих сигналов Y1, Y2, Y3, Y4, Y5. Затем необходимо произвести инициализацию ЖКД, клавиатуры, модулей АЦП и ШИМ, а также канала звука по методике, изложенной в описании библиотечных функций mikroCPROдля этих устройств. После инициализации ЖКД надо вывести на дисплей текст «WorkMode», сообщающий о начале работы МКС после запуска микроконтроллера. Заключительным этапом инициализации является настройка таймера TMR0 на заданный режим работы и настройка системы прерывания.
Таймер TMR0 будет использоваться в программе для отсчета времени опроса Топр, при этом он считает импульсы внутреннего тактового генератора. Счетные импульсы поступают с частотой, определяемой частотой системной синхронизации и коэффициентом предварительного деления, задаваемым регистром специальных функций OPTION_REG.
Рисунок 3.2 - БСА функции инициализации init( )
Формат регистра OPTION_REGследующий:
Коэффициент деления выбирают с помощью битов PS2, PS1, PS0 в диапазоне от 2 до 256, как показано в таблице 3.1.
Таблица 3.1 - Выбор коэффициента деления с помощью регистра OPTION_REG
Например, при использовании тактовой частоты fOSC = 16МГц период тактовых импульсов будет TOSC = 1 / fOSC = 0,0625мкс, командный (машинный) цикл будет 4 х TOSC = 0,8мкс (частота тактирования внутренне делится на 4). Таким образом, если, например, выбрать коэффициент деления 16, то содержимое счетного регистра таймера будет увеличиваться через каждые 16 мкс.
При переполнении счетного регистра (т.е. переход от 255 к 0) формируется запрос прерывания от таймера (если оно разрешено). Загружая некоторое значение в регистр TMR0, можно управлять количеством отсчетов до получения переполнения.
Для вычисления времени до момента переполнения таймера можно воспользоваться следующей формулой:
TOV = 4 * TOSC * K * (256 - TMR0), (3.1)
Где TOV - время до момента переполнения (мкс); TOSC-период следования импульсов тактового генератора (мкс); К - коэффициент деления частоты, выбранный с помощью регистра OPTION_REG; TMR0 -значение, загруженное в регистр TMR0 (десятичное число).
Из формулы (3.1) можно определить, что максимальное время переполнения, а следовательно, и время задержки при тактовой частоты 16 МГц, т.е. TOSC = 0,0625мкс, коэффициенте деления К = 256, начальном значении TMR0 = 0 будет:
TOV= 4 * 0,0625 * 256 * (256 - 0) = 16384мкс
Это значение значительно меньше требуемого времени Топр =4.2 с. Поэтому на таймере реализуем задержку на 15мс, а в переменной, например с именем counter (счетчик) будем накапливать количество переполнений с целью получения требуемой задержки в 4.2 с. Необходимое количество переполнений для отсчета времени 4.2с будет:
4200мс / 15мс = 280
Для определения значения, которое должно быть загружено в регистр TMR0 с целью получения заданного времени переполнения, формулу (3.1) удобно записать в виде:
TMR0 = 256 - TOV / (4 * 0.0625 * K) (3.2)
Для получения времени 15мс при тактовой частоте 16 МГц и коэффициенте деления 256 из формулы (3.2) имеем:
TMR0 = 256 - 15000/ (4 * 0.0625 * 256) = 21.625 =22
Таким образом в регистр TMR0 необходимо загрузить десятичное число 22. Для получения коэффициента деления К = 256 в младшие 3 разряда регистра OPTION_REG надо записать двоичное число 111. Кроме этого, необходимо установить бит INTEDG = 1 для того, чтобы прерывание по входу INT микроконтроллера от аварийного датчика возникало при изменении сигнала Х0 от “0” к “1”. Таким образом, в регистр OPTION_REG необходимо загрузить число 0b01000111 = 0x47.
В функции init( )необходимо также разрешить прерывания при переполнении таймера TMR0 и по сигналу на входе INT от аварийного датчика.
В микроконтроллерах семейства PIC16 управление прерываниями реализовано с помощью регистров специальных функций INTCON, PIE, PIR, а программа обработчик прерываний всегда начинает исполняться с адреса 0004h.
Формат регистра INTCON следующий:
GIE - это бит общего разрешения прерываний. Если он установлен в “1”, то все немаскируемые прерывания разрешены. Если он сброшен в “0”, то все прерывания запрещены.
PEIE используется в качестве бита разрешения всех прерываний от периферийных устройств, определяемых с помощью регистров PIEи PIR. В данном курсовом проекте не предусмотрены прерывания от периферийных устройств, поэтому этот бит равен 0.
T0IEявляется битов разрешения (логическая 1) или запрещения (логический 0) прерывания при переполнении таймера TMR0.
Бит T0IF является флагом запроса прерывания при переполнении TMR0 (T0IF = 1 -есть запрос прерывания, T0IF = 0 -нет запроса).
INTE - Это бит разрешения внешнего прерывания по входу INT, а бит INTF-это флаг запроса прерывания по этому входу.
RBIE - это бит разрешения прерывания при изменении уровней сигналов на входах линий RB4, RB5, RB6, RB7 порта B, а бит RBIF-это таймер TMR0 и сигнал по входу INT, который поступает от аварийного датчика. Поэтому для разрешения прерываний от них необходимо в регистр INTCON загрузить число 0b10110000 = 0хB0.
Рассмотрим пример реализации функции инициализации МКС init( ) на языке mikroC.
/* Объявления глобальных переменных, используемых в init() */
// присоединение выводов ЖКД
sbitLCD_ENatRB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
// направлениевыводов
sbitLCD_RS_Direction at TRISB2_bit;
sbitLCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// присоединение клавиатуры к порту D микроконтроллера
charkeypadPort at PORTD;
voidinit () //функцияинициаизации
{
// настройка линий портов
TRISA = 0xFF;
TRISB = 0b11111101;
TRISC = 0b11111000;
TRISE = 0;
TRISD = 0xFF;
// вывод начальных значений Y1=Y2=Y3=Y4=Y5=0
PORTE = 0;
PORTC.B0 = 0;
PORTC.B1 = 0;
PORTC.B2 = 0;
PORTB.B1 = 0;
//инициализацияЖКД
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,4, "WorkMode");
//инициализация модуля АЦП
ADC_Init();
//инициализация клавиатуры
Keypad_Init();
//инициализация модулей ШИМ
PWM1_Init(5000);
PWM2_Init(5000);
PWM1_Start();
PWM2_Start();
//инициализация линии RC0 порта C для генерации звука
Sound_Init(&PORTC,0);
//инициализациятаймераTMR0
OPTION_REG = 0b11111111;
TMR0 = 22;
//разрешить прерывания от TMR0 и INT
INTCON = 0xB0;
}
- ВВЕДЕНИЕ
- 1. ОПИСАНИЕ АЛГОРИТМА РАБОТЫ И РАЗРАБОТКА СТРУКТУРНОЙ СХЕМЫ МКС
- 1.1 Алгоритм работы МКС
- 1.2 Пульт управления
- 1.3 Структурная схема МКС
- 2. РАЗРАБОТКА ПРИНЦИПИАЛЬНОЙ СХЕМЫ МКС
- 2.1 Схема подключения микроконтроллера
- 2.2 Схема ввода цифровых сигналов
- 2.3 Схема ввода аналоговых сигналов
- 2.4 Схемы вывода цифровых управляющих сигналов
- 2.5 Схема вывода аналогового управляющего сигнала
- 2.6 Схема подключения ЖК-дисплея
- 2.7 Схема подключения клавиатуры
- 2.8 Подключение аварийного датчика
- 2.9 Схемы подключения аварийной сигнализации
- 3. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ МКС
- 3.1 Разработка блок-схемы алгоритма главной программы работы МКС
- 3.2 Функция инициализации init( )
- 3.3 Функция interrupt( )
- 3.4 Функция digit( )
- 3.5 Функцияanalog( )
- 3.6 Функция display( )
- «Микропроцессорные системы»
- Проектирование микропроцессорных систем уровни представления микропроцессорной системы
- Этапы проектирования микропроцессорных систем
- Проектирование микропроцессорных систем
- Этапы проектирования микропроцессорной системы управления
- Этапы проектирования микропроцессорных систем
- 1 Техническое задание на разработку микропроцессорной системы управления объектом
- Этапы проектирования микропроцессорных систем