Mục đích
Timers là một trong những thiết bị ngoại vi thông dụng nhất
trong các thiết kế nhúng. Mục đích của bài này là để cung cấp một số ví dụ đơn
giản cho các thiết bị định thời gian PSoC. PSoC Creator, mà là một phần mềm miễn
phí phát triển từ Cypress cho PSoC 3, 4, 5, và các thiết bị 5LP, được sử dụng để
thực hiện cho project này. Các PSoC4 Pioneer Kit đã được sử dụng như là nền tảng
cho bản demo này. Tuy nhiên, bất kỳ thiết bị PSoC khác đều có thể sử dụng các
mã của project này.
Mục tiêu Project
Các mục tiêu sau đây sẽ được thực hiện trong dự án này. Nếu
bạn đơn giản chỉ là tham khảo code và là người dùng psoc tốt bạn có thể bỏ qua
mục đích này.
- Bắt đầu một project từ đầu trong PSoC Creator
- Thêm cấu hình một thành phần Timer để thiết kế
- Thêm một thành phần ngắt để thiết kế
- Thêm một pin ra kỹ thuật số để thiết kế
- Chọn chân được sử dụng để điều khiển LED
- Cung cấp / giải mã ứng dụng
Yêu cầu dự án
Các công cụ sau đây đã được sử dụng cho dự án này:
- PSoC Creator - miễn phí phần mềm phát triển phần mềm được cung cấp bởi Cypress. Phiên bản 3.0 đã được sử dụng cho dự án này.
- PSoC4 Pioneer Kit - nền tảng phát triển cho các thiết bị PSoC4.
Phương pháp
Bắt đầu một project PsoC
- Mở PSoC Creator
- Chọn File -> New -> Project
- Chọn "Empty PSoC 4 Design"
- Đặt tên cho project "Timer_Example", chọn vị trí để lưu dự án, và nhấn "Ok"
- Điều này sẽ đưa bạn đến một sơ đồ của các dự án mà bạn có thể nhấp và kéo các thành phần mong muốn vào thiết kế của bạn. Nếu bạn không nhìn thấy một sơ đồ trang trống, nhấp đúp chuột vào "TopDesign.cysch" từ cửa sổ Workspace Explorer
Thêm cấu hình một Timer
- Trong cửa sổ Catalog Component, trong Digital -> Functions folder, nhấp và kéo "Timer" thành phần trên trang. Theo mặc định, một đồng hồ 24MHz được gắn liền với các thành phần.
- Click đúp vào khối Time. Đối với dự án này, các thiết lập bộ đếm thời gian sau đây được sử dụng:
- Resolution: 16-bit (counter value can be 0~65535).
- Period: 24000 (with 24MHz clock, period = 1ms)
- Trigger Mode: None
- Capture Mode: None
- Enable Mode: Software Only
- Run Mode: Continuous
- Interrupts: None
Nhấn "Apply" để áp dụng các thay đổi và click
"Ok" để đóng cửa sổ Configuration.
Thêm Component Interrupt
- Trong cửa sổ Catalog Component, trong thư mục hệ thống, bấm và kéo "Interrupt" vào trang cấu hình.
- Đối với dự án này, các tên mặc định (isr_1) đã được sử dụng.
Thêm một đầu ra kỹ thuật số Pin
- Trong cửa sổ Catalog Component, tại các cảng và thư mục Pins, click và kéo các "đầu ra kỹ thuật số" thành phần trên trang.
- Click đúp vào thành phần Pin để đưa lên cửa sổ Configuration.
- Đổi tên thành "LED". Đảm bảo "Digital Output" được chọn và bỏ chọn "HW Connection".
- Dưới tab "General", chọn "Drive Strong" như chế độ Drive và "High (1)"
- Nhấn "Apply" để áp dụng các thay đổi và click "Ok" để đóng cửa sổ Configuration.
Chọn LED Pin
- Trong cửa sổ Workspace Explorer, nhấp chuột vào "Timer_Example.cydwr". Đây là nơi bạn có thể xác định mà pin của thiết bị PSoC sẽ được sử dụng để điều khiển LED.
- Bạn sẽ thấy một tín hiệu được gọi là "LED" với một mũi tên thả xuống bên cạnh nó. Các mũi tên thả xuống có thể được sử dụng để chọn một Port / Pin cho các tín hiệu LED. Chọn P0 [3] như các pin điều khiển LED. P0 [3] được kết nối với đèn LED xanh trên Board Pioneer.
- Lưu và đóng cửa sổ "Timer_Example.cydwr".
Xây dựng các dự án
Xây dựng dự án. Điều này sẽ tự động tạo ra các chức năng
cho mỗi thành phần mà bạn có thể thực hiện từ mã ứng dụng.
Code mẫu
Timer with Interrupt Example
Các đoạn code dưới đây trình bày cách thực hiện một bộ đếm
thời gian sử dụng ngắt.
#include <project.h>
uint16 ms_count =
0
;
CY_ISR(MY_ISR) {
Timer_STATUS;
ms_count++;
if
(ms_count ==
1000
) {
// 1 second
LED_Write(!LED_Read());
// Toggle LED
ms_count =
0
;
// reset ms counter
}
}
int
main()
{
Timer_1_Start();
// Configure and enable timer
isr_1_StartEx(MY_ISR);
// Point to MY_ISR to carry out the interrupt sub-routine
CyGlobalIntEnable;
// Enable global interrupts
for
(;;)
{
// Infinite loop for timer/interrupt to keep executing
}
}
Timer Delay Example
Các đoạn code sau minh họa cách sử dụng time để tạo ra những
khoảng thời gian chuẩn. Đối với ví dụ này, một đèn LED được thêm vào (P1 [6]) đếm
thời gian đã thay đổi đến 32-bit. Tất cả các thiết lập khác cũng tương tự như
những gì đã nêu ở các phần trên.
#include <project.h>
#define ON
0
#define OFF
1
#define TIMER_CLOCK
24000000
// This value should match the clock input to the Timer
uint8 timer_flag =
0
;
void
ms_delay (uint32 ms);
void
us_delay (uint32 us);
CY_ISR(MY_ISR) {
timer_flag =
1
;
}
int
main()
{
Blue_LED_Write(ON);
Red_LED_Write(OFF);
Timer_1_Init();
// config but don't start the timeout counter
isr_1_StartEx(MY_ISR);
// setup timer interrupt sub-routine
CyGlobalIntEnable;
// enable global interrupts
for
(;;)
{
ms_delay(
500
);
// delay 1/2 second
// Toggle LEDs
Blue_LED_Write(!Blue_LED_Read());
Red_LED_Write(!Red_LED_Read());
us_delay(
500000
);
// delay 1/2 second
// Toggle LEDs
Blue_LED_Write(!Blue_LED_Read());
Red_LED_Write(!Red_LED_Read());
}
}
// This function can be used for delays in units of ms.
// Valid value of ms can be in the range [0 ~ 4,294,967,295].
void
ms_delay (uint32 ms) {
uint32 period = TIMER_CLOCK/
1000
*ms;
Timer_1_WritePeriod(period);
Timer_1_Enable();
// start the timeout counter
while
(!timer_flag);
Timer_1_Stop();
timer_flag =
0
;
}
// This function can be used for delays in units of us.
// Valid value of us can be in the range [0 ~ 4,294,967,295].
void
us_delay (uint32 us) {
uint32 period = TIMER_CLOCK/
1000
/
1000
*us;
Timer_1_WritePeriod(period);
Timer_1_Enable();
// start the timeout counter
while
(!timer_flag);
Timer_1_Stop();
timer_flag =
0
;
}
Nguồn: http://electronicvn.com/psoc-device/su-dung-timer-psoc-4/
https://eewiki.net/display/microcontroller/PSoC+Timer+Example
Video
Hỏi đáp
Nếu gặp bất kỳ vấn đề gì bạn có thể bình luận phía bên dưới
hoặc gửi về hòm thư: Phantuan.ktd@gmail.com
Xem thêm Tổng quan và các thể hệ PSoC.
Xem thêm Tổng quan và các thể hệ PSoC.