Микропроцессорныая система. Автоматический чайник
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
;
MOVFTEMP_TH, W0x0F
MOVWFIND_2; ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TH В IND_2
SWAPFTEMP_TH, W0x0F
MOVWFIND_3; ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TH В IND_3
;-
; КОРРЕКЦИЯ РЕЗУЛЬТАТАSTATUS, ZSTATUS, C
MOVLW0x0AIND_0, WSTATUS, C
GOTO$+5STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND_0 НЕ МЕНЬШЕ 0x0A$+3IND_0; В РЕГИСТР IND_0 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0AIND_1, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_1
BCFSTATUS, ZSTATUS, C
MOVLW0x0A; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ
SUBWFIND_1, WSTATUS, C
GOTO$+5STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND_1 НЕ МЕНЬШЕ 0x0A$+3IND_1; В РЕГИСТР IND_1 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0AIND_2, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_2
BCFSTATUS, ZSTATUS, C
MOVLW0x0A; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ
SUBWFIND_2, WSTATUS, C
GOTO$+5STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND_2 НЕ МЕНЬШЕ 0x0A$+3IND_2; В РЕГИСТР IND_2 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0AIND_3, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_3
;-
2.10 Обработка прерываний
Вектор прерываний находится по адресу 0х04.
Обработчик прерываний включает в себя следующие подпрограммы:
1.Подпрограмма сохранения контекста.
2.Подпрограмма определения источника прерывания.
.Подпрограмма часов.
.Подпрограмма обработки прерываний от таймера TMR2.
.Подпрограмма обработки прерываний по входу INT.
.Подпрограмма обработки прерываний по входам .
.Подпрограмма приема / передачи данных через USART.
.Подпрограмма восстановления контекста.
Подпрограмма сохранения контекста
При переходе на обработку прерываний необходимо сохранять текущее содержимое аккумулятора и регистра STATUS, чтобы при возврате из прерывания программа могла продолжать нормальную работу.
Ниже приведен листинг подпрограммы, осуществляющей сохранение контекста во временные регистры W_TEMP и STATUS_TEMP. Регистр STATUS_TEMP определен в 0-м банке по адресу 0х39, а регистр W_TEMP - в 0-м банке по адресу 0х3А и в 1-м банке по адресу 0хВА.
;-
; СОХРАНЕНИЕ АККУМУЛЯТОРА И РЕГИСТРА STATUSSTATUS, RP0; ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО БАНКАRP0_CLRSTATUS, RP0; УСТАНОВИТЬ БАНК 0W_TEMP; СОХРАНИТЬ АККУМУЛЯТОРSTATUS, WSTATUS_TEMP; СОХРАНИТЬ РЕГИСТР STATUSSTATUS_TEMP, 5; ВОССТАНОВИТЬ ЗНАЧЕНИЕ БИТА RP0$+4_CLRW_TEMP; СОХРАНИТЬ АККУМУЛЯТОР
SWAPFSTATUS, WSTATUS_TEMP; СОХРАНИТЬ РЕГИСТР STATUS
;-
Подпрограмма определения источника прерывания
Данная подпрограмма по состоянию флагов прерываний в регистрах PIR1 и INTCON определяет источник прерывания и осуществляет вызов соответствующей подпрограммы обработки.
Листинг подпрограммы приведен ниже.
;-
; ОПРЕДЕЛЕНИЕ ИСТОЧНИКА ПРЕРЫВАНИЯ
INT_SOURCESTATUS; ОЧИСТИТЬ РЕГИСТР STATUS
BTFSCPIR1, CCP1IF; ЕСЛИ ПРЕРЫВАНИЕ ОТ МОДУЛЯ CCP1CLOCK; ПЕРЕХОД НА ПОДПРОГРАММУ ЧАСОВ
PIR1, TMR2IF; ЕСЛИ ПРЕРЫВАНИЕ ОТ ТАЙМЕРА TMR2INT_TMR2; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ОТ
; TMR2
INTCON, INTF; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДУ INTINT_INT; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО
; INT
INTCON, RBIF; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДАМ INT_RB; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО
; ВХОДАМ PIR1, RCIF; ЕСЛИ ПРЕРЫВАНИЕ ОТ ПРИЕМНИКА USARTSERIAL_PRT; ПЕРЕХОД НА ПОДПРОГРАММУ ПРИЕМА/ПЕРЕДАЧИ
; ДАННЫХ ЧЕРЕЗ USARTEND_INT; ИНАЧЕ ПЕРЕХОД НА ПОДПРОГРАММУ ВОССТАНОВЛЕНИЯ
; КОНТЕКСТА
;-
Подпрограмма часов
Данная подпрограмма осуществляет счет и вывод на индикацию (в случае включения режима отображения текущего времени) текущего времени. Кроме того подпрограмма проверяет совпадение текущего времени с временем начала и поддержания температуры. В случае их совпадения подпрограмма включает либо выключает режим поддержания температуры. Для счета используется 6 регистров-счетчиков:
SEC_L - счетчик единиц секунд;
SEC_H - счетчик десятков секунд;
MIN_L - счетчик единиц минут;
MIN_H - счетчик десятков минут;
HOUR_L - счетчик единиц часов;
HOUR_H - счетчик десятков часов.
Счетчики SEC_L, MIN_L, HOUR_L инкрементируются от 0х00 до 0х0А. При достижении 0х0А счетчики сбрасываются. Счетчики SEC_H и MIN_H инкрементируются от 0х00 до 0х06. При достижении 0х06 счетчики сбрасываются. Счетчик HOUR_H инкрементируется от 0х00 до 0х02. Счетчик сбрасывается, когда в нем записано значение 0х02, а счетчик HOUR_L досчитал до 0х04.
Листинг подпрограммы часов приведен ниже.
;-; ПОДПРОГРАММА ТАЙМЕРАPIR1, CCP1IF; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ МОДУЛЯ CCP1
;-
; СЧЕТЧИК ЕДИНИЦ СЕКУНДSEC_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНДSEC_L, W; СЧЕТЧИК ДОСЧИТАЛ ДО 100x0ASTATUS, ZCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSEC_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД
;-
; СЧЕТЧИК ДЕСЯТКОВ СЕКУНДSEC_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК СЕКУНДSTATUS, ZSEC_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 60x06STATUS, ZCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSEC_H; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТMIN_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТSTATUS, ZMIN_L, W; СЧЕТЧИК ДОСЧИТАЛ ДО 100x0ASTATUS, ZCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮMIN_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТMIN_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, ZMIN_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW0x06STATUS, Z
GOTOCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮMIN_H; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
;-
; СЧЕТЧИКИ ЧАСОВHOUR_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, ZHOUR_H, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 20x02STATUS, ZM3; НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCFSTATUS, ZHOUR_L, W0x04STATUS, ZM3STATUS, ZHOUR_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRFHOUR_HCURR_TIME; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ?/p>