?? armok0137229.txt
字號:
;8、**** 初識化I/O口*************************************************END
;9、**** 設定T/C0、T/C1、T/C2的工作方式。T0作計數器,*******************
; T1作PWM定時器(1S寬度正脈沖OC1A輸出),T2作CLKio/2頻率OC2輸出
InitTime:
push temp0
ldi temp0,InitTIMSK ;
out TIMSK,temp0
;**** 設定T/C0的一般計數方式
clr temp0
out TCNT0,temp0
ldi temp0,InitTCCR0
out TCCR0,temp0 ;
;**** 設定T/C1工作方式
ldi temp0,InitTCCR1A ;
out TCCR1A,temp0 ;
ldi temp0,InitTCCR1B ;
out TCCR1B,temp0 ;
ldi temp0,high(InitOCR1A) ;
out OCR1AH,temp0
ldi temp0,low(InitOCR1A)
out OCR1AL,temp0
ldi temp0,high(InitICR1) ;
out ICR1H,temp0
ldi temp0,low(InitICR1)
out ICR1L,temp0
;**** 設定T/C2的方式
ldi temp0,InitTCCR2 ;
out TCCR2,temp0 ;
ldi temp0,InitOCR2 ;
out OCR2,temp0
InitTimeEnd:
pop temp0
ret
;**** 設定1000、10的9次方、10的21次方和pi的浮點值
InitData:
ldi YH,HIGH(DataStack)
ldi YL,LOW(DataStack)
ldi R16,LOW(4) ;4的浮點值
ldi R17,HIGH(4)
rcall INT2FP
sts Float4Byte0,R16
sts Float4Byte1,R17
sts Float4Byte2,R18
sts Float4Byte3,R19
ldi R16,LOW(1) ;1的浮點值
ldi R17,HIGH(1)
rcall INT2FP
sts Float10E0Byte0,R16
sts Float10E0Byte1,R17
sts Float10E0Byte2,R18
sts Float10E0Byte3,R19
ldi R16,LOW(1000) ;10的3次方的浮點值
ldi R17,HIGH(1000)
rcall INT2FP
sts Float10E3Byte0,R16
sts Float10E3Byte1,R17
sts Float10E3Byte2,R18
sts Float10E3Byte3,R19
ldi R31,6
mov R21,R16 ;10的21次方的浮點值=1000的7次方
mov R22,R17
mov R23,R18
mov R24,R19
Float10E21Loop:
rcall MPY32F
lds R21,Float10E3Byte0
lds R22,Float10E3Byte1
lds R23,Float10E3Byte2
lds R24,Float10E3Byte3
dec R31
brne Float10E21Loop
sts Float10E21Byte0,R16
sts Float10E21Byte1,R17
sts Float10E21Byte2,R18
sts Float10E21Byte3,R19
Initpi:
ldi R16,LOW(100000000) ;10的8次方的浮點值
ldi R17,BYTE2(100000000)
ldi R18,BYTE3(100000000)
ldi R19,BYTE4(100000000)
rcall LONG2FP
sts Float10E8Byte0,R16
sts Float10E8Byte1,R17
sts Float10E8Byte2,R18
sts Float10E8Byte3,R19
ldi R16,LOW(314159265) ;pi的浮點值
ldi R17,BYTE2(314159265)
ldi R18,BYTE3(314159265)
ldi R19,BYTE4(314159265)
rcall LONG2FP
lds R21,Float10E8Byte0
lds R22,Float10E8Byte1
lds R23,Float10E8Byte2
lds R24,Float10E8Byte3
rcall DIV32F
sts FloatpiByte0,R16
sts FloatpiByte1,R17
sts FloatpiByte2,R18
sts FloatpiByte3,R19
ret
;9、**** 設定T/C0、T/C1、T/C2的工作方式。************************END
;**** 四字節浮點數運算程序
;INT2FP 16 位整數轉換成四字節浮點數運算子程
; 入口 r17:r16 出口r19:r18:r17:r16
; 使用的寄存器r16,r17,r18,r19,r20,r26
;LONG2FP 32 位長整數轉換成四字節浮點數運算子程
; 入口r19:r18:r17:r16 出口r19:r18:r17:r16
; 使用的寄存器r16,r17,r18,r19,r20,r26
;FP2INT 四字節浮點數轉換成16 位整數運算子程
; 入口 r19:r18:r17:r16 出口r19:r18
; 使用的寄存器r16,r17,r18,r19,r20,r26
;FP2LONG 四字節浮點數轉換成32 位長整數運算子程
; 入口r19:r18:r17:r16 出口r19:r18:r17:r16
; 使用的寄存器r16,r17,r18,r19,r20,r26
;ADD32F 四字節浮點加法運算子程
; 入口r19:r18:r17:r16 + r24:r23:r22:r21 出口r19:r18:r17:r16
; 使用的寄存器r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29
; 使用的SRAM Y-5 Y-4 Y-3 Y-2 Y-1
;SUB32F 四字節浮點減法運算子程
; 入口r19:r18:r17:r16 - r24:r23:r22:r21 出口r19:r18:r17:r16
; 使用的寄存器r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29
; 使用的SRAM Y-5 Y-4 Y-3 Y-2 Y-1
;DIV32F 四字節浮點除法運算子程
; 入口r19:r18:r17:r16 / r24:r23:r22:r21 出口r19:r18:r17:r16
; 使用的寄存器r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29
; 使用的SRAM Y-1
;MPY32F 四字節浮點乘法運算子程
; 入口r19:r18:r17:r16 * r24:r23:r22:r21 出口r19:r18:r17:r16
; 使用的寄存器r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29
; 使用的SRAM Y-1
INT2FP: ; 16 位整數轉換成四字節浮點數運算子程
CLR R18
SBRC R17,7 ; R17:R16 為待轉換的整數
COM R18
CLR R19 ; 16 位整數按數符位擴展成32 位長整數
SBRC R18,7 ; 為正R19,R18 清零
COM R19 ; 為負R19,R18 置為$FFFF
LONG2FP: ; 32 位長整數轉換成四字節浮點數運算子程
CLR R20 ; 清符號位R20
AND R19,R19 ; 先判+/-
BRPL LONG2FP_1 ; 為正跳至LONG2FP_1
RCALL QUBU ; 為負調QUBU 子程取補
COM R20 ; 符號位R20 取反
LONG2FP_1:
MOV R26,R16 ; 再判R19:R18:R17:R16 是否全零
OR R26,R17
OR R26,R18
OR R26,R19
BRNE LONG2FP_2 ; 不為零跳至LONG2FP_2
RJMP JGW0 ; 為零跳至JGW0 結果為零
LONG2FP_2:
LDI R26,$16 ; 令R26 = 22
RJMP LONG2FP_4
LONG2FP_3:
INC R26
LSR R19
ROR R18
ROR R17
ROR R16
LONG2FP_4:
AND R19,R19 ; 判高位是否為零
BRNE LONG2FP_3 ; 不為零右移一位階碼加 1
LONG2FP_5:
AND R18,R18 ; 判次高位是否為零
BRNE LONG2FP_7
SUBI R26,$08 ; 為零階碼減 8
MOV R18,R17 ; 數左移 8 位
MOV R17,R16
LDI R16,$00 ; 低位以 $00 填充
RJMP LONG2FP_5
LONG2FP_6:
DEC R26
ADD R16,R16
ADC R17,R17
ADC R18,R18
LONG2FP_7:
BRPL LONG2FP_6 ; R18 第7 為0 再左移一位
MOV R19,R26 ; 階碼減 1 直到R18 第7 位為1
RJMP GGH
FP2INT: ; 四字節浮點數轉換成16 位整數運算子程
LDI R26,$0E ; 令R26 = 14
RJMP FP2LONG_1 ; 跳至FP2LONG_1
FP2LONG: ; 四字節浮點數轉換成32 位長整數運算子程
LDI R26,$1E ; 令R26 = 30
FP2LONG_1:
RCALL FP2LONG_11 ; 調FP2LONG_11 子程
BREQ FP2LONG_4 ; 相等即階碼為 0 按 0 處理
SUB R26,R19 ; R26(14)- 階碼差值
BREQ FP2LONG_2 ; 為 0 則跳至FP2LONG_2
BRPL FP2LONG_5 ; 為正 則跳至FP2LONG_5 無溢出
FP2LONG_2: ; 有溢出
AND R20,R20 ; 符號為正
BRMI FP2LONG_3 ; 符號為負則跳至FP2LONG_3
LDI R16,$FF
LDI R17,$FF
LDI R18,$FF
LDI R19,$7F
RET ; 正向溢出結果置為 $7F FF FF FF
FP2LONG_3:
LDI R16,$00
LDI R17,$00
LDI R18,$00
LDI R19,$80
RET ; 負向溢出結果置為 $80 00 00 00
FP2LONG_4:
LDI R16,$00
LDI R17,$00
LDI R18,$00
LDI R19,$00
RET ; 結果為 0 置為 $00 00 00 00
FP2LONG_5: ; 無溢出
INC R19 ; 階碼差值 + 1
BRMI FP2LONG_4 ; 為負即( 階碼 < $7E) 按零處理
LDI R19,$00 ; 清R19
SUBI R26,$08 ;R26(14- 階碼差值) -8
BRPL FP2LONG_7 ; 為正轉FP2LONG_7
SUBI R26,$F8 ; 不夠減則加 8
MOV R19,R18 ;左移 8 位
MOV R18,R17
MOV R17,R16
LDI R16,$7F ; 低位以 $7F 填充
RJMP FP2LONG_8 ; 跳至 FP2LONG_8
FP2LONG_6:
MOV R16,R17 ; 右移 8 位
MOV R17,R18
LDI R18,$00 ; 高位以 $00 填充
SUBI R26,$08 ; R26-8
FP2LONG_7:
CPI R26,$08 ; R26 值與 8 相比較
BRCC FP2LONG_6 ; 有借位跳至FP2LONG_6
FP2LONG_8: ;無借位
AND R26,R26
BREQ FP2LONG_10
FP2LONG_9:
LSR R19 ; 右移一位
ROR R18
ROR R17
ROR R16
DEC R26 ;R26-1, 不為 0 跳至FP2LONG_9
BRNE FP2LONG_9 ; 直到R26 為 0 為止
FP2LONG_10: ; 考慮符號位
SBRC R20,7
RJMP QUBU ; 為負則跳至QUBU 取補 返回
RET ; 為正返回
FP2LONG_11:
MOV R20,R19 ; 取浮點數數符存于R20 最高位
ANDI R20,$80
ADD R18,R18 ; 將階碼移至R19
ADC R19,R19
SUBI R19,$80 ; 階碼減 $80 存于R19
SEC
ROR R18 ; 恢復尾數最高位 1
CPI R19,$80 ; 階碼差值與 $80 相比較
RET
ADD32F_1: ; 存儲結果
MOV R20,R25
MOV R19,R24
MOV R18,R23
MOV R17,R22
MOV R16,R21
ADD32F_2:
RJMP GGH ; 跳至GGH 處理結果
SUB32F: ; 四字節浮點減法運算子程
SUBI R24,$80 ; 減數取反視為浮點加法運算
ADD32F: ; 四字節浮點加法運算子程
RCALL YCL ; 調YCL 子程
CPI R24,$80 ; 先判加數是否為 0
BREQ ADD32F_2 ; 為 0 則和為被加數 跳至ADD32F_2
CPI R19,$80 ; 再判被加數是否為 0
BREQ ADD32F_1 ; 為 0 則和為加數 跳至ADD32F_1
ADD32F_3:
MOV R26,R19 ; 轉存被加數階碼
SUB R26,R24 ;R26= 被加數階碼 減 加數階碼
BRVS ADD32F_2 ; 溢出跳至ADD32F_2 即加數可忽略
BRMI ADD32F_4 ; 為負跳至ADD32F_4
BRNE ADD32F_5 ; 不等跳至ADD32F_5
CP R16,R21
CPC R17,R22
CPC R18,R23
BRCC ADD32F_5
ADD32F_4:
RCALL ADD32F_16 ; 調ADD32F_16 被加數和加數相交換
RJMP ADD32F_3 ; 跳至ADD32F_3
ADD32F_5:
CPI R26,$18 ;階碼差值與 24 相比較
BRCS ADD32F_6 ;C=1 跳至ADD32F_6 即 < 24
CLR R21 ; > 24 加數清 0
CLR R22
CLR R23
ADD32F_6:
CPI R26,$08 ; 階碼差值與 8 相比較
BRCS ADD32F_7 ;C=1 跳至ADD32F_7 ( 直至 < 8)
MOV R21,R22 ; 加數尾數右移 8 位
MOV R22,R23 ; 高 8 位清 0
CLR R23
SUBI R26,$08 ; 階碼差值再減 8
RJMP ADD32F_6 ; 跳至ADD32F_6
ADD32F_7:
AND R26,R26
BREQ ADD32F_9 ; 直至R26=0 跳至ADD32F_9
ADD32F_8:
LSR R23 ; 加數尾數右移 1 位
ROR R22
ROR R21
DEC R26 ; 階碼差值減 1
BRNE ADD32F_8 ; 不為 0 跳至ADD32F_8
ADD32F_9:
MOV R26,R20 ; 被加數和加數是否同號
EOR R26,R25
BRMI ADD32F_10 ; 異號跳至ADD32F_10
RCALL ADD32F_13 ; 同號調ADD32F_13 子程尾數相加
BRCC ADD32F_2 ; C=0, 無溢出跳至ADD32F_2
ROR R18 ; C=1, 溢出尾數右移 1 位
ROR R17
ROR R16
SUBI R19,$FF ; 階碼加 1
BRVC ADD32F_2 ; 無溢出跳至ADD32F_2 處理結果
RJMP JGZD ; 溢出跳至JGZD 出結果
ADD32F_10:
RCALL ADD32F_14 ;調ADD32F_14 子程尾數相減
BRNE ADD32F_11 ; 不等跳至ADD32F_11
RJMP JGW0 ; 跳至JGW0 出結果
ADD32F_11:
BRCC ADD32F_12 ;C=0, 夠減跳至ADD32F_12
RCALL ADD32F_15 ;C=1, 不夠減調ADD32F_15 子程取補
ADD32F_12:
AND R18,R18 ; 判R18 最高位是否位 1
BRMI ADD32F_2 ; 為 1 跳至ADD32F_2 處理結果
ADD R16,R16 ; 為 0 尾數左移一位
ADC R17,R17
ADC R18,R18
SUBI R19,$01 ; 階碼減 1
BRVC ADD32F_12 ; 無溢出跳至ADD32F_12
RJMP JGZD ; 溢出跳至JGZD 出結果
ADD32F_13: ; 尾數相加
ADD R16,R21
ADC R17,R22
ADC R18,R23
RET
ADD32F_14: ; 尾數相減
SUB R16,R21
SBC R17,R22
SBC R18,R23
RET
ADD32F_15: ; 結果取補
COM R17
COM R18
NEG R16
SBCI R17,$FF
SBCI R18,$FF
RET
ADD32F_16: ; 兩個數相交換
ST -Y,R21
ST -Y,R22
ST -Y,R23
ST -Y,R24
ST -Y,R25
MOV R24,R19
MOV R21,R16
MOV R22,R17
MOV R23,R18
MOV R25,R20
LD R20,Y+
LD R19,Y+
LD R18,Y+
LD R17,Y+
LD R16,Y+
RET
YCL:
MOV R20,R19
LDI R26,$80
ADD R18,R18
ADC R19,R19 ; 將階碼移至R19
EOR R19,R26 ; 階碼減 $80 存于R19
ADD R26,R26
ROR R18 ; 恢復尾數最高位 1
ANDI R20,$80 ; 取浮點數數符存于R20 最高位
MOV R25,R24
LDI R26,$80
ADD R23,R23 ; 將階碼移至R24
ADC R24,R24
EOR R24,R26 ; 階碼減 $80 存于R24
ADD R26,R26
ROR R23 ; 恢復尾數最高位 1
ANDI R25,$80 ; 取浮點數數符存于R25 最高位
CPI R19,$80
RET
GGH: ; 規格化
ADD R18,R18 ; 隱含尾數最高位為 1
LDI R26,$80 ; 考慮符號位
EOR R26,R19 ;
ADD R20,R20
ROR R26 ; 右移R26,R18
ROR R18
MOV R19,R26 ;R26移至R19
RET
DIV32F_1:
ST -Y,R26 ; 轉存R26
CLR R13 ; 清R15:R14:R13
CLR R14
CLR R15
LDI R26,$18 ; 令R26=$18(24)
DIV32F_2:
CP R16,R21 ; 被除數( 余數) 與除數兩尾數相比
CPC R17,R22
CPC R18,R23
BRCS DIV32F_3 ; 被除數( 余數) < 除數
SUB R16,R21 ; 余數 = 被除數 - 除數
SBC R17,R22
SBC R18,R23
SEC
RJMP DIV32F_4
DIV32F_3:
CLC ; 清除進位位
DIV32F_4:
ADC R13,R13 ; 商左移一位并加上進位位
ADC R14,R14
ADC R15,R15
ADD R16,R16 ; 余數左移一位
ADC R17,R17
ADC R18,R18
DEC R26 ; R26-1
BRNE DIV32F_2 ; 循環 24 次
MOV R16,R13 ; 取出商
MOV R17,R14
MOV R18,R15
LD R26,Y+ ; 恢復R26
RET
DIV32F: ; 四字節浮點除法運算子程
AND R24,R24
BREQ DIV32F_7 ; 跳至DIV32F_7 出結果
AND R19,R19 ; 判被除數是否為 0
BREQ JGW0 ; 為 0 則結果為 0
RCALL YCL ; 調YCL 子程
BREQ JGW0 ; 跳至JGW0 結果為 0
EOR R20,R25 ; 取商的符號位存于R20
SEC
SBC R19,R24 ; 取出商的階碼
BRVS JGZD ; 溢出跳至JGZD
LSR R23 ; 無溢出
ROR R22 ; 將被除數與除數得尾數
ROR R21 ; 右移一位最高位置 0
LSR R18
ROR R17
ROR R16
RCALL DIV32F_1 ; 調DIV32F_1 子程進行運算
AND R18,R18 ; 判R18 最高位是否為 0
BRMI DIV32F_5 ; 為 1
ADD R16,R16 ; 為 0 左移被除數尾數
ADC R17,R17
ADC R18,R18
SUBI R19,$01 ; 階碼減 1
BRVS JGZD ; 溢出 跳至JGZD
DIV32F_5: ; 無溢出
MOV R26,R16
LSR R26
BRCS DIV32F_6 ; 進位位為 1 跳至DIV32F_6
AND R16,R16
BRPL DIV32F_6 ; 為正跳至DIV32F_6
AND R17,R17
BRPL DIV32F_6 ; 為正跳至DIV32F_6
LDI R26,$01 ; 尾數加 1
ADD R16,R26
CLR R26
ADC R17,R26
ADC R18,R26
DIV32F_6:
RJMP GGH
DIV32F_7:
RJMP JGW0
JGZD: ; 結果置為 $7FFFFFFF
LDI R26,$7F
MOV R19,R26
OR R18,R26
LDI R26,$FF
MOV R16,R26
MOV R17,R26
RET
JGW0: ; 結果置為 $00000000
CLR R16
CLR R17
CLR R18
CLR R19
CLR R20
RET
MPY32F: ; 四字節浮點乘法運算子程
RCALL YCL ; 調YCL 子程 并判乘數是否為 0
BREQ JGW0 ; 被乘數為 0 跳至JGW0 結果為 0
CPI R24,$80 ; 判乘數是否為 0
BREQ JGW0 ; 乘數為 0 跳至JGW0 結果為 0
EOR R20,R25 ; 符號位相異或
SEC
ADC R19,R24 ; 恢復階碼存于R19
BRVS JGZD ; 溢出跳至JGZD
RCALL MPY32F_2 ; 無溢出調MPY32F_2 子程
AND R18,R18 ; 判R18 最高位是否為 1
BRMI MPY32F_1 ; 為負即R18 最高位為1 跳至MPY32F_1
DEC R19 ; 為正即R18 最高位為 0 階碼減 1
ADD R15,R15 ; 尾數左移一位
ADC R16,R16
ADC R17,R17
ADC R18,R18 ; 直至R18 最高位為 1 止
MPY32F_1:
SUBI R19,$FF ; 階碼加 1
BRVS JGZD ; 溢出跳至JGZD
RJMP GGH ; 跳至GGH 出結果
MPY32F_2:
ST -Y,R24 ; 轉存R24
CLR R13 ; 清R26 R15 R14 R13
CLR R14
CLR R15
CLR R26
LDI R24,$18 ; 令R24=$18 24
MPY32F_3:
ADD R13,R13 ; 積的尾數在R18:R17:R16:R15:R14:R13
ADC R14,R14
ADC R15,R15
ADC R16,R16 ; 尾數左移
ADC R17,R17
ADC R18,R18
BRCC MPY32F_4 ; 無進位R24 減 1 不加乘數
ADD R13,R21 ; 有進位R24 減 1 加乘數到尾數低位
ADC R14,R22
ADC R15,R23
ADC R16,R26
ADC R17,R26
ADC R18,R26
MPY32F_4:
DEC R24 ; 循環 24 次
BRNE MPY32F_3
LD R24,Y+ ; 恢復R24
RET ; 取高 24 位
QUBU: ; 取補運算
COM R16
COM R17
COM R18
COM R19
SUBI R16,$FF
SBCI R17,$FF
SBCI R18,$FF
SBCI R19,$FF
RET
Soft_ID: .DB "DG_Meter"
.DB "多功能測量計"
Version: .DB "0010"
.DB "2005011008"
Author: .DB "Author:CHQ_陳海強"
.DB "END"
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -