📄 vidu4-4.s
字号:
;*******************************************************************************
; Vidu4-4.s la chuong trinh viet bang hop ngu de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Khoi tao RTC DS1307, sau do doc thong tin *
; tu RTC bang module I2C, gui thong tin thoi gian ve may tinh thong qua *
; cong RS232 (dung cac chan I/O thay the) *
;*******************************************************************************
; Tac gia : Nguyen Quang Nam *
; Don vi : PIC Viet Nam *
; Ten tap tin : Vidu4-4.s *
; Ngay : 17/08/2006 *
; Phien ban : 0.01 *
; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.inc *
; Cong cu duoc dung: MPLAB 7.31 *
; ASM30 2.14 *
; LNK30 2.14 *
;-------------------------------------------------------------------------------
; .equ __30F2010, 1
; .equ __30F2011, 1
; .equ __30F2012, 1
; .equ __30F3010, 1
; .equ __30F3011, 1
; .equ __30F3012, 1
; .equ __30F3013, 1
; .equ __30F3014, 1
; .equ __30F4011, 1
.equ __30F4012, 1
; .equ __30F4013, 1
.include "p30fxxxx.inc"
; config __FOSC, CSW_FSCM_OFF & HS
; config __FOSC, CSW_FSCM_OFF & HS2_PLL8
; config __FOSC, CSW_FSCM_OFF & HS2_PLL16
; config __FOSC, CSW_FSCM_OFF & FRC
config __FOSC, CSW_FSCM_OFF & FRC_PLL4
; config __FOSC, CSW_FSCM_OFF & FRC_PLL8
; config __FOSC, CSW_FSCM_OFF & XT_PLL8
; config __FOSC, CSW_FSCM_OFF & XT_PLL16
config __FWDT, WDT_OFF
config __FBORPOR, MCLR_EN & PBOR_OFF
config __FGS, CODE_PROT_OFF
;-------------------------------------------------------------------------------
;Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
.equiv Fcy, 8000000 ;Tan so thuc thi lenh
.equiv I2Cbaud, 100000 ;Toc do baud cua giao tiep I2C
.equiv RSbaud, 38400 ;Toc do baud cua giao tiep RS232
;-------------------------------------------------------------------------------
;Cac khai bao toan cuc:
.global __reset ;Khai bao nhan bat dau chuong trinh (bat buoc)
.global __T1Interrupt ;Khai bao toan cuc chuong trinh xu ly ngat Timer 1
;-------------------------------------------------------------------------------
;Khai bao cac bien trong RAM
.section .bss
.align 2 ;Chinh dia chi theo boi so cua 2
count: .space 2 ;Khai bao bien 'count' kieu word (2 byte)
buff: .space 16 ;Bo dem cho du lieu I2C (16 byte)
str: .space 16 ;Bo dem xau ky tu de xuat ra cong RS232 (16 byte)
flag: .space 2 ;Thanh ghi chua co bao loi (bit0 = ACK/NACK khi ghi ra
;bit1 = ACK/NACK khi doc vao)
;-------------------------------------------------------------------------------
;Doan ma trong vung nho chuong trinh
.text ;Bat dau doan ma chuong trinh
__reset:
mov #__SP_init, W15 ;Khoi tao con tro ngan xep (stack)
mov #__SPLIM_init, W0
mov W0, SPLIM ;Khoi tao thanh ghi gioi han con tro ngan xep (stack)
nop ;Can mot lenh NOP sau khi ghi vao SPLIM
clr W0 ;Xoa thanh ghi lam viec W0
mov W0, W14 ;Xoa cac thanh ghi W1 den W14
repeat #12
mov W0,[++W14] ;Dia chi cua cac thanh ghi: 0x0002 - 0x001C
clr W14
;-------------------------------------------------------------------------------
rcall Init_PORTS ;Khoi tao cac cong I/O
rcall Init_I2C ;Khoi tao module I2C
rcall Init_UART1 ;Khoi tao module UART1
rcall Init_TMR1 ;Khoi tao Timer 1
;Tao du lieu cho message ghi
mov #buff, W1
mov.b #0xD0, W0
mov.b W0, [W1++]
clr W0
repeat #2 ;Dat dia chi thanh ghi bat dau = 0x00
mov.b W0, [W1++] ;va noi dung cua 2 o nho 0x00 va 0x01 la 0
mov.b #0x67, W0 ;O nho 0x02 co gia tri 0x67
mov.b W0, [W1++] ;Che do 24h, dat gia tri la 7 pm
mov.b #0x01, W0 ;O nho 0x03 co gia tri 0x01
mov.b W0, [W1++] ;Ngay dau tuan
mov.b #0x18, W0 ;O nho 0x04 co gia tri 0x18
mov.b W0, [W1++] ;Ngay 18
mov.b #0x08, W0 ;O nho 0x05 co gia tri 0x08
mov.b W0, [W1++] ;Thang 8
mov.b #0x06, W0 ;O nho 0x06 co gia tri 0x06
mov.b W0, [W1++] ;Nam 06
mov.b #0x90, W0 ;O nho 0x07 co gia tri 0x90
mov.b W0, [W1] ;Xung 1 Hz tai chan SQW/OUT
;Buoc 1, tao dieu kien START, cho hoat dong I2C hoan tat
bset I2CCON, #SEN ;Tao ra dieu kien START
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
mov #10, W2 ;So byte can ghi ra RTC
mov #buff, W1 ;Lay dia chi bo dem du lieu I2C
bclr flag, #0 ;Xoa co bao loi truoc khi ghi
write_1:
;Buoc 2, ghi cac byte can thiet, cho va kiem tra ACK
mov.b [W1++], W0 ;Lay byte can ghi
rcall Write_I2C ;Ghi du lieu I2C
btsc flag, #0 ;Neu ACK thi thuc hien tiep
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
dec W2, W2 ;Giam bien dem so byte can ghi
bra nz, write_1 ;Tiep tuc ghi neu chua ghi xong
;Buoc 3, tao dieu kien STOP, cho hoat dong I2C hoan tat
bset I2CCON, #PEN ;Tao ra dieu kien STOP
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
mov #11, W0
mov W0, count ;Dat gia tri cho bien dem (61 giay)
bra main_loop ;Moi thu deu tot, chuyen den vong lap chinh
I2CFail:
bset I2CCON, #PEN ;Tao ra dieu kien STOP
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
bclr LATE, #0 ;Bat LED noi vao RE0 de bao loi
bra $ ;Chuong trinh dung tai day
main_loop:
cp0 count
bra nz, main_loop ;Tiep tuc kiem tra neu count khac 0
mov #11, W0 ;Count = 0, dat lai gia tri
mov W0, count ;cho bien dem (61 giay)
;Doc thong tin thoi gian tu RTC
;Buoc 1, tao dieu kien START, cho hoat dong I2C hoan tat
bset I2CCON, #SEN ;Tao ra dieu kien START
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
;Buoc 2, ghi dia chi cua RTC, sap thao tac ghi vao RTC
mov.b #0xD0, W0 ;Ghi dia chi cua RTC, chuan bi ghi vao RTC
bclr flag, #0 ;Xoa co bao loi truoc khi ghi
rcall Write_I2C ;Ghi du lieu I2C
btsc flag, #0 ;Neu ACK thi thuc hien tiep
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 3, ghi dia chi cua thanh ghi sap thao tac
clr W0 ;Ghi dia chi thanh ghi
bclr flag, #0 ;Xoa co bao loi truoc khi ghi
rcall Write_I2C ;Ghi du lieu I2C
btsc flag, #0 ;Neu ACK thi thuc hien tiep
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, tao dieu kien RESTART, cho hoat dong I2C hoan tat
bset I2CCON, #RSEN ;Tao ra dieu kien RESTART
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
;Buoc 5, ghi dia chi cua RTC, sap thao tac doc tu RTC
mov.b #0xD1, W0 ;Ghi dia chi cua RTC, chuan bi doc tu RTC
bclr flag, #0 ;Xoa co bao loi truoc khi ghi
rcall Write_I2C ;Ghi du lieu I2C
btsc flag, #0 ;Neu ACK thi thuc hien tiep
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
mov #2, W2 ;So byte can doc vao tu RTC (tru byte cuoi)
mov #str, W1 ;Lay dia chi bo dem xau ky tu
read_1:
;Buoc 6, doc cac byte can thiet (tru byte cuoi cung), va ACK
bclr flag, #1 ;Xoa bit 1 cua flag (tuc la ACK)
rcall Read_I2C ;Doc du lieu I2C
mov W0, W3 ;Giu lai byte du lieu truoc khi thao tac
and.b #0x0F, W0 ;Xoa 4 bit cao
add.b #'0', W0 ;Chuyen so BCD thanh ky tu
mov.b W0, [W1++] ;Ghi vao bo dem xau ky tu
swap.b W3 ;Hoan doi cac nibble trong byte da luu
and.b #0x0F, W3 ;Xoa 4 bit cao
add.b #'0', W3 ;Chuyen so BCD thanh ky tu
mov.b W3, [W1++] ;Ghi vao bo dem xau ky tu
mov.b #':', W0 ;Them ky tu phan cach (giua giay va phut, hay
mov.b W0, [W1++] ;phut va gio), ghi vao bo dem xau ky tu
dec W2, W2 ;Giam bien dem so byte can doc
bra nz, read_1 ;Tiep tuc doc neu chua doc xong
;Buoc 7, doc byte cuoi cung, va NACK
bset flag, #1 ;Dat bit 1 cua flag (tuc la NACK)
rcall Read_I2C ;Doc du lieu I2C
mov W0, W3 ;Giu lai byte du lieu truoc khi thao tac
and.b #0x0F, W0 ;Xoa 4 bit cao
add.b #'0', W0 ;Chuyen so BCD thanh ky tu
mov.b W0, [W1++] ;Ghi vao bo dem xau ky tu
swap.b W3 ;Hoan doi cac nibble trong byte da luu
and.b #0x0F, W3 ;Xoa 4 bit cao
add.b #'0', W3 ;Chuyen so BCD thanh ky tu
mov.b W3, [W1] ;Ghi vao bo dem xau ky tu
;Buoc 8, tao dieu kien STOP, cho hoat dong I2C hoan tat
bset I2CCON, #PEN ;Tao ra dieu kien STOP
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
clr W0 ;Xoa W0 de tranh hieu ung le cua byte cao
mov #8, W2 ;So ky tu can xuat
Out_Str:
;Bay gio co the xuat thong tin thoi gian qua RS232
rcall Send_UART1 ;va xuat thong tin thoi gian ra RS232
dec W2, W2
bra nz, Out_Str
mov.b #0x0a, W0
mov WREG, U1TXREG ;Xuat cap ky tu CR, LF
mov.b #0x0d, W0
mov WREG, U1TXREG
bra main_loop ;Vong lap chinh
;-------------------------------------------------------------------------------
;Chuong trinh con khoi tao cac cong I/O, de noi voi LED
;-------------------------------------------------------------------------------
Init_PORTS:
setm LATE ;Tat cac LED (anode chung) noi vao cong E
mov #0xFFFE, W0 ;LED noi vao RE0
mov W0, TRISE
return
;-------------------------------------------------------------------------------
;Chuong trinh con khoi tao module I2C o che do Master
;-------------------------------------------------------------------------------
Init_I2C:
mov #0x8200, W0 ;bit15=I2CEN, bit9=DISSLW (tat Slew Rate
;Control cho cac toc do baud khac 400 kbps)
mov W0, I2CCON
mov #(((Fcy/I2Cbaud)-(Fcy/1111111))-1), W0 ;Khoi tao toc do baud
mov W0, I2CBRG ;=((Fcy/I2Cbaud)-(Fcy/1111111)) - 1)
return
;-------------------------------------------------------------------------------
;Chuong trinh con cho hoat dong Master I2C sau cung hoan tat, bang cach kiem tra
;bit MI2CIF trong thanh ghi IFS0
;-------------------------------------------------------------------------------
Wait_MI2C:
btss IFS0, #MI2CIF
bra $ - 2
bclr IFS0, #MI2CIF
return
;-------------------------------------------------------------------------------
;Chuong trinh con ghi byte thap cua W0 o che do Master
;-------------------------------------------------------------------------------
Write_I2C:
mov.b WREG, I2CTRN ;Gui mot byte ra bang I2C
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bset flag, #0 ;Neu NACK thi bat co bao loi
return ;Tro ve chuong trinh goi
;-------------------------------------------------------------------------------
;Chuong trinh con doc byte tu I2C va ghi vao byte thap cua W0, che do Master
;-------------------------------------------------------------------------------
Read_I2C:
bset I2CCON, #RCEN ;Cho phep nhan byte
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
mov.b I2CRCV, WREG ;Lay byte da nhan dat vao W0
bclr I2CCON, #ACKDT ;Gia su la ACK
btsc flag, #1 ;Neu yeu cau la NACK
bset I2CCON, #ACKDT ;thi dat lai la NACK
bset I2CCON, #ACKEN ;Ghi bit ACK/NACK ra I2C bus
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
return ;Tro ve chuong trinh goi
;-------------------------------------------------------------------------------
;Chuong trinh con khoi tao TMR1
;TMR1 duoc khoi tao de tran sau moi 1 giay tai muc xung 8 Mips (fcy = 8 MHz)
;-------------------------------------------------------------------------------
Init_TMR1:
clr TMR1
mov #0x7A12, W0 ;TMR1 tran moi 1 giay
mov W0, PR1 ;Dat nguong tran vao PR1
bclr IFS0, #T1IF ;Xoa co ngat cua TMR1
mov #0x8030, W0 ;TMR1 dung fcy lam clock, prescale la 1:256,
mov W0, T1CON ;va khoi dong TMR1
bset IEC0, #T1IE ;cho phep ngat khi TMR1 tran
return
;-------------------------------------------------------------------------------
;Chuong trinh con khoi tao module UART1
;-------------------------------------------------------------------------------
Init_UART1:
mov #0x8400, W0 ;bit15=UARTEN, bit10=ALTIO, dung Alternate IO
mov W0, U1MODE
mov #0x0400, W0 ;bit15=UTXISEL, bit10=UTXEN
mov W0, U1STA
bclr IFS0, #U1TXIF ;Xoa co U1TXIF bi bat len do UTXEN = 1
mov #(((Fcy/RSbaud)/16)-1), W0 ;Khoi tao toc do baud
mov W0, U1BRG ;=((Fcy/RSbaud)/16) - 1)
return
;-------------------------------------------------------------------------------
;Chuong trinh con xuat thong tin thoi gian ra UART1, W1 chua dia chi ky tu
;-------------------------------------------------------------------------------
Send_UART1:
mov.b [W1--], W0 ;Lay mot ky tu
mov WREG, U1TXREG ;Xuat ra cong RS232
xmt_loop:
btss U1STA, #TRMT ;Da truyen ky tu xong chua?
bra xmt_loop ;Chua xong, tiep tuc cho
return
;-------------------------------------------------------------------------------
;Trinh phuc vu ngat cho TMR1
;Moi 1 giay ngat nay duoc thuc thi. No se giam mot bien dem di 1 don vi
;-------------------------------------------------------------------------------
__T1Interrupt: ;Ten da duoc dinh truoc trong tap tin lien ket
bclr IFS0, #T1IF ;Truoc tien, can xoa co ngat
dec count ;Giam bien count di 1 don vi
retfie ;Tro ve tu ngat
;-------------------------------------------------------------------------------
.end ;Ket thuc phan ma trong tap tin nay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -