2.1.1 Giới thiệu :
Module Timer 0 là một bộ định thời/ đếm 8 bit, có khả năng đọc và ghi được , có một bộ tiền định tỉ lệ (Prescaler) 8 bit lập trình được, có bit lựa chọn nguồn xung clock trong hoặc ngoài, có ngắt khi Timer tràn, có bit lựa chọn cạnh tác động của xung clock ngoài.
2.1.2 Hoạt động của bộđịnh thời .
Chế độ định thời được chọn bằng cách xóa bit T0CS (OPTION_REG <5>). Trong chếđộ này thanh ghi TMR0 sẽ tăng lên sau mỗi chu kì (prescaler không có tác dụng hoặc tỉ lệ 1 :1). Nếu thanh ghi TMR0 được ghi một giá trị mới, giá trị trong thanh ghi này sẽ
không tăng trong 2 chu kỳ lệnh kế tiếp.Vì vậy để khắc phục hiện tượng này chúng ta có thể hiệu chỉnh giá trị nhập vào thanh ghi TMR0.
Chế độ đếm được lựa chọn bằng cách set bit T0CS (OPTION_REG <5>). Trong chếđộđếm, thanh ghi TMR0 sẽ tăng lên khi có cạnh lên hoặc cạnh xuống xuất hiện trên chân T0CKL ( cạnh lên hoặc cạnh xuống được lựa chọn bởi bit T0SE (OPTION_REG <4>, xóa bit T0SE sẽ lựa chọn cạnh lên).
2.1.3 Ngắt Timer 0 .
Ngắt Timer 0 được tạo ra khi thanh ghi TMR0 tràn từ 0FFh đến 00h. Khi xảy ra tràn, cờ T0IF(INTCON<2>) được bật lên. Ngắt có thểđược ngăn chặn bằng cách xóa bit T0IE (INTCON<5>). Cờ ngắt T0IF phải được xóa bằng phần mềm truớc khi thoát khỏi chương trình ngắt trở về chương trình chính.
Lưu ý : Ngắt Timer 0 không làm VĐK thoát khỏi trạng thái ngủ.
2.1.4 Sử dụng Timer 0 với nguồn xung clock ngoài.
Khi bộ tiền định tỉ lệ không được sử dụng, ngõ vào xung clock ngoại cũng giống như ngõ ra bộ tiền định tỉ lệ. Nguồn xung clock ngoại sẽ được đồng bộ với xung clock nội bằng cách: nó sẽ được lấy mẫu tại chu kỳ Q2 và Q4 của xung clock nội. Do đó, T0CKI phải ở mức cao ít nhất 2 Tosc và ở mức thấp ít nhất cũng là 2 Tosc.
2.1.5 Bộ tiền định tỉ lệ 8 bit của Timer 0.
Bộđếm 8 bit được sử dụng như bộ tiền định tỉ lệ cho Timer 0 hoặc bộ hậu định tỉ lệ
cho WDT. Bit PSA (OPTION_REG<3>) sẽ lựa chọn bộđếm này sẽ sử dụng cho Timer 0 hay WDT, các bit PS2, PS1, PS0 sẽ xác định tỉ lệ của bộđếm.
(Xem lại phần thanh ghi OPTION_REG) Các thanh ghi có liên quan đến Timer 0:
2.2 Bộđịnh thời Timer 1. 2.2.1 Giới Thiệu. 2.2.1 Giới Thiệu.
Timer 1 là một bộ định thời/ đếm 16 bit bao gồm hai thanh ghi 8 bit (TMR1H và TMR1L), có khả năng đọc được và ghi được. Cặp thanh ghi TMR1H và TMR1L sẽ tăng từ 0000h lên FFFFh rồi sau đó tràn về 0000h. Nếu được cho phép (bit TMR1IE được set), ngắt sẽ xảy ra khi giá trị TMR1 tràn từ FFFFh về 0000h, lúc đó cờ ngắt TMR1IF sẽ bật lên.
2.2.2 Thanh ghi điều khiển Timer 1:
Bit 7,6 Không sử dụng, đọc là 0.
Bit 5,4 T1CKPS1 : T1CKPS0 : Các bit chọn tỉ lệ xung ngõ vào cho Timer1. 11 1 : 8 giá trị tỉ lệ
10 1 : 4 giá trị tỉ lệ
01 1 : 2 giá trị tỉ lệ
00 1 : 1 giá trị tỉ lệ
Bit 3 T10SCEN : Bit cho phép bộ dao động Timer 1 Oscillator 1 : Cho phép dao động
0 : Không cho phép dao động
Bit 2 T1SYNC : Bit lựa chọn đồng bộ hóa xung clock ngoài của Timer 1 (Chú ý: Bit này chỉ có tác dụng khi bit TMR1CS = 1)
1: Không đồng bộ hóa xung clock ngoại 0: Đồng bộ hóa xung clock ngoại.
Bit 1 TMR1CS : Bit chọn nguồn xung clock cho Timer 1
1: Chọn xung clock ngoài qua chân T1OSC/T1CKI ( tác động cạnh lên)
0: Chọn xung clock nội (Fosc/4) Bit 0 TMR1ON: Bit cho phép ngoặc ngưng Timer 1
1: Cho phép
0: Không cho phép
2.2.3 Chếđộđịnh thời trong hoạt động của Timer 1 :
Chếđộ định thời được lựa chọn bằng cách xóa bit TMR1CS (T1CON<1>). Trong chế độ này, xung clock cung cấp cho Timer 1 là Fosc/4, bit đồng bộ T1SYNC (T1CON<2>) không có tác dụng vì xung clock nội đã luôn luôn được đồng bộ.
2.2.4 Chếđộđếm :
Timer 1 có thể hoạt động ở cả chếđộđồng bộ hoặc bất đồng bộ tùy thuộc vào việc cài đặt bit TMR1CS (T1CON<1>).
Đếm đồng bộ :
Chếđộ này được lựa chọn bằng cách set bit TMR1CS và xóa bit T1SYNC. Trong chếđộ này giá trị của Timer 1 sẽ tăng khi có xung cạnh lên trên chân T1OSI/RC1 ( nếu bit T1OSCEN được set) hoặc chên trân T1OSO (nếu bit T1OSCEN được xóa).
Xung clock ngoại sẽ được đồng bộ với xung clock nội, hoạt động đồng bộ được thực hiện ngay sau bộ tiền định tỉ lệ xung (prescaler). Trong chếđộ ngủ hoạt động đồng
bộ sẽ bị tắt cho dù có xung clock ngoài thì Timer 1 cũng không tăng. Điều này có nghĩa là chếđộđếm đồng bộ sẽ không hoạt động được trong chếđộ ngủ (SLEEP).
Khi chế độ sử dụng xung clock ngoài được lựa chọn cho Timer 1 ở chế độ đếm
đồng bộ, chúng ta phải đảm bảo xung clock ngoài đã được đồng bộ với xung clock nội.
Đếm bất đồng bộ :
Nếu bit T1SYNC được set, xung clock ngoài sẽ không được đồng bộ hóa. Bộđịnh thời sẽ tiếp tục đếm trong suốt quá trình Sleep của VĐK và có khả năng tạo ra một ngắt khi bộđịnh thời tràn và làm VĐK thoát khỏi trạng thái ngủ.
* Một sốđặc điềm lưu ý khi đọc ghi vào Timer :
- Việc đọc thanh ghi TMR1H hoặc TMR1L trong khi bộ định thời đang chạy từ
một nguồn xung clock ngoài không đồng bộ sẽ cho giá trị tức thời (không phải ngưng Timer lại). Tuy nhiên, phải chú ý rằng việc đọc Timer 1 sẽ phải bao gồm 2 lần đọc giá trị
8 bit, do đó có thể phát sinh vấn đề là Timer có thể bị tràn giữa 2 lần đọc.
- Để ghi vào Timer tốt nhất chúng ta nên dừng Timer lại và ghi giá trị chúng ta mong muốn. Chúng ta có thể ghi giá trị váo khi Timer đang chạy nhưng việc đó có thể
tạo ra một giá trị không như ta mong muốn.
2.2.5 Dao động riêng của Timer 1 :
Chúng ta có thể tạo một bộ dao động độc lập cho Timer 1 bằng cách sử dụng thạch anh có tần số tối đa 200Khz.Với bộ dao động này Timer có thể đếm ngay cả khi VĐK rơi vào trạng thái ngủ.
2.2.6 Ngắt Timer 1 :
Khi ngắt được cho phép, nó sẽ xảy ra khi Timer tràn từ giá trị FFFFh xuống 0000h. Khi xảy ra tràn, cờ báo ngắt TMR1IF sẽ bật lên. Ngắt có thể ngăn chặn bằng cách xóa bit TMR1IE, cờ TMR1IF phải được xóa bằng phần mềm trước khi thoát khỏi chương trình phục vụ ngắt trở về chương trình chính.
Lưu ý : Ngắt của Timer 1 ở chế độ định thời và chế độ đếm đồng bộ không làm cho VĐK thoát khỏi trạng thái ngủ, chỉ có ngắt ở chếđộ đếm bất đồng bộ mới làm cho VĐK thoát khỏi trạng thái ngủ.
Các thanh ghi liên quan đến Timer 1 :
2.3 Bộđịnh thời Timer 2 : 2.3.1 Giới thiệu :
Timer 2 là một bộ định thời 8 bit bao gồm một bộ tiền định tỉ lệ và một bộ hậu
định tỉ lệ, Timer 2 cung cấp thời gian hoạt
động cho chế độ PWM nếu module CCP
ghi có thểđọc và ghi được, nó bị xóa bởi bất cứ tác đông reset nào.
Xung clock ngõ vào (Fosc/4) có các tùy chọn tỉ lệ là 1:1, 1:4, 1:16, được lựa chọn bằng các bit điều khiển T2CKPS1 : T2CKPS0 (T2CON<1 :0>).
Timer 2 có một thanh ghi khoảng thời gian 8 bit PR2, đây là một thanh ghi có khả
năng đọc được và ghi được. Timer 2 sẽ tăng từ 00h đến khi bằng giá trịở thanh ghi PR2 nó sẽ reset về 00h ở chu kỳ tăng tiếp theo.
2.3.2 Thanh ghi điều khiển T2CON
Bit 7 Không sử dụng
Bit 6:3 TOUTPS3:TOUTPS0: Bit chọn tỉ lệ ngõ ra của Timer 2 0000: 1:1 Tỷ lệ ngõ ra 0001: 1:2 Tỷ lệ ngõ ra . . . 1111: 1:16 Tỷ lệ ngõ ra
Bit 2 TMR2ON: Bit cho phép hoạt động của Timer 2
1: Cho phép
0: Không cho phép.
Bit 1:0 T2CKPS1:T2CKPS0: Bit chọn tỉ lệ ngõ vào của Timer 2 00 : Prescaler 1
01 : Prescaler 4 1x : Prescaler 16
2.2.3 Xóa các bộ tỉ lệ.
Hai bộ đếm prescaler và postcaler sẽ bị xóa bởi một trong các nguyên nhân sau
đây :
- Ghi một giá trị vào thanh ghi TMR2 - Ghi một giá trị vào thanh ghi TCON2 - Bất cứ một reset thiết bị nào.
Thanh ghi TMR2 không bị xóa khi thanh ghi TCON2 được ghi.
2.3.4 Nguồn xung clock cho Timer 2.
Timer 2 có một nguồn xung clock đó là xung clock của VĐK. Một bộ tiền định tỉ
lệđược lựa chọn bởi các bit T2CKPS1:T2CKPS0
2.3.5 Thanh ghi TMR2 và PR2.
Thanh ghi TMR2 và PR2 là 2 thanh ghi đọc được và ghi được. Timer 2 sẽ tăng từ
giá trị 00h lên tới giá trị nằm trong thanh ghi PR2, sau đó nó sẽ reset về 00h cho đến chu kỳđếm kế tiếp.
Khi giá trị trong thanh ghi TMR2 bằng với giá trị trong PR2, bộ so sánh sẽ tạo ra một xung báo hiệu, xung này có thểđược dùng cho bộ hậu định tỉ lệ hoặc được dùng làm xung clock cho module truyền nối tiếp. Ngoài ra nó còn được dùng làm tín hiệu Reset cho Timer 2.
2.3.7 Chếđộ ngủ.
Trong chếđộ ngủ Timer 2 không hoạt động, giá trị của bộđịnh tỉ lệ sẽđược lưu lại và phục hồi sau khi VĐK thoát khỏi trạng thái ngủ.
CHƯƠNG III : MODULE CCP
3.1 Giới thiệu :
Module CCP được xây dựng để hỗ trợ cho việc đo lường và điều khiển thời gian hoạt động của các tín hiệu, đo chu kỳ hoạt động của tín hiệu, tạo ra các tín hiệu có tần số khác nhau, điều khiển tốc độđộng cơ DC…
Mỗi module CCP có môt thanh ghi 16 bit có thể hoạt động như:
- Một thanh ghi Capture 16 bit - Một thanh ghi Compare 16 bit
- Một thanh ghi điểu khiển chu kỳ nhiệm vụ của bộ PWM. PIC16F877A có 2 module CCP là CCP1 và CCP2:
Module CCP1:
Thanh ghi CCPR1 bao gồm 2 thanh ghi 8 bit: CCPR1L và CCPR1H. Thanh ghi CCP1CON điều khiển hoạt động cùa module CCP1. Các xung đặc biệt xảy ra bằng các thuật toán so sánh và sẽ reset Timer 1.
Module CCP2:
Thanh ghi CCPR2 bao gồm 2 thanh ghi 8 bit: CCPR2L và CCPR2H. Thanh ghi CCP2CON điều khiển hoạt động cùa module CCP2. Các xung đặc biệt xảy ra bằng các thuật toán so sánh sẽ reset Timer 1 và bắt đầu chuyển đổi ADC (nếu chuyển đổi ADC
được cho phép).
3.2 Thanh ghi điều khiển module CCP:
Bit 7,6 Không sử dụng
Bit 5,4 DCxB1:DCxB0: Bit 0 và bit 1 của chếđộ PWM Chếđộ Capture và chếđộ Compare : Không sử dụng
Chế độ PWM: Trong chế độ PWM có 10 bit dùng để định chu kỳ nhiệm vụ cho PWM, đây là 2 bit trong số 10 bit đó, 8 bit còn lại nằm trong thanh ghi CCPRxL.
Bit 3:0 CCPxM3:CCPxM0: Các bit chọn chếđộ cho module CCPx 0000: Tắt tất cả các chức năng CCP
0100: Chếđộ Capture, hoạt động ở mỗi xung cạnh xuống 0101: Chếđộ Capture, hoạt động ở mỗi xung cạnh lên. 0110: Chếđộ Capture, hoạt động ở mỗi 4 xung cạnh lên. 0111: Chếđộ Capture, hoạt động ở mỗi 16 xung cạnh lên.
1000: Chếđộ Compare, ban đầu ngõ ra CCP ở mức thấp, khi điều kiện cân bằng xuất hiện nó lên mức cao (cờ CCPIF được set).
1001: Chếđộ Compare, ban đầu ngõ ra CCP ở mức cao, khi điều kiện cân bằng xuất hiện nó xuống mức thấp (cờ CCPIF được set).
1010: Chế độ Compare, tạo ra một ngắt phần mềm khi điều kiện cân bằng xuất hiện (cờ CCPIF được set, chân CCP không đổi)
1011: Chếđộ Compare , sự kiện đặc biệt xảy ra (cờ CCPIF được set, chân CCP không đổi), CCP1 reset TMR1, CCP2 reset TMR1, bắt đầu chuyển đổi A/D ( nếu module ADC được cho phép).
11xx: Chếđộ PWM .
3.3 Chếđộ Capture.
Để module CCP hoạt động trong chế độ
Capture thì Timer 1 phải thiết lập ở chế độ định thời hoặc chế độ đếm đồng bộ, nếu không chếđộ Capture sẽ không làm việc. Khi chếđộ Capture được sử dụng, chân CCP phải
được mặc định là ngõ vào.
Trong chế độ Capture, hai thanh ghi CCPRxH và CCPRxL sẽ ghi lại giá trị 16 bit
của Timer 1 khi có môt sự kiện xuất hiện trên chân CCPx (giá trị trong Timer 1 không bị
reset). Một sự kiện được định nghĩa bởi: - Bất cứ một xung cạnh xuống - Bất cứ một xung cạnh lên - Bất cứ 4 xung cạnh lên - Bất cứ 16 xung cạnh lên
Sự kiện được lựa chọn bởi các bit điều khiển CCPxM3:CCPxM0 (CCPxCON<3:0>). Khi một sự kiện xuất hiện giá trị trong Timer 1 được ghi lại và cờ
CCPxIF được bật lên, cờ này phải được xóa bằng phần mềm trước khi một sự kiện khác xảy ra nếu không giá trị lưu trước đó sẽ bị xóa.
Khi thay đổi hoạt động chế độ Capture sẽ tạo ra một ngắt nên khi muốn thay đổi hoạt động chếđộ Capture trước hết phải vô hiệu hóa các ngắt và xóa các cờ ngắt.
3.3.1 Bộđịnh tỉ lệ của CCP:
Bộđịnh tỉ lệ prescaler có 4 giá trị tỉ lệđược lựa chọn bởi các bit CCPxM3:CCPxM0. Bất cứ khi nào module CCP ngừng hoạt động hoặc không hoạt động trong chế độ
Khi thay đổi giá trị prescaler có thể gây ra một ngắt. Giá trị đếm prescaler sẽ không bị xóa nên sự Capture đầu tiên có thể không xuất phát từ giá trị 0 của bộ prescaler.
3.4 Chếđộ Compare:
Để module CCP hoạt động trong chế độ
Compare thì Timer 1 phải thiết lập ở chế độ định thời hoặc chế độ đếm đồng bộ, nếu không chế độ Compare sẽ không làm việc. Khi chếđộ Compare được sử dụng, chân CCP phải được mặc định là ngõ vào.
Trong chế độ Compare giá trị trong thanh ghi TMR1 sẽ được so sánh với một giá trị đã được lưu sẵn trong thanh ghi 16 bit CCPRx, khi hai giá trị này bằng nhau, một ngắt sẽ xảy ra nếu được cho phép.Chân CCPx sẽ:
- Lên mức cao - Xuống mức thấp
- Hay giữ nguyên trạng thái
Trạng thái của chân CCP sẽ phụ thộc vào các bit CCPxM3:CCPxM0.
Việc xóa thanh ghi CCPxCON sẽ đẩy trạng thái của chân CCP xuống mức thấp.
Đặc biệt trong chếđộ này, khi giá trị trong 2 thanh ghi TMR1 và CCPRx bằng nhau thì một xung tín hiệu sẽ được tạo ra. Xung này sẽ reset cặp thanh ghi TMR1H và TMR1L. Điều này cho phép thanh ghi CCPRx hoạt động giống như một thanh ghi khoảng thời gian cho Timer 1.
3.5 Chếđộđiều biến xung PWM:
Trong chế độđiều chếđộ rộng xung PWM, chân CCP tạo ra một tín hiệu có độ phân giải 10 bit. Chân CCP phải được mặc định là ngõ ra.
Việc xóa thanh ghi CCPxCON sẽ đẩy chân ngõ ra CCPx xuống mức mặc định thấp.
3.5.1 Chu kỳ PWM:
Chu kỳ PWM được chỉ định trong thanh ghi PR2. Chu kỳ có thể được tính bằng công thức:
Chu kỳ PWM = [(PR2 + 1)*4*Tosc*giá trị tỉ lệ TMR2) Tần số PWM = 1/ chu kỳ PWM.
- Thanh ghi TMR2 bị xóa
- Chân CCPx được set lên mức 1
- Giá trị Duty cycle ( Chu kỳ nhiệm vụ) từ thanh ghi CCPRxL sẽ chuyển sang thanh ghi CCPRxH.
Lưu ý: Bộ postcaler của Timer 2 không có tác dụng trong việc quyết định tần số
PWM. Bộ prescaler được kết hợp với thanh ghi TMR2 để tạo ra bộ đếm 10 bit tương ứng.
3.5.2 Chu kỳ nhiệm vụ của PWM:
Giá trị chu kỳ nhiệm vụ của PWM được quy định bằng 10 bit : 8 bit trong thanh ghi CCPRxL và 2 bit trong thanh ghi CCPxCON (DCxB1, DCxB0). Chu kỳ nhiệm vụ PWM có thểđược tính theo công thức sau:
Ton PWM = ( Giá trị của DCxB9:DcxB0) * Tosc * giá trị tỉ lệ tiền định TMR2
Giá trị DCxB9:DcxB0 có thể thay đổi tùy ý nhưng giá trị này sẽ không được tải vào trong thanh ghi CCPRxH cho đến khi trạng thái cân bằng xảy ra giữa 2 thanh ghi PR2 và TMR2. Trong chếđộ PWM thanh ghi CCPRxH là thanh ghi chỉđọc.
Độ phân giải PWM có thể tính theo công thức sau:
3.5.3 Cài đặt hoạt động cho PWM:
Để cài đặt hoạt động cho chếđộ PWM ta tiến hành các bước sau: - Định chân CCPx là ngõ ra.