Chương 4:Bộ Hoạt Động Định thời4.1 – Bộ định thời TIMER0 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, b
Trang 1Chương 4:Bộ Hoạt Động Định thời
4.1 – Bộ định thời TIMER0
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:hiển thị các giá trị đã được cập nhật ra LED 7 đoạn
Bộ định thời/bộ đếm Timer0 cĩ các đặc tính sau :
Bộ định thời / bộ đếm 8 bit
Cho phép đọc và ghi
Bộ chia 8 bit lập trình được bằng phần mềm
Chọn xung clock nội hoặc ngoại
Ngắt khi cĩ sự tràn từ FFh đến 00h
Chọn cạnh cho xung clock ngồi
Bên dưới là sơ đồ khối của bộ định thời Timer0 và bộ chia dùng chung với WDT
Chế độ định thời (Timer) được chọn bằng cách xĩa bit T0CS ( OPTION_REG<5> Trong chế độ định thời , bộ định thời Timer0
sẽ tăng dần sau mỗi chu kỳ lệnh ( khơng cĩbộ chia ) Nếu thanh ghi TMR0 được ghi thì sự tăng sẽ bị ngăn lại sau hai chu kỳ lệnh Chế độ đếm (Counter) được chọn bằng cách set bit T0SC (OPTION_REG<5> ) Trong chế độ đếm , Timer0 sẽ tăng dần ở mỗi cạnh lên hoặc cạnh xuống của chânRA4/T0CKI Sự tăng cạnh được xác định bởi bit Timer0 Source Edge Select , T0SE (OPTION_REG<4> ) Bộ chia chỉ được dùng chung qua lại giữa bộ định thời Timer0 và bộ định thời Watchdog Bộ chia khơng cho phép đọc hoặc ghi
Trang 2Ngắt TMR0 được phát ra khi thanh ghi TMR0 tràn từ FFh đến 00h
Sự tràn này sẽ set bit T0IF (INTCON<2>) Ngắt này có thể được giấu đi bằng cách xóa đi bit T0IE(INTCON<5>) Bit T0IF cần phải được xóa trong chương trình bởi thủ tục phục vụngắt của bộ định thời Timer0 trước khi ngắt này được cho phép lại
2 – Sử dụng Timer0 với xung clock ngoại
Khi bộ chia không được sử dụng , clock ngoài đặt vào thì giống như bộ chia ở ngõ ra Sự đồng bộ của chân T0CKI với clock ngoài được thực hiện bằng cách lấy mẫu bộ chia ở ngõ ra trên chân Q2
và Q4 Vì vậy thưc sự cần thiết để chân T0CKIở mức cao trong ít nhất 2 chu kỳ máy và ở mức thấp trong ít nhất 2 chu kỳ máy
4.2*Bộ định thời TMR1 :
Bộ định thời 1 là một bộ định thời/bộ đếm 16 bit gồm hai thanh ghi TMR1H ( byte cao ) và TMR1L ( byte thấp ) mà có thể đọc hoặc ghi Cặp thanh ghi này tăng số đếm từ0000h đến FFFFh và một tràn sẽ xuất hiện khi có sự chuyển số đếm từ FFFFh xuống0000h Ngắt, nếu được phép có thể phát ra khi có số đếm tràn và được đặt ở bit cờ ngắt TMR1IF Ngắt có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit cho phép ngắtTMR1IE.Bộ định thời Timer1 có thể được cấu hình để hoạt động một trong hai chế độ sau:
_Định thời một khoảng thời gian ( Timer )
Trang 3_Đếm sự kiện ( Counter )
Việc lựa chọn một trong hai chế độ được xác định bằng cách đặt hoặc xóa bit chọn clock TMR1CS Trong chế độ định một khoảng thời gian, bộ định thời tăng số đếm lênsau mỗi chu kỳ lệnh Trong chế độ đếm sự kiện, bộ định thời tăng sau mỗi
cạnh lên của clock ngoài đặt vào Bộ định thời 1 có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit điều khiển TMR1ON.\
1 – Chế độ Timer
Chế độ Timer được chọn bằng cách xóa bit TMR1CS Trong chế độ này, nguồn clock đặt vào Timer là mạch dao động FOSC/4 Bit điều khiển đồng bộ không bị tác động vì clock ngoài luôn luôn đồng bộ
*Chế độ counter
Trong chế độ này, bộ định thời tăng số đếm qua nguồn clock ngoài Việc tăng xảy ra sau mỗi cạnh lên của xung clock ngoài
Bộ định thời phải có một cạnh lên trước khi việc đếm bắt đầu
Trang 44.3– Bộ định thời Timer2
Bộ định thời 2 là bộ định thời 8 bit với một bộ chia và một bộ Postscaler Nó thường được dùng chung với bộ CCP trong chế độ PWM ( sẽ được đề cập ở phần sau ) Thanh ghi TMR2 có thể đọc hoặc ghi và được xóa khi có bất kỳ tín hiệu reset nào của thiết bị.Bộ định thời 2 có một thanh ghi chu kỳ 8 bit,PR2.Bộ định thời tăng số đếm lên từ 00hđến giá trị được ghi trong thanh ghi TR2
và sau đó reset lại giá trị 00h trong chu kỳ kếtiếp PR2 là thanh ghi có thể đọc hoặc ghi.Giá trị trùng hợp trong thanh ghi TMR2 được đi qua bộ postscaler 4 bit để phát ra
một ngắt TMR2(được đặt ở bit cờ ngắt TMR2IF) Bộ định thời 2 có thể được tắt ( không hoạt động ) bằng cách xóa bit điều khiển TMR2ON để giảm thiểu công suất tiêu tán nguồn
Trang 5.
Trang 64.4 NGẮT (INTERRUPT)
PIC16F877A có đến 15 nguồn tạo ra hoạt động ngắt được điều khiển bởi thanh ghi INTCON (bit GIE) Bên cạnh đó mỗi ngắt còn có một bit điều khiển và cờ ngắt riêng Các cờ ngắt vẫn được set bình thường khi thỏa mãn điều kiện ngắt xảy ra bất chấp trạng thái của bit GIE, tuy nhiên hoạt động ngắt vẫn phụ thuôc vào bit GIE và các bit điều khiển khác Bit điều khiển ngắt RB0/INT và TMR0 nằm trong thanh ghi INTCON, thanh ghi này còn chứa bit cho phép các ngắt ngoại vi PEIE Bit điều khiển các ngắt nằm trong thanh ghi PIE1 và PIE2 Cờ ngắt của các ngắt nằm trong thanh ghi PIR1 và PIR2
Trong một thời điểm chỉ có một chương trình ngắt được thực thi, chương trình ngắt được kết thúc bằng lệnh RETFIE Khi chương trình ngắt được thực thi, bit GIE tự động được xóa, địa chỉ lệnh tiếp theo của chương trình chính được cất vào trong bộ nhớ Stack và bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h Lệnh RETFIE được dùng để thoát khỏi chương trình ngắt và quay trở về chương trình chính, đồng thời bit GIE cũng sẽ được set để cho phép các ngắt hoạt động trở lại Các cờ hiệu được dùng để kiểm tra ngắt nào đang xảy ra và phải được xóa bằng chương trình trước khi cho phép ngắt tiếp tục hoạt động trở lại để ta có thể phát hiện được thời điểm tiếp theo mà ngắt xảy ra.Đối với các ngắt ngoại vi như ngắt từ chân INT hay ngắt từ sự thay đổi trạng thái các pin của PORTB (PORTB Interrupt on change), việc xác định ngắt nào xảy ra cần 3 hoặc 4chu kì lệnh tùy thuộc vào thời
Trang 7điểm xảy ra ngắt.Cần chú ý là trong quá trình thực thi ngắt, chỉ có giá trị của bộ đếm chương trình được cất vào trong Stack, trong khi một số thanh ghi quan trọng sẽ không được cất và có thể bị thay đổi giá trị trong quá trình thực thi chương trình ngắt Điều này nên được xử lí bằng chương trình để tránh hiện tượng trên xảy ra
*Giới Thiệu 1 số thanh ghi trong PIC
P2.24 Thanh ghi RCSTA: địa chỉ 18h
Thanh ghi chứa các bit trạng thái và các bit điều khiển quá trình nhận dữ liệu qua
chuẩn giao tiếp USART
P2.25 Thanh ghi XTREG: địa chỉ 19h
Thanh ghi đóng vai trò là buffer đệm 8 bit trong quá trình truyền dữ liệu thông qua
chuẩn giao tiếp USART
P2.26 Thanh ghi RCREG: địa chỉ 1Ah
Thanh ghi đóng vai trò là buffer đệm trong quá trình nhận dữ liệu qua chuẩn giao tiếp USART
P2.27 Thanh ghi CCPR2L: địa chỉ 1Bh
Thanh ghi chứa 8 bit thấp của khối CCP2
P2.28 Thanh ghi CCPR2H: địa chỉ 1Ch
Thanh ghi chứa 8 bit cao của khối CCP2
P2.29 Thanh ghi ADRESH: địa chỉ 1Eh
Trang 8Thanh ghi chứa byte cao của kết quả quá trình chuyển đổi ADC
P2.30 Thanh ghi ADCON0: địa chỉ 1Fh
Đây là một trong hai thanh ghi điều khiển khối chuyển đổi ADC Thanh ghi còn lại là thanh ghi ADCON1 (địa chỉ 9Fh)
P2.32 Thanh ghi TRISA: địa chỉ 85h
Thanh ghi điều khiển xuất nhập của các pin trong PORTA
P2.33 Thanh ghi TRISB: địa chỉ 86h, 186h
Thanh ghi điều khiển xuất nhập của các pin trong PORTB
P2.34 Thanh ghi TRISC: địa chỉ 87h
Thanh ghi điều khiển xuất nhập của các pin trong PORTC
P2.35 Thanh ghi TRISD: địa chỉ 88h
Thanh ghi điều khiển xuất nhập của các pin trong PORTD
P2.36 Thanh ghi TRISE: địa chỉ 89h
Thanh ghi điều khiển xuất nhập của các pin trong PORTE, điều khiển cổng giao tiếp song song PSP (Parallel Slave Port)
P2.37 Thanh ghi PIE1: địa chỉ 8Ch
Thanh ghi chứa các bit cho phép các ngắt ngoại vi
P2.38 Thanh ghi PIE2: địa chỉ 8Dh
Thanh ghi chứa các bit cho phép các ngắt ngọai vi
P2.39 Thanh ghi PCON: địa chỉ 8Eh
Thanh ghi điều khiển chứa các cờ hiệu cho biết trạng thái các chế độ reset của vi điều khiển
P2.40 Thanh ghi SSPCON2: địa chỉ 91h
Thanh ghi điều khiển các chế độ hoạt động của chuẩn giao tiếp I2C
P2.41 Thanh ghi PR2: địa chỉ 92h
Thanh ghi dùng để ấn định trước giá trị đếm cho Timer2 Khi vi điều khiển được reset, PR2 mang giá trị FFh Khi ta đưa một giá trị vào thanh ghi PR2, Timer2 sẽ đếm từ 00h cho đến khi giá trị bộ đếm của Timer2 bằng với giá trị của bộ đếm trong thanh ghi PR2 Như vậy mặc định Timer2 sẽ đếm từ 00h đến FFh
P2.42 Thanh ghi SSPADD: địa chỉ 93h Thanh ghi chứa địa
chỉ của vi điều khiển khi hoạt động ở chuẩn giao tiếp I2C Slavemode Khi không dùng để chứa địa chỉ (I2C Master mode) SSPADD được dùng để chứa giá trị tạo ra xung clock đồng bộ tại pin SCL Và 1 số thanh ghi khác