- Yêu cầu và thiết lập phần cứng
- Sơ đồ mạch cho giao diện LED với Nuvoton N76E003
- Ghim hẹn giờ trên Nuvoton N76E003
- Thanh ghi hẹn giờ trong Nuvoton N76E003
- Các loại thời gian trong Nuvoton N76E003
- Lập trình Vi điều khiển Nuvoton N76E003 cho Bộ hẹn giờ
- Mã nhấp nháy và đầu ra xác minh cho chức năng hẹn giờ
Trong các hướng dẫn về Vi điều khiển Nuvoton trước đây của chúng tôi, chúng tôi đã sử dụng chương trình nhấp nháy đèn LED cơ bản làm hướng dẫn bắt đầu và cũng giao tiếp GPIO làm đầu vào để kết nối công tắc xúc giác. Với hướng dẫn đó, chúng ta đã biết đầy đủ về cách cấu hình dự án Keil và thiết lập môi trường để lập trình vi điều khiển N76E003 Nuvoton. Đã đến lúc sử dụng thiết bị ngoại vi bên trong của bộ vi điều khiển và tiến xa hơn một chút bằng cách sử dụng Bộ hẹn giờ có sẵn của N76E003.
Trong hướng dẫn trước của chúng tôi, chúng tôi chỉ sử dụng độ trễ phần mềm để nhấp nháy đèn LED, vì vậy trong hướng dẫn này, chúng ta sẽ tìm hiểu cách sử dụng chức năng độ trễ Bộ hẹn giờ cũng như ISR của Bộ định thời (Quy trình dịch vụ ngắt) và nhấp nháy hai đèn LED riêng lẻ. Bạn cũng có thể xem Hướng dẫn Arduino Timer và hướng dẫn PIC Timer để kiểm tra cách sử dụng bộ hẹn giờ với các bộ vi điều khiển khác. Không mất nhiều thời gian, hãy đánh giá loại thiết lập phần cứng mà chúng tôi yêu cầu.
Yêu cầu và thiết lập phần cứng
Vì yêu cầu của dự án này là tìm hiểu Timer ISR và chức năng trễ hẹn giờ, chúng tôi sẽ sử dụng hai đèn LED, trong đó một đèn sẽ nhấp nháy bằng cách sử dụng độ trễ bộ định thời trong vòng lặp while và một đèn khác sẽ nhấp nháy bên trong chức năng ISR.
Vì một đèn LED có sẵn trong bảng phát triển N76E003, dự án này yêu cầu một đèn LED bổ sung và điện trở giới hạn dòng điện để giới hạn dòng điện LED. Các thành phần chúng tôi yêu cầu -
- Bất kỳ màu nào của đèn LED
- Điện trở 100R
Chưa kể, ngoài những thành phần trên, chúng ta cần bo mạch phát triển dựa trên vi điều khiển N76E003 cũng như Nu-Link Programmer. Ngoài ra, breadboard và dây hookup cũng được yêu cầu để kết nối tất cả các thành phần.
Sơ đồ mạch cho giao diện LED với Nuvoton N76E003
Như chúng ta có thể thấy trong sơ đồ bên dưới, đèn LED Kiểm tra có sẵn bên trong bảng phát triển và nó được kết nối trên cổng 1.4. Một đèn LED bổ sung được kết nối với cổng 1.5. Điện trở R3 được sử dụng để giới hạn dòng LED. Ở phía bên trái, kết nối giao diện lập trình được hiển thị.
Ghim hẹn giờ trên Nuvoton N76E003
Các sơ đồ pin của N76E003 có thể được nhìn thấy trong dưới image-
Như chúng ta thấy, mỗi chân cắm có thông số kỹ thuật khác nhau và mỗi chân cắm có thể được sử dụng cho nhiều mục đích. Tuy nhiên, chân 1.5 được sử dụng làm chân đầu ra LED, nó sẽ mất PWM và các chức năng khác. Tuy nhiên, đó không phải là vấn đề vì một chức năng khác không cần thiết cho dự án này.
Lý do đằng sau việc chọn chân 1.5 làm đầu ra và chân 1.6 làm đầu vào là vì sự sẵn có gần nhất của các chân GND và VDD để dễ dàng kết nối. Tuy nhiên, trong bộ vi điều khiển này, trong số 20 chân, 18 chân có thể được sử dụng làm chân GPIO và bất kỳ chân GPIO nào khác có thể được sử dụng cho các mục đích liên quan đến Đầu ra và Đầu vào, ngoại trừ chân 2.0 được sử dụng chuyên dụng cho đầu vào Đặt lại và nó không thể được sử dụng như đầu ra. Tất cả các chân GPIO có thể được định cấu hình ở chế độ được mô tả dưới đây.
Theo biểu dữ liệu, PxM1.n và PxM2.n là hai thanh ghi được sử dụng để xác định hoạt động điều khiển của cổng I / O. Vì chúng tôi đang sử dụng đèn LED và chúng tôi yêu cầu chân là chân đầu ra chung, do đó chúng tôi sẽ sử dụng chế độ Quasi-hai chiều cho các chân.
Thanh ghi hẹn giờ trong Nuvoton N76E003
Bộ đếm thời gian là một thứ quan trọng đối với bất kỳ bộ vi điều khiển nào. Bộ vi điều khiển đi kèm với một thiết bị ngoại vi hẹn giờ tích hợp. Nuvoton N76E003 cũng đi kèm với các thiết bị ngoại vi hẹn giờ 16 bit. Tuy nhiên, mỗi bộ hẹn giờ được sử dụng cho các mục đích khác nhau, và trước khi sử dụng bất kỳ giao diện bộ hẹn giờ nào, điều quan trọng là phải biết về bộ hẹn giờ.
Các loại thời gian trong Nuvoton N76E003
Bộ hẹn giờ 0 và 1:
Hai bộ định thời timer0 và timer1 này giống hệt bộ định thời 8051. Hai bộ đếm thời gian này có thể được sử dụng như một bộ đếm thời gian chung hoặc bộ đếm. Hai bộ hẹn giờ này hoạt động ở bốn chế độ. Ở Chế độ 0, các bộ định thời đó sẽ hoạt động ở chế độ Bộ định thời / Bộ đếm 13 bit. Trong Chế độ 1, bit phân giải của hai bộ định thời đó sẽ là 16 bit. Trong Chế độ 2, bộ hẹn giờ được định cấu hình ở chế độ tự động tải lại với độ phân giải 8 bit. Ở Chế độ 3, bộ hẹn giờ 1 tạm dừng và bộ hẹn giờ 0 có thể được sử dụng làm bộ đếm và bộ hẹn giờ cùng một lúc.
Trong số bốn chế độ này, Chế độ 1 được sử dụng trong hầu hết các trường hợp. Hai bộ hẹn giờ này có thể sử dụng Fsys (Tần số hệ thống) ở chế độ cố định hoặc định mức trước (Fys / 12). Nó cũng có thể được tạo xung nhịp từ nguồn xung nhịp bên ngoài.
Hẹn giờ 2:
Bộ định thời 2 cũng là bộ định thời 16-Bit chủ yếu được sử dụng để chụp dạng sóng. Nó cũng sử dụng đồng hồ hệ thống và có thể được sử dụng trong các ứng dụng khác nhau bằng cách chia tần số đồng hồ bằng 8 thang đo khác nhau. Nó cũng có thể được sử dụng trong chế độ so sánh hoặc để tạo PWM.
Giống như Timer 0 và Timer 1, Timer 2 có thể được sử dụng ở chế độ tự động tải lại.
Hẹn giờ 3:
Bộ định thời 3 cũng được sử dụng làm bộ định thời 16 bit và nó được sử dụng làm nguồn xung nhịp truyền cho UART. Nó cũng có tính năng tự động tải lại. Điều quan trọng là chỉ sử dụng bộ hẹn giờ này cho giao tiếp Nối tiếp (UART) nếu ứng dụng yêu cầu giao tiếp UART. Không nên sử dụng bộ hẹn giờ này cho các mục đích khác trong trường hợp như vậy do quy trình xung đột trong thiết lập bộ hẹn giờ.
Bộ định thời gian giám sát:
Watchdog Timer có thể được sử dụng như một bộ định thời 6 bit tiêu chuẩn nhưng nó không được sử dụng cho mục đích này. Việc sử dụng bộ định thời Watchdog làm bộ hẹn giờ cho mục đích chung có thể áp dụng cho các ứng dụng tiêu thụ điện năng thấp trong đó bộ vi điều khiển chủ yếu ở chế độ nhàn rỗi.
Watchdog Timer, như tên cho thấy, luôn kiểm tra xem bộ vi điều khiển có hoạt động tốt hay không. Trong trường hợp vi điều khiển bị treo hoặc tạm dừng, WDT (Bộ định thời gian giám sát) sẽ tự động đặt lại vi điều khiển để đảm bảo rằng vi điều khiển chạy trong dòng mã liên tục mà không bị kẹt, bị treo hoặc trong các tình huống bị tạm dừng.
Hẹn giờ tự đánh thức:
Đây là một thiết bị ngoại vi hẹn giờ khác phục vụ một quá trình định thời chuyên dụng giống như một bộ định thời cho cơ quan giám sát. Bộ hẹn giờ này, đánh thức hệ thống định kỳ khi bộ vi điều khiển đang chạy ở chế độ năng lượng thấp.
Thiết bị ngoại vi hẹn giờ này có thể được sử dụng bên trong hoặc sử dụng thiết bị ngoại vi bên ngoài để đánh thức bộ vi điều khiển từ chế độ ngủ. Đối với dự án này, chúng tôi sẽ sử dụng Timer 1 và Timer 2.
Lập trình Vi điều khiển Nuvoton N76E003 cho Bộ hẹn giờ
Đặt các Ghim làm Đầu ra:
Hãy bắt đầu với phần đầu ra trước. Chúng tôi đang sử dụng hai đèn LED, một là đèn LED trên bo mạch, có tên là Test, và được kết nối với cổng P1.4 và một đèn LED bên ngoài được kết nối với chân P1.5.
Do đó, hai chân này được cấu hình như một chân đầu ra để kết nối hai đèn LED đó bằng cách sử dụng các đoạn mã bên dưới.
#define Test_LED P14 #define LED1 P15
Hai chân này được đặt làm chân bán hướng hai chiều trong chức năng thiết lập.
void setup (void) {P14_Quasi_Mode; P15_Quasi_Mode; }
Đặt chức năng hẹn giờ:
Trong chức năng thiết lập, Timer 2 cần được cấu hình để có được đầu ra mong muốn. Đối với điều này, chúng tôi sẽ đặt thanh ghi T2MOD với hệ số phân chia xung nhịp 1/128 và sử dụng nó trong chế độ trì hoãn tự động tải lại. Đây là tổng quan về đăng ký T2MOD-
Bit thứ 4,5 và thứ 6 của thanh ghi T2MOD đặt bộ chia xung nhịp 2 và bit thứ 7 đặt chế độ tự động tải lại. Điều này được thực hiện bằng cách sử dụng dòng dưới đây -
TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode;
Hai dòng này được định nghĩa trong tệp Function_define.h là
#define TIMER2_DIV_128 T2MOD- = 0x50; T2MOD & = 0xDF #define TIMER2_Auto_Reload_Delay_Mode T2CON & = ~ SET_BIT0; T2MOD- = SET_BIT7; T2MOD- = SET_BIT3
Bây giờ, các dòng này đặt giá trị định thời cần thiết cho ISR của Timer 2.
RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms >> 8;
Điều này được định nghĩa thêm trong tệp Function_define.h as-
TIMER_DIV128_VALUE_100ms 65536-12500 // 12500 * 128/16000000 = 100 mili giây
Vì vậy, 16000000 là tần số tinh thể 16 Mhz đang thiết lập độ trễ thời gian 100 ms.
Hai dòng dưới đây sẽ làm trống 2 byte Thấp và Cao của Timer.
TL2 = 0; TH2 = 0;
Cuối cùng mã bên dưới sẽ kích hoạt ngắt bộ định thời 2 và khởi động bộ định thời 2.
set_ET2; // Kích hoạt ngắt Timer2 set_EA; set_TR2; // Timer2 chạy
Chức năng thiết lập hoàn chỉnh có thể được nhìn thấy trong các mã dưới đây-
thiết lập void (void) { P14_Quasi_Mode; P15_Quasi_Mode; TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode; RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms >> 8; TL2 = 0; TH2 = 0; set_ET2; // Kích hoạt ngắt Timer2 set_EA; set_TR2; // Timer2 run }
Chức năng ISR của Timer 2:
Có thể thấy chức năng ISR của Timer 2 trong đoạn mã dưới đây.
void Timer2_ISR (void) ngắt 5 { clr_TF2; // Xóa cờ ngắt Timer2 LED1 = ~ LED1; // LED1 chuyển đổi, được kết nối trong P1.5; }
Mã nhấp nháy và đầu ra xác minh cho chức năng hẹn giờ
Mã (được đưa ra bên dưới) khi được biên dịch trả về 0 cảnh báo và 0 Lỗi và tôi đã cài đặt nó bằng phương pháp nhấp nháy mặc định trong Keil. Sau khi nhấp nháy, các đèn LED sẽ nhấp nháy trong một khoảng thời gian trễ xác định như được lập trình.
Hãy xem video dưới đây để có một minh chứng đầy đủ về cách thức hoạt động của bảng đối với mã này. Hy vọng bạn thích hướng dẫn và học được điều gì đó hữu ích nếu bạn có bất kỳ câu hỏi nào, hãy để lại chúng trong phần bình luận bên dưới. Bạn cũng có thể sử dụng diễn đàn của chúng tôi để đăng các câu hỏi kỹ thuật khác.