Курсовая работа: Цифровой термометр на микропроцессоре AVR-MEGA 128
;16–битный таймер, тактирование от MCLK, CIN разрешает
счёт MEASURE PUSH.B #TPDMAX ;Сохранить в стеке для послед.использ.
CLR R8 ;Указатель для стека результата
MEASLOP MOV.B #(TPSSEL0*3)+ENA,&TPCTL
;TPCNT1 CLK=MCLK, EN1=1
;Конденсатор С заряжается на протяжении t>5нс.Используются
выходы N–1
MOV.B #B16+TPDMAX–1,&TPD;один16-бит.счёт,выбор вых. заряда
MOV.B #TPDMAX–1,&TPE ; Разрешить выходы заряда
MOV.B #PRESET,&TPCNT2 ; Загрузить время заряда
BIS #CPUOFF,SR ; Режим понижен.потребления
MOV.B @SP,&TPE ;Разрешить только текущий датчик
CLR.B &TPCNT2
; Запрет.все прерыв.для обеспеч.непрерыв.работы тайм.и
разряд конден.
DINT ; Запрет прерываний
CLR.B &TPCNT1 ; Очистить младший байт таймера
BIC.B @SP,&TPD ; Переключить все датчики в «0»
MOV.B #(TPSSEL0*3)+ENA+ENB,&TPCTL ;TPCNT1 CLK=MCLK,
; разрешить вход CIN
EINT ; Разрешить прерывания, общий старт
BIS #CPUOFF,SR ; Режим пониженного потребления
; EN=0:Завершение преобразования: 2X8 бит результата в
MSTACK
; Сохранить результат в стеке
MOV.B &TPCNT2,MSTACK+1(R8)
; Сохранить старший байт результата
L$301 INCD R8 ; Инкремент адреса
RRA.B @SP ; Следующий выход TPD.X
JNC MEASLOP ; Если C=1 – завершение
INCD SP ; Убрать старший TPD из стека
; Вычисление сопротивления датчика
;Подпрограмма беззнакового умножения:MSTACK X TEN_K
MRESLT_HW/MRESLT_LW
;Использованы рег.MSTACK,TEN_K,MLTPLR_HW,MRESLT_LW,
MRESLT_HW, BITTEST
;Подпрограмма беззнакового умножения с накоплением
;(MSTACK X TEN_K) + MRESLT_HW|MRESLT_LW –>
MRESLT_HW|MRESLT_LW
CALC_RES
MOV #10000,TEN_K ;Загрузить 10,000 десятичное в TEN_K
MPYU CLR MRESLT_LW ; 0 ? LSBS результата
CLR MRESLT_HW ; 0 ? MSBS результата
MACU CLR MLTPLR_HW ; 0 ? MSBS множителя
MOV #1,BITTEST ; Регистр проверки бит
L$002 BIT BITTEST,MSTACK ; Проверить текущий бит
JZ L$01 ; Если «0» ничего не делать
ADD TEN_K,MRESLT_LW ;Если «1»добавить множитель к резул
ADDC MLTPLR_HW,MRESLT_HW
L$01 RLA TEN_K ; Множитель X 2
RLC MLTPLR_HW
RLA BITTEST ; Проверить следующий бит
JNC L$002 ;Если бит в CARRY: завершить
; Подпрограмма беззнакового деления 32–бита на 16-бит
; Использованы регистры (MSTACK+2),MRESLT_LW,RESULT,
LPCNTR, MRESLT_HW
; MRESLT_HW MRESLT_LW / (MSTACK+2) RESULT Остаток в
MRESLT_HW
; По выходу: CARRY = 0: OK CARRY = 1: Частное > 16 Бит
DIVIDE CLR RESULT ; Очистить RESULT
MOV #17,LPCNTR ; Инициализация счётчика
DIV1 CMP MSTACK+2,MRESLT_HW
JLO DIV2
SUB MSTACK+2,MRESLT_HW
DIV2 RLC RESULT
JC RES_2_F ;Ошибка: RESULT > 16 Бит
DEC LPCNTR ; Декремент счётчика
JZ DIV3 ; 0: выход без ошибки
RLA MRESLT_LW
RLC MRESLT_HW
JNC DIV1
SUB MSTACK+2,MRESLT_HW
SETC
JMP DIV2
DIV3 CLRC ;Ошибки нет, C = 0
; Перевод сопротивления датчика в градусы Цельсия для
отображения RES_2_F
CLR R12 ;Указат.на значение в табл.R
MOV #064H,R13 ;Поместить мин.темп.-1 в индик
JMP FIRST_CMP ;При первом сравн.1 не добав.
CHECK_R INCD R12 ;INC указат.на знач.в таб.cопрот.
DADD #1,R13 ;Десятичный инкремент счётчика
FIRST_CMP CMP RESIS_TAB(R12),RESULT
;Сравнить табличное значение с вычисленным сопротивлением
JNC CHECK_R ;Переход,если R датч.<табличного
;по адресу указателя
;Отобразить ”С” и знак «°» на ЖКИ
DISPLAY MOV.B #A+E+F+D,LCDM1+1 ;”С” ? дисплейная память
ЖК
MOV.B #A+B+F+D,LCDM1+2 ;” °” (знак градуса)
; Отобразить значение, хранящееся в R13 в формате BCD на
ЖКИ
MOV R13,R12 ;Копир.число в виде BCD в R12
MOV #LCDM1+4,R14 ;Младшая цифра в памяти ЖКИ; R14
BIC #0FFF0H,R13 ;Погасить всё,кроме младшей цифры
MOV.B LCD_TAB(R13),0(R14) ; Отпр.мл.цифру в ЖКИ
MOV R12,R13 ; Восстановить значение в R13
RRA R13 ; 4 сдвига
RRA R13
RRA R13
RRA R13
BIC #0FFF0H,R13 ; Погасить всё, кроме млад.цифры
MOV.B LCD_TAB(R13),1(R14) ;Отправить старшую цифру в ЖКИ
JMP BEGIN ; Переход к началу программы
; ЖКИ модуля STK
LCD_TYPE
A EQU01H
B EQU02H
C EQU10H
D EQU04H
E EQU80H
F EQU20H
G EQU08H
H EQU40H
LCD_TAB BYTE A+B+C+D+E+F ; Отображает”0”
.BYTE B+C ; Отображает”1”
.BYTE A+B+D+E+G ; Отображает”2”
.BYTE A+B+C+D+G ; Отображает”3”
.BYTE B+C+F+G ; Отображает”4”
.BYTE A+C+D+F+G ; Отображает”5”
.BYTE A+C+D+E+F+G ; Отображает”6”
.BYTE A+B+C ; Отображает”7”
.BYTE A+B+C+D+E+F+G ; Отображает”8”
.BYTE A+B+C+D+F+G ; Отображает”9”
; Табл.сопротив.30–40 °C. Значения = KОмыX1000–в 3
децимальных цифры
.EVEN ; Выравнивание по чётному адресу
RESIS_TAB
.WORD 12953 ;300C
.WORD 12666
.WORD 12378
.WORD 12090
.WORD 11858
.WORD 11626
.WORD 11393
.WORD 11161
.WORD 10929
.WORD 10353 ;400C
; Вектора прерываний
.EVEN ; Выравнивание по чётному адресу
.SECT ”INT_VECT”,I_VECTORS–31
.WORD RESET ; PORT0, Биты 2 .. 7
.WORD BTINT ; BASIC TIMER
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD TPINT ; TIMER PORT
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; WATCHDOG/TIMER, Режим таймера
.WORD RESET ; Нет источника
.WORD RESET ; UART
.WORD RESET ; P0.0
.WORD RESET ; NMI, Сбой генератора
.WORD RESET ; POR,Внеш. Reset, WATCHDOG
.END
|