📄 vidu4-3.s
字号:
;*******************************************************************************
; Vidu4-3.s la chuong trinh viet bang hop ngu de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Thiet lap cac tham so cho RTC DS1307 *
; thong qua giao tiep I2C, su dung module I2C cua dsPIC *
;*******************************************************************************
; Tac gia : Nguyen Quang Nam *
; Don vi : PIC Viet Nam *
; Ten tap tin : Vidu4-3.s *
; Ngay : 16/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 baud, 100000 ;Toc do baud cua giao tiep I2C
;-------------------------------------------------------------------------------
;Cac khai bao toan cuc:
.global __reset ;Khai bao nhan bat dau chuong trinh (bat buoc)
;-------------------------------------------------------------------------------
;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
;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, xuat dia chi cua RTC voi thao tac ghi, cho va kiem tra ACK
mov.b #0xD0, W0 ;Xuat dia chi cua RTC DS1307, thao tac ke tiep
rcall Send_I2C ;la ghi vao RTC (dia chi cua thanh ghi)
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 3, xuat dia chi cua thanh ghi dich (target), cho va kiem tra ACK
clr W0 ;Xuat dia chi cua thanh ghi can thao tac
rcall Send_I2C
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
clr W0 ;Xuat noi dung cua thanh ghi thu nhat (0x00)
rcall Send_I2C ;Thanh ghi dem giay va bit Clock Halt
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
clr W0 ;Xuat noi dung cua thanh ghi thu hai (0x01)
rcall Send_I2C ;Thanh ghi dem phut
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
mov.b #0x67, W0 ;Xuat noi dung cua thanh ghi thu ba (0x02)
rcall Send_I2C ;Thanh ghi dem gio
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
mov.b #0x01, W0 ;Xuat noi dung cua thanh ghi thu tu (0x03)
rcall Send_I2C ;Thanh ghi dem thu trong tuan
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
mov.b #0x09, W0 ;Xuat noi dung cua thanh ghi thu nam (0x04)
rcall Send_I2C ;Thanh ghi dem ngay
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
mov.b #0x04, W0 ;Xuat noi dung cua thanh ghi thu sau (0x05)
rcall Send_I2C ;Thanh ghi dem thang
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
mov.b #0x73, W0 ;Xuat noi dung cua thanh ghi thu bay (0x06)
rcall Send_I2C ;Thanh ghi dem nam
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 4, xuat noi dung cho thanh ghi dich (target), cho va kiem tra ACK
mov.b #0x90, W0 ;Xuat noi dung cua thanh ghi thu tam (0x07)
rcall Send_I2C ;Thanh ghi dieu khien ngo ra SQW/OUT
rcall Wait_MI2C ;Cho hoat dong I2C hoan tat
btsc I2CSTAT, #ACKSTAT ;Kiem tra trang thai ACK
bra I2CFail ;Neu NACK thi chuyen dieu khien den I2CFail
;Buoc 5, 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
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
main_loop:
nop
nop
bra main_loop ;Vong lap chinh, khong lam gi ca
;-------------------------------------------------------------------------------
;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/baud)-(Fcy/1111111))-1), W0 ;Khoi tao toc do baud
mov W0, I2CBRG ;=((Fcy/baud)-(Fcy/1111111)) - 1)
return
;-------------------------------------------------------------------------------
;Chuong trinh con xuat 1 byte nam trong W0 (byte thap) dung module I2C
;-------------------------------------------------------------------------------
Send_I2C:
mov.b WREG, I2CTRN
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
;-------------------------------------------------------------------------------
.end ;Ket thuc phan ma trong tap tin nay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -