Микропроцессорныая система. Автоматический чайник
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
ритма обработки прерываний (продолжение)
Рисунок 14 - Блок-схема алгоритма обработки прерываний (окончание)
.2 Инициализация микроконтроллера
При запуске микроконтроллера необходимо проинициализировать следующие модули:
1.Порты ввода / вывода;
2.Модуль АЦП;
.Модуль CCP1;
.Таймер TMR1;
.Таймер TMR2;
.Модуль USART;
.Модуль MSSP;
Необходимо настроить прерывания от приемника USART, модуля CCP1, таймера TMR2, прерывания по заднему фронту сигнала на входе INT и прерывания по изменению уровня на входах .
Листинг подпрограммы инициализации приведен ниже.
;-
; ИНИЦИАЛИЗАЦИЯ ПОРТОВ ВВОДА/ВЫВОДАINTCON, GIE; ЗАПРЕТИТЬ ПРЕРЫВАНИЯPORTA; ОЧИСТКА ПОРТОВPORTBPORTC
B00111111; ЛИНИИ RA0-RA5 НА ВВОДTRISAB11110011; ЛИНИИ RB2, RB3 НА ВЫВОД
; ОСТАЛЬНЫЕ НА ВВОДTRISBTRISC
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ USARTB10010000; ВКЛЮЧИТЬ МОДУЛЬ USART
; РАЗРЕШИТЬ ПРИЕМ
; УСТАНОВИТЬ 8-РАЗРЯДНЫЙ ПРИЕМRCSTAB00000100; УСТАНОВИТЬ 8-РАЗРЯДНУЮ ПЕРЕДАЧУ
; АСИНХРОННЫЙ НИЗКОСКОРОСТНОЙ РЕЖИМ ПЕРЕДАЧИTXSTAD129; СКОРОСТЬ ОБМЕНА 9600 бит/сSPBRG
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ MSSPB00001000; ВЕДУЩИЙ РЕЖИМ I2CSSPCONB10000000; УПРАВЛЕНИЕ ДЛИТЕЛЬНОСТЬЮ ФРОНТА ВЫКЛЮЧЕНО
; ВЫХ. УРОВНИ СООТВЕТСТВУЮТ СПЕЦИФИКАЦИИ I2CSSPSTAT0x09; ТАКТОВАЯ ЧАСТОТА 100 кГцSSPADDSSPCON2
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ АЦПB10001110; ПРАВОЕ ВЫРАВНИВАНИЕ
; КАНАЛ AN0 - АНАЛОГОВЫЙ ВХОД, ОСТАЛЬНЫЕ ЦИФРОВЫЕADCON1B10000001; МОДУЛЬ АЦП ВКЛЮЧЕН
; ТАКТОВАЯ ЧАСТОТА Fosc/32
; ВЫБРАН КАНАЛ 0ADCON0
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ CCPB00001011; РЕЖИМ СРАВНЕНИЯ
; ТРИГГЕР СПЕЦИАЛЬНЫХ ФУНКЦИЙCCP1CON0x80; ЗАГРУЗИТЬ 8000h В РЕГИСТРЫ CCPR1H И CCPR1LCCPR1HCCPR1L
;-
; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR1B00000010; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ 1:1
; СИНХРОНИЗАЦИЯ ВКЛЮЧЕНА
; ВНЕШНИЙ ИСТОЧНИК ТАКТОВЫХ ИМПУЛЬСОВT1CONTMR1L; ОЧИСТКА РЕГИСТРОВ TMR1L И TMR1HTMR1H
;-
; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR2B01111010; ПРЕДДЕЛИТЕЛЬ 1/16, ВЫХОДНОЙ ДЕЛИТЕЛЬ 1/16
MOVWFT2CON0xFFPR2
;-OPTION_REG; ПОДКЛЮЧИТЬ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ
; К ВЫВОДАМ PORTB
; АКТИВНЫЙ ЗАДНИЙ ФРОНТ ИМПУЛЬСА НА ВХОДЕ INT
;-
; ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙB01011000; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПЕРИФЕРИЙНЫХ МОДУЛЕЙ
; И ПРЕРЫВАНИЯ ПО ВХОДАМ INT И INTCONB00100110; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART,
; МОДУЛЯ CCP1 И ТАЙМЕРА TMR2PIR1PIE1
;-
; ИНИЦИАЛИЗАЦИЯ РЕГИСТРОВ ОБЩЕГО НАЗНАЧЕНИЯEEADR; ОЧИСТИТЬ РЕГИСТР АДРЕСАEECON1, EEPGD; УСТАНОВИТЬ ЧТЕНИЕ ИЗ EEPROMEECON1, RD; НАЧАТЬ ЧТЕНИЕEEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХMAX_TL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР MAX_TLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХMAX_TH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР MAX_THEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_ML; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_MLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_MH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_MHEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_HL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_HLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_HH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_HHEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_ML; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_MLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_MH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_MHEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_HL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_HLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_HH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_HH
B0100000; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИFLAG_RFLAG_R1; ВЫКЛЮЧИТЬ РЕЖИМ ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ
IND_0; ОБНУЛИТЬ РЕГИСТРЫ ИНДИКАЦИИIND_1
CLRFIND_2IND_3
SEC_L; ОБНУЛИТЬ СЧЕТЧИКИSEC_HMIN_LMIN_HHOUR_L
CLRFHOUR_H
B00000010; ВКЛЮЧИТЬ ДЕЦИМАЛЬНУЮ ТОЧКУ ВО 2-М РАЗРЯДЕPOINT
;-
; ИНИЦИАЛИЗАЦИЯ ДРАЙВЕРА LCDSSPCON, SSPEN; ВКЛЮЧИТЬ МОДУЛЬ MSSPSSPCON2, SEN; СГЕНЕРИРОВАТЬ БИТ STARTSSPCON2, SEN; ОЖИДАТЬ ОКОНЧАНИЯ ГЕНЕРАЦИИ БИТА START$-10x38; ПЕРЕДАТЬ АДРЕС ДРАЙВЕРАSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-10x01; ПРЕРЕДАТЬ АДРЕС РЕГИСТРА УПРАВЛЕНИЯ ДЕКОДИРОВАНИЕМSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-10x0F; ВКЛЮЧИТЬ ДВОИЧНО-ДЕСЯТИЧНОЕ ДЕКОДИРОВАНИЕ ДЛЯ ВСЕХ
; РАЗРЯДОВSSPBUFSSPSTAT, BF; ОЖИДАТЬ ОКОНЧАНИЕ ПЕРЕДАЧИ$-10x07; УСТАНОВИТЬ ЯРКОСТЬ СВЕЧЕНИЯ ИНДИКАТОРОВSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-1SSPCON2, PEN; СФОРМИРОВАТЬ БИТ STOP
INTCON, GIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ
;-
2.3 Преобразование напряжения от датчика температуры
Ниже приведена часть программы, осуществляющая преобразование напряжения от датчика температуры. При изменении температуры от 0 до 1000С напряжение на входе АЦП изменяется в пределах 0…4,88 В. При этом результат преобразования в регистрах ADRESL и ADRESH будет изменяться в пределах 0…1000d, что позволяет легко преобразовать результат в десятичный формат.
;-TIME1; СФОРМИРОВАТЬ ЗАДЕРЖКУ 20 мкс
MOVWFTIMER1TIMER1, F$+1
;-_START; ПОДПРОГРАММА ИЗМЕРЕНИЯ ТЕМПЕРАТУРЫADCON0, GO; НАЧАТЬ ПРЕОБРАЗОВАНИЕADCON0, GO; ОЖИДАТЬ ОКОНЧАНИЯ ПРЕОБРАЗОВАНИЯ$-1
;-
Для осуществления временных задержек, необходимых для заряда внутреннего конденсатора модуля АЦП реа