Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
564,07 KB
Nội dung
Bài - Timer - Counter ( 151 Votes ) Nội dung Các cần tham khảo trước Giới thiệu Tổng quan Timer/Counter AVR Cấu trúc AVR Sử dụng Timer/Counter WinAVR Timer/Counter0 C cho AVR Timer/Counter1 Mơ với Proteus Download ví dụ I Giới thiệu Trong giới thiệu khái qt phương pháp lập trình ngơn ngữ C cho AVR với WinAVR cách sử dụng ngắt AVR Bài khảo sát chế độ hoạt động phương pháp điều khiển định thời, đếm (Timer/Counter) AVR Công cụ phục vụ cho công cụ WinAVR phần mềm mô Proteus Tôi dùng chip Atmega8 để làm ví dụ Một điều khơng may mắn tất Timer/Counter tất dịng chip AVR nhau, tơi trình bày khơng với dịng AVR khác AT90S…Tuy nhiên cố gắng số điểm khác biệt để bạn tự điều khiển chip khác Nội dung học bao gồm: Nắm bắt Timer/Counter có AVR Sử dụng Timer/Counter định thời Sử dụng Timer/Counter đếm Sử dụng Timer/Counter tạo xung điều rộng PWM Viết ví dụ điều khiển động RC servo PWM II Tổng quan Timer/Counter chip Atmega8 Timer/Counter module độc lập với CPU Chức Timer/Counter, tên gọi chúng, định (tạo khoảng thời gian, đếm thời gian…) đếm kiện Trên chip AVR, Timer/Counter cịn có thêm chức tạo xung điều rộng PWM (Pulse Width Modulation), số dòng AVR, số Timer/Counter dùng canh chỉnh thời gian (calibration) ứng dụng thời gian thực Các Timer/Counter chia theo độ rộng ghi chứa giá trị định thời hay giá trị đếm chúng, cụ thể chip Atmega8 có Timer bit (Timer/Counter0 Timer/Counter2) 16 bit (Timer/Counter1) Chế độ hoạt động phương pháp điều khiển Timer/Counter khơng hồn tồn giống nhau, ví dụ chip Atmega8: Timer/Counter0: định thời, đếm đơn giản với bit Gọi đơn giản có chế độ hoạt động (mode) so với chế độ Timer/Counter1 Chế độ hoat động Timer/Counter0 thực chất coi chế độ nhỏ (và chức bản) tạo khoảng thời gian đếm kiện Chú ý chip AVR dòng mega sau Atmega16,32,64…chức Timer/Counter0 nâng lên Timer/Counter1… Timer/Counter1: định thời, đếm đa 16 bit Bộ Timer/Counter có chế độ hoạt động Ngồi chức thơng thường, Timer/Counter1 cịn dùng để tạo xung điều rộng PWM dùng cho mục đích điều khiển Có thể tạo tín hiệu PWM độc lập chân OC1A (chân 15) OC1B (chân 16) Timer/Counter1 Các Timer/Counter kiểu tích hợp thêm nhiều chip AVR sau này, ví dụ Atmega128 có bộ, Atmega2561 có bộ… Timer/Counter2: module bit Timer/Counter0 Timer/ Counter2 có đến chế độ hoạt động Timer/Counter1, ngồi nó cịn sử dụng module canh chỉnh thời gian cho ứng dụng thời gian thực (chế độ asynchronous) Trong phạm vi này, chủ yếu hướng dẫn cách sử dụng chế độ hoạt động Timer/Counter Chế độ asynchronous Timer/Counter2 bỏ qua chế độ khơng sử dụng phổ biến Trước khảo sát hoạt động Timer/Counter, thống cách gọi tắt tên gọi Timer/Counter T/C, ví dụ T/C0 để Timer/Counter0… II Sử dụng Timer/Counter Có số định nghĩa quan trọng mà cần nắm bắt trước sử dụng T/C AVR: BOTTOM: giá trị thấp mà T/C đạt được, giá trị MAX: giá trị lớn mà T/C đạt được, giá trị quy định bởi giá trị lớn mà ghi đếm T/C chứa Ví dụ với T/C bit giá trị MAX ln 0xFF (tức 255 hệ thập phân), với T/C 16 bit MAX 0xFFFF (65535) Như MAX giá trị không đổi T/C TOP: giá trị mà T/C đạt đến thay đổi trạng thái, giá trị không thiết số lớn bit hay 16 bit MAX, giá trị TOP thay đổi cách điều khiển bit điều khiển tương ứng nhập trừ tiếp thông qua số ghi Chúng ta hiểu rõ giá trị TOP lúc khảo sát T/C1 Timer/Counter0: Thanh ghi: có ghi thiết kế riêng cho hoạt động điều khiển T/ C0, là: TCNT0 (Timer/Counter Register): ghi bit chứa giá trị vận hành T/C0 Thanh ghi cho phép bạn đọc ghi giá trị cách trực tiếp TCCR0 (Timer/Counter Control Register): ghi điều khiển hoạt động T/C0 Tuy ghi bit thực chất có bit có tác dụng CS00, CS01 CS02 Các bit CS00, CS01 CS02 gọi bit chọn nguồn xung nhịp cho T/C0 (Clock Select) Chức bit mô tả bảng Bảng 1: chức bit CS0X TIMSK (Timer/Counter Interrupt Mask Register): ghi mặt nạ cho ngắt tất T/C Atmega8, có bit TOIE0 tức bit số (bit đầu tiên) ghi liên quan đến T/C0, bit có tên bit cho phép ngắt có tràn T/C0 Tràn (Overflow) tượng xảy giá trị ghi TCNT0 đạt đến MAX (255) lại đếm thêm lần Khi bit TOIE0=1, bit I ghi trạng thái set (xem lại điều khiển ngắt), “tràn” xảy dẫn đến ngắt tràn TIFR (Timer/Counter Interrupt Flag Register): ghi cờ nhớ cho tất T/C Trong ghi bit số 0, TOV0 cờ thị ngắt tràn T/C0 Khi có ngắt tràn xảy ra, bit tự động set lên Thơng thường điều khiển T/C vai trị ghi TIFR không quan trọng Hoạt động: T/C0 hoạt động đơn giản, hoạt động T/C “kích” tín hiệu (signal), lần xuất tín hiệu “kích” giá trị ghi TCNT0 lại tăng thêm đơn vị, ghi tăng đạt mức MAX 255, tín hiệu kích làm ghi TCNT0 trở (tràn), lúc bit cờ tràn TOV0 tự động set Với cách thức hoạt động T/C0 vơ dụng tăng từ đến 255 lại quay 0, trình lặp lại Tuy nhiên, yếu tố tạo khác biệt tín hiệu kích ngắt tràn, kết hợp yếu tố tạo định thời gian đếm kiện Trước hết bạn nhìn lại bảng bit chọn xung nhịp cho T/C0 Xung nhịp cho T/C0 tín hiệu kích cho T/C0 Xung nhịp tạo nguồn tạo dao động chip (thạch anh, dao động nội chip…) Bằng cách đặt giá trị cho bit CS00, CS01 CS02 ghi điều khiển TCCR0, định kích T/C0 lần Ví dụ mạch ứng dụng bạn có nguồn dao động clk = 1MHz tức chu kỳ nhịp 1us (1 micro giây), bạn đặt ghi TCCR0=5 (tức SC02=1, CS01=0, CS00=1) Căn theo bảng 1, tín hiệu kích cho T/C0 clk/1024 nghĩa sau 1024us T/C0 kích lần, nói cách khác giá trị TCNT0 tăng thêm sau 1024us (chú ý tần số chia cho 1024 chu kỳ tăng 1024 lần) Quan sát dòng cuối bảng bạn thấy tín hiệu kích cho T/C0 lấy từ bên ngồi (External clock source), ý tưởng cho hoạt động chức đếm kiện T/C0 Bằng cách thay đổi trạng thái chân T0 (chân chip Atmega8) làm tăng giá trị ghi TCNT0 hay nói cách khác T/C0 dùng để đếm kiện xảy chân T0 Dưới xem xét cụ thể cách điều khiển T/C0 theo chế độ định thời gian đếm 1.1 Bộ định thời gian Chúng ta tạo định để cài đặt khoảng thời gian Ví dụ bạn muốn sau xác 1ms chân PB0 thay đổi trạng thái lần (nhấp nháy), bạn lại không muốn dùng lệnh delay trước dùng nhược điểm delay “CPU khơng làm cả” lúc delay, nhiều trường hợp lệnh delay hạn chế sử dụng Bây dùng T/C0 để làm việc này, ý tưởng cho đếm T/C0 hoạt động, đếm đủ 1ms tự kích hoạt ngắt tràn, trình phục vụ ngắt tràn chúng tat hay đổi trạng thái chân PB0 Tôi minh họa ý tưởng hình Hình So sánh cách làm việc (CPU nop: khoảng thời gian CPU khơng làm cả) Một vấn đề nảy sinh lúc này, tơi trình bày phần trước, T/C0 đếm từ đến 255 lại quay (xảy ngắt tràn), dường cài đặt giá trị mong muốn cho T/C0? Câu trả lời cách gán trước giá trị cho ghi TCNT0, T/C0 đếm từ giá trị mà gán trước kết thúc 255 Tuy nhiên tràn xảy ra, TCNT0 lại tự động trả 0, việc gán giá trị khởi tạo cho TCNT0 phải thực liên tục sau lần xảy tràn, vị trí tốt đặt trình phục vụ ngắt tràn Việc lại việc quan trọng việc tính tốn giá trị chia (prescaler) cho xung nhịp T/C0 việc xác định giá trị khởi đầu cần gán cho ghi TCNT0 để có khoảng thời gian định xác mong muốn Trước hết chọn prescaler cho hợp lí (chọn giá trị chia cách set bit CS02,CS01,CS00) Giả sử nguồn xung clock “nuôi” chip clkI/O=1MHz tức nhịp 1us, để prescaler=1, tức tần số T/C0 (tạm gọi fT/C0) clkI/O=1MHz, 1us T/C0 kích TCNT0 tăng đơn vị Khi giá trị lớn mà T/C0 đạt 256 x 1us=256us, giá trị nhỏ 1ms mà ta mong muốn Nếu chọn prescaler=8 (xem bảng 1) nghĩa sau nhịp (8us) TCNT0 tăng đơn vị, khả lớn mà T/C0 đếm 256 x 8us=2048us, lớn 1ms, ta hồn tồn sử dụng prescaler=8 để tạo khoảng định 1ms Bước xác định giá trị khởi đầu TCNT0 để T/C0 đếm 1ms (1000us) Ứng với prescaler=8 biết 8us TCNT0 tăng đơn vị, dễ dàng tính đếm cần đếm 1000/8=125 lần để hết 1ms, giá trị ban đầu TCNT0 phải 256-125=131 Bạn quan sát hình để hiểu thấu đáo Hình Quá trình thực Hãy tạo Project Programmer Notepad với tên gọi TIMER0 viết đoạn code cho Project list List Định 1ms với T/C0 #include #include #include int main(void){ DDRB=0xFF; //PORTB la output PORT PORTB=0x00; TCCR0=(1