Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh Git chấp nhận cả tên thẻ và tên nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi không mong muốn. Bạn có chắc chắn muốn tạo nhánh này không? Show Bộ hẹn giờ là một trong những tính năng phần cứng phổ biến trong tất cả các bộ vi điều khiển. Bộ hẹn giờ và ngắt hẹn giờ được sử dụng rất nhiều trong các ứng dụng vi điều khiển. Các ngắt hẹn giờ thường được sử dụng khi yêu cầu thời gian chính xác mà không có một phần sai số nào. Tất cả các cổng MicroPython đều có một hoặc nhiều bộ hẹn giờ. Một số bộ hẹn giờ này có thể được dành riêng cho các chức năng cụ thể như kết nối mạng hoặc Wi-Fi, trong khi những bộ hẹn giờ còn lại có thể được sử dụng trong ứng dụng của người dùng. Bài viết này sẽ khám phá các bộ định thời và việc triển khai các ngắt của bộ định thời trong MicroPython. Sau đó, chúng tôi sẽ kiểm tra bộ hẹn giờ có sẵn trong ESP8266 và ESP32. Cuối cùng, chúng tôi sẽ sử dụng các khái niệm đã nói ở trên để thiết kế mã đánh dấu ESP8266 Các chức năng liên quan đến thời gian của MicroPython Mô-đun thời gian cung cấp các chức năng liên quan đến thời gian, ngày tháng và độ trễ sau thời gian. ngủ (giây). Phương thức chặn này cung cấp độ trễ tính bằng giây. Một số cổng cho phép chỉ định thời gian trễ dưới dạng số dấu phẩy động. Khi phương thức được gọi, bộ điều khiển sẽ dừng thực thi chương trình người dùng trong số giây đã đặt thời gian. sleep_ms(ms). Đây là một phương pháp chặn khác cung cấp độ trễ tính bằng mili giây. So với thời gian. sleep(), phương pháp này chính xác hơn. Một số dương hoặc số 0 có thể được truyền làm đối số cho phương thức này. Nếu nó được sử dụng cho ngắt hẹn giờ, thời gian trễ có thể kéo dài cho đến khi quá trình thực thi chương trình phục vụ ngắt kết thúc. Nếu 0 được truyền làm đối số, độ trễ sẽ bằng thời gian thực hiện quy trình dịch vụ ngắt thời gian. sleep_us(chúng tôi). Đây là một phương pháp chặn khác cung cấp độ trễ tính bằng micro giây. Một số dương hoặc số 0 có thể được chuyển thành đối số. Nếu được sử dụng cho ngắt hẹn giờ, thời gian trễ có thể kéo dài cho đến khi quá trình thực thi quy trình phục vụ ngắt kết thúc. Nếu 0 được truyền làm đối số, độ trễ sẽ bằng thời gian thực hiện quy trình dịch vụ ngắt thời gian. ticks_ms(). Phương thức này trả về số mili giây được truyền trở đi một tham chiếu tùy ý. Nó hơi giống hàm millis() trong Arduino. Mặc dù vậy, hàm millis() trong Arduino trả về một khoảng thời gian tính bằng mili giây kể từ khi khởi động bo mạch Arduino, thời gian. ticks_ms() giả định một thời điểm tùy ý để tham khảo. Giá trị bao quanh được sử dụng làm phạm vi tối đa luôn ở mức lũy thừa 2 để nó giữ nguyên trong quá trình triển khai MicroPython bất kể cổng. Nó được gọi là TICKS_PERIOD, lớn hơn TICKS_MAX một. Do đó, lệnh gọi hàm này luôn trả về một giá trị không âm nằm trong khoảng từ 0 đến TICKS_MAX, biểu thị cho số mili giây trong phạm vi đã đề cập được chuyển sang một thời điểm tùy ý. Điều quan trọng cần lưu ý là, không giống như Arduino, các toán tử toán học tiêu chuẩn hoặc toán tử quan hệ, trực tiếp hoặc làm đối số cho các phương thức ticks_diff() hoặc ticks_add() trên các giá trị được phương thức này trả về hoặc đánh dấu như các phương thức đã đề cập ở trên đều không được phép. Các hoạt động như vậy có thể dẫn đến lỗi cú pháp (tùy thuộc vào IDE) hoặc kết quả sai thời gian. ve_us(). Phương pháp này tương tự như thời gian. ticks_ms() ngoại trừ việc nó trả về thời gian đã trôi qua tính bằng micro giây từ một thời điểm tùy ý thời gian. ve_cpu(). Phương pháp này tương tự như thời gian. ticks_ms() và thời gian. ticks_us() ngoại trừ việc nó trả về các chu kỳ xung nhịp CPU được truyền từ một thời điểm tùy ý. Nó cung cấp độ phân giải cao nhất có thể. Thay vì chu kỳ đồng hồ, một đơn vị có độ phân giải cao nhất khác được cung cấp bởi bộ hẹn giờ tích hợp có thể được trả về ở một số cổng. Cần lưu ý rằng phương pháp này không khả dụng cho tất cả các cổng MicroPython. Do đó, phải kiểm tra tài liệu dành riêng cho cổng trước khi sử dụng phương pháp này trong tập lệnh MicroPython thời gian. ticks_add(tích, delta). Phương pháp này tính toán thời hạn cho các sự kiện và tác vụ của vi điều khiển. Tùy thuộc vào thời gian, nó trả về thời hạn tính bằng mili giây, micro giây hoặc chu kỳ CPU. ticks_ms(), thời gian. ticks_us() hoặc thời gian. ticks_cpu() được sử dụng làm tham số tick tương ứng. Đối số delta có thể là một số nguyên hoặc một đối số số. Nó bằng với số tick, trong đó tick có thể là mili giây, micro giây hoặc chu kỳ CPU được đặt làm thời hạn. Ví dụ: câu lệnh sau trả về thời hạn 200 mili giây Câu lệnh sau trả về thời hạn 100 micro giây Câu lệnh sau trả về thời hạn 20 chu kỳ CPU thời gian. ticks_diff(tick1, tick2). Phương thức này trả về sự khác biệt giữa hai tick. Sự khác biệt về số lần đánh dấu có thể tính bằng mili giây, micro giây hoặc chu kỳ CPU tùy thuộc vào thời gian được trả về. ticks_ms(), thời gian. ticks_us() hoặc thời gian. ticks_cpu() chức năng được sử dụng như tick tương ứng. Giá trị được trả về là ticks1-ticks2, có thể nằm trong khoảng từ -TICKS_PERIOD/2 đến TICKS_PERIOD/2 – 1. Thời gian. ticks_diff() rất hữu ích trong việc bỏ phiếu hết thời gian chờ, lên lịch cho một tác vụ được nhúng hoặc tính toán thời hạn thời gian. thời gian(). Phương thức này trả về số giây kể từ khi epoch cung cấp RTC của cổng đã cho được đặt và duy trì. Kỷ nguyên tương thích với nhúng và thời gian trả về là số giây kể từ 2000-01-01 lúc 00. 00. 00 UTC. Kỷ nguyên có thể là tham chiếu dành riêng cho cổng như thời gian kể từ khi bật nguồn hoặc đặt lại ở một số cổng thời gian. time_ns(). Phương thức này trả về số micro giây kể từ kỷ nguyên. Nó rất hữu ích trong việc xác định thời gian tuyệt đối. Giá trị trả về của phương thức này là một số nguyên thời gian. mktime(). Phương thức này trả về một số giây được truyền giữa các kỷ nguyên (i. e. , 2000-01-01 00. 00. 00 UTC) và giờ địa phương được thông qua dưới dạng đối số. Phương thức lấy toàn bộ 8-bộ làm giờ địa phương, trong đó bộ có định dạng sau - (năm, tháng, ngày, giờ, phút, giây, ngày trong tuần, ngày trong năm) trong đó các giá trị của bộ phải nằm trong phạm vi sau Nămnăm sau Công Nguyêntháng1~12mngày1~31giờ0~23phút0~59giây0~59ngày trong tuần0~6 cho Thứ Hai~Chủ Nhật1~366
thời gian. gmtime([giây]). Phương thức này trả về ngày giờ theo UTC kể từ giây được chỉ định làm đối số. Thời gian được trả về là một bộ có định dạng (năm, tháng, ngày, giờ, phút, giây, ngày trong tuần, ngày trong năm) thời gian. giờ địa phương([giây]). Phương thức này trả về ngày giờ theo giờ địa phương vì giây được chỉ định làm đối số. Thời gian được trả về là một bộ có định dạng (năm, tháng, ngày, giờ, phút, giây, ngày trong tuần, ngày trong năm). Giờ địa phương có thể được đặt theo OS/RTOS hoặc RTC Sử dụng chức năng đánh dấu Sau đây là một ví dụ hợp lệ về thời gian tính toán dành cho việc thực thi một phần của tập lệnh MicroPython Sau đây là một ví dụ hợp lệ về việc tìm TICKS_MAX của một cổng nhất định Sau đây là một ví dụ hợp lệ về việc đặt thời hạn cho một tác vụ được nhúng Sau đây là một ví dụ hợp lệ về việc bỏ phiếu một sự kiện có thời gian chờ nếu thời gian. ticks_diff(thời gian. ticks_us(), bắt đầu) > 500 Sau đây là ví dụ hợp lệ về lập lịch tác vụ nhúng bằng cách sử dụng chức năng đánh dấu Vấn đề với các chức năng liên quan đến thời gian Mặt khác, các chức năng liên quan đến độ trễ của mô-đun thời gian như thời gian. giờ ngủ. sleep_ms() và thời gian. sleep_us() có hai vấn đề đáng chú ý. Đầu tiên, các phương thức này có tính chất chặn và dừng tập lệnh khi được gọi. Thứ hai, các phương pháp này không cung cấp độ trễ chính xác. Ví dụ: độ trễ vài giây so với thời gian. phương thức sleep() có thể có lỗi vài mili giây. Những lỗi này có thể cao tới 1 hoặc 2 phần trăm Trong những tình huống như vậy, bộ hẹn giờ đến khu nghỉ mát. Bộ hẹn giờ có các ngắt có mức độ ưu tiên cao hơn thường không thể bị ghi đè trừ khi đặt lại. Các ngắt của chúng sử dụng phần cứng bên dưới, tôi. e. , các thanh ghi hẹn giờ không để lại phạm vi lỗi nào. Để đặt thời gian chờ hoặc lên lịch cho các tác vụ nhúng quan trọng về thời gian, ngắt hẹn giờ là các tùy chọn tốt nhất. Đồng thời, các chức năng đánh dấu có thể được sử dụng để đặt thời hạn hoặc tính toán thời gian dành cho việc thực hiện các phần quan trọng của tập lệnh MicroPython hẹn giờ là gì? Ngắt hẹn giờ là gì? Thông thường, bộ vi điều khiển thực hiện các lệnh theo cách tuần tự. Khi một ngắt được đưa ra, bộ vi điều khiển sẽ bỏ qua quá trình thực thi mã hiện tại và thực hiện ISR trước. Sau khi hoàn thành ISR, nó sẽ tiếp tục thực thi mã bình thường Các ngắt hẹn giờ được nâng lên khi bộ hẹn giờ đạt đến số lượng đã đặt. Một thanh ghi cập nhật số đếm thời gian thường được gọi là thanh ghi hẹn giờ. Có một thanh ghi khác nơi người dùng đặt số lượng tham chiếu. Điều này thường được gọi là thanh ghi so sánh và đối sánh. Có thể có một hoặc nhiều thanh ghi liên quan đến cài đặt cấu hình hẹn giờ. Có một thanh ghi duy trì các giá trị của các mặt nạ ngắt khác nhau. Bất cứ khi nào một ngắt hẹn giờ được nâng lên, bit mặt nạ tương ứng của nó sẽ được bật trong thanh ghi mặt nạ ngắt. Bằng cách theo dõi bit mặt nạ ngắt, một ngắt hẹn giờ được phát hiện. Điều này có thể cung cấp độ trễ, đặt thời gian chờ hoặc lên lịch cho các tác vụ trong quy trình dịch vụ ngắt Lớp hẹn giờ MicroPython Trong trường hợp cổng là WiPy, phải sử dụng câu lệnh sau Điều quan trọng cần lưu ý là nếu có lỗi xảy ra trong quá trình thực thi quy trình dịch vụ ngắt, MicroPython sẽ không tạo báo cáo lỗi trừ khi bộ đệm đặc biệt được tạo cho nó. Do đó, một bộ đệm phải được tạo để gỡ lỗi khi ngắt hẹn giờ hoặc các ngắt khác được sử dụng trong tập lệnh MicroPython. Bộ đệm có thể được tạo bằng các câu lệnh sau Điều quan trọng cần lưu ý là bộ đệm chỉ lưu trữ dấu vết ngăn xếp ngoại lệ mới nhất tại đây. Nếu một ngoại lệ thứ hai được ném ra trong khi heap bị khóa, dấu vết ngăn xếp của ngoại lệ thứ hai sẽ thay thế dấu vết ban đầu Sau khi nhập lớp bộ đếm thời gian, một đối tượng bộ đếm thời gian phải được tạo. Điều này được thực hiện bằng cách gọi phương thức khởi tạo. Phương thức khởi tạo có nguyên mẫu sau Phương thức khởi tạo lấy id của bộ đếm thời gian làm đối số. Nó có thể là một số dương 0, 1, 2, v.v. , đối với bộ hẹn giờ phần cứng hoặc -1 đối với bộ hẹn giờ ảo, miễn là cổng hỗ trợ nó. Các tham số cấu hình khác cũng có thể được đặt trong lệnh gọi phương thức khởi tạo. Mặt khác, đối tượng hẹn giờ có thể được cấu hình rõ ràng bằng cách sử dụng bộ hẹn giờ. phương thức init(). đồng hồ bấm giờ. phương thức init() có nguyên mẫu sau Chế độ có thể được đặt thành hẹn giờ. ONE_SHOT hoặc Hẹn giờ. ĐỊNH KỲ. Nếu được đặt thành hẹn giờ. ONE_SHOT, bộ hẹn giờ chỉ chạy một lần cho đến khi hết khoảng thời gian đã chỉ định tính bằng mili giây. Nếu được đặt thành hẹn giờ. ĐỊNH KỲ, bộ hẹn giờ chạy định kỳ với khoảng thời gian tính bằng mili giây được chuyển thành khoảng thời gian đối số. Khoảng thời gian đối số là khoảng thời gian tính bằng mili giây được sử dụng làm thời gian chờ để thực thi chức năng gọi lại một lần hoặc định kỳ, tùy thuộc vào chế độ được đặt. Cuộc gọi lại là một cuộc gọi có thể gọi được thực hiện khi hết khoảng thời gian. Quy trình dịch vụ ngắt được gọi để thực thi các tác vụ nhúng mong muốn khi tăng ngắt hẹn giờ. Có thể gọi được có thể là một hàm hoặc thậm chí là một phương thức thuộc về một đối tượng lớp Lớp hẹn giờ cho phép dừng hẹn giờ và vô hiệu hóa thiết bị ngoại vi hẹn giờ. Điều này được thực hiện bằng cách gọi bộ đếm thời gian. phương thức deinit(). Một cuộc gọi đến phương thức này sẽ ngay lập tức dừng bộ hẹn giờ nếu đang chạy, hủy khởi tạo đối tượng bộ hẹn giờ và vô hiệu hóa thiết bị ngoại vi hẹn giờ. Nó có nguyên mẫu sau Nếu phải bật lại bộ đếm thời gian đã tắt, đối tượng bộ đếm thời gian có cùng ID phải được tạo lại trong chương trình người dùng Trình xử lý ngắt MicroPython Chức năng gọi lại hoặc thói quen dịch vụ ngắt cho các đối tượng hẹn giờ yêu cầu các biện pháp phòng ngừa lập trình nhất định để tránh trục trặc thời gian chạy. Chúng tôi đã thảo luận về một trong những cảnh báo như vậy. xác định một đối tượng bộ đệm để lưu trữ lỗi ngoại lệ mới nhất. Hãy để chúng tôi thảo luận thêm về một số đề xuất để viết trình xử lý ngắt trong MicroPython Phần thân của một thói quen phục vụ ngắt phải càng ngắn gọn và đơn giản càng tốt. Các thói quen dịch vụ ngắt có nghĩa là để thực hiện các hành động quan trọng về thời gian. Không nên lạm dụng chúng để lập lịch trình thường xuyên cho các tác vụ được nhúng. Nếu bất kỳ lịch trình nào của các tác vụ nhúng được yêu cầu trong tập lệnh MicroPython, thì điều đó phải được thực hiện bằng micropython. lịch trình. Không nên có loại cấp phát bộ nhớ trong một thói quen dịch vụ ngắt. Tránh các giá trị dấu chấm động, chèn chúng vào từ điển hoặc nối các mục vào danh sách. Tuy nhiên, các biến toàn cục có thể được cập nhật trong các quy trình dịch vụ ngắt Hầu hết các nền tảng vi điều khiển không cho phép các thói quen dịch vụ ngắt trả về giá trị. Tuy nhiên, MicroPython cho phép ngắt các quy trình dịch vụ và trả về một hoặc nhiều giá trị. ISR có thể trả về một giá trị duy nhất bằng cách cập nhật một biến toàn cục. Nếu cần trả về nhiều giá trị, một mảng byte được phân bổ trước phải được cập nhật theo thường trình. Một đối tượng mảng được phân bổ trước phải được cập nhật nếu thường trình trả về nhiều giá trị số nguyên. Tuy nhiên, việc chia sẻ các biến và đối tượng này giữa ISR và vòng lặp chính có thể gây ra tình trạng dồn đuổi, trong đó cả vòng lặp chương trình chính và vòng lặp ISR đều thay đổi giá trị của biến. Do đó, việc cập nhật giá trị của các biến này trong vòng lặp chương trình chính cần hết sức thận trọng. Trước khi cập nhật biến/mảng byte/mảng được chia sẻ trong vòng lặp chương trình chính, các ngắt phải được tắt bằng cách gọi pyb. phương thức disable_irq(). Sau khi cập nhật biến/mảng byte/mảng được chia sẻ trong chương trình chính, các ngắt có thể được kích hoạt lại bằng cách gọi pyb. phương thức enable_irq() Ngắt hẹn giờ là gì?Ngắt hẹn giờ cho phép bạn thực hiện một tác vụ theo các khoảng thời gian được định thời rất cụ thể bất kể điều gì khác đang diễn ra trong mã của bạn . Trong tài liệu hướng dẫn này, tôi sẽ giải thích cách thiết lập và thực hiện ngắt trong Clear Timer trên So sánh Match hoặc Chế độ CTC.
Làm cách nào để tạo bộ đếm thời gian trong Python?Làm theo các bước bên dưới để tạo đồng hồ đếm ngược. . Bước 1. Nhập mô-đun thời gian Bước 2. Sau đó yêu cầu người dùng nhập thời lượng đếm ngược tính bằng giây Bước 3. Giá trị này được gửi dưới dạng tham số 't' đến hàm đếm ngược() do người dùng xác định. . Bước 4. Trong chức năng này, một vòng lặp while chạy cho đến khi thời gian trở thành 0 Sự khác biệt giữa hẹn giờ và ngắt là gì?nhớ. bộ hẹn giờ độc lập với CPU. khoảng thời gian t (còn gọi là chu kỳ đồng hồ). gián đoạn được tạo ra trong mỗi chu kỳ. bởi người dùng .
Chúng ta có thể tạo ngắt bằng cách sử dụng bộ hẹn giờ không?Mỗi bộ đếm thời gian có thể tạo ra một hoặc nhiều ngắt . Một loại ngắt là khớp so sánh. Chúng ta có thể viết một giá trị trong một thanh ghi khác và khi giá trị bộ định thời bằng giá trị so sánh, nó sẽ kích hoạt ngắt. |