Giáo trình hoàn chỉnh vi điều khiển PIC 14 - Pdf 17

BTFSC STATUS,Z
GOTO bang_10

MOVLW 0x0B
XORWF xx,0
BTFSC STATUS,Z
GOTO bang_11

MOVLW 0x0C
XORWF xx,0
BTFSC STATUS,Z
GOTO bang_12

MOVLW 0x0D
XORWF xx,0
BTFSC STATUS,Z
GOTO bang_13

MOVLW 0x0E
XORWF xx,0
BTFSC STATUS,Z
GOTO bang_14

MOVLW 0x0F
XORWF xx,0
BTFSC STATUS,Z
GOTO bang_15
nho_hon_10 ; xử lí trường hợp nhỏ hơn 10
MOVLW 0x00 ; bit 0 của thanh ghi xx1 mang giá trò 0
MOVWF xx1
MOVF xx,0 ; lưu giá trò sau chuyển đổi chứa trong

RETLW 0xC0
RETLW 0xF9
RETLW 0xA4
RETLW 0xB0
RETLW 0x99
RETLW 0x92
RETLW 0x82
RETLW 0xF8
RETLW 0x80
RETLW 0x90
delay_1ms ; chương trình con tạo thời gian delay 1ms
MOVLW d'1'
MOVWF count1
d1 MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
END

Trong chương trình con “chuyen_ma”, ta lần lượt so sánh giá trò sau khi tách từ thanh
ghi “díplay_reg” thành hàng chục (chứa trong thanh ghi “hang_chuc”) và hàng đơn vò (chứa
trong thanh ghi “hang_don_vi”) so sánh với từng giá trò từ 0 đến 15. Nếu số cần chuyển mã

ngưng công việc đang làm để tiến hành các thao tác mà ngắt đó qui đònh thông qua chương
trình ngắt. Tín hiệu điều khiển này được báo hiệu bởi cờ ngắt (tương ứng với chuông điện
thoại ở ví dụ trên) và phải được ta cho phép trước đó thông qua các bit điều khiển cho phép
hoặc không cho phép ngắt. Một chương trình ngắt thông thường sẽ được tách riêng với
chương trình chính để bảo đảm tính độc lập của chương trình ngắt.

Đối với vi điều khiển PIC16F877A, khi một ngắt (đã được cho phép trước đó) xảy ra
thì “phản ứng” của nó là quay về đòa chỉ 0004h và thực hiện các lệnh bắt đầu tại đòa chỉ này.
Thông thường đối với chương trình viết cho vi điều khiển PIC, chương trình ngắt sẽ được đặt
tại đây và chương trình chính sẽ được bắt đầu ở một đòa chỉ cách đó một đoạn “an toàn” sao
cho chương trình chính và chương trình ngắt không bi chồng lên nhau. Nếu ta sử dụng trình
biên dòch MPLAB, trình biên dòch sẽ báo lỗi khi hiện tượng trên xảy ra và ta có thể khắc
phục bằng cách dời chương trình chính đi một đoạn xa hơn.
Một điểm cần lưu ý nữa là trong quá trình thực hiện chương trình ngắt, nội dung của
một số thanh ghi quan trọng có khả năng bò thay đổi (thanh ghi W chẳng hạn). Do đó trước
khi thực hiện chương trình ngắt ta cần thực hiện một thao tác là “cất” một số thanh ghi quan
trọng vào một vài ô nhớ nào đó và phải trả lại giá trò ban đầu cho các thanh ghi đó trước khi
thoát khỏi chương trình ngắt bằng lệnh RETFIE.
Nếu sử dụng trình biên dòch MPLAB, cấu trúc chương trình này đã được viết sẵn, ta
chỉ việc đưa chương trình ngắt và chương trình chính vào các vò trí thích hợp được chú thích
trong chương trình, tuy nhiên dựa vào các nhận đònh như trên ta hoàn toàn có thể tự đònh ra
một câú trúc chương trình cho riêng mình như sau:

