⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vidu4-4.s

📁 h&#432 &#7899 ng d&#7851 n v&#7873 dsp tham kh&#7843 o các c&#244 ng c&#7909 c&#417 b&#7843 n
💻 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 + -