intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Giáo trình Vi điều khiển: Phần 2

Chia sẻ: Lê Na | Ngày: | Loại File: PDF | Số trang:81

111
lượt xem
22
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Giáo trình Vi điều khiển: Phần 2 có kết cấu gồm 7 bài học. Nội dung phần này trình bày về bộ định thời, cổng nối tiếp, ngắt (Interrupt), phần mềm hợp ngữ. Giáo trình dành cho sinh viên trường nghề và những ai quan tâm đến vấn đề trên.

Chủ đề:
Lưu

Nội dung Text: Giáo trình Vi điều khiển: Phần 2

  1. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bài 4: BỘ ĐỊNH THỜI 1. Mở đầu Định thời là sự hoạt động để kiểm soát thời gian thực thi các câu lệnh trong quá trình xử lý của vi điều khiển. 8051 có hai bộ định thời/ bộ đếm. Chúng có thể được dùng như các bộ định thời để tạo một bộ trễ thời gian hoặc như các bộ đếm để đếm các sự kiện xảy ra bên ngoài bộ VĐK. Các timer này đều là timer 16bit, giá trị đếm được tính từ 0 đến 0xFFFF(đếm từ 0 đến 65535). Mỗi bộ Timer có 4 chế độ hoạt động khác nhau và được dùng để: - Đếm sự kiện tại các chân T0 (chân 14) hay T1 (chân 15). - Chờ một khoảng thời gian. - Tạo tốc độ cho port nối tiếp. Quá trình điều khiển hoạt động của Timer / Counter được thực hiện thông qua các thanh ghi sau: Bảng 4.1 : Các thanh ghi điều khiển hoạt động timer Thanh ghi Địa chỉ byte Địa chỉ bit TCON 88H 88H – 8FH TMOD 89H Không TL0 90H Không TL1 91H Không TH0 92H Không TH1 93H Không Hoạt động cơ bản của Timer / Counter gồm có các thanh ghi timer THx và TLx (x = 0, 1) mắc liên tầng tạo thành dạng thanh ghi 16 bit. Khi set bit TRx trong thanh ghi TCON, timer tương ứng sẽ hoạt động và giá trị trong thanh ghi TLx tăng lên 1 sau mỗi xung đếm. Khi TLx tràn (thay đổi từ 255 đến 0), giá trị của THx tăng lên 1. Khi THx tràn, cờ tràn tương ứng TFx (trong thanh ghi TCON) sẽ được đưa lên mức 1. Tuỳ theo nội dung của bit C/T xung đếm có thể lấy từ dao động nội (C/T = 0) hay từ các chân Tx bên ngoài (C/T = 1). Lưu ý rằng phải xoá bit TRx khi thay đổi chế độ hoạt động của Timer. Khi xung đếm lấy từ dao động nội, tốc độ đếm = fOSC/12 hay fOSC/2 trong chế độ X2(nghĩa là nếu fOSC = 12 MHz thì tốc độ xung đếm là 1 MHz hay cứ 1 90
  2. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái µs thì có 1 xung đếm trong chế dộ chuẩn) hay tốc độ đếm = fPER/6 (fPER: tần số xung ngoại vi – peripheral clock). Khi lấy xung đếm từ bên ngoài (các chân Tx), bộ đếm sẽ tăng lên 1 khi ngõ vào Tx ở mức 1 trong 1 chu kỳ và xuống mức 0 trong chu kỳ kế tiếp. Do đó, tần số xung tối đa tại các chân Tx là fOSC/24 trong chế độ thường hay fOSC/12 trong chế độ X2 (=fPER/12). 2. Thanh ghi SFR của timer 2.1. Thanh ghi chế độ TMOD Cả hai bộ định thời Timer 0 và Timer 1 đều dùng chung một thanh ghi được gọi là TMOD để thiết lập các chế độ làm việc khác nhau của bộ định thời. Thanh ghi TMOD là thanh ghi 8 bít gồm có 4 bít thấp được thiết lập dành cho bộ Timer 0 và 4 bít cao dành cho Timer 1. Trong đó hai bít thấp của chúng dùng để thiết lập chế độ của bộ định thời, còn 2 bít cao dùng để xác định phép toán. TMOD Register MSB LSB GATE C/T M1 M0 GATE C/T M1 M0 Timer1 Timer0 Chức năng các bit của thanh ghi TMOD: - Các bit M1, M0 : Là các bít chế độ của các bộ Timer 0 và Timer 1. Chúng chọn chế độ của các bộ định thời: 0, 1, 2 và 3. Chế độ 0 là một bộ định thời 13 bit, chế độ 1 là một bộ định thời 16 bít và chế độ 2 là bộ định thời 8 bít. Chúng ta chỉ tập chung vào các chế độ thường được sử dụng rộng rãi nhất là chế độ 1 và 2. Các chế độ được thiết lập theo trạng thái của M1 và M0 như sau : M1 M0 Mode Chế độ hoạt động 0 0 0 Chế độ định thời 13 bit. 0 1 1 Chế độ định thời 16 bit, không định tỉ lệ trước 1 0 2 Chế độ 8 bit tự nạp lại 1 1 3 Chế độ bộ định thời chia tách Ví dụ: Xác định chế độ và bộ định thời của các trường hợp sau: 91
  3. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái a) MOV TMOD, #20H b) MOV TMOD, #12H Giải: Trường hợp a: TMOD = 20H = 00100000B . Đối chiếu với thanh ghi TMOD ta thấy đây là chế độ 2 bộ định thời Timer 1 được chọn. Trường hợp b: TMOD = 12H = 00010010. Đối chiếu với thanh ghi TMOD ta thấy đây là chế độ 1 bộ định thời Timer 1 và chế độ 2 bộ định thời Timer 0 được chọn.  Bit C/T ( Counter / Timer): Bít này trong thanh ghi TMOD được dùng để quyết định xem bộ định thời được dùng như một máy tạo độ trễ hay bộ đếm sự kiện. + C/T = 1: Đếm xung từ bên ngoài. + C/T = 0 : Đếm xung nội bên trong. Nguồn đồng hồ cho chế độ trễ thời gian là tần số thạch anh của 8051.  Bit cổng GATE : Một bít khác của thanh ghi TMOD là bít cổng GATE. Để ý trên thanh ghi TMOD ta thấy cả hai bộ định thời Timer 0 và Timer 1 đều có bít GATE. Mỗi bộ định thời thực hiện điểm khởi động và dừng. Một số bộ định thời hực hiện điều này bằng phần mềm, một số khác bằng phần cứng và một số khác vừa bằng phần cứng vừa bằng phần mềm. Các bộ định thời trên 8051 có cả hai. Việc khởi động và dừng bộ định thời được khởi động bằng phần mềm bởi các bít khởi động bộ định thời TR là TR0 và TR1. 2.2. Thanh ghi điều khiển TCON MSB LSB TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Bảng 4.2 :Hoạt động từng bit của thanh ghi TCON. Bit Ký hiệu Địa chỉ Chức năng 7 TF1 8FH Cờ tràn Time 1: TF1=1 khi timer 1 bị tràn và có thể xóa bằng phần mềm hoặc khi vi điều khiển thực hiện chương trình con phục vụ ngắt timer 1 thì tự động xóa luôn cờ tràn TF1 92
  4. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 6 TR1 8EH Bit điều khiển timer 1 đếm/ ngừng đếm: TR1=1 thì timer 1 được phép đếm xung. TR1=0 thì timer 1 ngừng đếm xung. 5 TF0 8DH Cờ tràn timer 0( hoạt động tương tự TF1) 4 TR0 8CH Bit điều khiển timer 0 3 IE1 8BH 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. 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. 2 IT1 8AH 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 bằng mức. IT1=1 thì ngắt INT1 tác động bằng cạnh xuống. 1 IE0 89H Giống như IE1 nhưng phục vụ cho ngắt INT0. 0 IT0 88H Giống như IT1 nhưng phục vụ cho ngắt INT0. Ví dụ: Tìm giá trị của TMOD nếu muốn lập trình bộ Timer 1 ở chế độ 1 và sử dụng thạch anh XTLA 8051 làm nguồn đồng hồ và sử dụng lệnh để khởi động và dừng bộ định thời. TMOD = 00010000 Chế độ 1 và chế độ 2 là hai chế độ được sử dụng khá phổ biến, vì vậy chúng ta sẽ nghiên cứu kỹ hơn. 3. Các chế độ làm việc 8051 có 2 timer là timer 0 và timer 1. Ta dùng ký hiệu TLx và THx để chỉ 2 thanh ghi byte cao va byte thấp của timer 0 hoặc timer 1. Như đã trình bày ở trên các timer có 4 chế độ hoạt động, sau đây là chi tiết các kiểu hoạt động của timer : 93
  5. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 3.1. Chế độ time 13 bit (Mode 0) Chế độ 0 là chế độ 13 bit bao gồm 8 bit của thanh ghi THx và 5 bit của thanh ghi TLx còn 3 bit cao của thanh ghi TLx không sử dụng. Mỗi lần có xung đếm, giá trị trong thanh ghi 13 bit tăng lên 1. Khi giá trị này thay đổi từ 1 1111 1111 1111b đến 0 thì bộ đếm tràn làm cho TFx được đặt lên mức 1. Do chế độ 0 sử dụng 13 bit nên giá trị đếm tối đa là 213 = 8192. Chế độ này được cung cấp nhằm mục đích tạo khả năng tương thích với 8048 và thường không được sử dụng hiện nay. Hình 4.1: Timer chế độ 13 bit 3.2. Chế độ time 16 bit (Mode 1) Dưới đây là những đặc trưng và những phép toán của Model 1. - Đó là bộ định thời 16 bit, do vậy các giá trị từ 0000 – FFFFH được nạp vào thanh ghi TL và TH của bộ định thời. - Sau đó bộ định thời được khởi động nhờ lệnh “SETB TR0” cho Timer 0 và “SETB TR1” cho Timer 1. - Sau khi được khởi động thì bộ định thời bắt đầu đếm tăng. Bộ định thời đếm lên cho đến khi đạt giới hạn FFFFH. Khi đó nó sẽ quay vòng từ FFFFH về 0 và bật cờ định thời TF (Timer Flag) lên mức cao. - Bộ định thời sau khi đạt giá trị giới hạn thì thực hiện quay vòng về 0. Để lặp lại quá trình đếm thì các thanh ghi TH và TL phải được nạp lại giá trị ban đầu và cờ TF cần được xoá về 0. 94
  6. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Hình 4.2: Chế độ timer 16 bit Các bước lập trình chế độ 1: Để tạo ra bộ trễ thời gian khi dùng chế độ 1 của bộ định thời thì cần phải thực hiện các bước dưới đây: - Bước 1: Nạp giá trị cho thanh ghi TMOD xác định bộ định thời nào (Timer O hay Timer 1) và chế độ nào được chọn. - Bước 2: Nạp giá trị đếm ban đầu cho các thanh ghi TL và TH. - Bước 3: Khởi động bộ định thời. - Bước 4: Kiểm tra trạng thái bật của cờ bộ định thời. Thoát khỏi vòng lặp khi TF được bật lên. - Bước 5: Dừng bộ định thời. - Bước 6: Xoá cờ TF cho vòng kế tiếp. - Bước 7: Quay trở lại bước 2 để nạp lại giá trị cho TL và TH.Để tính toán thời gian trễ chính xác (với XTAL cụ thể) ta có thể sử dụng một trong hai cách tính. Tính theo số hexa Tính theo số thập phân (FFFFH – YYXXH +1)xT Đổi YYXXH ra số thập phân Trong đó:YYXXH: Giá trị khởi tạo của NNNNN. Sau đó tính (65536 – TH, TL tương ứng NNNNN)xT T: Chu kỳ bộ định thời Ví dụ 1: Viết chương trình tạo ra xung vuông độ dày 50% trên chân P0.1 sử dụng bộ định thời Timer 0 để tạo trễ. CLR TF0 ;xoa co Timer 0 MOV TMOD,#01H ;su dung Timer 0 che do 1 95
  7. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái HERE: MOV TL0,#0F2H ;TL0 = F2H, byte thap MOV TH0,#0FFH ;TH0 = FFH, byte cao CPL P0.1 ;su dung chan P0.1 ACALL DELAY ;tao tre SJMP HERE ;nap lai TH, TL ;************* Tao tre dung Timer 0. DELAY: SETB TR0 ;khoi dong bo dinh thoi Timer 0 AGAIN: JNB TF0,AGAIN ;kiem tra cờ bộ định thời CLR TR0 ; Xóa cờ bộ định thời CLR TF0 ;xoa co Timer 0 RET Với giả thiết tần số XTAL = 11,0592MHz ta sẽ tính được thời gian tạo trễ như sau. Bộ định thời làm việc ở tần số đồng hồ bằng 1/12 tần số XTAL do vậy ta có: f = 11, 0592/12 = 0, 9216MHz và T = 1/f = 1/0, 9216 = 1, 085 s. Thời gian trong chương trình con DELAY là (FFFFH – FFF2H +1) x1, 085 = 14x1, 085 = 15, 19 s. Ví dụ 2: Giả sử tần số XTAL = 11, O592 MHz. Hãy viết chương trình tạo xung có tần số 2KHz trên chân P1.5. Giải: - Chu kỳ sóng vuông là: T = 1/f = 1/2KHz = O, 5ms = 5OO s. - Khoảng thời gian cao (hoặc thấp) là: O, 5T = O, 5.5OO = 25O s. - Số nhịp đếm cần trong khoảng thời gian đó là: 25O/1, O85 = 23O nhịp - Giá trị cần nạp vào thanh ghi TH và TL là: 65536 – 23O = 653O6 = FF1AH. Chương trình được viết như sau: 96
  8. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái CLR TF0 ;xoa co Timer 0 MOV TMOD,#01H ;su dung Timer 0 che do 1 AGAIN: MOV TL0,#1AH ;TL0 = 1AH, byte thap MOV TH0,#0FFH ;TH0 = FFH, byte cao SETB TR0 ;khoi dong bo dinh ;thoi Timer 0 BACK: JNB TF0,BACK 3.3. Chế độ tự nạp lại 8 bit ( Mode 2) Chế độ 2 là chế độ 8 bit trong đó sử dụng thanh ghi TLx đế chứa giá trị đếm còn thanh ghi THx chứa giá trị nạp lại (do đó chế độ này được gọi là chế độ tự động nạp lại – autoreload). Trong chế độ 2, mỗi khi giá trị trong thanh ghi TLx thay đổi từ 1111 1111b đến 0 thì cờ TFx được set lên mức 1 đồng thời giá trị trong thanh ghi THx được chuyển vào thanh ghi TLx. Như vậy, giá trị đếm trong TLx và THx chỉ được nạp một lần khi khởi động timer (có thể không cần nạp cho TLx nhưng khi đó chu kỳ hoạt động đầu tiên của timer sẽ sai). Chế độ 2 sử dụng 8 bit đếm trong thanh ghi TLx nên giá trị đếm tối đa là 28 = 256. Hình 4.3: Chế độ tự nạp lại 8 bit 3.4. Chế độ tách biệt time ( Mode 3) Ở chế độ này chức năng Timer 0 và chức năng Timer 1 khác nhau. Bộ Timer 1 ở chế độ 3 chỉ chứa chức năng đếm của nó, kết quả giống khi đặt TR1 = 0. Bộ Timer 0 ở chế độ 3 thiết lập TH0, TL0 như là 2 bộ đếm riêng biệt. Mạch 97
  9. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái logic đối với chế độ 3 của Timer 0 thể hiện ở hình 2.7. Bộ đếm TL0 được điều khiển bởi các bit: C/(/T), GATE, TR0, /INTO và khi đếm tràn nó thiết lập cờ ngắt TF0. Bộ đếm TH0 chỉ được điều khiển bởi bit TR1 và khi đếm tràn nó thiết lập cờ ngắt TF1. Vậy TH0 điều khiển ngắt Timer/Counter 1. Chế độ 3 thường được dùng khi yêu cầu cần có bộ thời gian hoặc bộ đếm ngoài 8 bit. Đối với Timer 0 ở chế độ 3, AT89C51 có thể có 3 bộ Timer/Counter còn 8052 có thể có 4 bộ. Khi Timer 0 hoạt động ở chế độ 3 thì Timer 1 có thể được bật hoặc tắt bằng chuyển mạch ngoài. Ở chế độ này Timer1 có thể được sử dụng bởi cổng nối tiếp như một bộ tạo tốc độ Baud hoặc trong bất kỳ ứng dụng nào mà không yêu cầu một ngắt. Hình 4.4: Chế độ tách biệt timer 4. Nguồn cung cấp xung cho time Có thể sử dụng hai nguồn tạo xung nhịp cung cấp cho các timer. Chúng được chọn bằng cách ghi vào bit C/T ( count/timer) trong TMOD. Một nguồn tạo xung nhịp dùng cho định khoảng thời gian, cái khác cho đếm sự kiện. 4.1. Chức năng định thời Nếu C/T = 0 hoạt động timer liên tục được chọn và timer được dùng cho việc định khoảng thời gian. Lúc đó timer lấy xung nhịp từ bộ dao động trong chip. Xung nhịp ngõ ra bộ tạo dao động được giảm tần số bằng bộ chia 12 trước khi cấp vào timer để thích hợp cho phần lớn các ứng dụng. Như vậy với thạch anh 12 MHz, thì tốc độ xung nhịp cung cấp cho timer sẽ là 1 MHz. Báo tràn timer xảy ra một số ( cố định) xung nhịp, tùy thuộc vào giá trị ban đầu được nạp vào các thanh ghi timer TLx / THx. 4.2. Chức năng đếm sự kiện Nếu C/T = 1 timer lấy xung nhịp từ nguồn bên ngoài. Trong hầu hết các ứng dụng, nguồn bên ngoài này cung cấp cho timer một xung khi xảy ra một “ sự kiện” timer dùng đếm sự kiện. Số sự kiện được xác định bằng phần mềm bằng cách đọc các thanh ghi TLx/THx, vì giá trị 16 bit trong các thanh ghi này tăng thêm 1 cho mỗi sự kiện. 98
  10. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Nguồn xung nhịp ngoài được cung cấp bằng các chân cổng 3. Bit 4 của cổng 3 (P3.4) dùng là ngõ vào tạo xung nhịp bên ngoài cho timer 0 và được gọi là “T0”, còn P3.5 hay “T1” là ngõ vào tạo xung nhịp cho timer 1. Trong các ứng dụng đếm, các thanh ghi timer được tăng thêm 1 tương ứng với sự chuyển trạng thái logic từ 1 xuống 0 ở ngõ vào bên ngoài (Tx). Ngõ vào bên ngoài được lấy mẫu trong S5P2 của mọi chu kỳ máy. Như vậy, khi ngõ vào cao trong một chu kỳ và thấp trong một chu kỳ kế thì số đếm được tăng thêm 1. Giá trị mới xuất hiện trong các thanh ghi trong S3P1 của chu kỳ theo sau chu kỳ phát hiện sự chuyển trạng thái. Do đó cần 2 chu kỳ máy ( 2µs) để ghi nhận một sự chuyển trạng thái 1 sang 0, tần số ngoài tối đa là 500 KHz ( giả sử hệ thống hoạt động ở 12 MHz). Hinh 4.5: Sơ đồ cung cấp xung nhịp cho timer 5. Khởi động, dừng, điều khiển timer Phương pháp đơn giản nhất để bắt đầu ( cho chạy) và dừng các timer là dùng các bit điều khiển chạy ( TRx) trong TCON. TRx bị xóa sau khi reset hệ thống, như vậy các timer theo mặc định là bị cấm ( bị dừng) sau khi reset. TRx được đặt lên 1 bằng phần mềm để cho các timer chạy. Vì TRx ở trong thanh ghi TCON có địa chỉ theo bit, nên việc cho chạy và dừng timer có thể thực hiện dễ dàng trong chương trình. Ví dụ : Cho time 0 chạy bằng lệnh : SETB TR0. Dừng bằng lệnh : CLR TR0 Trình hợp dịch sẽ thực hiện việc chuyển đổi ký hiệu cần thiết từ “ TR0” sang địa chỉ bit tương ứng của nó. Lệnh SETB TR0 sẽ giống như SETB 8CH. Một cách khác để điều khiển các timer là dùng bit GATE trong TMOD và ngõ vào bên ngoài INTx. Đặt GATE = 1 cho phép timer sẽ được điều khiển bằng INTx, cách này hữu dụng cho việc đo độ rộng xung. Ví dụ để đo độ rộng xung ngõ vào INT0 có thể thực hiện như sau : 99
  11. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Khởi động time 0 ở chế độ 2 ( chế độ timer 16 bit), với TL0/TH0 = 0000H, GATE = 1 và TR0 = 1. Khi INT0 xuống thấp, timer bị “ đóng cổng” và khoảng thời gian của xung tính bằng µs là số đếm được trong TL0/TH0 ( có thể lập trình INT0 để tạo ra một ngắt khi nó xuống thấp). Hình dưới minh họa timer 1 hoạt động chế độ 1 như một timer 16 bit. Sơ đồ chỉ khả năng điều khiển việc cấp nguồn tạo xung nhịp cho timer. Hình 4.6: Sơ đồ điều khiển hoạt động của Timer 0 chế độ 1 6. Khởi tạo truy xuất thanh ghi timer Các timer thường được khởi tạo một lần ở đầu chương trình để thiết lập chế độ 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 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 chế độ hoạt động cho các timer. Ví dụ khởi động cho timer 0 hoạt động ở chế độ 1 ( chế độ 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, # 000000001B Trong lệnh này M1 = 0, M0 = 1 để vào chế độ 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 chế độ timer 1. Sau lệnh trên timer 0 chỉ đếm khi thiết lập bit điều khiển 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… 100
  12. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 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 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ị 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 ở chế độ 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 thiết lập, đồ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 gán lại cho các thanh ghi timer mà chúng vẫn đếm được lại từ giá trị đã gán. 6.1. Đọc thời gian đang hoạt động Trong một số ứng dụng cần đọc giá trị trong các thanh ghi timer khi nó đang chạy. Vì phải đọc hai thanh ghi timer thì “sai pha” có thể xảy ra nếu byte thấp tràn vào byte cao giữa hai lần đọc. Giá trị đọc được có thể không đúng. Giải pháp là đọc byte cao trước kế đó đọc byte thấp rồi đọc byte cao lại một lần nữa. Nếu byte cao đã thay đổi thì lặp lại các hoạt động đọc. Các lệnh dưới đây đọc nội dung của các thanh ghi timer TL1/ TH1 vào các thanh ghi R6/ R7: AGAIN : MOV A, TH1 MOV R6, TL1 CJNZ A, TH1, AGAIN MOV R7, A 6.2. Thời gian ngắn và thời gian dài Như ta đã biết từ các ví dụ trên là lượng thời gian trễ cần tạo ra phụ thuộc vào hai yếu tố: - Tần số thạch anh XTAL. - Thanh ghi 16 bít của bộ định thời ở chế độ 1. Cả hai yếu tố này nằm ngoài khả năng điều chỉnh của lập trình viên 8051. Ví như ta đã biết giá trị lớn nhất của độ trễ thời gian có thể đạt được bằng cách đặt cả TH và TL bằng 0. Thời gian ngắn: Là khoảng thời gian mà bộ định thời có thể tạo ra nhỏ hơn giá trị tối đa của bộ định thời ở chế độ 16 bit. Thời gian dài: Là khoảng thời gian mà bộ định thời có thể tạo ra lớn hơn giá trị tối đa của bộ định thời ở chế độ 16 bit. Giả sử tần số thạch anh là 12 MHz do đó xung kích cho bộ định thời là 101
  13. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 1 MHz.Khoảng thời gian định thời ngắn nhất không phụ thuộc tần số xung kích timer mà phụ thuộc vào phần mềm, có nghĩa là do thời gian thực hiện các lệnh, lệnh có thời gian thực hiện nhanh nhất của 8051 là một chu kỳ máy hoặc 1 μS. Ví dụ: Viết chương trình tạo xung tuần hoàn tạI chân P1.0 với tần số cao nhất có thể được. Cho biết tần số và tỉ số giữa độ rộng xung với chu kỳ. Bài làm: Tần số cao nhất có nghĩa là chu kỳ ngắn nhất. Do đó không thể dùng bộ định thời mà chỉ dùng phần mềm. Chương trình như sau: LOOP : SETB P1.0 : 1 chu kỳ CLR P1.0 : 1 chu kỳ SJMP LOOP : 2 chu kỳ Chu kỳ của xung là 4µs trong đó mức cao la 1 µs và mức thấp 3 µs suy ra tần số 250 KHz và tỉ số độ rộng / chu kỳ là 25%. Chu kỳ tín hiệu ra có thể được kéo dài bằng cách thêm vào lệnh NOP ( No operation) vào trong vòng lặp mỗi lệnh NOP sẽ tăng lên 1 µS thêm 2 lệnh NOP sau lệnh SETB P1.0 sẽ làm xung ra có dạng hình vuông với chu kỳ là 6 µS tương đương tần số 166,7 KHz. Tuy nhiên cách làm trên không hay lắm và cách tốt nhất để tạo thời gian trì hoãn là dùng bộ định thời. 7. Time 2 của 8052 Timer 2 là bộ định thời 16 bit (chỉ có trong họ 8x52). Giá trị đếm của timer 2 chứa trong các thanh ghi TH2 và TL2. Giống như timer 0 và timer1, timer 2 cũng hoạt động như bộ định thời (timer) hay đếm sự kiện (counter). Chế độ định thời đếm bằng dao động nội, chế độ đếm sự kiện đếm bằng xung ngoài tại chân T2 (P1.0) và chọn chế độ bằng bit C/ 2 của thanh ghi T2CON. Họ vi điều khiển 8052 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ọ 8051. Ở đây chỉ trình bày thêm phần hoạt động của timer T2. Các thanh ghi điều khiển timer 2 bao gồm: T2CON, T2MOD, RCAP2H, RCAP2L, TH2 và TL2. Timer T2 của 8052 có 2 chế độ hoạt động: Chế độ tự động nạp lại, chế độ thu nhận. Các bit chọn chế độ được mô tả như bảng sau : Bảng 4.3 : Chức năng các bít chọn chế độ 102
  14. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái RCLK TCLK CP/RL2 TR2 Chế độ 0 0 0 1 Tự động nạp lại 16 bit 0 0 1 1 Giữ 16 bit x 1 x 1 Tạo tốc độ baud 1 x x 1 x x x 0 Ngưng  Các thanh ghi điều khiển Timer T2 - Thanh ghi điều khiển T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 Bảng 4.4 : Chức năng các bit thanh ghi T2CON được mô tả trong bảng sau : 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 thiết lập khi xảy ra sự thu nhận hoặc nạp dữ liệu bởi sự chuyển trạng thái từ 1 sang 0 ở ngõ vào T2EX và EXEN = 1 ; khi cho phép timer T2 ngắt, EXF2 = 1 thì CPU sẽ thực 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ề. 103
  15. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 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. Dùng lệnh điều khiển bit TR2 để cho phép timer 1 đế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 bằng 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 bằng 0 thì quá trình 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 EXEN = 1; nếu bit RCLK hoặc TCLK = 1 thì bit này xem như bỏ. Thanh ghi TMOD - - - - - T2OE DCEN - Bảng 4.5: Chức năng các bit thanh ghi TMOD được mô tả trong bảng sau : Bit Tên Mô tả 7 - 104
  16. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 6 - 5 - 4 - 3 - 2 - 1 T2OE Timer 2 Output Enable Bit = 0 : T2 ( P1.0) là ngõ vào clock hay I/O port = 1 : T2 là ngõ ra Clock 0 DCEN Down Counter Enable Bit = 0 : Cấm timer 2 là bộ đếm lên / xuống. = 1 : Cho phép timer 2 là bộ đếm lên / xuống. Giá trị khi reset : T2MOD = xxxx xx00b, MOD không cho phép định vị bit. Các thanh ghi TH2, TL2, RCAP2H và RCAP2L không cho phép định vị bit và giá trị khi reset là 00h. Các chế độ hoạt động của timer 2 mô tả trong phần tiếp theo. 7.1. Chế độ tự động nạp lại Chế độ tự động nạp lại cũng có 2 trường hợp giống như chế độ giữ: - Nếu EXEN2 = 0: khi Timer tràn, cờ tràn TF2 được đặt lên 1 và nạp lại giá trị cho TH2, TL2 (từ cặp thanh ghi RCAP2H, RCAP2L) đồng thời tạo ngắt. - Nếu EXEN2 = 1: hoạt động giống như trên nhưng khi có xung âm tại chân T2EX thì cũng nạp lại giá trị cho TH2, TL2 và đặt cờ EXF2 lên 1. Chế độ tự động nạp lại cũng cho phép thực hiện đếm lên hay xuống (điều khiển bằng bit DCEN trong thanh ghi T2MOD). Khi DCEN được đặt lên 1 và chân T2EX ở mức cao thì timer 2 sẽ đếm lên; còn nếu T2EX ở mức thấp thì timer 2 đếm xuống. Khi đếm lên, timer tràn tại giá trị đếm 0FFFFh. Khi tràn, cờ TF2 được đặt lên mức 1 và giá trị trong cặp thanh ghi RCAP2H, RCAP2L chuyển vào căp thanh ghi TH2, TL2. Khi đếm xuống, timer tràn khi giá trị trong cặp thanh ghi TH2, TL2 bằng giá trị trong cặp thanh ghi RCAP2H, RCAP2L. Khi tràn, cờ TF2 được đặt lên 1 và giá trị 0FFFFh được nạp vào cặp thanh ghi TH2, TL2. Trong chế độ này, khi timer tràn, giá trị trong cờ EXF2 sẽ chuyển mức và không tạo ngắt (có thể dùng thêm EXF2 để tạo giá trị đếm 17 bit). 105
  17. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Hình 4.7: Chế độ tự nạp lại 16 bit 7.2. Chế độ thu nhận Chế độ thu nhận của Timer 2 có 2 trường hợp xảy ra: - Nếu EXEN2 = 0: Timer 2 hoạt động giống như Timer 0 và 1, nghĩa là khi giá trị đếm tràn (TH2_TL2 thay đổi từ FFFFh đến 0) thì cờ tràn TF2 được đặt lên mức 1 và tạo ngắt tại Timer 2 (nếu cho phép ngắt). - Nếu EXEN2 = 1: vẫn hoạt động như trên nhưng thêm một tính chất nữa là: khi xuất hiện cạnh âm tại chân T2EX (P1.1), giá trị hiện tại của TH2 và TL2 được chuyển vào cặp thanh ghi RCAP2H, RCAP2L (quá trình thu xảy ra); đồng thời, bit EXF2 = 1 (sẽ tạo ngắt nếu cho phép ngắt tại Timer 2). 106
  18. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Hình 4.8: 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 thá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. 8. Luyện tập 8.1. Phương pháp Để điều khiển hoạt động của timer, cần thực hiện: - Nạp giá trị cho thanh ghi TMOD để xác định chế độ hoạt động (thông thường chỉ dùng chế độ 1 – 16 bit và chế độ 2 – 8 bit tự động nạp lại). - Nạp giá trị đếm trong các thanh ghi THx, TLx (thông thường sử dụng timer 0 và timer 1 nên quá trình đếm là đếm lên). - Đặt các bit TR0, TR1 = 1 (cho phép timer hoạt động) hay xoá các bit này về 0 (cấm timer). - Trong quá trình timer chạy, thực hiện kiểm tra các bit TF0, TF1 để xác định timer đã tràn hay chưa. - Sau khi timer tràn, nếu thực hiện kiểm tra tràn bằng phần mềm (không dùng ngắt) thì phải thực hiện xoá TF0 hay TF1 để có thể tiếp tục hoạt động. 8.2. Bài tập Bài tập 1: Viết chương trình tạo sóng vuông tần số 10 KHz tại chân P1.0 dùng timer 0 (tần số thạch anh là fOSC = 12MHz). Bài làm : Do fOSC = 12MHz nên chu kỳ máy = 1 µs. 107
  19. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái f = 10 KHz → T = 1/f = 0.1 ms = 100 µs →một chu kỳ sóng vuông chiếm khoảng thời gian 100 chu kỳ máy →thời gian trì hoãn cần thiết là 50 chu kỳ máy. \ Do giá trị đếm là 50 (ứng với 50 chu kỳ máy) nên chỉ cần dùng chế độ 8 bit (có thể đếm từ 1 đến 256) cho timer 0 (chế độ 2). Nội dung thanh ghi TMOD: GATE C/T1 M11 M10 GATE0 C/T0 M01 M00 1 0 0 0 0 0 0 1 0 Timer 1 không dùng Không dùng Đếm bằng dao Chế độ 8 bit INT0 động nội TMOD = 0000 0010b (02h) Giá trị đếm là 50 và do timer 0 đếm lên nên giá trị cần nạp cho TH0 là -50 (có thể không cần nạp cho TL0 nhưng lúc đó chu kỳ đầu tiên của xung sẽ sai). Chương trình thực hiện như sau: MOV TMOD, # 02h MOV TH0, # (-50) MOV TL0, # (-50) SETB TR0 ; Cho phép timer 0 chạy Lặp: JNB TF0, Lặp ; Nếu timer chưa tràn thì chờ CLR TF0 CPL P1.0 ; Đảo bit P1.0 để tạo xung vuông SJMP Lặp END Bài tập 2: Viết chương trình tạo xung vuông tần số f = 1 Hz tại P1.2 dùng timer 1. 108
  20. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bài làm : f = 1 Hz → T = 1/f = 1 s = 1 000 000 µs → một chu kỳ sóng vuông chiếm khoảng thời gian 500 000 chu kỳ máy → thời gian trì hoãn cần thiết là 500 000 chu kỳ máy. Giá trị đếm là 500 000, vượt quá khả năng của timer (tối đa chỉ đếm được 65536 chu kỳ) nên phải thực hiện tạo vòng lặp đếm nhiều lần cho đến khi đạt đến giá trị 500 000 (có thể đếm mỗi lần 50 000 và thực hiện vòng lặp 10 lần). Chương trình thực hiện như sau: MOV TMOD,#10h Batdau: MOV R7,#10 ; Lặp 10 lần Lap: MOV TH1,#HIGH(-50000) MOV TL1,#LOW(-50000) SETB TR1 KtrT1: JNB TF1,KtrT1 CLR TF1 CLR TR0 DJNZ R7,Lap ; Nếu R7 ≠ 0 thì lặp lại CPL P1.2 ; Đảo bit để tạo xung SJMP Batdau END Bài tập 3: Viết chương trình con tạo thời gian trì hoãn 1s dùng timer 0. Bài làm : Chương trình như sau: MOV TMOD,#01h ;--- Chương trình chính Delay1s: MOV R7,#20 ; Lặp 20 lần Lap: MOV TH0,#HIGH(-50000) ; Mỗi lần trì hoãn 50 000 µs 109
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2