-Timer nào thì cũng có hai chức năng là đếm xung và đếm thời gian. Việc mà bạn chọn đếm xugn hay đếm thời gian thì vào trong thanh ghi TCCRn (n là chỉ số của timer -- timer 0 thì n=0), giá trị đếm được thì được ghi vào thanh ghi TCNTn (Lưu ý là nếu thanh ghi TCNTn được ghi giá trị nào đó !=0 trước khi khởi động thì sau khi khởi động T/C (timer/counter) sẽ bắt đầu đếm từ giá trị đó lên. Sau khi tràn thì lại đếm từ 0). Có vài bít trong thanh ghi này qui định, nếu là đếm thời gian thì đem tần số thạch anh chia cho bao nhiêu để dc tần số đếm. Còn với đếm xung thì bạn đưa xung vào chân Tn, đặt cấu hình là chân vào bằng phần mềm. Sau đó dùng mấy cái bít trên xác định xem đếm sườn lên hay xuống. Thế là xong.
-Việc ngắt timer hay counter được cho phép qua thanh ghi TIMSK (thanh ghi dùng riêng cho bộ định thời và bộ đếm).Cái này để xem bít nào cho phép thì bạn phải vào datasheet của từng con AVR thì mới rõ. Đây mình chỉ nói chung chung vậy thôi. Dĩ nhiên là lúc này bít I ở trong thanh ghi SREG được cho phép đấy nhé.
-Đó là hai mấy thứ cơ bản mà cái timer và counter nào cũng có. Ở AVR thì timer còn có thêm vài chức năng nữa mình xin nói thêm một tí về nó:
+ Về cái PWM để điều khiển động cơ thì timer vẫn đếm như bình thường. Có điều khi nó đếm nó vác cái giá trị của TCNTn ra đem so sánh với cái giá trị đặt ở tại thanh ghi OCRn để quyết định độ rộng xung ở chân đầu ra (chân đầu ra ở đây được cấu hình cứng ở trên chip và bạn phải tra datasheet. hình như nó có tên là OC..gì đó). Có hai chế độ của PWM là FAST và phase correct. Ở cái FAST thì nếu mà giá trị TCNTn<OCRn sẽ cho đầu ra là 0 hoặc 1 tùy chọn ở phần mềm. Còn khi TCNTn>OCRn sẽ cho đầu ra ngược lại 1 hoặc 0. Như vậy thì trong một chu kì đếm của timer thì trong khoảng thời gian timer đếm từ 0-->OCRn thì đầu ra là mức i, còn từ OCR--tràn thì đầu ra là mức đảo của i, vậy là có một chú PWM. Đối với chế độ Phase..thì các bạn về tam khảo thêm nhé. nói ở đây dài lắm, còn nếu bạn nào muốn thì mail cho mình cũng dc. Trong chế độ này thì ngắt sẽ xảy ra khi đc cho phép và tại các thời điểm timer tràn và hoặc có thể ngắt tại thời điểm TCNTn=OCRn cũng được.
+Nếu như bạn có một ứng dụng nào đó muốn timer đếm từ 0 đến một giá trị nào đó thì bị reset về 0 (giá trị này dĩ nhiên có thể khác giá trị tràn) thì có thể sử dụng chế độ CTC mode. Bạn đặt giá trị reset vào cái thằng ICR sau đó thì timer đếm từ 0 đến ICR thì về 0 luôn. VÀ nếu như bạn cho phép ngắt thì tại đây sẽ có một ngắt cho bạn ứng dụng.
+ 2 chế độ ở trên có thể kết hợp với nhau để có được một bộ pwm rất linh hoạt. tùy theo nhu cầu của bạn.
+ Về cái input capture thì nó làm việc cũng đơn giản thôi. Tai cái chân ICP, nếu được cho phép thì mỗi lần có sự thay đổi sườn xung ở trên ICP thì nó làm công việc là copy thằng TCNTn vào ICRn, chỉ có vậy thôi. Dĩ nhiên nó cũng có ngắt cho bạn lập trình dễ dàng hơn. Ví dụ bạn định đo độ rộng xugn dương chẳng hạn. Bạn bắt tại sườn lên một phát, lưu giá trị lại. Bắt tại sườn xuống ngay sau đó. Sau đó lấy giá trị mới trừ đi cái cũ và sử lý thêm cái ngắt tràn timer nữa. Tiếp đến nhân giá trị thu đc với tần số timer là xong. Được ngay cái độ rộng xung....
+ Watch dog thì nó làm đơn giản hơn. Nếu vì một lý do gì đó mà chíp bị rơi vào vòng lặp vô hạn không thể tiếp tục công việc của mình được (kiểu như là bị treo ấy) thì lúc này WDog sẽ làm việc. Nó sẽ kiểm tra khi chíp bị treo, nó sẽ tính ra một khoảng thời gian nào đó mà ko thoát ra dc thì nó sẽ tự độgn reset chip. Cái duy nhất bạn phải làm là chọn xem sau bao lâu thì reset thôi. Vào datasheet xem thanh ghi nào qui định thời gian này nếu bạn lập trình dùng ASM. Còn codevision thì cứ tick vào phát là xong. chả cần biết nó tên tuổi gì.
+ Trong bộ timer và conter của nó có nhiều chế độ lắm, nói ra đây không hết được đâu. Bạn nào có vấn đề gì ở chỗ nào thì hỏi trực tiếp. Anh em ở đây giải quyết cho.
Mình làm mạch đếm xung với time 1. Theo minh hiểu thì bt k phải cài đặt gì
ReplyDeletethì nó tự đếm đến 0xffff.nhưng mình hiển thị giá trị thanh ghi tcnt1H thì thấy nó k chạy. Có ai giúp mình với.