PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 10-07-2009, 05:45 PM   #1
cancel
Nhập môn đệ tử
 
Tham gia ngày: Jul 2008
Bài gửi: 3
:
Exclamation Xin hỏi về ngắt timer của pic16f877a

Mấy ngày nay em trầy trật hoài với cái ngắt timer trong pic. Em không biết là mình cho chạy timer bằng cách nào? (timer0) (trong C có hàm set_timer0()). Trong chương trình phục vụ ngắt mình có dừng timer lại như trong 8051 không?
Đoạn code này em đánh dựa trên hướng dẫn của mấy bài trên diễn đàn. Lúc đầu led sáng số 0, rồi tăng dần khi timer tràn. Trong code em chưa tính thời gian tràn( cho nó nhảy trước rồi tính toán sau), và sau mấy ngày kiếm cách set_timer0() bằng ASM chương trình này chắp vá lung tung rồi. Em mong các tiền bối cảm phiền chỉ dùm em LÀM SAO CHO TIMER0 chạy?
;xuat ra port D
;a la MSB noi voi PD.7
Code:
TITLE "TIMER0"
PROCESSOR 	P16F877A
INCLUDE <P16F877A.INC>
__CONFIG  _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF & _LVP_OFF & _CPD_OFF 

ORG		0x020
	V_DONVI	EQU 0x20
	VDEM	EQU	0x25
	PCLATH_save	EQU	0x26
	W_save	EQU	0x27
	STATUS_save	EQU	0x28
	FSR_save	EQU	0x29
	
ORG		0x0000
GOTO	MAIN
ORG		0x0004
GOTO 	ISR_TMR0

ORG		0x0005
MAIN
;dat cau hinh xuat nhap
;----------------------------------------------
BCF  STATUS,RP1 
 BSF  STATUS,RP0  ; chon BANK1 
  
 MOVLW 0x00   
 MOVWF TRISD   
 MOVLW b'11111100' 
 MOVWF TRISB   ; 
  
  

;----------------------------------------------
BCF  STATUS,RP0  ; chon BANK0	
movlw	0xff
movfw	VDEM
movlw	0x00
movwf	V_DONVI
call HIENTHI

CLRF  TMR0   
CLRF    INTCON    
BSF  STATUS,RP0   
MOVWF  OPTION_REG      
           
BCF  STATUS,RP0   
BSF    INTCON,TMR0IE   
BSF  INTCON,GIE  

goto $
;END MAIN
;--------------------------------------------------
;chuong trinh phuc vu ngat cua timer 0
;--------------------------------------------------
ISR_TMR0
;doan chuong trinh bat buoc khi di vao ngat
MOVWF W_save 
 SWAPF STATUS,W 
 CLRF  STATUS 
 MOVWF STATUS_save 
 MOVF  PCLATH,W 
 MOVWF PCLATH_save 
 CLRF  PCLATH 
 MOVF  FSR,W 
 MOVWF FSR_save 
 
 BTFSS   INTCON,TMR0IF   
 GOTO  EXIT1  
   
 BCF    INTCON,TMR0IF    
;---------------------------------------------------
decfsz	VDEM,f
goto EXIT1
movlw	0xff
movfw	VDEM
banksel	V_DONVI
incf	V_DONVI,f
call HIENTHI
EXIT1
;------------------------------------------
 MOVF  FSR_save,W 
 MOVWF FSR 
 MOVF  PCLATH_save,W 
 MOVWF PCLATH 
 SWAPF STATUS_save,W 
 MOVWF STATUS 
 SWAPF W_save,1 
 SWAPF W_save,0 
 RETFIE 
;---------------------------------------------------
;chuong trinh con hien thi
;---------------------------------------------------
HIENTHI

banksel	V_DONVI
movwf	V_DONVI
movfw	V_DONVI
call	TABLE
banksel	PORTD
movwf	PORTD

RETURN
;---------------------------------------------------
;Xay dung bang
;---------------------------------------------------
ORG	0x80
TABLE
addwf	PCL,F
retlw	0x03	;so 0
retlw	0x9f	;so 1
retlw	0x25	;so 2
retlw	0x0d	;so 3
retlw	0x99	;so 4
retlw	0x49	;so 5
retlw	0x41	;so 6
retlw	0x1f	;so 7
retlw	0x01	;so 8
retlw	0x09	;so 9
END

thay đổi nội dung bởi: namqn, 10-07-2009 lúc 06:07 PM. Lý do: định dạng code
cancel vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-07-2009, 11:29 AM   #2
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
Question

Khi bạn nạp 1 giá tri vào thanh ghi OPTION_REG thì timer0 bắt đầu chạy, bạn không thể kiếm soát việc Start, Stop của nó được. Nói chính xác là timer0 chạy song song với chương trình.
Đây là bài đơn giản tôi viết để test ngắt Timer0, hy vọng giúp ích cho bạn
Code:
	TITLE 		" nhap nhay rb0_dung timer0 "				
	PROCESSOR	P16F877A
	INCLUDE 	<P16F877A.inc>
		__CONFIG   	_CP_OFF	& _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF &_BODEN_OFF
