Thắc mắc về các lưu ý trong lập trình TIMER 0 của Pic16f887

Chào anh chị, em đang học lập trình Pic16f887 bằng MPLAB X IDE thì trong giáo trình dạy học của em có phần lưu ý về lập trình TIMER 0 ở chế độ định thì. Có ghi chú là nếu thời gian định thì có lớn hơn thời gian delay lớn nhất của TIMER 0 (trong giáo trình có ghi là 65ms đổi ra là 65 us) thì phải dùng vòng lặp for để tăng thời gian delay. Và em có các thắc mắc như sau:

  1. Coi qua các ví dụ trong giáo trình thì cho trước thời gian t delay(định thời) là 100 us thì có thể tạo trực tiếp được (mặc dù đã lớn hơn so với t delay max của TIMER 0 như trên) còn với 500 us thì không tạo trực tiếp được phải thông qua hàm for với hàm delay 100 us.

  2. Khi tìm hiểu trên mạng thì thấy t delay max của TIMER 0 là 120 us cái này thì em thấy hợp lý. Nhưng không biết là cái 65 us trong giáo trình của mình là từ đâu mà ra.

Cảm ơn anh chị đã dành thời gian để đọc ạ.

Đầu tiên em phải nhìn vào sơ đồ của timer0:

Bản chất việc delay dùng timer là cho timer đếm xung. Mỗi một xung thì timer tăng 1 đơn vị. Khi đủ số lượng xung thì sinh ngắt và chương trình tiếp tục chạy. Timer 0 là timer 8 bit, tức là nó đếm tối đa được 256 giá trị. (2 mũ 8). Nguồn cấp xung cho timer có thể cấu hình theo nhiều cách khác nhau nên :

  1. Giá trị thời gian tối đa của timer 0 không phải là con số cố định. Nó phụ thuộc vào nguồn xung cơ sở và cấu hình.
  2. Nếu theo cách cấu hình như đường màu đỏ a vẽ trên hình, dùng thạch anh ngoài có Fosc = 20MHz, bộ prescale đặt tối đa là chia 256 (như trong khung xanh) thì thời gian tối đa timer có thể xử lý là 13.1072 ms. Nếu chọn thạch anh tần số khác đi, hoặc dùng dao động nội,… và cấu hình khác đi thì thời gian tối đa của timer cũng khác.
  3. Trong trường hợp thời gian cần nhỏ hơn thời gian tối đa của timer thì đơn giản. Ta cấu hình cho timer đếm đủ thời gian thì sinh ngắt để bật hoặc tắt cờ chờ sau đó tắt timer. Chương trình sẽ theo dõi cờ chờ để biết delay đã hoàn thành hay chưa.
  4. Nhưng nếu thời gian lớn hơn thời gian max của timer thì … cũng đơn giản. Thay vì dùng cờ chờ, ta dùng biến đếm chờ. Mỗi một chu kỳ ngắt của timer ta giảm biến đếm đi 1, chương trình sẽ theo dõi biến đếm. Ví dụ delay 1000ms, ta khởi tạo biến đếm = 100, timer chu kỳ ngắt 10ms. Sau 100 chu kỳ ngắt thì biến đếm giảm về 0 -> hoàn thành delay.
2 Likes

Em cảm ơn.Vậy là có công thức để tính riêng cái thời gian tối đa của TIMER 0 hả anh?

Có chứ em .
Em nhìn sơ đồ và cách cấu hình là tính ra được thôi.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?