;
; Một số thông tin cần ghi chú về chương trình
;
TITLE "tên chương trình"
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &

; Nếu thay đổi chương trình sẽ chạy không đúng

ORG 0X0004
;
; Bắt đầu chương trình ngắt
; Đoạn chương trình bắt buộc và không được thay đổi
; có tác dụng lưu lại một số thanh ghi quan trọng
;
MOVWF W_SAVE ; W_SAVE(bank unknown!) = W
SWAPF STATUS,W
CLRF STATUS ; force bank 0 for remainder of handler
MOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS )
; STATUS = 0
MOVF PCLATH,W
MOVWF PCH_SV ; PCH_SV = PCLATH
CLRF PCLATH ; PCLATH = 0
MOVF FSR,W
MOVWF FSR_SV ; FSR_SV = FSR
; 12 cycles from interrupt to here!

;
; Đoạn chương trình ngắt bắt đầu tại đây
;
; Kiểm tra xem ngắt nào đã xảy ra
; Xóa cờ ngắt trước khi thực hiện các lệnh trong ngắt
; Bắt đầu các lệnh cho chương trình ngắt
;
; Kết thúc chương trình ngắt
; Đoạn chương trình bắt buộc và không được thay đổi
; có tác dụng phục hồi giá trò ban đầu cho một số thanh ghi quan trọng

; Các thao tác trong vòng lặp chính
; Các chương trình con
END

So với các chương trình trước đây thì bắt đầu từ giai đoạn này, các chương trình sẽ trở
nên phức tạp hơn về cấu trúc cũng như chức năng do có thêm chương trình ngắt. Tuy nhiên ta
sẽ dễ dàng làm quen với cấu trúc mới này sau một vài chương trình đơn giản có liên quan
đến ngắt. Ta sẽ bắt đầu với Timer và các ngắt của Timer.

4.5 TIMER VÀ ỨNG DỤNG

Như ta đã biết PIC16F877A có 3 bộ đònh thời là Timer0, Timer1 và Timer2. Mỗi
Timer có một cấu trúc và chức năng riêng tùy thuộc vào mục đích sử dụng. Có thể phân chia
một cách tương đối mục đích sử dụng của một Timer như sau:
Tác dụng đònh thời (Timing): các Timer sẽ sử dụng xung clock đồng bộ được
cung cấp bởi oscillator của vi điều khiển hoặc từ một oscillator cố đònh RC0/T1OSO/T1CKI
và RC1/T1OSICCP2 đối với Timer1. Giá trò đếm chứa trong thanh ghi của các Timer sẽ tăng
tuần tự sau một khoảng thời gian tuần tự được đònh trước dựa vào các thông số của prescaler,
postscaler, chu kì lệnh và các giá trò đònh trước được đưa vào các thanh ghi chứa giá trò đếm
của các Timer. Dây cũng là lí do tại sao ta nói Timer có tác dụng đònh thời vì dựa vào giá trò
đếm của các Timer, ta có thể xác đònh một cách tương đối chính xác thời gian thực.
Tác dụng đếm (Counting): các Timer sẽ lấy xung đếm từ bên ngoài. Các xung
đếm này có tác dụng phản ánh một hiện tượng nào đó từ thế giới bên ngoài và thông qua
việc đếm các xung clock đó, ta có thể xác đònh được số lần một hiện tượng nào đó xảy ra, từ
đó ấn đònh các thao tác tương ứng đối với hiện tượng đó.

Thông thường các thao tác đối với Timer dựa vào các ngắt và chương trình ngắt. Ta
cần xem lại cấu trúc một chương trình ngắt được trình bày ở phần trước để quá trình viết
chương trình cho Timer trở nên thuận lợi hơn. Bên cạnh đó cách thiết lập các chế độ hoạt
động đối với mỗi Timer cũng khác nhau. Vấn đề này sẽ được trình bày cụ thể trong từng

; 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


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status