Chapter7 Timer&ADC GT V2q tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các lĩnh vực ki...
Trang 1CHƯƠNG 7: BỘ ĐỊNH THỜI/BỘ ĐẾM, BỘ BIẾN ĐỔI TƯƠNG
TỰ SANG SỐ, BỘ SO SÁNH
Mục tiêu chính của chương này đối với người tham khảo:
Hiểu rõ cấu trúc và hoạt động các bộ định thời/bộ đếm
Hiểu rõ cấu trúc và hoạt động của bộ chuyển đổi tương tự sang số
Hiểu rõ cấu trúc và hoạt động của bộ so sánh
Thiết kế và lập trình được các ứng dụng dùng bộ định thời
Thiết kế và lập trình được các ứng dụng dùng bộ đếm
Thiết kế và lập trình được các ứng dụng dùng bộ chuyển đổi tương tự sang số
Khối Timer0 được tích hợp các tính năng sau:
− Lựa chọn chế độ hoạt động bằng phần mềm: timer hay counter, chế độ 8-bit hay 16-bit
− Có các thanh ghi có thể đọc và ghi
− Bộ chia trước tần số (prescaler) 8-bit dành riêng có thể lập trình được bằng phần mềm
− Có thể chọn nguồn xung clock (clock nội hay ngoại)
− Có thể chọn sườn kích cho nguồn xung clock ngoại
− Có hoạt động ngắt tràn
Hầu hết các bộ định thời trong PIC18 có độ rộng 16-bit Vì PIC18 có kiến trúc 8-bit,
mỗi bộ định thời 8-bit được truy xuất bằng hai thanh ghi riêng gồm byte thấp (TMRxL) và byte cao (TMRxH), chẳng hạn hình 7.1
Hình 7.1: thanh ghi TMR0 7.1.1 Thanh ghi điều khiển TIMER0 (T0CON)
Hình 7.2: thanh ghi T0CON
Trang 2Ghi chú:
R: bit cho phép đọc
W: bit cho phép ghi
U: bit không sử dụng, xem như là bit ‘0’
‘0’: bit được xóa
‘1’: bit được set
x: bit không xác định trạng thái
Bit 7 – TMR0ON: bit điều khiển Timer0 On/Off
1 = Enable Timer0
0 = Stop Timer0
Bit 6 – T08BIT: bit điều khiển Timer0 là timer 8-bit/16-bit
1 = Timer0 được cấu hình ở chế độ timer/counter 8-bit
0 = Timer0 được cấu hình ở chế độ timer/counter 16-bit
Bit 5 – T0CS: bit chọn nguồn xung Timer0
1 = Theo sự chuyển trạng thái trên chân T0CKI
0 = Theo chu kỳ xung clock nội (CLKO)
Bit 4 – T0SE: bit chọn sườn kích cho Timer0
1 = Timer tăng khi chân T0CKI chuyển từ high xuống low
0 = Timer tăng khi chân T0CKI chuyển từ low lên high
Bit 3 – PSA: bit thiết lập cho prescaler Timer0
1 = Prescaler của Timer0 không được gán, ngõ vào clock của Timer0 bỏ qua prescaler
0 = Prescaler của Timer0 được gán, ngõ vào clock của Timer0 được cấp từ ngõ ra của prescaler
Bit 2-0 – T0PS2:T0PS0: bit chọn prescaler của Timer0
111 = 1:256 giá trị của prescaler
110 = 1:128 giá trị của prescaler
101 = 1:64 giá trị của prescaler
100 = 1:32 giá trị của prescaler
011 = 1:16 giá trị của prescaler
010 = 1:8 giá trị của prescaler
Trang 3001 = 1:4 giá trị của prescaler
000 = 1:2 giá trị của prescaler
Ví dụ 7.1: xác định giá trị của T0CON nếu chúng ta muốn lập trình Timer0 ở chế độ 16-bit,
không dùng prescaler PIC18 có dao động FOSC/4 để tạo nguồn xung clock, gia tăng theo cạnh lên của xung
Giải pháp:
Đặt thanh ghi T0CON như sau :
T0CON = 0b00001000; //TMR0 : 16-bit, FOSC/4, no prescaler Timer0 off
Ví dụ 7.2: tính tần số xung của bộ định thời và chu kỳ của nó khi PIC18 sử dụng các thạch
anh sau đây Giả sử không sử dụng prescaler
7.1.2 Hoạt động của TIMER0
Timer0 có thể hoạt động như là một timer hoặc một counter, chế độ hoạt động được
chọn bằng cách xoá bit T0CS (T0CON<5>) Ở chế độ timer, Timer0 sẽ mặc định tăng lên
sau mỗi chu kỳ xung clock nếu giá trị của prescaler không được chọn Nếu thanh ghi TMR0 đang được ghi, hoạt động của Timer0 sẽ bị cấm trong 2 chu kỳ lệnh
Chế độ counter được chọn bằng cách set bit T0CS (T0CS = 1) ở chế độ này, Timer0 sẽ
tăng theo trạng thái sườn lên hoặc sườn xuống của chân RA4/T0CKI Sườn kích cho hoạt
động của counter được xác định thông qua bit T0SE (T0CON<4>)
Xung clock ngoại có thể được sử dụng để điều khiển Timer0, tuy nhiên nó bắt buộc phải tương thích với một số điều kiện để đảm bảo rằng nguồn xung clock này có thể đồng bộ được
với pha của xung clock nội (TOSC) Luôn có một khoảng thời gian delay giữa quá trình đồng
bộ nguồn xung và lúc timer/counter bắt đầu hoạt động
7.1.3 Đọc và ghi Timer0 ở chế độ 16-bit
TMR0H không phải là byte cao thực sự lưu giá trị của Time0 trong chế độ 16-bit, có thể xem nó như là một bộ đệm của byte cao thực của Timer0 không thể đọc hay ghi một cách trực tiếp Nội dung của TMR0H được cập nhật từ nội dung của byte cao của Timer0 trong
Trang 4suốt quá trình đọc thanh ghi TMR0L Điều này cho phép đọc tất cả 16 bit của Timer0 mà không phải kiểm tra xem có thể đọc được byte thấp và byte cao này hay không
Tương tự cho quá trình ghi vào byte cao của Timer0 cũng phải được thực hiện thông qua thanh ghi đệm TMR0H Byte cao thực của Timer0 sẽ được cập nhật nội dung của TMR0H khi thanh ghi TMR0L được ghi Điều này cho phép 16 bit của Timer0 luôn được cập nhật ngay lập tức
Hình 7.3: sơ đồ khối của Timer0 (chế độ 8-bit)
Hình 7.4: sơ đồ khối của Timer0 (chế độ 16-bit)
Ví dụ 7.3: trong chương trình sau, sẽ tạo ra sóng vuông ở RB.5 Timer0 được sử dụng để tạo
ra delay (time delay)
Giải pháp:
bcf TRISB, 5 ; RB.5 as an output
movlw 0x08 ; Timer0, 16-bit, int clock, no prescaler
movwf T0CON ; Load T0CON
movwf TMR0H ;
Trang 5movlw 0xF2 ; TMR0L = 0xF2
movwf TMR0L ; bcf INTCON, TMR0IF; Xoá TMR0 interrupt flag bit
btg PORTB, 5 ; Toggle PB5
AGAIN btfss INTCON, TMR0IF; Monitor TMR0 flag until
bra AGAIN ; it rolls over
bcf T0CON, TMR0ON; Stop TMR0
Timer0 bắt đầu hoạt động bằng lệnh “bsf T0CON, TMR0ON”
Timer0 đếm lên theo mỗi xung clock Bộ định thời sẽ đếm lên từ 0xFFF2 …0xFFFF Thêm một xung nữa thì giá trị thanh ghi Timer0 là 0x0000 sẽ làm bit cờ TMR0IF =
1 Tại thời điểm này, lệnh “btfss INTCON, TMR0IF” sẽ bỏ qua lệnh “bra AGAIN”
Timer0 dừng lại bằng lệnh “bcf T0CON, TMR0ON”, và quá trình được lập lại
TMR0IF = 0 TMR0IF = 0 TMR0IF = 0
0xFFFF TMR0IF = 0
0x0000 TMR0IF = 1
Hình 7.5: trạng thái các bit cờ TMR0IF của ví dụ 7.3
Ví dụ 7.4: trong ví dụ 7.3, hãy tính thời gian delay của timer Giả sử dùng XTAL = 10 MHz Giải pháp:
Timer hoạt động có tần số xung clock fCK = fOSC/4 = 2.5 MHz TCK = 0.4 µs Mặt khác, Timer0 đếm lên mỗi 0.4 µs sẽ tạo ra độ trễ:
Trang 6;====> delay using Timer0
Trang 7HERE movlw 0xB8
movlw 0x3E
bsf T0CON, TMR0ON; Start TMR0
AGAIN btfss INTCON, TMR0IF; Monitor TMR0 flag until
bra AGAIN ; it rolls over
bcf T0CON, TMR0ON; Stop TMR0
bcf INTCON, TMR0IF; Xoá TMR0 flag
Giải pháp:
(0xFFFF – 0xB83E + 1) = 0x47C2 = 18,370
Timer0 tạo ra thời gian delay = 18,370 x 0.4 µs = 7.348 ms
Ví dụ 7.7: tính tần số của sóng vuông được tạo bởi đoạn chương trình sau nếu biết XTAL =
10 MHz Lưu ý, chỉ tính các lệnh bên trong vòng
movwf TMR0H ; TMR0H = 0x76
movlw 0x34 movwf TMR0L ; TMR0L = 0x34
bcf INTCON,TMR0IF; Xoá interrupt flag
call DELAY
bra HERE ; Load TH & TL again
Trang 8;===> delay using Timer0
DELAY bsf T0CON,TMR0ON; Start TMR0
AGAIN btfss INTCON,TMR0IF ; Monitor TMR0 flag until
bra AGAIN ; it rolls over
Cách tìm giá trị được nạp vào trong timer
Giả sử rằng chúng ta biết giá trị thực của độ delay cho timer mà chúng ta cần Để tính toán giá trị được nạp vào các thanh ghi TMR0L và TMR0H, giả sử dùng XTAL = 10 MHz cho họ PIC18 và không sử dụng prescale, chúng ta làm theo trình tự từng bước sau:
(1) Chia độ trễ thời gian mong muốn cho 0.4 µs
(2) Thực hiện (65536 – n), với n là giá trị thập phân trong bước 1
(3) Chuyển đổi kết quả trong bước 2 sang giá trị hex là 0xhhll, 0xhhll là giá trị ban đầu phải nạp vào cho các thanh ghi của timer
(4) Đặt TMR0L = 0xll và TMR0H = 0xhh
Các bước lập trình cho Timer0 hoạt động chế độ 8-bit
Trình tự thực hiện theo các bước sau:
(1) Cấu hình thanh ghi T0CON để chỉ định Timer0 hoạt động 8-bit
(2) Nạp giá trị đếm ban đầu cho thanh ghi TMR0L
(3) Bắt đầu đếm timer
(4) Kiểm tra cờ TMR0IF, khi báo tràn thì TMR0IF = 1
(5) Ngừng đếm timer bằng lệnh “bcf T0CON, TMR0ON”
(6) Xoá bit cờ TMR0IF
(7) Lập lại vòng lặp từ bước 2 để nạp lại giá trị cho TMR0L
Trang 97.1.4 Lập trình bộ đếm
Bit TOCS trong thanh ghi T0CON
Bit TOCS quyết định nguồn cấp xung clock cho timer Nếu TOCS = 0, timer sẽ lấy xung
từ dao động thạch anh được gắn vào hai chân OSC1 và OSC2 (FOSC/4) Ngược lại, TOCS =
1, timer sẽ được sử dụng là bộ đếm và nó nhận xung từ bên ngoài PIC18 cung cấp Vì thế, khi
TOCS = 1, bộ đếm sẽ thực hiện đếm lên theo mỗi xung nhận được từ chân RA4 (chân thứ 6 của PIC18) Chân này là T0CKI (Timer0 Clock Input) Tương tự đối với Timer1, chân nhận xung sẽ ở RC0 (chân thứ 15 của PIC18)
Ví dụ 7.8: xác định giá trị cho thanh ghi T0CON để Timer0 hoạt động là bộ đếm 8-bit, không
dùng prescaler Sử dụng nguồn clock ngoài và đếm lên theo cạnh lên của xung
Giải pháp:
T0CON = 0110 1000
Ví dụ 7.9: từ hình 7.6, viết chương trình để Conuter0 ở 8-bit đếm các xung và hiển thị trạng
thái đếm của TMR0L ra các LED trên PORTB
Hình 7.6: sơ đồ kết nối của ví dụ 7.9 Giải pháp:
bsf TRISA, RA4 ; RA4 as an input for clock
clrf TRISB ; PORB as an output
movlw 0x68 ; TMR0, 8-bit, ext clk, no prescaler
movwf T0CON ; Load to T0CON
movwf TMR0L ; TMR0L = 0x00
bcf INTCON,TMR0IF ; Cleat flag bit
bsf T0CON,TMR0ON ; Start TMR0
AGAIN movff TMR0L, PORTB ; Display the count on PORTB
btfss INTCON, TMR0IF; Monitor flag bit until bra AGAIN ; it rolls over
bcf T0CON, TMR0ON; Stop TMR0
Trang 10goto HERE end
7.1.5 Bộ ấn định hệ số chia Prescaler
Prescaler là một bộ đếm counter 8-bit nằm trong khối Timer0, nó không thể được ghi
hoặc đọc một cách trực tiếp, giá trị của prescaler được thiết lập bởi các bit PSA và
T0PS2:T0PS0 (T0CON<3:0>), các bit này có chức năng xác định giá trị gán cho prescaler
và tỷ số chia của bộ đếm
Xóa bit PSA sẽ gán giá trị của prescaler đến khối Timer0, giá trị của prescaler được chọn sẽ tăng theo hệ số 2 với các tỷ lệ 1:2 đến 1:256 Khi đó, tất cả các lệnh thực hiện hoạt
động ghi vào thanh ghi TMR0 (CLRF TMR0, MOVWF, MR0, BSF TMR0…) sẽ xóa giá trị
đếm của prescaler, tuy nhiên sẽ không làm thay đổi giá trị gán trước cho prescaler
7.1.6 Ngắt Timer0
Ngắt TMR0 xảy ra khi thanh ghi TMR0 bị tràn từ giá trị FFh về 00h ở chế độ 8-bit, hoặc
từ FFFFh tới 0000h ở chế độ 16-bit Khi có tràn Timer0, bit cờ TMR0IF sẽ được set Ngắt
Timer0 có thể vô hiệu bằng cách xoá bit TMR0IE (INTCON<5>) Trước khi cho phép ngắt
Timer0 trở lại, bit cờ TMR0IF phải được xoá bằng phần mềm
Bởi vì Timer0 bị tắt ở chế độ Sleep, do đó ngắt TMR0 không thể làm cho vi xử lý hoạt động trở lại từ trạng thái Sleep được
Bảng 7.1: các thanh ghi có liên kết với Timer0 Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 TMR0L Thanh ghi byte thấp của TMR0
TMR0H Thanh ghi byte cao của TMR0
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
T0CON TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
TRISA - TRISA6 (1) TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
Chú thích:
“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer0
(1) RA6 được cấu hình làm chân port trong các kiểu dao động sơ cấp Khi chân port bị vô hiệu, tất cả các bit liên kết đọc bằng 0
Khối Timer1 (timer/counter) tích hợp các tính năng sau:
− Lựa chọn chế độ hoạt động bằng phần mềm: timer 16-bit hay counter 16-bit
− Có các thanh ghi 8-bit có thể đọc và ghi (TMR1H và TMR1L)
− Có thể chọn nguồn xung clock (clock nội hay ngoại) với các tùy chọn: xung clock của
VĐK hoặc bộ dao động nội của Timer1
− Có hoạt động ngắt khi tràn
Trang 11− Tích hợp khối Reset theo bộ kích khởi từ các sự kiện đặc biệt (Special Event Trigger) của khối CCP (Capture/Compare/PWM)
− Cờ báo trạng thái xung clock của VĐK (T1RUN)
7.2.1 Thanh ghi điều khiển TIMER1 (T1CON)
Hình 7.7: thanh ghi điều khiển T1CON
Bit 7 – RD16: bit cho phép chế độ ghi/đọc 16-bit
1 = Cho phép ghi/đọc theo số 16-bit vào thanh ghi của Timer1
0 = Cho phép ghi/đọc theo 2 lần số 8-bit vào thanh ghi của Timer1
Bit 6 – T1RUN: bit trạng thái xung clock hệ thống của Timer1
1 = Xung clock được lấy từ bộ dao động Timer1
0 = Xung clock được lấy từ nguồn khác
Bit 5-4 – T1CKPS1:T1CKPS0: bit chọn hệ số chia xung clock ngõ vào Timer1
11 = 1:8 giá trị Prescaler
10 = 1:4 giá trị Prescaler
01 = 1:2 giá trị Prescaler
00 = 1:1 giá trị Prescaler
Bit 3 – T1OSCEN: bit cho phép bộ dao động Timer1
1 = Bộ dao động Timer1 được cho phép
0 = Tắt bộ dao động Timer1
Bit 2 – 𝐓𝟏𝐒𝐘𝐍𝐂̅̅̅̅̅̅̅̅̅̅̅: bit chọn sự đồng bộ ngõ vào xung clock ngoại của Timer1
Khi TMR1CS = 1
1 = Không đồng bộ với ngõ vào xung clock ngoại
0 = Đồng bộ với ngõ vào xung clock ngoại
Khi TMR1CS = 0
Bit này được bỏ qua, Timer1 sử dụng xung clock nội
Bit 1 – TMR1CS: bit chọn nguồn xung clock Timer1
1 = xung clock ngoại từ chânRC0/T1OSO/T13CKI (theo sườn lên xung clock)
0 = Xung clock nội (FOSC/4)
Trang 12Bit 0 – TMR1ON: bit chạy Timer1
1 = cho phép chạy Timer1
0 = Dừng Timer1
7.2.2 Hoạt động của TIMER1
Timer1 có thể hoạt động theo một trong các chế độ: định thời, đếm đồng bộ và bất đồng
các chân lúc này được đọc là ‘0’
Hình 7.8: sơ đồ khối của Timer1
Trang 13Hình 7.9: sơ đồ khối của Timer1 (chế độ đọc/ghi 16-bit)
7.2.3 Đọc và ghi Timer1 ở chế độ 16-bit
Timer1 có thể được cấu hình cho phép việc đọc và ghi 16-bit (hình 7.9) Khi bit điều
khiển RD16(T1CON<7>) được set, địa chỉ của TMR1H được chỉ định đến một thanh ghi
đệm đóng vai trò như là byte cao của Timer1 Việc đọc nội dung của TMR1L sẽ lấy nội dung
từ byte cao của Timer1 đưa vào byte cao của thanh ghi đệm Điều này cho phép khả năng đọc chính xác 16-bit của Timer1 một cách đồng thời mà không phải theo thứ tự đọc byte thấp trước rồi mới đến byte cao
Việc ghi nội dung vào byte cao của Timer1 cũng được thực hiện thông qua thanh ghi
đệm TMR1H Byte cao của Timer1 sẽ được cập nhật nội dung từ byte cao thanh ghi đệm
TMR1H khi thực hiện hoạt động ghi vào TMR1L Quá trình này cho phép ghi tất cả 16 bit
vào byte cao và byte thấp của Timer1 ngay lập tức
Do byte cao của Timer1 không thể đọc hoặc ghi một cách trực tiếp ở chế độ này, do đó, tất cả hoạt dộng ghi và đọc đều thực hiện thông qua thanh ghi đệm byte cao của Timer1 Ghi
nội dung vào TMR1H sẽ không xóa giá trị prescaler của Timer1, prescaler chỉ bị xóa khi ghi nội dung vào thanh ghi TMR1L
7.2.4 Bộ dao động Timer1
Là một mạch dao động thạch anh nằm trên chip được tích hợp vào 2 chân:T1OSI (ngõ
vào) and T1OSO (ngõ ra bộ khuếch đại) Mạch này được kích hoạt bằng cách set bit cho phép bộ dao động Timer1 T1OSCEN (T1CON<3>) Bộ dao động này là một mạch công suất
thấp với tốc độ dao động thạch anh 32.768 kHz, nó vẫn hoạt động cho dù trạng thái của VĐK đang ở chế độ quản lý công suất
Trang 14Sơ đồ mạch của một bộ dao động LP điển hình được mô tả trong hình 7.10
Chú ý: Khi lập trình phải đảm bảo cung cấp một khoảng delay thích hợp cho quá trình
khởi động của bộ dao động Timer1
Hình 7.10: các linh kiện được sử dụng cho bộ dao động Timer1 LP
7.2.5 Dùng Timer1 như nguồn xung clock
Bộ dao động Timer1 cũng đóng vai trò là một nguồn xung clock ở chế độ quản lý công
suất Bằng cách set các bit chọn xung clock SCS1:SCS0 (OSCCON<1:0>) bằng ‘01’, khi đó
VĐK sẽ chuyển sang chế độ SEC_RUN, lúc này cả CPU và các ngoại vi đều được cấp xung
từ bộ dao động Timer1 Nếu xoá bit IDLEN (OSCCON<7>) và thực thi lệnh SLEEP thì
VĐK sẽ chuyển sang chế độ SEC_IDLE
Bất kể khi nào bộ dao động Timer1 vẫn còn cấp xung clock thì bit cờ báo trạng thái
xung clock hệ thống của Timer T1RUN (T1CON<6>) vẫn được set, bit này có thể được dùng
để xác định chế độ cấp xung hiện tại của VĐK Nếu chế độ giám sát xung clock được cho phép, trong trường hợp bộ dao động Timer1 bị lỗi, không thể cấp xung thì khi đó giá trị của
bit T1RUN sẽ xác định nguồn xung clock đang được cấp là từ bộ dao động Timer1 hay từ
nguồn khác
7.2.6 Tính năng Timer1 công suất thấp
Bộ dao động Timer1 có thể hoạt động ở hai mức công suất tiêu thụ riêng biệt dựa theo
cấu hình của VĐK Khi bit cấu hình LPT1OSC được set, bộ dao động Timer1 sẽ hoạt động
ở chế độ công suất thấp Khi LPT1OSC không được set, Timer1 sẽ hoạt động ở mức tiêu thụ
công suất cao hơn Công suất tiêu thụ trong từng chế độ riêng biệt là hằng số tương đối bất chấp chấp chế độ hoạt động của VĐK, cấu hình hoạt động Timer1 mặc định là chế độ có mức công suất tiêu thụ cao hơn
Khi hoạt động ở chế độ công suất thấp, Timer1có xu hướng nhạy cảm với nhiễu, nếu VĐK hoạt động môi trường có nhiễu cao sẽ tạo nên sự bất ổn định cho bộ dao động Do đó, chế độ hoạt động công suất thấp chỉ phù hợp nhất cho các ứng dụng nhiễu thấp mà trong đó yếu tố bảo toàn năng lượng là một yếu tố quan trọng cần xem xét khi thiết kế
Trang 157.2.7 Ngắt Timer1
Cặp thanh ghi TMR1 (TMR1H:TMR1L) tăng từ 0000h đến FFFFh, nếu vượt qua giá
trị FFFFh bộ đếm sẽ bị tràn và trở về 0000h, khi đó ngắt Timer1 (nếu được enable) sẽ xảy ra
và được chốt trạng thái thông qua bit cờ ngắt TMR1IF (PIR1<0>).Ngắt Timer1 có thể được phép hoặc không bằng việc đặt hay xoá bit cho phép ngắt Timer1 TMR1IE (PIE1<0>)
7.2.8 Sử dụng Timer1 làm đồng hồ thời gian thực
Bằng việc thêm một mạch dao động ngoại kiểu LP vào Timer1 sẽ cho phép sử dụng tính năng RTC vào trong các ứng dụng Sử dụng chức năng đồng hồ thời gian thực bằng cách thêm vào một dao động thạch anh nhằm tạo ra căn cứ thời gian một cách chính xác và thêm một số dòng lệnh trong chương trình điều khiển để tính toán thời gian hoạt động của đồng hồ Khi VĐK hoạt động ở chế độ SLEEP và sử dụng pin như nguồn cung cấp, lúc đó VĐK có thể hoàn toàn loại bỏ nhu cầu sử dụng linh kiện RTC rời và nguồn pin dự trữ
movlw d’12’
movwf hours bsf PIE1, TMR1IE ; Cho phép ngắt Timer1 return
Trang 16return ; không, đã đủ 60 giây
incf mins, F ; Tăng phút movlw d’59’ ; Kiểm tra được 60 phút chưa?
movwf hours
Chương trình trong ví dụ trên đưa ra cách thức đơn giản để tăng counter sau 1 giây sử dụng ngắt Timer1 Việc tăng nội dung của cặp thanh ghi TMR1 cho đến khi tràn để tạo ra ngắt và gọi chương trình con sẽ làm tăng bộ đếm giây lên từng đơn vị một Các bộ counter thêm vào cho phút và giờ cũng tăng lên khi counter trước đó tràn
Bởi vì cặp thanh ghi sử dụng là 16-bit, đếm lên đến khi tràn và trong trường hợp sử dụng xung clock 32.768 kHz sẽ mất 2 giây Do đó, để làm cho counter tràn chỉ sau 1 giây thì cần
phải nạp lại giá trị cho nó Cách đơn giản nhất là set bit MSB của TMR1H bằng lệnh BSF
Chú ý rằng thanh ghi TMR1L sẽ không bao giờ được nạp lại hay thay đổi giá trị Thực hiện
theo cách này có lẻ sẽ tạo ra lỗi tích lũy dần sau vài chu kỳ
Để phương pháp này chính xác hơn thì Timer1 phải hoạt động ở chế độ bất đồng bộ và
ngắt tràn Timer1 phải được enable (PIE1<0> = 1) như đoạn chương trình RTCinit ở trên
Đồng thời, bộ dao động Timer1 phải được kích hoạt và chạy tại mọi thời điểm
Bảng 7.2: các thanh ghi có liên kết với Timer1 Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
PIR1 SPPIF (1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE1 SPPIE (1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
IPR1 SPPIP (1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP
TMR1L Thanh ghi byte thấp của TMR1
TMR1H Thanh ghi byte cao của TMR1
T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC ̅̅̅̅̅̅̅̅̅̅̅ TMR1CS TMR1ON
Chú thích:
“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer0
Trang 17(1) Các bit này không sử dụng với VĐK 28 chân; luôn duy trì các bit này bằng 0
Khối Timer2 tích hợp các tính năng sau:
− Có các thanh ghi timer 8-bit TMR2 và các thanh ghi thời gian PR2
− Có các thanh ghi có thể đọc và ghi
− Có bộ chia trước tần số Prescaler có thể lập trình bằng phần mềm (1:1, 1:4 và 1:16)
− Có bộ chia sau tần số Postscaler có thể lập trình bằng phần mềm (1:1 đến 1:16)
− Ngắt khi Timer2 trùng với PR2
− Được sử dụng tùy chọn như một nguồn xung clock dịch pha cho khối MSSP
Khối Timer2 được điều khiển thông qua thanh ghi T2CON như: cho phép hay vô hiệu timer, thiết lập cấu hình cho prescaler và postscaler Có thể tắt Timer2 để giảm thiểu công
suất tiêu thụ bằng cách xoá bit điều khiển TMR2ON (T2CON<2>)
7.3.1 Thanh ghi điều khiển TIMER2 (T2CON)
Hình 7.11: thanh ghi T2CON
Trang 1801 = Hệ số chia tần số Prescaler là 4
1x = Hệ số chia tần số Prescaler là 16
7.3.2 Hoạt động của TIMER2
Ở chế độ hoạt động bình thường, TMR2 sẽ tăng lên từ giá trị bắt đầu 00h sau mỗi xung
clock (F osc/4) Timer2 còn có một bộ chia trước tần số (prescaler) tại vị trí xung clock ngõ vào với các hệ số chia tần số (1:4 và 1:16) sẽ cấp trực tiếp đến ngõ vào của Timer2, các hệ số
này được lựa chôn thông qua các bit điều khiển chọn prescaler T2CKPS1:T2CKPS0
(T2CON<1:0>) Giá trị của TMR2 được so sánh với giá trị tương ứng trong thanh ghi thời
gian PR2 ở mỗi chu kỳ xung clock Nếu hai giá trị này trùng khớp với nhau, bộ so sánh sẽ tạo
ra một tín hiệu báo trùng khớp tại ngõ ra của Timer Tín hiệu này sẽ reset giá trị của TMR2
về 00h ở chu kỳ clock kế tiếp và nó cũng dùng để điều khiển bộ chia sau tần số (postscaler)
ngõ ra
Cả hai thanh ghi TMR2 và PR2 đều có thể đọc và ghi trực tiếp, thanh ghi TMR2 sẽ bị xóa khi Reset VĐK, trong khi thanh ghi PR2 khi reset sẽ trở về giá trị ban đầu là FFh Hai bộ đếm prescaler và postscaler được xóa theo các sự kiện sau:
- Hoạt động ghi vào thanh ghi TMR2
- Hoạt động ghi vào thanh ghi T2CON
- Reset VĐK (Power-on Reset, MCLR Reset, Watchdog Timer Reset hoặc Brown-out Reset)
Chú ý: TMR2 không bị xóa khi ghi vào thanh ghi T2CON
Hình 7.12: sơ đồ khối của Timer2 7.3.3 Ngắt Timer2
Timer2 có thể tạo ra ngắt tùy chọn trên VĐK, tín hiệu được tạo ở ngõ ra của Timer2 (khi TMR2 và PR2 trùng nhau) sẽ làm ngõ vào cho bộ chia sau tần số postscaler 4bit ở ngõ ra
Postscaler sẽ tạo ra cờ ngắt được chốt trạng thái bởi bit TMR2IF (PIR1<1>) Ngắt Timer2 được cho phép bằng cách set bit cho phép ngắt khi trùng của TMR2 (TMR2IE (PIE1<1>))
Trang 19Ngoài ra, postscaler với 16 hệ số khác nhau có thể được chọn bằng bit điều khiển
postscaler T2OUTPS3:T2OUTPS0 (T2CON<6:3>)
PIR1 SPPIF (1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE1 SPPIE (1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
IPR1 SPPIP (1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP
TMR2 Thanh ghi TMR2
T2CON - T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0
PR2 Thanh ghi chu kỳ Timer2
Chú thích:
“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer2
(1) Các bit này không sử dụng với VĐK 28 chân; luôn duy trì các bit này bằng 0
Khối Timer3 (timer/counter) tích hợp các tính năng sau:
− Lựa chọn chế độ hoạt động bằng phần mềm: timer 16-bit hay counter 16-bit
− Có các thanh ghi 8bit có thể đọc và ghi (TMR3H và TMR3L)
− Có thể chọn nguồn xung clock (clock nội hay ngoại) với các tùy chọn: xung clock của
VĐK hoặc bộ dao động nội của Timer1
− Có hoạt động ngắt khi tràn
− Tích hợp khối Reset theo bộ kích khởi từ sự kiện đặc biệt (Special Event Trigger) của khối CCP (Capture/Compare/PWM)
Khối Timer3 được điều khiển thông qua thanh ghi T3CON
7.4.1 Thanh ghi điều khiển TIMER3 (T3CON)
Hình 7.13: thanh ghi T3CON
Bit 7 – RD16: bit cho phép chế độ ghi/đọc 16bit
1 = Cho phép ghi/đọc theo số 16bit vào thanh ghi của Timer3
Trang 200 = Cho phép ghi/đọc theo 2 lần số 8bit vào thanh ghi của Timer3
Bit 6:3 – T3CCP2:T3CCP1: bit cho phép Timer1 và Timer3 kết nối với CCPx
1x = Timer3 là nguồn xung clock cho hoạt động capture/compare của hai khối CCP1
1 = Không đồng bộ với ngõ vào xung clock ngoại
0 = Đồng bộ với ngõ vào xung clock ngoại
Khi TMR3CS = 0
Bit này được bỏ qua, Timer3 sử dụng xung clock nội
Bit 1 – TMR3CS: bit chọn nguồn xung clock Timer3
1 = Chọn ngõ vào xung clock ngoại từ bộ dao động Timer1 hoặc T13CKI (theo sườn lên ngay sau thời điểm sườn xuống đầu tiên của xung clock)
0 = Chọn xung clock nội (F OSC/4)
Bit 0 – TMR3ON: bit chạy Timer3
1 = Cho phép chạy Timer3
0 = Dừng Timer3
7.4.2 Hoạt động của TIMER3
Timer1 có thể hoạt động theo 1 trong 3 chế độ sau: định thời, đếm đồng bộ và bất đồng
bộ
Trang 21Chế độ hoạt động được xác định bởi bit chọn xung clock TMR3CS (T3CON<1>) Khi xoá bit TMR3CS, Timer3 tăng lên theo mỗi chu kỳ xung clock nội (F OSC/4) Khi bit này được
set, Timer3 sẽ tăng theo mỗi sườn lên của ngõ vào xung clock ngoại Timer1 hoặc của bộ dao động Timer1
Tương tự như với Timer1, các chân RC1/T1OSI/𝐔𝐎𝐄 ̅̅̅̅̅̅ và RC0/T1OSO/T13CKI trở
thành các ngõ vào khi bộ dao động Timer1 được cho phép, điều này có nghĩa là bỏ qua giá trị
hiện tại của TRISC<1:0> và các chân lúc này được đọc là ‘0’
Hình 7.14: sơ đồ khối của Timer3
Hình 7.15: sơ đồ khối của Timer3 (chế độ đọc/ghi 16-bit)
Trang 227.4.3 Đọc và ghi Timer3 ở chế độ 16-bit
Timer3 có thể được cấu hình cho phép việc đọc và ghi 16-bit (hình 7.15) Khi bit điều
khiển RD16 (T3CON<7>) được set, địa chỉ của TMR3H được chỉ định như một thanh ghi
đệm đóng vai trò như là byte cao của Timer3 Việc đọc nội dung của TMR3L sẽ lấy nội dung
từ byte cao của Timer3 đưa vào byte cao của thanh ghi đệm Điều này cho phép khả năng đọc chính xác 16-bit của Timer3 một cách đồng thời mà không phải theo thứ tự đọc byte thấp trước rồi mới đến byte cao
Việc ghi nội dung vào byte cao của Timer3 cũng được thực hiện thông qua thanh ghi
đệm TMR3H Byte cao của Timer3 sẽ được cập nhật nội dung từ byte cao thanh ghi đệm
TMR3H khi thực hiện hoạt động ghi vào TMR3L Quá trình này cho phép ghi tất cả 16-bit
vào byte cao và byte thấp của Timer3 ngay lập tức
Do byte cao của Timer3 không thể đọc hoặc ghi một cách trực tiếp ở chế độ này, do đó, tất cả hoạt dộng ghi và đọc đều thực hiện thông qua thanh ghi đệm byte cao của Timer3 Ghi
nội dung vào TMR3H sẽ không xóa giá trị prescaler của Timer3, prescaler chỉ bị xóa khi ghi nội dung vào thanh ghi TMR3L
7.4.4 Sử dụng bộ dao động Timer1 làm nguồn xung clock cho Timer3
Bộ dao động nội Timer1 có thể được dùng làm nguồn xung clock cho Timer3 Bộ dao
động Timer1 được cho phép bằng cách set bit T1OSCEN (T1CON<3>), và để sử dụng bộ
dao động này làm nguồn xung clock cho Timer3 thì bit TMR3CS phải được set, lúc này Timer3 cũng tăng lên theo sườn lên mỗi chu kỳ xung của nguồn tạo dao động
7.4.5 Ngắt Timer3
Cặp thanh ghi TMR3 (TMR3H:TMR3L) tăng từ 0000h đến FFFFh, nếu vượt qua giá
trị FFFFh bộ đếm sẽ bị tràn và trở về 0000h, khi đó ngắt Timer3 (nếu được cho phép) sẽ xảy
ra và được chốt trạng thái thông qua bit cờ ngắt TMR3IF (PIR2<1>).Ngắt Timer3 có thể
được cho phép hay huỷ bỏ bằng việc đặt hay xoá bit cho phép ngắt Timer3 TMR3IE
(PIE2<1>)
7.4.6 Reset Timer3 sử dụng Special Event Trigger của khối CCP
Nếu khối CCP2 được cho phép để tạo ra “tín hiệu kích khởi từ các sự kiện đặc biệt”
(Special Event Trigger) ở chế độ Compare (CCP2M3:CCP2M0 = 1011), tín hiệu này sẽ reset
Timer3 Nó cũng sẽ khởi động bộ chuyển đổi ADC nếu khối ADC được cho phép
Khối Timer3 phải được cấu hình là timer hoặc counter đồng bộ để tận dụng ưu điểm của
tính năng này Khi sử dụng cách này, cặp thanh ghi CCPR2H:CCPR2L sẽ trở thành thanh
ghi thời gian cho Timer3
Trang 23Nếu Timer3 đang chạy ở chế độ counter bất đồng bộ thì quá trình Reset có thể không hoạt động Giả sử hoạt động ghi vào Timer3 trùng với Special Event Trigger của khối CCP, thì hoạt động ghi này sẽ chiếm quyền ưu tiên
Chú ý rằng, Special Event Trigger của khối CCP2 sẽ không đặt bit cờ ngắt TMR3IF
(PIR2<1>)
Bảng 7.4: các thanh ghi có liên kết với Timer3 Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF
PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE
IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP
TMR3L Byte thấp thanh ghi TMR3
TMR3H Byte cao thanh ghi TMR3
T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC ̅̅̅̅̅̅̅̅̅̅̅ TMR1CS TMR1ON
T3CON RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC ̅̅̅̅̅̅̅̅̅̅̅ TMR3CS TMR3ON
Chú thích:
“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer3
PIC18F2455/2550/4455/4550 được tích hợp 2 khối CCP (Capture/Compare/PWM),
mỗi khối chứa một thanh ghi 16-bit có thể hoạt động như một thanh ghi Capture 16-bit, thanh ghi Compare 16-bit hoặc như một thanh ghi Master/Slave Duty Cycle của PWM
Đối với các linh kiện 28 chân, hoạt động của 2 khối CCP chuẩn (CCP1 và CCP2) được
mô tả trong chương này Với các linh kiện 40/44 pin thì CCP1 được tích hợp như là một khối CCP tăng cường bao gồm các chế độ Capture, Compare, PWM chuẩn và một số tính năng tăng cường khác
7.5.1 Thanh ghi điều khiển CCPx chuẩn CCPxCON
Hình 7.16: thanh ghi CCPx
Bit 7-6 – Không sử dụng, đọc là bằng 0
Bit 5-4 – DCxB1:DCxB0: là bit 1 và bit 0 của duty cycle PWM (chu kỳ làm việc - khoảng
thời gian ở mức cao) ở khối CCPx
Capture mode: không sử dụng
Compare mode: Không sử dụng
PWM mode: Các bit này là 2 bit LSB (bit 1 và bit 0) chu kỳ làm việc (duty cycle) của
PWM 10 bit, 8 bit MSB của duty cycle nằm trong thanh ghi CCPR1L
Trang 24Bit 3-0 – CCPxM3:CCPxM0: bit chọn mode cho khối CCPx
0100 = Capture mode: trên mỗi sườn xuống của xung clock
0101 = Capture mode: trên mỗi sườn lên của xung clock
0110 = Capture mode: trên mỗi sườn lên thứ 4 của xung clock
0111 = Capture mode: trên mỗi sườn lên thứ 16 của xung clock
1000 = Compare mode: khởi tạo chân CCPx ở mức thấp; khi xuất hiện trạng thái
trùng nhau sẽ đẩy chân CCPx lên mức cao (bit CCPxIF được set)
1001 = Compare mode: khởi tạo chân CCPx ở mức cao; khi xuất hiện trạng thái trùng
nhau sẽ đẩy chân CCPx xuống mức thấp (bit CCPxIF được set)
1010 = Compare mode: tạo ra ngắt phần mềm khi xuất hiện trạng thái trùng nhau
trong quá trình so sánh (bit CCPxIF được set, chân CCPx sẽ phản ánh trạng thái của I/O)
1011 = Compare mode: kích khởi theo sự kiện đặc biệt, thực hiện reset timer, khởi
động chuyển đổi A/D khi xuất hiện trạng thái trùng nhau ở khối CCP2 (bit CCPxIF được set)
11xx =PWM mode
7.5.2 Cấu hình khối CCP
Mỗi khối CCP thường kết hợp với một thanh ghi điều khiển (CCPxCON) và một thanh
ghi dữ liệu (CCPRx) Thanh ghi dữ liệu bao gồm 2 thanh ghi 8-bit : CCPRxL (byte thấp) và CCPRxH (byte cao), cả 2 thanh ghi đều có thể ghi và đọc trực tiếp
Tài nguyên timer của khối CCP
Khối CCP sẽ sử dụng Timer1, 2 hoặc 3 phụ thuộc vào chế độ đang được chọn Trong khi Timer1 và Timer3 được sử dụng trong chế độ Capture hoặc Compare, thì Timer2 được dùng trong chế độ tạo PWM
Bảng 7.5: timer sử dụng cho khối CCP
Capture Compare
Timer1 hoặc Timer3 Timer1 hoặc Timer3
Trang 25PWM Timer2 Việc kết nối từng timer riêng biệt đến khối CCP được xác định bằng bit cho phép gán Timer cho CCP trong thanh ghi T3CON Cả hai khối CCP đều có thể được kích hoạt tại bất
kỳ thời điểm nào và có thể chia sẽ cùng một timer nếu như chúng được cấu hình hoạt động ở
cùng chế độ (Capture/Compare hoặc PWM) tại cùng thời điểm Sự tương quan giữa hai khối được tổng hợp trong bảng 7.6 (cho cả khối chuẩn và khối tăng cường), chú ý rằng nếu Timer1
ở chế độ Counter bất đồng bộ thì hoạt động capture sẽ không làm việc
Bảng 7.6: tương quan giữa CCP1 và CCP2 đối với các Timer Chế độ
CCP1
Chế độ
Capture Capture Mỗi khối có thể sử dụng TMR1 hoặc Timer3 làm cơ sở
thời gian Cơ sở thời gian có thể khác nhau đối với từng CCP
Capture Compare - CCP2 có thể được cấu hình về chế độ Special Event
Trigger để reset TMR1 hoặc TMR3 (tùy theo cơ sở thời gian nào được sử dụng)
- Chuyển đổi ADC tự động theo trigger event cũng có thể được thực hiện
- Hoạt động của CCP1 có thể bị ảnh hưởng nếu nó sử dụng cùng một timer làm cơ sở thời gian
Compare Capture - CCP1 có thể được cấu hình về chế độ Special Event
Trigger để reset TMR1 hoặc TMR3 (tùy theo cơ sở thời gian nào được sử dụng)
- Hoạt động của CCP2 có thể bị ảnh hưởng nếu nó sử dụng cùng một timer làm cơ sở thời gian
Compare Compare - Mỗi khối có thể được cấu hình về chế độ Special
Event Trigger để reset cơ sở thời gian
- Chuyển đổi ADC tự động theo trigger event của CCP2 có thể được thực hiện
- Xung đột có thể xảy ra nếu cả 2 khối sử dụng cùng một cơ sở thời gian
Việc gán chân cho CCP2 (làm ngõ vào Capture, ngõ ra Compare và PWM) có thể thay
đổi tùy theo cấu hình của khối Bit chọn cấu hình CCP2MX sẽ xác định chân CCP2 được đa
hợp chức năng với chân nào Mặc định CCP2 sẽ được gán đến chân RC1 (CCP2MX = 1)
Nếu bit cấu hình được xoá thì CCP2 sẽ đa hợp chức năng với chân RB3