?? 定點運算和定點數制轉換.txt
字號:
LPRT2: LDI R25,1
CLR R24 ;point to $100
LDI R17,$80
OUT GIMSK,R17 ;允許int1中斷
LDI R17,$0A
OUT MCUCR,R17 ;INT1下降沿中斷
SEI ;general interrupt enable
RET
EX_INT1:PUSH R26
PUSH R27
IN R27,SREG
PUSH R27
PUSH R17 ;保護現場
MOV R27,R25 ;取數據指針
MOV R26,R24
LD R17,X+ ;
MOV R25,R27
MOV R24,R26 ;增1后將指針送回
CPI R17,3 ;是停止符?
BRNE INT1SD
CLR R17
OUT GIMSK,R17 ;禁止INT1中斷
RJMP INT1ED
INT1SD: OUT PORTC,R17 ;打印數據輸出到打印口
CBI PORTD,7 ;clr ($12,7)
NOP
NOP
NOP
SBI PORTD,7 ;向打印機發出選通
INT1ED: POP R17
POP R27
OUT SREG,R27
POP R27
POP R26 ;恢復現場
RETI
;范例32 ;步進電機控制程序
.ORG 0
STRT10: RJMP RST10 ;8535/8515/晶振4MHZ
.ORG $011
RST10: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
SER R16
OUT DDRB,R16 ;B口為輸出
LDI R17,8
OUT PORTB,R16 ;接通總開關
LDI R16,50 ;50次基本運作
RCALL DELAY5 ;延時5毫秒
LOOPX: LDI R17,$68 ;step1時序脈沖控制
OUT PORTB,R17
RCALL DELAY2 ;延時2毫秒
LDI R17,$38 ;step2時序脈沖控制
OUT PORTB,R17
RCALL DELAY2 ;延時2毫秒
LDI R17,$98 ;step3時序脈沖控制
OUT PORTB,R17
RCALL DELAY2 ;延時2毫秒
LDI R17,$C8 ;step4時序脈沖控制
OUT PORTB,R17
RCALL DELAY2 ;延時2毫秒
DEC R16
BRNE LOOPX ;到50次?
LDI R17,8
OUT PORTB,r17 ;關閉各相位開關
RCALL DELAY5
RCALL DELAY5 ;延時10毫秒
CLR R17
OUT PORTB,R17 ;關閉所有相位開關和總開關
HH0: RJMP HH0 ;踏步
DELAY1: LDI R17,$06 ;延時1毫秒
MOV R15,R17 ;1000/0.75=1333=$535,外層計數器裝入$06
LDI R17,$35 ;DEC+BRNE=0.75微秒
RJMP DLCOM
DELAY2: LDI R17,$0B ;延時2毫秒
MOV R15,R17 ;2000/0.75=2666=$0A6A,外層計數器裝入$0B
LDI R17,$6A
DLCOM: DEC R17
BRNE DLCOM
DEC R15
BRNE DLCOM
RET
DELAY5: LDI R17,$1B ;延時5毫秒
MOV R15,R17 ;5000/0.75=6666=$1A0A,外層計數器裝入$1B
LDI R17,$0A
RJMP DLCOM
;范例33
.ORG 0 ;8515采用定時器中斷輸出時序脈沖方式控制電機轉動
STRT11: RJMP RST11 ;晶振4MHZ
.ORG $007
RJMP T0_OVF ;中斷服務程序與STRT12共用
.ORG $00D
RST11: LDI R17,HIGH(ramend)
OUT SPH,R17
LDI R17,LOW(ramend)
OUT SPL,R17
LDI R17,$68
MOV R7,R17 ;初始脈沖為0B01101000
SER R17
OUT DDRB R17 ;B口為輸出
LDI R17,N ;運作次數N(N>0)
RCALL STPDRV ;初始化子程序
HH20: RJMP HH20 ;實用時改為具體的背景程序!
STPDRV: TST R17
BRNE STPDR1
INC R17 ;N=0時,將其改為1
STPDR1: MOV R6,R17
INC R6 ;N+1-->r6(max.is 256;“植樹問題”,N必需增1!
LDI R17,$A4
CBR R17,$20
STS $A4,R17 ;清除連續轉動電機標志
LDI R17,$08
OUT PORTB,R17 ;接通總開關
LDI R17,4 ;0B00000100/ 256分頻(4兆/256=1兆/64)
OUT TCCR0,R17
LDI R17,178 ;78*64=4.992ms
OUT TCNT0,R17 ;時間常數,首定時為5毫秒
LDI R17,$02
OUT TIMSK,R17 ;允許T/C0溢出中斷
SEI
HH21: SJMP HH21
;范例34
.ORG $000 ;步進電機手動控制程序(8515)晶振4MHZ
STRT12: RJMP RST12
.ORG $007
RJMP T0SEV
.ORG $00D
RST12: LDI R17,HIGH(ramend)
OUT SPH,R17
LDI R17,LOW(ramend)
OUT SPL,r17
LDI R17,$68
MOV R7,R17 ;第一個時序脈沖
LDI R17,$F8
OUT DDRB,R17 ;PB7-PB3輸出,PB2-PB0輸入
CLR R17
OUT PORTB,R17 ;輸出為低電平
LDS R17,$A4
SBR R17,$20 ;設置連續轉動標志
CBR R17,$40 ;設置電機正轉標志
TSTLP1: SBI PORTB,1 ;PB1接地,正轉
SBIS PINB,1
RJMP TSTL11 ;
TSTL10: SBI PORTB,2
SBIC PINB,2 ;PB2接地,反轉
RJMP TSTLP1 ;PB1,PB2都未接地,反復查詢
SBR R17,$40 ;設置電機反轉
TSTL11: STS $A4,R17 ;保存標志
CLR R6
INC R6 ;R6中裝入1,減一次即為0!
LDI R17,$08
OUT PORTB,R17 ;接通總開關
LDI R17,4 ;0B00000100/256分頻(256/4=64微秒)!
OUT TCCR0,R17
LDI R17,178 ;178之補為78,78*64=4.992ms
OUT TCNT0,R17 ;
LDI R17,$02
OUT TIMSK,R17 ;允許T/C0中斷(toie1=$39,7 toie0=$39,1)
;8535,toie1:$39,2 toie0:$39,0
SEI
TSTLP2: SBI PORTB,1
SBI PORTB,2
IN R17,PINB
ANDI R17,6
CPI R17,6
BRNE TSTLP2 ;兩開關未全部打開,查詢等待
LDS R17,$A4
CBR R17,$20 ;清除連續轉動標志
STS $A4,R17 ;
TSTLP3: IN R17,TIMSK
SBRC R17,1 ;已禁止8515中斷?(8535:timsk,0)
RJMP TSTLP3 ;未,查詢等待
RJMP RST12
T0_OVF: PUSH R17 ;電機控制中斷服務子程序
IN R17,SREG
PUSH R17
LDS R17,$A4
SBRC R17,7
RJMP T0SV2 ;$A4,7:關電機前10毫秒延時標志
MOV R17,R7
CPI R17,$68
BRNE T0SV0
LDS R17,$A4
SBRC R17,5
RJMP T0SV0 ;電機連續轉動,不減R6
DEC R6 ;R6減為0,將停止電機
BREQ T0SV1 ;
T0SV0: LDI R17,225 ;每步進延時(256-225)*64=1.984MS err.<0.8%
OUT TCNT0,R17 ;
OUT PORTB,R7 ;步進控制脈沖輸出
LDS R17,$A4
SBRC R17,6
RJMP T0SVA ;$A4,6=1 為連續反轉
CLC
SBRC R7,4 ;組織下一步控制脈沖
SEC
ROR R7
LDI R17,$08 ;正轉
OR R7,R17 ;01101***->00111***->10011***->11001***->01101***.......
RJMP T0RET
T0SVA: MOV R17,R7 ;
SBR R17,$04
ROL R17 ;組織下一步控制脈沖(反轉)
BRCS T0SVB
CBR R17,$10 ;01101***->11001***->10011***->00111***->01101***.......!
T0SVB: MOV R7,R17
RJMP T0RET
T0SV1: LDS R17,$A4
SBR R17,$80
STS $A4,R17 ;總開關關斷前10毫秒延時標志
LDI R17,$08
OUT PORTB,R17 ;關斷4個相位開關
LDI R17,100 ;156(256-100)*64=9.984ms
OUT TCNT0,R17 ;
RJMP T0RET
T0SV2: LDI R17,$07
OUT PORTB,R17 ;關閉所有開關
CLR R17
OUT TCCR0,R17 ;關T/C0中斷
OUT TIMSK,R17
LDS R17,$A4
CBR R17,$C0
STS $A4,R17 ;清除10毫秒延時和反向轉動標志
T0RET: POP R17
OUT SREG,R17
POP R17
RETI
;精確定時及時鐘日歷走時子程序
;范例35
.EQU DTPNT=$75 ;年年月日時分秒(from $7B to $75)
.ORG $000
STRT20: RJMP RST20 ;晶體實測頻率4.000119MHZ
.ORG $006 ;8515 t1 overflow INT.vector
RJMP T1_OVF
.ORG $00D
RST20: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
LDI R16,2 ;8分頻,4000119/8=500015
OUT TCCR1B,R16
LDI R16,$5E ;500015=65536*8-24273=8*$10000-$5ed1/TCC=$5Ed1
OUT TCNT1H,R16 ;
LDI R16,$D1 ;
OUT TCNT1L,R16 ;將TCC寫入TCNT1
LDI R16,$80
OUT TIMSK,R16 ;允許T/C1溢出中斷
LDI R16,8 ;8次中斷出秒號
MOV R6,R16
SEI
HH10: RJMP HH10 ;可改為具體的實用程序
T1_OVF: PUSH R16
PUSH R17
IN R7,SREG
DEC R6 ;到8次中斷?
BRNE GOON1
IN R17,TCNT1L ;*
IN R16,TCNT1H ;*讀回TCNT1自然計數值
SUBI R17,$2F ;*$5ED1之補為$A12F,以減法替代加法修正TCC
SBCI R16,$A1 ;*減去$A12E可不做下面的加1修正
SUBI R17,$FF ;*8條修正指令占用一個計數單位時間
SBCI R16,$FF ;*修正后TCC=$5ED1+(TCNT1)+1
OUT TCNT1H,R16 ;*
OUT TCNT1L,R17 ;*將修整后TCC寫入TCNT1
LDI R16,8
MOV R6,R16 ;重裝中斷次數8
;.
;.
RCALL ACLK ;時鐘走時
GOON1: POP R17
POP R16
OUT SREG,R7
RETI
;范例36
.EQU DTPNT=$75 ;yyyy mm dd hh mm ss(from $7B--$75)
.ORG $000 ;晶體實測頻率8.000267MHZ,8分頻
;INT(8000267/8)=1000033
STRT21: RJMP STRT21
.ORG $006 ;8515 t1 overflow INT. vector
RJMP T1_OVF
.ORG $00D
STRT21: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
LDI R16,2
OUT TCCR1B,R16 ;8分頻
LDI R16,1 ;1000033=62332*15+65053
;=($10000-$0C84)*15-$10000-$1E3
OUT TCNT1H,R16 ;主常數62332(補碼為$0C84) 補嘗常數TCC=$01E3
LDI R16,$E3 ;$FE1D=65053\65053+62332*15=1000033
OUT TCNT1L,R16
CLR R16
OUT TCCR1A,R16 ;DISABLE CMPA/CMPB/PWM!
LDI R16,$80 ;8515
OUT TIMSK,R16 ;允許T/C1溢出中斷
LDI R16,16 ;16次中斷
MOV R6,R16
SEI
HH11: RJMP HH11 ;
T1_OVF: PUSH R17
PUSH R16
IN R7,SREG
DEC R6 ;中斷次數到?未到轉裝入主常數
BRNE COMP ;否則重裝入TCC
IN R17,TCNT1L ;*
IN R16,TCNT1H ;*讀回自然計數值
SUBI R17,$1D ;*
SBCI R16,$FE ;*減去TCC之補碼
SUBI R17,255 ;*再加1
SBCI R16,255 ;*修正后TCC=$01E3+(TCNT1)+1
OUT TCNT1H,R16 ;*
OUT TCNT1L,R17 ;*
LDI R16,16
MOV R6,R16 ;重寫中斷次數
;.
;.
RCALL ACLK ;時鐘走時
RJMP GOON2
COMP: IN R17,TCNT1L ;*
IN R16,TCNTIH ;*讀回TCNT1自然計數值
SUBI R17,$7C ;*先減去$0C84$'補碼$F37C
SBCI R16,$F3 ;*再作加1補償
SUBI R17,$FF ;*
SBCI R16,$FF ;*修整后重裝值=[$0C84+(TCNT1)+1]
OUT TCNT1H,R16 ;*
OUT TCNT1L,R17 ;*
GOON2: POP R16
POP R17
OUT SREG,R7
RETI
;范例37 ;8515使用T/C0定時,64分頻,晶振頻率40
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -