TIMER VÀ HOẠT ĐỘNG ĐỊNH THỜ

Một phần của tài liệu TÀI LIỆU VI điều KHIỂN PIC 16f877a (Trang 127 - 150)

CHƯƠN G4 MỘT SỐ ỨNG DỤNG CỤ THỂ CỦA PIC16F877A

4.5.1 TIMER VÀ HOẠT ĐỘNG ĐỊNH THỜ

Trong phần này ta sẽ làm bước đầu làm quen với các Timer của vi điều khiển PIC16F877A và các thao tác cơ bản đối với các Timer, bao gồm thao tác khởi tạo và xử lí ngắt. Để cụ thể hơn ta sẽ đi sâu vào ứng dụng sau:

Ứng dụng 4.7: Hiển thị các giá trị định thời của Timer ra LED 7 đoạn.

Ứng dụng này được phát triển dựa trên ứng dụng 4.6 về hiển thị trên LED 7 đoạn. Ở ứng dụng 4.6 ta đã làm quen với các thao tác cơ bản đối với LED 7 đoạn. Trong ứng dụng này ta sẽ dùng các Timer để hiển thị các giá trị tăng dần từ 0 đến 99 sau một khoảng thời

gian định trước trên 2 LED hàng chục và hàng đơn vị. Cấu trúc phần cứng vẫn không có gì thay đổi, tuy nhiên về chương trình sẽ có những thay đổi đáng kể.

Trước hết là giải thuật cho ứng dụng trên. Ta sẽ khởi tạo Timer để hình thành thời gian delay cố định. Thời gian delay sẽ kết thúc bằng một tín hiệu từ ngắt Timer, chương trình ngắt có nhiệm vụ cập nhật giá trị đếm mỗi khi ngắt xảy ra, chương trình chính có tác dụng hiển thị các giá trị đã được cập nhật ra LED 7 đoạn. Trước tiên ta sẽ sử dụng Timer0 cho ứng dụng trên và chương trình cụ thể như sau:

;--- ; Ghi chú về chương trình

;--- ; Chương trình 4.5.1

; Chương trình hiển thị số đếm trên hai LED 7 đoạn theo thứ tự tăng dần ; Timer sử dụng: Timer2

;--- ; Khai báo vi điều khiển

;--- processor 16f877a

include <p16f877a.inc>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

; --- ; Khai báo biến

;--- count1 EQU 0x20 ; Các thanh ghi sử dụng cho chương counta EQU 0x21 ; trình delay

countb EQU 0x22

hang_don_vi EQU 0x23 ; Các thanh ghi chứa giá trị cần hang_chuc EQU 0x24 ; hiển thị ra LED 7 đoạn

W_save EQU 0x25 ; Các thanh ghi dùng để cất các PCLATH_save EQU 0x26 ; thanh ghi quan trọng khi thưc thi

STATUS_save EQU 0x27 ; chương trình ngắt FSR_save EQU 0x28 ;--- ; Chương trình ngắt ;--- ORG 0x0004 GOTO ISR ISR

;--- ; Đoạn chương trình bắt buộc đầu chương trình ngắt

;--- 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 ; Kiểm tra cờ ngắt Timer0

GOTO exit_int ; Nếu cờ ngắt chưa được set, thoát khỏi ; chương trình ngắt

BCF INTCON,TMR0IF ; nếu cờ ngắt đã được set, xóa cờ ngắt để ; cho phép nhận biết thời điểm tiếp theo

; xảy ra ngắt

;--- ; Các thao tác chính của chương trình ngắt

;--- INCF hang_don_vi,1 ; tăng hàng đơn vị

MOVLW 0x0A

XORWF hang_don_vi,0 ; so sánh hàng đơn vị với 10 BTFSS STATUS,Z

GOTO exit_int ; thoát chương trình ngắt nếu chưa bằng 10 CLRF hang_don_vi ; nếu bằng 10, xóa hàng đơn vị

INCF hang_chuc,1 ; tăng hàng chục

MOVLW 0x0A

XORWF hang_chuc,0 ; so sánh hàng chục với 10 BTFSS STATUS,Z

GOTO exit_int ; thoát chương trình ngắt nếu chưa bằng 10 CLRF hang_chuc ; nếu bằng 10, xóa hàng chục, bắt đầu đếm ; lại từ giá trị 00

GOTO exit_int ; thoát chương trình ngắt

;--- ; Đoạn chương trình bắt buộc trước khi thoát khỏi chương trình ngắt

;--- exit_int

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 ;--- ; Kết thúc chương trình ngắt ;--- ORG 0x0000 GOTO start ORG 0x050 ;--- ; Bắt đầu chương trình chính ;--- start ;--- ; Khởi tạo các PORT

;--- BCF STATUS,RP1

BSF STATUS,RP0 ; Chọn BANK1 MOVLW 0x00

MOVWF TRISD ; PORTD <- output MOVLW b'11111100'

MOVWF TRISB ; PORTB<1:0> <- output BCF STATUS,RP0 ; chọn BANK0

CLRF PORTD

MOVLW b'00000011' ; tắt các LED hàng chục và hàng đơn vị MOVWF PORTB

;--- ; Khởi tạo Timer0

;---

CLRF TMR0 ; xóa thanh ghi TMR0 CLRF INTCON ; xóa thanh ghi INTCON BSF STATUS,RP0 ; chọn BANK0

MOVLW b'10000001' ; tắt chức năng điện trở kéo lên ở PORTB, MOVWF OPTION_REG ; chọn xung đếm là xung lệnh, gán

; prescaler cho Timer0 và chọn tỉ số chia ; tần số prescaler là 1:4

BCF STATUS,RP0 ; chọn BANK0 BSF INTCON,TMR0IE ; cho phép ngắt Timer0 BSF INTCON,PEIE ; cho phép ngắt ngoại vi BSF INTCON,GIE ; cho phép toàn bộ các ngắt ;---

; Khởi tạo các biến

;---

Một phần của tài liệu TÀI LIỆU VI điều KHIỂN PIC 16f877a (Trang 127 - 150)

Tải bản đầy đủ (PDF)

(177 trang)