Xem mẫu

  1. Chương 5: KHẢO SÁT TIMER - COUNTER CỦA VI ĐIỀU KHIỂN 5.1 Giới thiệu 5.1.1 Cấu tạo của Bộ đếm/định thời 8051 có 02 Bộ đếm/Bộ định thời là Timer/Counter0 và Timer/Counter1, ta gọi chung là Timer/Counterx. Bộ Timer/Counterx là một loại ngoại vi của 8051 được thiết kế để thực hiện một nhiệm vụ đơn giản: đếm các xung nhịp (Pulse Input). Mỗi khi có thêm một xung nhịp tại đầu vào đếm thì giá trị của Bộ đếm sẽ được tăng lên 01 đơn vị (trong chế độ đếm tiến/đếm lên) hay giảm đi 01 đơn vị (trong chế độ đếm lùi/đếm xuống). Hình 5.1 - Sơ đồ khối tổng quan của Bộ đếm/ định thời Xung nhịp đưa vào đếm có thể là một trong hai loại: - Xung nhịp bên trong IC: Đó là xung nhịp được tạo ra nhờ kết hợp mạch dao động bên trong IC và thạch anh bên ngoài nối với IC. Trong trường hợp sử dụng xung nhịp loại này, người ta gọi là các Bộ định thời (Timers). Do xung nhịp bên loại này thường đều đặn nên ta có thể dùng để đếm thời gian một cách khá chính xác. - Xung nhịp bên ngoài IC: Đó là các tín hiệu logic thay đổi giữa hai mức tín hiệu 0 - 1 và không nhất thiết phải là đều đặn từ các sự kiện bên ngoài vi điều khiển. Trong trường hợp này người ta gọi là các Bộ đếm (Counters). 70
  2. 5.1.2 Hoạt động của Bộ đếm/định thời Hoạt động của Bộ đếm/định thời như sau: mỗi một xung đưa vào (Pulse Input), thanh ghi 16 bit THxTLx (ghép từ hai thanh ghi 8 bit THx, TLx) sẽ tăng (hoặc giảm) một giá trị cho đến khi xảy ra hiện tượng tràn, khi đó cờ TFx sẽ được bật lên. Sự kiện “tràn” (overflow) được hiểu là sự kiện Bộ đếm đếm vượt quá giá trị tối đa mà nó có thể biểu diễn và quay trở về giá trị 0 (Hình 5.2). Với Bộ đếm 8 bit, giá trị tối đa là 255 (tương đương với FF trong hệ Hexa) với Bộ đếm 16 bit là 65535 (FFFFH). Trong phần mềm, căn cứ vào cờ TFx được bật lên, có thể biết được Bộ đếm đã đếm hết một chu kỳ (một khoảng thời gian). Hình 5.2 - Một chu trình đếm của Timer0 Các giá trị đếm được của Timer/Counter T0 thì lưu trong 2 thanh ghi TH0 và TL0 – mỗi thanh ghi 8 bit kết hợp lại thành 16 bit. Tương tự, các giá trị đếm được của Timer/Counter T1 thì lưu trong 2 thanh ghi TH1 và TL1 – mỗi thanh ghi 8 bit kết hợp lại thành 16 bit. Bộ đếm/định thời được lựa chọn hay hoạt động ở chế độ nào là do việc thiết đặt trong các thanh ghi chức năng đặc biệt SFR (Special Function Registers) TCON và TMOD mà ta sẽ xét trong phần 5.2 và 5.3. 5.1.3 Ứng dụng của Bộ đếm/định thời Ứng dụng phổ biến của các Bộ đếm là dùng để thiết kế các ứng dụng đếm sự kiện xảy ra bên ngoài vi điều khiển như đếm các sản phẩm chạy trên băng chuyền, đếm xe ra/vào kho bãi, đếm khách ra vào siêu thị, trung tâm thương mại… (a) (b) 71
  3. Cảm biến Bảng Led (c) Hình 5.3 - Các ứng dụng tiêu biểu của Bộ đếm (a) - Máy đếm sản phẩm c hạy trên băng chuyền; (b) - Bộ đếm khách ra vào trung tâm thương mại; (c) – Bảng Led kết hợp với bộ đếm hiển thị số lượng chỗ đậu xe còn trống trong bãi. Bộ định thời được sử dụng trong hầu hết các ứng dụng của Vi điều khiển, từ việc tạo ra các hàm trễ (delay), cho đến việc tạo ra các giá trị baudrate cho truyền thông nối tiếp (Serial Communication). Tuy nhiên, ứng dụng phổ biến nhất của Bộ định thời là điều chế độ rộng xung PWM (Pulse Width Modulation). Đây là một chức năng quan trọng của Vi điều khiển trong rất nhiều ứng dụng: điều khiển tốc độ động cơ, điều khiển góc quay động cơ Servo, thiết kế các bộ nguồn ổn áp xung… (a) (b) Hình 5.4 - Các ứng dụng tiêu biểu của Bộ định thời (a) - Bộ định thời đếm ngược trong đèn giao thông; (b) - Chỉnh góc quay servo theo PWM 72
  4. 5.2 Thanh ghi chọn chế kiểu làm việc cho Timer Thanh ghi TMOD (TIMER MODE) là thanh ghi 8 bit, chỉ có thể truy xuất BYTE dùng để xác định chế độ hoạt động của Timer. Nó gồm hai nhóm 4 bit: 4 bit thấp (0 - 3) dùng để thiết lập các chế độ hoạt động cho Timer 0 và 4 bit cao (4 – 7) thiết lập các chế độ hoạt động cho Timer 1. Hình 5.5 - Thanh ghi TMOD Bảng 5.1 - Bảng tóm tắt các bit trong thanh ghi TMOD Bit Kí hiệu Timer Chức năng Nếu GATE = 1 thì Timer 1 chỉ làm việc khi chân INT1 hay 7 GATE 1 P3.3 ở mức cao Bit lựa chọn Counter hay Timer: 6 C/T 1 C/T = 0: Bộ định thời đếm xung từ bộ dao động thạch anh/12 C/T = 1: đếm xung từ bên ngoài đưa đến ngõ vào T1 5 T1M1 1 Bit chọn Mode của Timer 1 4 T1M0 1 Bit chọn Mode của Timer 1 3 GATE 0 Nếu GATE = 1 thì Timer 0 chỉ làm việc khi INT0 = 1 2 C/T 0 Bit lựa chọn Counter hay Timer: giống như trên 1 T0M1 0 Bit chọn mode của Timer 0 0 T0M0 0 Bit chọn mode của Timer 0 Ø Hai bit M0 và M1 tạo ra 4 tổ hợp trạng thái tương ứng với 4 kiểu làm việc khác nhau của Timer 0 hoặc của Timer 1 theo bảng sau: Bảng 5.2 - Chế độ hoạt động của Timer/Counter M1 M0 Chế độ Chức năng 0 0 0 Timer/Counter 13 bit 0 1 1 Timer/Counter 16 bit 1 0 2 Timer/Counter 8 bit, auto 1 1 3 Timer/Counter 8 bit Trong 4 chế độ này, thì chỉ có chế độ 1 và 2 là hay được sử dụng, chế độ 0 và 3 rất ít được sử dụng. Để hiểu hơn về cách truy xuất thanh ghi TMOD, ta khảo sát ví dụ sau: 73
  5. - TMOD = 0000 0001 (0x01): chế độ 1 của Bộ định thời Timer 0 được chọn - TMOD = 0010 0000 (0x20): chế độ 2 của Bộ định thời Timer 1 được chọn. TMOD = 0001 0010 (0x12): chế độ 1 của Bộ định thời Timer 1 và chế độ 2 của Bộ định thời Timer 0 được chọn. 5.3 Thanh ghi điều khiển Timer Thanh ghi TCON (TIMER CONTROL) là thanh ghi điều khiển hoạt động của Timer, chứa các bit trạng thái và các bit điều khiển cho Timer0 và Timer1. Gồm 8 bit và cho phép truy xuất byte hoặc từng bit. Hình 5.6 - Thanh ghi TCON Hoạt động của từng bit của thanh ghi TCON được tóm tắt như sau: Bảng 5.3 - Bảng mô tả các bit của thanh ghi TCON Kí Bit Tên đầy đủ Chức năng hiệu Cờ tràn của Timer 1. Cờ này được set bởi phần cứng 7 TF1 Timer Flag 1 khi có tràn, được xóa bởi phần mềm (lập trình) hoặc bởi phần cứng khi trình phục vụ ngắt hoạt động. Bit điều khiển Timer 1 đếm / ngừng đếm: Timer Run TR1 = 1 : Timer 1 được phép đếm xung. 6 TR1 Control 1 TR1 = 0 : Timer 1 không được phép đếm xung (ngừng) 5 TF0 Timer Flag 0 Cờ tràn Timer 0 (hoạt động tương tự TF1) Timer Run 4 TR0 Bit điều khiển Timer 0 (hoạt động tương tự TR1) Control 0 Cờ báo ngắt của ngắt INT1. Khi có ngắt xảy ra ở ngõ vào INT1 (cạnh xuống) thì cờ IE1 tác động lên mức 1. 3 IE1 Interrupt enable 1 Khi vi điều khiển thực hiện chương trình con phục vụ ngắt INT1 thì tự động xóa luôn cờ báo ngắt IE1. Bit điều khiển cho phép ngắt INT1 tác động bằng mức hay bằng cạnh. IT1 = 0 thì ngắt INT1 tác động 2 IT1 Interrupt type 1 bằng mức. IT1 = 1 thì ngắt INT1 tác động bằng cạnh xuống. 1 IE0 Interrupt enable 0 Giống như IE1 nhưng phục vụ cho ngắt INT0 0 IT0 Interrupt type 0 Giống như IT1 nhưng phục vụ cho ngắt INT0 Ø 4 bit thấp (IEx, ITx) được sử dụng cho phần lập trình ngắt, phần này sẽ được trình bày ở chương sau. 74
  6. Để hiểu thêm về cách truy xuất thanh ghi TCON thì ta xét các ví dụ sau: - Truy xuất BYTE: TCON = 0001 0010; - Truy xuất BIT: TR0 = 1; IE0 = 1; 5.4 Các kiểu hoạt động của Timer và cờ tràn Như đã trình bày ở trên các Timer có 4 kiểu hoạt động (Bảng 5.2), phần này ta sẽ khảo sát chi tiết các kiểu hoạt động của Timer. Ta dùng ký hiệu TLx và THx để chỉ 2 thanh ghi byte thấp và byte cao của Timer0 hoặc Timer1. v Chế độ 0 (Chế độ 13 bit): TLx chỉ được sử dụng 5 bit đầu để ghép với 8bit của THx, tạo thành 13 bit. Thời gian tối đa có thể định thời là 213 = 8192 µs (với thạch anh 11.0592 MHz) Hình 5.7 - Thanh ghi TH và TL ở chế độ 0 v Chế độ 1 (Chế độ 16 bit): Thời gian tối đa có thể định thời là 216 = 65536 µs. Hình 5.8 - Thanh ghi TH và TL ở chế độ 1 v Chế độ 2 (Chế độ tự động nạp lại 8 bit): Chế độ 8 bit, tự động nạp lại. Khi đó TLx hoạt động để đếm (định thời), còn THx chứa giá trị nạp lại. Khi xảy ra tràn, TFx được bật lên, đồng thời cho phép giá trị của THx được nạp vào TLx. Hình 5.9 - Thanh ghi TH và TL ở chế độ 2 75
  7. v Chế độ 3 (Chế độ tách ra): Bộ đếm/định thời 8 bit. Tuy nhiên chỉ sử dụng hai thanh ghi TH0 và TL0 (TH0 thay vai trò của TH1, TH1 không được sử dụng) Hình 5.10 - Thanh ghi TH và TL ở chế độ 3 5.5 Các nguồn xung đếm Timer/Counter có thể đếm xung từ hai nguồn: nếu Bộ Timer/Counter sử dụng ở chế độ Định thời - Timer thì sẽ đếm xung bên trong (xung nội) đã biết tần số, nếu Bộ Timer/Counter sử dụng ở chế độ Đếm - Counter thì sẽ đếm xung từ bên ngoài như Hình 5.11. Bit C/T trong TMOD cho phép chọn chế độ Timer hay Counter khi khởi tạo ở thanh ghi TMOD. Hình 5.11 - Các nguồn xung đếm 5.5.1 Chức năng định thời (đếm thời gian) Nếu bit C/T = 0 thì Bộ định thời hoạt động như một Bộ đếm thời gian với xung vào là xung đồng hồ trong chip, một mạch chia 12 được thêm vào để giảm tần số xung đồng hồ đến giá trị phù hợp với hầu hết các ứng dụng. 76
  8. Ở chế độ này Bộ định thời được dùng để đếm thời gian, cặp thanh ghi TLx/THx tăng dần với tốc độ là 1/12 tần số xung dao động trên chip (chẳng hạn nếu tần số thạch anh là 12 MHz thì tốc độ xung đếm là 1 MHz), hiện tượng tràn xảy ra nếu nó đếm đủ số xung tương ứng với thời gian quy định, phụ thuộc vào giá trị khởi tạo và được đặt vào các thanh ghi THx và TLx. Dao động Tần số đồng hồ :12 trên chip của Bộ định thời Hình 5.12 - Tần số của Bộ đếm/Bộ định thời Bảng 5.4 - Một số tần số thông dụng Tần số thạch anh Tần số Bộ định thời Chu kỳ Bộ định thời 20MHz 20MHz/12=1.6666MHz 1/1.6666MHz=0.6µs 12MHz 12MHz/12=1MHz 1/1MHz=1µs 11.0592MHz 11.0592MHz/12=0.9216MHz 1/0.9216MHz=1.085µs Mặc dù các hệ thống 8051 có thể sử dụng tần số thạch anh từ 10 đến 40MHz, song ta chỉ tập trung vào tần số thạch anh 11.0592MHz. Lý do đằng sau một số lẻ như vậy là tốc độ baud đối với truyền thông nối tiếp của 8051. Tần số XTAL = 11.0592MHz cho phép 8051 truyền thông với PC mà không có lỗi. 5.5.2 Chức năng đếm sự kiện Nếu bit C/T = 1 thì Timer hoạt động đếm xung đến từ bên ngoài và chu kỳ của mỗi xung do nguồn tạo tín hiệu bên ngoài quyết định. Hoạt động này thường dùng để đếm các sự kiện. Số lượng các sự kiện được lưu trữ trong thanh ghi của các Timer. Nguồn xung clock bên ngoài đưa vào chân T0 (P3.4 - chân 14) và và chân T1 (P3.5 - chân 15) của vi điều khiển. Trong các ứng dụng đếm xung từ bên ngoài: các thanh ghi Timer sẽ tăng giá trị đếm khi xung ngõ vào Tx chuyển trạng thái từ 1 sang 0 (tác động xung clock cạnh xuống). 77
  9. 5.6 Điều khiển các Timer đếm, ngừng đếm v Phương pháp đơn giản nhất để khởi động và dừng một Bộ định thời là dùng bit điều khiển khởi động TRx trong thanh ghi TCON, TRx tự động xóa khi reset hệ thống, do đó trạng thái mặc định của các Bộ định thời là trạng thái dừng. Bộ định thời được khởi động khi bit TRx ở trạng thái 1 (hình 5.13). Vì TRx nằm trong thanh ghi được định địa chỉ bit TCON nên rất dễ khởi động và dừng Timer bằng cách thiết lập trạng thái cho TRx = 1 (chạy) và TRx = 0 (ngừng). Hình 5.13 - Điều khiển đếm, ngừng Timer v Một phương pháp khác để điều khiển Bộ định thời là dùng bit GATE trong TMOD và ngõ vào từ bên ngoài INTx khi GATE = 1 thì Timer cho phép điều khiển bằng INTx, khả năng này thường dùng để đo bề rộng xung như sau: Giả sử INT0 ở mức thấp nhưng lên mức cao trong khoảng thời gian cần đo. Trước tiên, khởi tạo Timer 0 ở mode 1 là mode Timer 16 bit với TL0/TH0 = 0000H, GATE = 1 và TR0 = 1. Khi INT0 lên mức cao, Bộ định thời được mở cổng và đếm với xung 1 MHz, khi INT0 xuống mức thấp, Bộ định thời bị khóa cổng và bề rộng xung tính bằng µS chính là số xung đếm được chứa trong TL0/TH0 (INT0 có thể được lập trình để tạo một ngắt khi nó trở về mức thấp). 78
  10. 5.7 Khởi tạo và truy xuất các thanh ghi của Timer/Counter Các Timer thường được khởi tạo 1 lần ở đầu chương trình để thiết lập mode hoạt động phục vụ cho các ứng dụng điều khiển liên quan đến định thời hay đếm xung ngoại. Tùy thuộc vào yêu cầu điều khiển cụ thể mà ta điều khiển các timer bắt đầu đếm, ngừng hay khởi động đếm lại từ đầu … Thanh ghi TMOD là thanh ghi đầu tiên cần phải khởi tạo để thiết lập mode hoạt động cho các Timer. Ví dụ khởi động cho Timer0 hoạt động ở mode 1 (mode Timer 16 bit) và hoạt động định thời đếm xung nội bên trong thì ta khởi tạo bằng lệnh: MOV TMOD, # 00000001B. Trong lệnh này M1 = 0, M0 = 1 để vào mode 1 và C/T = 0, GATE = 0 để cho phép đếm xung nội bên trong đồng thời xóa các bit mode của Timer 1. Sau lệnh trên Timer 0 vẫn chưa đếm và timer 0 chỉ đếm khi set bit điều khiển chạy TR0. Nếu ta không thiết lập các giá trị bắt đầu đếm cho các thanh ghi TLx/THx thì Timer sẽ bắt đầu đếm từ 0000H lên và khi chuyển trạng thái từ FFFFH sang 0000H sẽ sinh ra tràn làm cho bit TFx = 1 rồi tiếp tục đếm từ 0000H lên tiếp . . . Nếu ta thiết lập giá trị bắt đầu đếm cho TLx/THx khác 0000H, thì Timer sẽ bắt đầu đếm từ giá trị thiết lập đó lên nhưng khi chuyển trạng thái từ FFFFH sang 0000H thì timer lại đếm từ 0000H lên. Để timer luôn bắt đầu đếm từ giá trị ta gán thì ta có thể lập trình chờ sau mỗi lần tràn ta sẽ xóa cờ TFx và gán lại giá trị cho TLx/THx để Timer luôn luôn bắt đầu đếm từ giá trị khởi gán lên. Đặc biệt nếu bộ định thời hoạt động trong phạm vi nhỏ hơn 256 µs thì ta nên dùng Timer ở mode 2 (tự động nạp 8 bit). Sau khi khởi tạo giá trị đầu cho thanh ghi THx, và TLx, khi set bit TRx thì Timer sẽ bắt đầu đếm từ giá trị đã gán trong TLX và khi tràn từ FFH sang 00H trong TLx, thì cờ tràn TFx tự động được set, đồng thời giá trị trong Thx tự động nạp sang cho TLx và Timer bắt đầu đếm từ giá trị khởi gán này lên. Nói cách khác, sau mỗi lần tràn ta không cần khởi gán lại cho các thanh ghi Timer mà chúng vẫn đếm được lại từ giá trị đã gán. Ví dụ 1: Chương trình tạo xung vuông tần số 1kHz sử dụng timer mode1: mov tmod,#01h ;chọn mode 1 timer 0 đếm 16 bit loop1: mov th0,#0feh ;độ rộng xung 500µs 79
  11. mov tl0,#0ch ; setb tr0 ;cho timer bắt đầu đếm loop: jnb tf0,loop ;chờ báo ngắt clr tf0 ;xóa cờ ngắt cpl p1.0 ;nghịch đảo bit p1.0 sjmp loop1 ;quay trở lại làm tiếp Ví dụ 2: Chương trình tạo xung vuông tần số 10 kHz sử dụng timer mode2: mov tmod,#02h ;chọn mode 2 chế dộ tự động nạp ;lai 8 bit loop1: mov th0,#-50 ;tạo độ rộng xung 50µs setb tr0 ;cho timer bắt đầu đếm loop: jnb tf0,loop ;chờ báo ngắt clr tf0 ;xóa cờ ngắt cpl p1.0 ;nghịch đảo bit p1.0 sjmp loop ;tro lai loop 5.8 Timer/Counter T2 của MCS52 Họ vi điều khiển MCS52 có 3 timer T0, T1, T2. Các timer T0 và T1 có các thanh ghi và hoạt động giống như họ 51. Ở đây chỉ trình bày thêm phần hoạt động của timer T2. Các thanh ghi của timer/counter T2 bao gồm: thanh ghi TL2, TH2, thanh ghi điều khiển T2CON, thanh ghi RCAP2L và RCAP2H. Timer/counter T2 có thể dùng để định thời timer hoặc dùng như bộ đếm counter để đếm xung ngoài đưa đến ngõ vào T2 chính là chân P1.0 của port 1 như hình 5.14. Timer/counter T2 có 3 kiểu hoạt động: tự động nạp lại, thu nhận và thiết lập tốc độ baud để phục vụ cho truyền dữ liệu. Chức năng của thanh ghi điều khiển T2CON được thể hiện trong bảng sau: 80
  12. Bảng 5.5 - Bảng mô tả các bit của thanh ghi T2CON Bit Kí hiệu Địa chỉ Chức năng 7 TF2 CFH Cờ tràn Timer 2: hoạt động giống như các timer trên (TF2 sẽ không được thiết lập lên mức 1 nếu bit TCLK hoặc RCLK ở mức 1). 6 EXF2 CEH Cờ ngoài của timer T2: chỉ được set khi xảy ra sự thu nhận hoặc nạp lại dữ liệu bởi sự chuyển trạng thài từ 1 sang 0 ở ngõ vào T2EX và EXEN2 = 1; khi cho phép timer T2 ngắt, EXF2=1 thì CPU sẽ thực hiện hiện chương trình con phục vụ ngắt Timer T2, bit EXF2 có thể bằng phần mềm. 5 RCLK CDH Xung clock thu của timer 2. Khi RCLK=1 thì timer T2 cung cấp tốc độ baud cho port nối tiếp để nhận dữ liệu về và timer T1 sẽ cung cấp tốc độ baud cho port nối tiếp để phát dữ liệu đi. 4 TCLK CCH Xung clock phát của timer 2. Khi TCLK=1 thì timer T2 cung cấp tốc độ baud cho port nối tiếp để phát dữ liệu đi và timer T1 sẽ cung cấp tốc độ baud cho port nối tiếp để nhận dữ liệu về. 3 EXEN2 CBH Bit điều khiển cho phép tác động từ bên ngoài. Khi EXEN2 = 1 thì hoạt động thu nhận và nạp lại của timer T2 chỉ xảy ra khi ngõ vào T2EX có sự chuyển trạng thái từ 1 sang 0. 2 TR2 CAH Bit điều khiển Timer 1 đếm / ngừng đếm: TR2 = 1 thì timer 1 được phép đếm xung. TR2 = 0 thì timer 1 không được phép đếm xung (ngừng). Dùng lệnh điều khiển bit TR2 để cho phép timer1 đếm hay ngừng đếm. 1 C/T2 C9H Bit lựa chọn counter hay timer: C/T2 = 1 : đếm xung từ bên ngoài đưa đến ngõ vào T2. C/T2 = 0 : định thời đếm xung nội bên trong. 0 CP/RL2 C8H Cờ thu nhận/nạp lại dữ liệu của timer T2. Khi bit này = 1 thì thu nhận chỉ xảy ra khi có sự chuyển trạng thái từ 1 sang 0 ở ngõ vào T2EX và EXEN2=1; khi bit này = 0 thì quá trình tự động nạp lại khi timer T2 tràn hoặc khi có sự chuyển trạng thái ở ngõ vào T2EX và bit EXEN2 = 1; nếu bit RCLK hoặc TCLK = 1 thì bit này xem như bỏ. 81
  13. Hình 5.14 - Sơ đồ chân của 89C52 với ngõ vào T2 là P1.0 và T2EX là P1.1 5.8.1 Chế độ tự động nạp lại Bit thu nhận/nạp lại RLCP 2/ lựa chọn một trong hai chế độ: tự động nạp lại và thu nhận. Khi RLCP = 02/ thì timer hoạt động ở chế độ tự động nạp lại: các thanh ghi TL2, TH2 sẽ lưu trữ số xung đếm còn 2 thanh ghi RCAP2L và RCAP2H lưu trữ giá trị để nạp lại cho TL2, TH2. Giá trị lưu và nạp lại là 16 bit. Khi timer đếm tràn thì làm cho cờ báo tràn TF2 bằng 1 đồng thời tự động thực hiện nạp lại dữ liệu. Hình 5.15 - Hoạt động của timer T2 ở chế độ tự động nạp lại 82
  14. Tương tự nếu bit EXEN2 = 1 thì chế độ tự động nạp lại xảy ra khi có sự chuyển trạng thái từ 1 sang 0 ở ngõ vào T2EX đồng thời làm cho bit EXF2 = 1. Tương tự như cờ TF2 thì cờ EXF2 cũng có thể được kiểm tra bằng phần mềm hoặc tạo ngắt. Bit EXF2 phải xóa bằng phần mềm. Hoạt động tự nạp của timer T2 được trình bày như hình 5.15. 5.8.2 Chế độ thu nhận Khi RLCP =12/ thì timer hoạt động ở chế độ thu nhận. Khi đó timer T2 hoạt động bình thường như một timer/counter 16 bit, thanh ghi TL2, TH2 sẽ lưu trữ xung đếm và nếu có sự chuyển trạng thái từ FFFFH sang 0000H thì sẽ sinh ra tràn và làm cho cờ tràn TF2=1. Bit cờ tràn có thể kiểm tra bằng phần mềm hay có thể tạo ra ngắt. Hình 5.16 - Hoạt động của timer T2 ở chế độ thu nhận dữ liệu Để cho phép chế độ thu nhận hoạt động thì làm cho bit EXEN2 = 1. Nếu bit EXEN2 = 1 và khi có sự chuyển trạng trái từ 1 sang 0ở ngõ vào T2EX thì chế độ thu nhận sẽ xảy ra: giá trị đếm được trong thanh ghi TL2, TH2 sẽ được chuyển sang 2 thanh ghi RCAP2L và RCAP2H. Cờ EXF2 cũng được chuyển lên mức 1 để báo hiệu quá trình thu nhận đã xảy ra, cờ EXF2 có thể kiểm tra bằng phần mềm hoặc tạo ngắt. Hoạt động thu nhận dữ liệu của timer T2 được trình bày ở hình 5.16. 83
  15. CÂU HỎI ÔN TẬP VÀ BÀI TẬP 1. Nêu ý nghĩa và ứng dụng của bộ đếm/định thời trong thực tế đời sống và sản xuất? 2. Trình bày nguyên lý hoạt động của bộ đếm, bộ định thời? 3. Hãy tìm tần số đồng bộ và chu kỳ của Bộ định thời cho các hệ dựa trên 8051 với các tần số thạch anh sau: a) 12MHz b) 16MHz c) 11.0592MHz d) 20MHz 4. Tìm giá trị cho TMOD (viết ở dạng Binay và Hexa) nếu ta muốn lập trình bộ Timer0 ở chế độ 2, Timer1 ở chế độ 1 và cả hai Timer 0 và Timer 1 đều ở chế độ 2. 5. Biết tần số XTAL là 12MHz. Hãy tìm các giá trị cần được nạp vào các thanh ghi TH và TL để tạo ra một sóng vuông tần số 480Hz. 6. Viết chương trình tạo xung vuông tần số f = 1 Hz tại P1.2 dùng Timer1 biết tần số XTAL là 12MHz. 84
  16. Chương 6: KHẢO SÁT NGẮT CỦA VI ĐIỀU KHIỂN 6.1 Giới thiệu Ngắt là sự xuất hiện của một điều kiện, một sự kiện làm tạm dừng chương trình trong khi điều kiện này được phục vụ bởi một chương trình khác. Ngắt có một vai trò quan trọng trong thiết kế và thực hiện các ứng dụng của vi điều khiển. Chúng cho phép hệ thống đáp ứng không đồng bộ với một sự kiện và xử lý sự kiện trong khi một chương trình khác đang hoạt động. Một hệ thống được điều khiển bằng ngắt tạo một ảo giác thực hiện đồng thời nhiều công việc cùng một lúc… Dĩ nhiên, tại một thời điểm CPU không thể thực hiện nhiều hơn một lệnh nhưng nó có thể tạm dừng chương trình để thực hiện một chương trình khác và sau đó trở lại chương trình đầu tiên. Điểm khác là trong một hệ thống điều khiển bằng ngắt, các ngắt không xảy ra như là kết quả của một lệnh (như lệnh gọi chương trình con) mà là đáp ứng với một sự kiện xảy ra một cách không đồng bộ với chương trình chính có nghĩa là không biết trước chương trình chính sẽ bị ngắt lúc nào. Chương trình xử lý ngắt được gọi là chương trình phục vụ ngắt (Interrupt service routine) viết tắt là ISR hay quản lý ngắt. ISR hoạt động để đáp ứng một ngắt và thường thực hiện một thao tác vào hoặc ra đến một thiết bị. Khi xảy ra một ngắt thì chương trình chính tạm thời dừng lại và rẻ nhánh đến ISR. ISR thực hiện các thao tác cần thiết và kết thúc với lệnh trở về từ ngắt và chương trình chính lại tiếp tục từ nơi tạm dừng. Như vậy, chương trình chính hoạt động ở mức cơ sở và các ISR hoạt động ở mức ngắt cũng có dùng các thuật ngữ: “phía trước” (foreground) để chỉ mức cơ sở và “phía sau” (background) để chỉ mức ngắt, trong hình 6.1a trình bày hoạt động của một chương trình không có ngắt và 6.1b là hoạt động của chương trình chính ở mức cơ sở có ngắt và các ngắt hoạt động ở mức ngắt. Một ví dụ điển hình về ngắt là việc nhập dữ liệu bằng tay dùng bàn phím. Hãy khảo sát một ứng dụng về lò vi sóng: Chương trình chính điều khiển phần tử tạo năng lượng vi sóng để nấu ăn, nhưng trong khi đang nấu hệ thống cần phải đáp ứng việc nhập bằng tay trên cửa lò ví dụ tăng hoặc giảm thời gian nấu. Khi người sử dụng thả nút nhấn, một ngắt được tạo ra (có thể là một tín hiệu chuyển từ mức cao xuống mức thấp) và chương trình chính bị dừng lại, chương trình ISR hoạt động 85
  17. đọc các mã của bàn phím và thay đổi quá trình nấu tương ứng sau đó chấm dứt bằng cách chuyển điều khiển về cho chương trình chính, chương trình chính lại tiếp tục từ nơi bị ngắt. Một điểm quan trọng trong ví dụ này là việc nhập bằng tay xảy ra một cách không đồng bộ có nghĩa là không biết trước hoặc không được điều khiển bằng phần mềm đang chạy trong hệ thống. Đó chính là đặc điểm của ngắt. Hình 6.1 - Vi điều khiển thực hiện chương trình chính trong hai trường hợp 6.2 Tổ chức ngắt 8051 có năm nguồn tín hiệu ngắt: 2 ngắt ngoài, 2 ngắt định thời và 1 ngắt cổng nối tiếp. 8052 có thêm ngắt thứ sáu của Timer thứ ba. Trạng thái mặc định của các ngắt là không hoạt động sau khi reset hệ thống và chuyển sang hoạt động từng ngắt riêng rẻ bằng phần mềm. Trong trường hợp có hai hoặc nhiều ngắt xuất hiện đồng thời hoặc một ngắt xảy ra trong khi một ngắt khác đang được phục vụ. Có hai sơ đồ sắp xếp ưu tiên các ngắt đó là: Chuỗi pooling và ưu tiên hai cấp, thứ tự theo chuỗi pooling thì cố định nhưng sơ đồ ưu tiên hai cấp thì lập trình được. Sau đây là phương pháp cho phép và không cho phép sự hoạt động của các ngắt. 86
  18. 6.2.1 Cho phép và không cho phép các ngắt Mỗi một tín hiệu ngắt được cho phép hoặc không cho phép bởi địa chỉ bit trong thanh ghi chức năng đặc biệt IE (Interrupt enable) tại địa chỉ 0A8H, có một bit cho phép toàn cục, bit này khi bị xóa sẽ ngăn tất cả các ngắt (bảng 6.1). Để cho phép một ngắt cần phải set hai bit: Một bit cho phép riêng và bit cho phép toàn cục. Ví dụ: ngắt Timer 1 được cho phép như sau: SETB ET1 SETB EA Hoặc MOV IE,#10001000B Mặc dù hai cách trên có cùng kết quả sau khi reset hệ thống nhưng kết quả sẽ khác nhau nếu IE được ghi ở giữa chương trình trong khi đang chạy. Cách thứ nhất không ảnh hưởng đến 5 bit còn lại trong thanh ghi IE còn cách thứ hai sẽ xóa các bit còn lại khác. Tốt nhất nên dùng cách thứ hai tại vị trí bắt đầu chương trình (nghĩa là khi bắt đầu mở máy hoặc reset hệ thống) nên dùng lệnh SETB và CLR trong khi chương trình đang chạy để tránh ảnh hưởng các bit khác trong thanh ghi IE. 6.2.2 Mức ưu tiên Mỗi ngắt được lập trình ở một trong hai mức ưu tiên bằng thanh ghi IP (Interrupt priority) tại địa chỉ 0B8H (bảng 6.2). Thanh ghi IP tự động xóa sau khi reset hệ thống để đặt các ngắt ở mức ưu tiên thấp. Bảng 6.1 - Thanh ghi IE Bit Kí hiệu Địa chỉ bit Mô tả (1 = cho phép, 0 = không cho phép) IE.7 EA AFH Cho phép toàn cục IE.6 - AEH Không dùng IE.5 ET2 ADH Cho phép ngắt Timer 2 (8052) IE.4 ES ACH Cho phép ngắt cổng nối tiếp IE.3 ET1 ABH Cho phép ngắt Timer1 IE.2 EX1 AAH Cho phép ngắt 1 ngoài IE.1 ET0 A9H Cho phép ngắt Timer 0 87
  19. IE.0 EX0 A8H Cho phép ngắt 0 ngoài Bảng 6.2 - Thanh ghi IP Bit Kí hiệu Địa chỉ bit Mô tả (1 = mức cao, 0 = mức thấp) IP.7 - - Không dùng IP.6 - - Không dùng IP.5 PT2 0BDH Ưu tiên ngắt Timer 2 (8052) IP.4 PS 0BCH Ưu tiên ngắt cổng nối tiếp IP.3 PT1 0BBH Ưu tiên ngắt Timer1 IP.2 PX1 0BAH Ưu tiên ngắt 1 ngoài IP.1 PT0 0B9H Ưu tiên ngắt Timer 0 IP.0 PX0 0B8H Ưu tiên ngắt 0 ngoài Khái niệm “ưu tiên” cho phép một ISR bị dừng bởi một ngắt khác nếu ngắt mới xuất hiện này có mức ưu tiên cao hơn ngắt đang được phục vụ, điều này phù hợp với 8051 vì chỉ có hai mức ưu tiên, nếu một ISR ưu tiên thấp đang chạy nhưng xảy ra một ngắt ưu tiên cao thì ISR sẽ bị dừng. Một ISR ưu tiên không thể bị dừng. Chương trình chính hoạt động ở mức ưu tiên cơ sở và không liên hệ với một ngắt bất kỳ nào nên luôn bị dừng khi xảy ra ngắt. Nếu hai ngắt có mức ưu tiên khác nhau cùng xảy ra thì ngắt có mức ưu tiên cao sẽ được phục vụ trước. 6.2.3 Chuỗi pooling Nếu đồng thời xuất hiện hai ngắt có cùng mức ưu tiên thì ngắt được phục vụ trước được xác định theo thứ tự chuỗi pooling: Ngắt 0 ngoài, ngắt Timer 0, ngắt 1 ngoài, ngắt Timer 1, ngắt cổng nối tiếp, ngắt Timer 2. Hình 6.2 trình bày năm nguồn tín hiệu ngắt cùng cơ chế cho phép toàn cục và riêng rẻ, chuỗi pooling và các mức ưu tiên, trạng thái của tất cả các nguồn tín hiệu ngắt có thể thông qua các bit cờ trong thanh ghi chức năng đặc biệt. Dĩ nhiên, nếu một ngắt nào đó không được cho phép thì ngắt tương ứng không được tạo ra nhưng phần mềm vẫn có thể kiểm tra cờ ngắt. Các ví dụ về Timer và cổng nối tiếp trong hai bài trước đã sử dụng các cờ ngắt mà thực tế không dùng các ngắt. 88
  20. Một ngắt cổng nối tiếp là kết quả từ phép OR của ngắt thu (RI) với ngắt phát (TI). Ngắt Timer 2 được tạo ra bởi cờ tràn TF2 hoặc với cờ nhập bên ngoài EXF2. Bảng 6.3 - Khả năng tạo ngắt của các bit cờ Ngắt Cờ Thanh ghi SFR và vị trí bit 0 ngoài IE0 TCON.1 1 ngoài IE1 TCON.3 Timer 0 TF1 TCON.7 Timer 1 TF0 TCON.5 Cổng nối tiếp TI SCON.1 Cổng nối tiếp RI SCON.0 Timer 2 TF2 T2CON.7 (8052) Timer 2 EXF2 T2CON.6 (8052) Hình 6.2 - Cấu trúc ngắt 8051 6.3 Xử lý ngắt Khi một ngắt xuất hiện được CPU nhận ra, chương trình chính sẽ dừng lại và kế tiếp là các thao tác như sau: 89
nguon tai.lieu . vn