;============phan dat bien=============================
			COUNT	EQU	0X23
;===========Phan chuong trình chính======================
			ORG	0x00
			GOTO	MAIN
			ORG	0X04		; dia chi vector ngat, tat ca ngat chi co dia chi nay
			GOTO	NGAT		
			ORG	0x0005
MAIN
	MOVLW		.56		; nap 56 vao de timer0 dem dc 200 lan thi tran
	MOVWF		TMR0
	BANKSEL		TRISB
	CLRF		TRISB
	MOVLW		B'10100000'	; cho phep ngat GLOBAL, ngat TIMER0
	MOVWF		INTCON
	MOVLW		B'00000111' ; che do chia 256 , tuc la 256 ckm thi timer0 dem len 1
	MOVWF		OPTION_REG	; nap vao OPTION, timer0 bat dau chay
	BANKSEL		PORTB
	CLRF		PORTB
	MOVLW		.20    ; viec tang giam thoi gian la do gia tri nap trong COUNT
	MOVWF		COUNT
	GOTO		$		; cho ngat o day
NGAT
	BTFSS		INTCON,T0IF ; Kiem tra xe co phai ngat xay ra la ngat timer_0 hay khong
	GOTO		THOAT_NGAT	; khong phai ngat timer_0 thi thoat
	BCF			INTCON,7	; ko cho phep ngat nao xay ra nua
						; ko can thiet vi khi ngat xay ra, c.trinh tu dong 
							; xoa bit GIE ( ngat toan cuc).
	DECFSZ		COUNT,1		; giam COUNT de duoc 20 lan ngat
	GOTO		THOAT_NGAT	; chua du thi thoat
	MOVLW		.20
	MOVWF		COUNT
;########## doan c.trinh set / clear RB0.############
	BTFSS		PORTB,0	
	GOTO		SET_RB0
CLR_RB0
	BCF			PORTB,0
	GOTO		THOAT_NGAT	
SET_RB0
	BSF			PORTB,0
;######### ket thuc doan c.trinh set / clear RB0 ###########
THOAT_NGAT		
	
	MOVLW		.56			; nap lai gia tri ban dau cho timer 0
	MOVWF		TMR0
	BCF			INTCON,2	; xoa co tran timer 0 (cung la co bao ngat)
							; phai xoa co nay de co ngat tiep theo xay ra
						
	RETFIE					; lenh nay cung set bit GIE ( ngat toan cuc).					
END

thay đổi nội dung bởi: phandinh, 12-07-2009 lúc 11:38 AM. Lý do: dinh dang lai code
phandinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-07-2009, 05:29 PM   #3
cancel
Nhập môn đệ tử
 
Tham gia ngày: Jul 2008
Bài gửi: 3
:
timer0

thankiều sư huynh phandinh. Tui đã làm lại theo hướng dẫn của sư huynh và kết quả là chạy ngon lành!
cancel vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-05-2010, 10:22 AM   #4
vinhlec4
Banned
 
Tham gia ngày: Dec 2009
Bài gửi: 65
:
cho e hoi may huynh ty. sao vd tren khong thấy mấy a chon bank? e thấy các vd khac diều chon bank truoc khi thao tac lệnh TRISA.....doi voi pic 18f4331 co nhiều bank thế thì nen chon sau a?
vinhlec4 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2010, 07:43 PM   #5
thangkho89
Nhập môn đệ tử
 
Tham gia ngày: Feb 2010
Bài gửi: 7
:
em dang lam bai tap lon ve dong ho dem thoi gian thuc dung pic 16f877a lap trinh bang asm
em nghien cuu mai ma khong hieu timer1
bac nao hieu chi e voi
cam on cac bac nhieu
thangkho89 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-05-2010, 11:41 PM   #6
DSP
Đệ tử 1 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 17
:
Trích:
Nguyên văn bởi vinhlec4 View Post
cho e hoi may huynh ty. sao vd tren khong thấy mấy a chon bank? e thấy các vd khac diều chon bank truoc khi thao tac lệnh TRISA.....doi voi pic 18f4331 co nhiều bank thế thì nen chon sau a?
tất nhiên khi truy cập và xử lý các thanh ghi, bạn phải dùng lệnh chọn bank chứa các thanh ghi đó.
chẳng hạn với pic16:
-có thể dùng lệnh banksel thanhghi, để truy cập trực tiếp vào vùng bank chứa thanh ghi đó
-có thể thao tác với 2 bit rp0, rp1 của thanh ghi STATUS để chọn bank. bạn xem datasheet sẽ rõ.
DSP vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 08:30 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam