Hướng dẫn tạo Timer trong Psoc.

Psoc khác với các dòng vi xử lý khác là nó phải thiết lập bằng cứng không bằng mền như dòng vi xử lý khác như là 8501, Pic, AVR nên chính điều này đã gây khó khăn cho người mới học Psoc. Nên hôm nay tôi hướng dẫn các pác tạo bộ Timer trong Psoc trong thiết lập phần cứng.
+ Bước 1 : Các pác khởi tạo chương trình và phần thiết lập của nó có giao diện như thế này :




Các pác vào giao diện như thế này để thiết lập cho bộ Timer
+ Bước 2 : Lấy bộ Timer như hình vẽ sau :




ở trên thì ở chỗ khoanh tròn màu đỏ đấy thì bên trái nó là User Module Types và bên phải là User Module. Bên trái là chọn kiểu module như Timer, PWM... Còn bên phải là chọn moudule sử dụng. Ví dụ như trên thì bộ Timer có Timer 8 bit, Timer 16 bit, Timer 32. Các bạn chọn các kiểu timer bằng select ( dấu chữ thập bên cạnh chỗ chọn các kiểu module)
+ Bước 3 : Nhấn chọn Timer như hình vẽ sau :




Kích chuột phải vào Module Timer đó sau đó chọn Place như hình vẽ trên sau đó nó sẽ xuống chỗ khối như hình sau đây




+ Bước 4 : Thiết lập các nguồn Clock khác nhau để đưa vào Timer.




ở phần này đầu tiên ta phải thiết lập clock đầu vào cho Timer. Thiết lập trên chỗ khoanh tròn trên hình vẽ. Các thông số quan trọng như tôi thiết lập trên như sau :
+ Power Setting[Vcc/Sýclk freq] : Đây là nguồn đầu vào và tần số ở đây chọn chuẩn 5V và tần số 24Mhz
+ CPU _clock : cái này là tần số thực thi lệnh của vi xử lý. Nó có nhiều tần số khác nhau. như trên là nó chia 8 như vậy tần số thực thi lệnh là 3Mhz.
+ VC1 : là nguồn Clock. Giá trị của nguồn này được tính như sau : VC1 = Sysclk/N. Sysclk được chọn như trên là 24Mhz và hệ số N bạn chọn để chia nó ra ( N lớn nhất là 16)
+ VC2 : Tương tự như VC1. Nhưng nguồn VC2 được lấy từ VC1 và được chia tiếp hệ số N ( Nmax = 16)
+ VC3 : Nguồn này được lấy tù VC1 hay VC2 hay sysclk để chia ra tiếp hệ số nữa và hệ số chia lớn nhất là 256. Để có nguồn clock VC3 nhỏ hơn nữa.
Đấy là thiết lập các nguồn clock khác nhau từ nguồn clock chính.
+ Bước 5: Thiết lập các thông số cho bộ Timer. Có 2 cách thiết lập là thiết lập trực tiếp trên khối và thiết lập theo các bảng chọn thông số như hình vẽ sau :





Như hình trên thì Timer nó cần 1 clock đầu vào để nó đếm số xung và đưa ra thời gian chính xác dựa vào xung đầu vào. Đầu vào nó có nhiều dạng clock với tần số khác nhau. Đầu vào nó có thể là VC1, VC2, VC3...và các thông số liên quan nó nằm ở khoanh tròn bên tay trái. Và được biểu hiện ở các khối bên phải. Do timer dùng nguồn clock trong nó chỉ tạo ra thời gian thực và không kết nối với đầu ra. Các thống số các pác thiết lập như kiểu trên hình vẽ.

Ví dụ : Tính toán thiết lập khối Timer để tạo ra Timer có thời gian là 0.1s.
Như thông số tôi đã chọn ở trên tôi chọn Timer 8 bit. Theo datasheet thì nó có công thức tính thời gian của Timer như sau


OutputPeriod = SourceClockPeriod x (PeriodRegisterValue + 1)


Ở công thức trên nó có 2 giá trị mà ta phải quan tâm là SourceClockPeriod (đầy là nguồn clock đầu vào của Timer) và PeriodRegisterValue ( Giá trị của thanh ghi đặt vào Timer)
Như trên tính toán được thì SourceClockPeriod là nguồn đầu vào VC3 tính như sau : VC1 = 24Mhz/15 ; VC2 = VC1/16 ; VC3 = VC2/100 như vậy nguồn clock VC3 là 1Khz. Theo công thức trên thì giá tị thanh ghi đặt vào timer phải là 100 mới tạo được ra 0.1s.
Trong chương trình các bạn khai báo như sau :


Timer8_1_WritePeriod(100); //dat thoi gian la 0.1s
Timer8_1_WriteCompareValue(0);
Timer8_1_EnableInt();
Timer8_1_Start();


Như vậy là tạo thành công bộ Timer trong Psoc. Đây chỉ là bộ Timer 8 bit nếu các bạn muốn thời gian dài hơnt hì dùng Timer 16,32 bit. Khi đó giá trị thanh ghi sẽ nhiều hơn và tạo được ra thời gian nhiều hơn. Chúc vui.



Tiếp theo để biết ngắt timer nó hoạt động như thế nào chúng ta hãy viết thử 1 bài xử dụng ngắt Timer đơn giản!
Yêu cầu : tạo chính xác thời gian LED nhấp nháy với 1s sáng và 1s tắt. LED được nối vào P0.6. LED đựoc mắc nối tiếp với điện trở để hạn dòng (330 ôm) lắp ở chế độ hút dòng!
Với cấu hình timer cho được 1s và P0.6 được cấu hình là Strong nên ta có chương trình như sau :
Code:
//----------------------------------------------------------------------------
// Test ngat Timer
// Viet boi : biendt
// yc: Dieu khien LED o chan P0.6. 1 s sang va 1s tat
//----------------------------------------------------------------------------

#include // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
unsigned char flag=0;

#pragma interrupt_handler Timer16_1_ISR
void Timer16_1_ISR()
{
flag++;
if(flag==3) flag=1;
}

void Timer_int()
{
Timer16_1_WritePeriod(1000); // Timer = 1s
Timer16_1_WriteCompareValue(0);
Timer16_1_EnableInt(); // Xay ra ngat Timer
M8C_EnableGInt; // CHo ngat toan cuc
Timer16_1_Start();
}

void main()
{
Timer_int();
PRT0DR=0xff;
while(1)
{
if(flag==1)

PRT0DR=0xbf; // sang P0.6
else if (flag==2) PRT0DR=0x40;
}
}
 



Đối với code trên tôi dùng một biến cờ flag mỗi khi ngắt xẩy ra thì tôi bật biến flag đó lên. Mỗi lần ngắt tăng lên 1. Tăng đến 3 thì trở về 1. Mỗi giá trị biến cờ mà ngắt trả về thì ta sẽ có tương ứng LED sáng và tắt. 







Post a Comment

Mới hơn Cũ hơn