資料介紹
描述
這一切是關于什么的?
你可以拖延,但時間不會。本杰明·富蘭克林
時間的唯一原因是一切都不會一下子發生。艾爾伯特愛因斯坦
我們所要做的就是決定如何處理給我們的時間。JRR托爾金
我不能說比這些偉大的人更好!
在我們的草圖中管理時間是我們需要經常做的事情,通過明智地使用計時器,我們能夠有效地設計、管理和處理時間驅動的事件。
本文提供了一種在您的草圖中使用任意數量的計時器的技術(方法),每個計時器都是獨立的、非阻塞的,并且它們都可以同時運行。該技術易于理解,易于實現,不使用 delay() 函數,也不需要最終用戶實現定時器中斷服務程序 (ISR)。
為什么計時器有用?
很多時候我們需要定期做一些事情,例如每 1/100 秒讀取一次傳感器,跟蹤和處理超時,每 1/2 秒處理一次心跳,等等。在這種情況下,我們需要使用一個或多個計時器來確保我們可以做所有我們需要做的事情。這就是本文提供的技術 (ez_timers) 非常有用的地方。
在這篇文章中,一個草圖定義了您在草圖中實現 ez_timers 提供的技術所需的所有數據和功能,您可以在此基礎上進行草圖設計、決策控制和流程。
為了展示該技術的簡單性和強大功能,提供了一個基于多個 LED(八個)的示例,每個 LED 由各自的定時器控制,以不同的時間間隔打開和關閉它們。正如將要看到的,該技術以直接和簡潔的方式實現。它很容易擴展到很多很多用途。
ez_timers 設計
在我們開始看示例草圖之前,讓我們看一下 ez_timers 技術和代碼的組成部分。
ez_timers 有兩個部分:
1. 其數據結構和數據要求,以及
2. 一些終端用戶可訪問的簡單功能。
讓我們來看看其中的每一個:
一、數據結構和數據要求
#define max_timers 8
#define elapsed true
#define not_elapsed !elapsed
#define active true
#define not_active !active // double defined for user preference
#define inactive not_active // double defined for user preference
uint8_t timer; // general variable for use dealing with timers
// timer control struct(ure)
struct timer_control {
bool timer_status; // records status of a timer - active or not active
uint32_t start_time;// records the millis time when a timer is started
} timers[max_timers];// declare an entry for each timer - 0:(max_timers-1)
我們首先注意到的是宏' max_timers
'。在“開箱即用”(OOTB)草圖中,它設置為 8,因此草圖將在編譯時將自身配置為 8 個計時器。然后這些將可從 0 到 7 引用。使用此宏定義您希望在草圖中配置多少個計時器。
接下來,我們將看到 ez_timer 函數使用的許多宏,最終用戶代碼也可以/應該使用這些宏來測試特定條件的狀態。不過,在這一點上,我只觀察到其中兩個宏可以相同地使用,具體取決于最終用戶的偏好。它們是 ' not_active
' 和 ' inactive
' - 它們是同一個東西。當我們討論 ez_functions 時,更多關于使用這些宏的上下文。
下一個聲明只是一個無符號字節,timer
可以在整個草圖中用作工作變量來引用任何計時器(最多 255 個),例如,在 for 循環等中。
ez_timers 的核心是數據結構(ure)' timer_control
'。這定義了兩個數據項/類型,它們是 ' timer_status
' ( bool
) 和 ' start_time
' ( uint32_t
- 無符號 32 位整數)。每個配置的計時器在此結構中都有自己的條目,從 0 到 (' max_timers
' -1)。' timer_control
' 數據類型 struct(ure) 然后被聲明為 ' timers
'。此數據結構(ure)使用' timers
'引用,例如' timers[2].timer_status
'、' timers[timer].start_time
'等。
2.ez_timerFunctions
只有三個 ez_timer 函數:
//
// set the given timer active and note start time in milliseconds
//
void start_timer(uint8_t timer) {
if (timer < max_timers) {
// valid timer
timers[timer].timer_status = active; // mark this timer as active
timers[timer].start_time = millis(); // record time this timer is started
}
}
//
// cancel (stop) the given timer
//
void stop_timer(uint8_t timer) {
if (timer < max_timers) {
// valid timer
timers[timer].timer_status = inactive; // mark this timer as inactive
}
}
//
// Function determines if the time has elapsed for given timer, if active.
// The elapsed_time parameter is in milliseconds.
//
bool timer_elapsed(uint8_t timer, uint32_t elapsed_time) {
if (timer < max_timers) {
// valid timer
if (timers[timer].timer_status == active) {
// timer is active so check elapsed time
if (millis() - timers[timer].start_time >= elapsed_time) {
// this timer has elapsed
timers[timer].timer_status = inactive; // mark this timer no longer active
return elapsed;
}
}
}
return not_elapsed;
}
讓我們更詳細地看一下這些函數:
1. ' ' - 將給定的計時器設置為活動并以毫秒為單位記錄開始時間。唯一的參數是要啟動的定時器編號:0 到(' '-1)。start_timer
max_timers
2. ' ' - 將給定的計時器標記為非活動/非活動。唯一的參數是要停止的定時器編號:0 到 (' '-1)。stop_timer
max_timers
3. ' ' - 應盡可能定期調用此函數,以檢查給定的計時器是否已過,如果已過,應遵循哪些操作。該函數返回兩個值之一 -如果計時器已完成,則返回“ ”,否則返回“ ”。請注意,如果計時器未激活,此函數還將返回值 ' '(與 ' ' 相同)。timer_elapsed
elasped
not_elapsed
not_elapsed
not_active
該函數有兩個參數,第一個是要檢查的計時器編號:0 到 (' max_timers
'-1),第二個是要檢查的經過時間(以毫秒為單位)。例如:
if (timer_elasped(5, 10000) == elapsed){...} else{...}
檢查計時器 5 以查看自啟動以來是否已過 10 秒。
該函數最適合用于遍歷所有已配置計時器(0 到 (' max_timers
' -1))的 for 循環。還要注意的是,一旦給定的計時器已經過去,如果它是連續發生的需求,則需要立即重新啟動。
一個例子
已經向 OOTB 提供了 ez_timers 草圖,并提供了如何使用它的示例。該示例配置了八個 LED 并為每個 LED 使用一個計時器,以不同的時間間隔使它們閃爍。為了定義和控制 LED,還使用了 struct(ure) 數據類型,該數據類型很容易根據最終用戶的需求進行修改(減少或增加 LED 的數量或改變閃光率)。
提供的示例是一種簡單的方法,可以處理 LED 以提供定時光效果。但是,對于處理經過的計時器結果的更通用的方法,switch-case 構造會特別好用,例如:
...
for (timer = 0;time < max_timers; timer++){
if (timer_elasped(timer, 10000) == elapsed){
switch (timer){
case 0: // timer 0
// restart this timer and process the event
start_timer(timer);
...
break;
case 1: // timer 1
// do not restart this timer, just process the event
...
break;
case 2: // timer 2
...etc
break;
...
}
}
}
...
在上面的示例代碼中,已經創建了許多從 0、1、2、...、(- max_timers
1) 引用的計時器,每個經過的計時器事件都由相應的案例段處理。
最后
ez_timers 技術可以提供一種易于實現的方法,用于在您的草圖中運行多個計時器。但是,如果您需要一個更全面、更復雜的計時器解決方案,它不僅可以容納經過時間的計時器,還可以容納實時計時器,那么請查看同一作者的REM_SYS (見下文),它給出了一個更工業化和完全異步的解決方案。
REM_SYS 支持經過時間和實時計時器(提醒)。可以將所有計時器類型定義為一次性事件、重復發生而沒有結束或重復發生直到達到/經過給定時間。不僅如此,對于每種類型,可以定義子類型以幫助決策控制,還可以為每個定義的計時器(提醒)提供用戶定義參數的“有效負載”,這些參數在達到計時器事件時返回(經過或實時)。REM_SYS 甚至可以在 UNO 微控制器上運行,并且可以配置有或沒有實時時鐘。
延伸閱讀
您可能還會發現同一作者的這些貢獻有趣且有用:
- 為您的草圖添加心跳- 包括一種可見的方式來查看您的代碼在您的微控制器上運行,而無需任何額外的組件或接線!
- 一個靈活、可擴展的庫 (ez_SIPO8_lib) - 支持實現多個串行輸入/串行輸出 IC、74HC595,無論是單獨還是在級聯組中,最多 255 個 IC(2040 個輸出引腳)
- 通用開關庫 (ez_switch_lib) ,適用于大多數開關類型和接線方案,包含新穎的功能
- 了解和使用按鈕開關,基本知識- 按鈕開關,一個簡單但通常很棘手的工具包。本教程提供了實現簡單按鈕開關的來龍去脈,可以靈活地探索電路設計的差異、不同的讀取方法和去抖動。
- 中斷驅動按鈕開關- 一種將按鈕開關與外部中斷聯系起來的方法和示例。
- 撥動開關- 如何可靠地讀取撥動式開關。
- Buttons & Lights Game - 使用按鈕開關和 LED 帶來一點樂趣。
- External Interrupts,一個通用框架——一個支持并發異步多個中斷的框架。配置多個不同特性的外部中斷,并添加代碼提供中斷后異步處理。
- REM_SYS, A Programmatic Timed Reminder Alerting ,一個用于已用和實時異步定時警報的編程框架。定義任意數量的計時器(提醒)警報(亞秒到小時)并異步處理。
- 廚房計時器開源設計
- 魔方計時器開源分享
- GymGeneral運動間歇計時器開源分享
- 工業計時器警報開源分享
- 游戲回合時間計時器開源分享
- 簡單的健身計時器開源分享
- 自動皂液器與計時器開源
- 帶繼電器的Arduino倒數計時器開源分享
- RFID競賽計時器開源分享
- 紅綠燈計時器開源分享
- 電子計時器pcb圖下載 12次下載
- 時鐘計時器設計與制作 43次下載
- 數字計時器Multisim設計 0次下載
- 時鐘計時器元件清單 28次下載
- 可逆計時器電路圖
- 使用定時器和數碼管實現簡易秒計時器 1109次閱讀
- 如何使用7段顯示器和分立元件構建一個飆車計時器電路 1142次閱讀
- 構建一個計時器電路的教程 2576次閱讀
- 在系統重新啟動期間禁用看門狗計時器 2081次閱讀
- 自動數字計時器是如何工作的? 3904次閱讀
- 基于51單片機的計時器設計 1.4w次閱讀
- 利用Excel制作秒表計時器? 1.1w次閱讀
- 如何用AT89C2051單片機自制一個倒計時器 9983次閱讀
- 51單片機時鐘計時器學習板的基本原理解析 4848次閱讀
- 三菱plc計時器編程實例 3.1w次閱讀
- 74Ls192構成倒計時器_基于74LS192的30秒倒計時設計詳解 8.4w次閱讀
- 基于VHDL的電子計時器的設計方法詳解 2.4w次閱讀
- 兩千分鐘計時器原理圖 1.7w次閱讀
- 可編程計時器電路圖 5591次閱讀
- 門球比賽計時器電路圖 3115次閱讀
下載排行
本周
- 1SMD LED選型手冊 貼片燈珠
- 5.47 MB | 4次下載 | 免費
- 2明緯S-50-24開關電源電路圖.pdf
- 0.10 MB | 2次下載 | 5 積分
- 3基本半導體產品在Sic逆變焊機中的應用
- 7.27 MB | 2次下載 | 免費
- 4加密芯片的一種破解方法和對應加密方案改進設計
- 0.29 MB | 1次下載 | 免費
- 5多功能MPU芯片GC9005數據手冊
- 2.67 MB | 1次下載 | 免費
- 6基本半導體產品在125kW工商業儲能PCS中的應用
- 10.74 MB | 1次下載 | 免費
- 7MOSFET參數解讀
- 1.59 MB | 1次下載 | 2 積分
- 8550W充電機原理圖
- 0.13 MB | 1次下載 | 6 積分
本月
- 1使用單片機實現七人表決器的程序和仿真資料免費下載
- 2.96 MB | 44次下載 | 免費
- 2美的電磁爐維修手冊大全
- 1.56 MB | 16次下載 | 5 積分
- 33314A函數發生器維修手冊
- 16.30 MB | 13次下載 | 免費
- 4STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 5使用TL431設計電源
- 0.67 MB | 7次下載 | 免費
- 6感應筆電路圖
- 0.06 MB | 7次下載 | 免費
- 7不對稱半橋(AHB)反激變換器的分析與設計
- 0.68 MB | 6次下載 | 1 積分
- 8LZC3106G高性能諧振控制器中文手冊
- 1.29 MB | 5次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多