06.02.2009, 00:38
общий
это ответ
Здравствуйте, d1mka1986!
Просмотрел Ваше решение. В целом все правильно.
Исправил пару ошибок:
1) Было неправильно организовано преобразование показаний АЦП в вольты.
Надо делить показание или на 50000 для 20мкВ, или на 25000 для 40мкВ.
2) В одном месте была использована не та подпрограмма: в комментарии правильно, а имя п/п неправильное
3) Ну и константы подправил
Приложение:
;1. RT=(U1-U2)*R0/(U0-U1)
;2. T=(RT-R0)/R0*alpha
?DT?Mesure SEGMENT DATA
RSEG ?DT?Mesure
BUF: DS 3
BUF1: DS 3
BUF2: DS 3
PUBLIC Mesure
EXTRN CODE(MOVFP_Y_C,MOVFP_Y_X,MOVFP_R_X,MOVFP_Y_R,W_TO_FP,ADD_FP,SUB_FP,MUL_FP,DIV_FP)
?PR?Mesure SEGMENT CODE
RSEG ?PR?Mesure
;--------------------------------------------------------------------------------
; Подпрограмма Mesure
; Вычисление температуры по трем измерениям напряжений
; Входные параметры:
; А - номер измеряемого канала
; Выходные параметры:
; T - соответствующая R температура (oC) в формате FP -
; возвращается в регистрах R2(знак и характеристика числа),R3-R4(мантисса)
;--------------------------------------------------------------------------------
Mesure:
MOV ADC0CON1, #01100100 ; 1,2,3 биты - диапазон 1,28В , 6 бит - униполярный режим, 7,8 биты - буферный режим
SWAP A
ORL A,#00000001
MOV ADC0CON2, A ; 1-4 биты - вход c номер контролируемой точки, 7,8 биты - источник опорного напряжения
JBC RDY0, M1 ; Ждем результата измерения U2
M1: CLR RDY0 ; Результат получен
MOV R3,ADC1H ; Сохранение результата U2 для преобразования
MOV R4,ADC1M
LCALL W_TO_FP ; Преобразование U2 в FP, результат в регистрах R2-R4
MOV DPTR,#koef+3
LCALL MOVFP_Y_C ; пересылка q2 из ПЗУ в регистры R5-R7
LCALL DIV_FP ; Результат U2,В в R2-R4
MOV R1,#BUF
LCALL MOVFP_R_X ; Сохранение U2 в внутреннем ОЗУ
MOV ADC0CON1, #01100100 ; 1,2,3 биты - диапазон 1,28В , 6 бит - униполярный режим, 7,8 биты - буферный режим
AND A,#11111110
SWAP A
MOV P3,A ;Выбор линии U1 контролируемой точки
MOV ADC0CON2, #11100001 ; 1-4 биты - вход AIN8, 7,8 биты - источник опорного напряжения
JBC RDY0, M2 ; Ждем результата измерения U1
M2: CLR RDY0 ; Результат получен
MOV R3,ADC1H ; Сохранение результатов U1 для преобразования
MOV R4,ADC1M
LCALL W_TO_FP ; Преобразование U1 в FP, результат в регистрах R2-R4
MOV DPTR,#koef
LCALL MOVFP_Y_C ; пересылка q1 из ПЗУ в регистры R5-R7
LCALL DIV_FP ; Результат U1 в R2-R4
MOV R1,#BUF1
LCALL MOVFP_R_X ; Сохранение U1 в внутреннем ОЗУ для дальнейших вычислений
MOV R1,#BUF
LCALL MOVFP_Y_R ; Загрузка в Y в 2*U2
LCALL SUB_FP ; Результат U1-U2 в R2-R4
MOV DPTR,#koef+6
LCALL MOVFP_Y_C ; пересылка R0 из ПЗУ в регистры R5-R7
LCALL MUL_FP ; Результат (U1-U2)*R0 в R2-R4
MOV R1,#BUF2
LCALL MOVFP_R_X ; Сохранение (U1-U2)*R0 во внутреннем ОЗУ для дальнейших вычислений
MOV ADC0CON1, #11100100 ; 1,2,3 биты - диапазон 2,56В , 6 бит - униполярный режим, 7,8 биты - буферный режим
MOV ADC0CON2, #00010001 ; 1-4 биты - вход AIN9, 7,8 биты - источник опорного напряжения
JBC RDY0, M1 ; Ждем результата измерения U0
M1: CLR RDY0 ; Результат получен
MOV R3,ADC1H ; Сохранение результатов U0
MOV R4,ADC1M
LCALL W_TO_FP ; Преобразование U0 в FP, результат в регистрах R2-R4
MOV DPTR,#koef+3
LCALL MOVFP_Y_C ; пересылка q2 из ПЗУ в регистры R5-R7
LCALL DIV_FP ; Результат U0 в R2-R4
MOV R1,#BUF1
LCALL MOVFP_Y_R ; Загрузка U1 в R5-R7
LCALL SUB_FP ; U0-U1 результат в R2-R4
LCALL MOVFP_Y_X ; U0-U1 результат в R5-R7
MOV R1,#BUF2
LCALL MOVFP_X_R ; Загрузка (U1-U2)*R0 в R2-R4
LCALL DIV_FP ; Результат R(T)=(U1-2*U2)*R0/(U0-U1) в R2-R4
MOV DPTR,#koef+6
LCALL MOVFP_Y_C ; пересылка R0 из ПЗУ в регистры R5-R7
LCALL SUB_FP ; R(T)-R0 результат в R2-R4
MOV R1,#BUF1
LCALL MOVFP_R_X ; Сохранение R(T)-R0 во внутреннем ОЗУ для дальнейших вычислений
MOV DPTR,#koef+6
LCALL MOVFP_Y_C ; пересылка R0 из ПЗУ в регистры R5-R7
MOV DPTR,#koef+9
LCALL MOVFP_X_C ; пересылка alpha из ПЗУ в регистры R2-R4
LCALL MUL_FP ; R0*alpha результат в R2-R4
LCALL MOVFP_Y_X ; R0*alpha результат в R5-R7
MOV R1,#BUF1
LCALL MOVFP_X_R ; Загрузка в X в R(T)-R0, результат в R2-R4
LCALL DIV_FP ; T=(R(T)-R0)/R0*alpha результат в R2-R4
RET
koef:
DB 47H, 043H, 50H ; q1 = 50000 = 1 B / 20 мкВ
DB 46H, 0c3H, 50H ; q2 = 25000 = 1 B / 40 мкВ
DB 43H, 0B4H, 00H ; R0=360 Ом
DB 3BH, 08CH, 3FH ; alpha=4.28*10^-3 C^-1
END
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен