資料介紹
描述
這一切是關(guān)于什么的?
你可以拖延,但時(shí)間不會(huì)。本杰明·富蘭克林
時(shí)間的唯一原因是一切都不會(huì)一下子發(fā)生。艾爾伯特愛(ài)因斯坦
我們所要做的就是決定如何處理給我們的時(shí)間。JRR托爾金
我不能說(shuō)比這些偉大的人更好!
在我們的草圖中管理時(shí)間是我們需要經(jīng)常做的事情,通過(guò)明智地使用計(jì)時(shí)器,我們能夠有效地設(shè)計(jì)、管理和處理時(shí)間驅(qū)動(dòng)的事件。
本文提供了一種在您的草圖中使用任意數(shù)量的計(jì)時(shí)器的技術(shù)(方法),每個(gè)計(jì)時(shí)器都是獨(dú)立的、非阻塞的,并且它們都可以同時(shí)運(yùn)行。該技術(shù)易于理解,易于實(shí)現(xiàn),不使用 delay() 函數(shù),也不需要最終用戶(hù)實(shí)現(xiàn)定時(shí)器中斷服務(wù)程序 (ISR)。
為什么計(jì)時(shí)器有用?
很多時(shí)候我們需要定期做一些事情,例如每 1/100 秒讀取一次傳感器,跟蹤和處理超時(shí),每 1/2 秒處理一次心跳,等等。在這種情況下,我們需要使用一個(gè)或多個(gè)計(jì)時(shí)器來(lái)確保我們可以做所有我們需要做的事情。這就是本文提供的技術(shù) (ez_timers) 非常有用的地方。
在這篇文章中,一個(gè)草圖定義了您在草圖中實(shí)現(xiàn) ez_timers 提供的技術(shù)所需的所有數(shù)據(jù)和功能,您可以在此基礎(chǔ)上進(jìn)行草圖設(shè)計(jì)、決策控制和流程。
為了展示該技術(shù)的簡(jiǎn)單性和強(qiáng)大功能,提供了一個(gè)基于多個(gè) LED(八個(gè))的示例,每個(gè) LED 由各自的定時(shí)器控制,以不同的時(shí)間間隔打開(kāi)和關(guān)閉它們。正如將要看到的,該技術(shù)以直接和簡(jiǎn)潔的方式實(shí)現(xiàn)。它很容易擴(kuò)展到很多很多用途。
ez_timers 設(shè)計(jì)
在我們開(kāi)始看示例草圖之前,讓我們看一下 ez_timers 技術(shù)和代碼的組成部分。
ez_timers 有兩個(gè)部分:
1. 其數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)要求,以及
2. 一些終端用戶(hù)可訪(fǎng)問(wèn)的簡(jiǎn)單功能。
讓我們來(lái)看看其中的每一個(gè):
一、數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)要求
#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'。在“開(kāi)箱即用”(OOTB)草圖中,它設(shè)置為 8,因此草圖將在編譯時(shí)將自身配置為 8 個(gè)計(jì)時(shí)器。然后這些將可從 0 到 7 引用。使用此宏定義您希望在草圖中配置多少個(gè)計(jì)時(shí)器。
接下來(lái),我們將看到 ez_timer 函數(shù)使用的許多宏,最終用戶(hù)代碼也可以/應(yīng)該使用這些宏來(lái)測(cè)試特定條件的狀態(tài)。不過(guò),在這一點(diǎn)上,我只觀(guān)察到其中兩個(gè)宏可以相同地使用,具體取決于最終用戶(hù)的偏好。它們是 ' not_active' 和 ' inactive' - 它們是同一個(gè)東西。當(dāng)我們討論 ez_functions 時(shí),更多關(guān)于使用這些宏的上下文。
下一個(gè)聲明只是一個(gè)無(wú)符號(hào)字節(jié),timer可以在整個(gè)草圖中用作工作變量來(lái)引用任何計(jì)時(shí)器(最多 255 個(gè)),例如,在 for 循環(huán)等中。
ez_timers 的核心是數(shù)據(jù)結(jié)構(gòu)(ure)' timer_control'。這定義了兩個(gè)數(shù)據(jù)項(xiàng)/類(lèi)型,它們是 ' timer_status' ( bool) 和 ' start_time' ( uint32_t - 無(wú)符號(hào) 32 位整數(shù))。每個(gè)配置的計(jì)時(shí)器在此結(jié)構(gòu)中都有自己的條目,從 0 到 (' max_timers' -1)。' timer_control' 數(shù)據(jù)類(lèi)型 struct(ure) 然后被聲明為 ' timers'。此數(shù)據(jù)結(jié)構(gòu)(ure)使用' timers'引用,例如' timers[2].timer_status'、' timers[timer].start_time'等。
2.ez_timerFunctions
只有三個(gè) ez_timer 函數(shù):
//
// 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;
}
讓我們更詳細(xì)地看一下這些函數(shù):
1. ' ' - 將給定的計(jì)時(shí)器設(shè)置為活動(dòng)并以毫秒為單位記錄開(kāi)始時(shí)間。唯一的參數(shù)是要啟動(dòng)的定時(shí)器編號(hào):0 到(' '-1)。start_timermax_timers
2. ' ' - 將給定的計(jì)時(shí)器標(biāo)記為非活動(dòng)/非活動(dòng)。唯一的參數(shù)是要停止的定時(shí)器編號(hào):0 到 (' '-1)。stop_timermax_timers
3. ' ' - 應(yīng)盡可能定期調(diào)用此函數(shù),以檢查給定的計(jì)時(shí)器是否已過(guò),如果已過(guò),應(yīng)遵循哪些操作。該函數(shù)返回兩個(gè)值之一 -如果計(jì)時(shí)器已完成,則返回“ ”,否則返回“ ”。請(qǐng)注意,如果計(jì)時(shí)器未激活,此函數(shù)還將返回值 ' '(與 ' ' 相同)。timer_elapsedelaspednot_elapsednot_elapsednot_active
該函數(shù)有兩個(gè)參數(shù),第一個(gè)是要檢查的計(jì)時(shí)器編號(hào):0 到 (' max_timers'-1),第二個(gè)是要檢查的經(jīng)過(guò)時(shí)間(以毫秒為單位)。例如:
if (timer_elasped(5, 10000) == elapsed){...} else{...}
檢查計(jì)時(shí)器 5 以查看自啟動(dòng)以來(lái)是否已過(guò) 10 秒。
該函數(shù)最適合用于遍歷所有已配置計(jì)時(shí)器(0 到 (' max_timers' -1))的 for 循環(huán)。還要注意的是,一旦給定的計(jì)時(shí)器已經(jīng)過(guò)去,如果它是連續(xù)發(fā)生的需求,則需要立即重新啟動(dòng)。
一個(gè)例子
已經(jīng)向 OOTB 提供了 ez_timers 草圖,并提供了如何使用它的示例。該示例配置了八個(gè) LED 并為每個(gè) LED 使用一個(gè)計(jì)時(shí)器,以不同的時(shí)間間隔使它們閃爍。為了定義和控制 LED,還使用了 struct(ure) 數(shù)據(jù)類(lèi)型,該數(shù)據(jù)類(lèi)型很容易根據(jù)最終用戶(hù)的需求進(jìn)行修改(減少或增加 LED 的數(shù)量或改變閃光率)。
提供的示例是一種簡(jiǎn)單的方法,可以處理 LED 以提供定時(shí)光效果。但是,對(duì)于處理經(jīng)過(guò)的計(jì)時(shí)器結(jié)果的更通用的方法,switch-case 構(gòu)造會(huì)特別好用,例如:
...
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;
...
}
}
}
...
在上面的示例代碼中,已經(jīng)創(chuàng)建了許多從 0、1、2、...、(- max_timers1) 引用的計(jì)時(shí)器,每個(gè)經(jīng)過(guò)的計(jì)時(shí)器事件都由相應(yīng)的案例段處理。
最后
ez_timers 技術(shù)可以提供一種易于實(shí)現(xiàn)的方法,用于在您的草圖中運(yùn)行多個(gè)計(jì)時(shí)器。但是,如果您需要一個(gè)更全面、更復(fù)雜的計(jì)時(shí)器解決方案,它不僅可以容納經(jīng)過(guò)時(shí)間的計(jì)時(shí)器,還可以容納實(shí)時(shí)計(jì)時(shí)器,那么請(qǐng)查看同一作者的REM_SYS (見(jiàn)下文),它給出了一個(gè)更工業(yè)化和完全異步的解決方案。
REM_SYS 支持經(jīng)過(guò)時(shí)間和實(shí)時(shí)計(jì)時(shí)器(提醒)。可以將所有計(jì)時(shí)器類(lèi)型定義為一次性事件、重復(fù)發(fā)生而沒(méi)有結(jié)束或重復(fù)發(fā)生直到達(dá)到/經(jīng)過(guò)給定時(shí)間。不僅如此,對(duì)于每種類(lèi)型,可以定義子類(lèi)型以幫助決策控制,還可以為每個(gè)定義的計(jì)時(shí)器(提醒)提供用戶(hù)定義參數(shù)的“有效負(fù)載”,這些參數(shù)在達(dá)到計(jì)時(shí)器事件時(shí)返回(經(jīng)過(guò)或?qū)崟r(shí))。REM_SYS 甚至可以在 UNO 微控制器上運(yùn)行,并且可以配置有或沒(méi)有實(shí)時(shí)時(shí)鐘。
延伸閱讀
您可能還會(huì)發(fā)現(xiàn)同一作者的這些貢獻(xiàn)有趣且有用:
- 為您的草圖添加心跳- 包括一種可見(jiàn)的方式來(lái)查看您的代碼在您的微控制器上運(yùn)行,而無(wú)需任何額外的組件或接線(xiàn)!
- 音樂(lè)和燈光工作臺(tái)- 旨在將計(jì)算機(jī)編程新手介紹給該主題,使用具有酷炫效果的簡(jiǎn)單命令。方法是導(dǎo)師和學(xué)生之一
- 一個(gè)靈活、可擴(kuò)展的庫(kù) (ez_SIPO8_lib) - 支持實(shí)現(xiàn)多個(gè)串行輸入/串行輸出 IC、74HC595,無(wú)論是單獨(dú)還是在級(jí)聯(lián)組中,最多 255 個(gè) IC(2040 個(gè)輸出引腳)
- 通用開(kāi)關(guān)庫(kù) (ez_switch_lib) ,適用于大多數(shù)開(kāi)關(guān)類(lèi)型和接線(xiàn)方案,包含新穎的功能
- 了解和使用按鈕開(kāi)關(guān),基本知識(shí)- 按鈕開(kāi)關(guān),一個(gè)簡(jiǎn)單但通常很棘手的工具包。本教程提供了實(shí)現(xiàn)簡(jiǎn)單按鈕開(kāi)關(guān)的來(lái)龍去脈,可以靈活地探索電路設(shè)計(jì)的差異、不同的讀取方法和去抖動(dòng)。
- 中斷驅(qū)動(dòng)按鈕開(kāi)關(guān)- 一種將按鈕開(kāi)關(guān)與外部中斷聯(lián)系起來(lái)的方法和示例。
- 撥動(dòng)開(kāi)關(guān)- 如何可靠地讀取撥動(dòng)式開(kāi)關(guān)。
- Buttons & Lights Game - 使用按鈕開(kāi)關(guān)和 LED 帶來(lái)一點(diǎn)樂(lè)趣。
- External Interrupts,一個(gè)通用框架——一個(gè)支持并發(fā)異步多個(gè)中斷的框架。配置多個(gè)不同特性的外部中斷,并添加代碼提供中斷后異步處理。
- REM_SYS, A Programmatic Timed Reminder Alerting ,一個(gè)用于已用和實(shí)時(shí)異步定時(shí)警報(bào)的編程框架。定義任意數(shù)量的計(jì)時(shí)器(提醒)警報(bào)(亞秒到小時(shí))并異步處理。
- 廚房計(jì)時(shí)器開(kāi)源設(shè)計(jì)
- 魔方計(jì)時(shí)器開(kāi)源分享
- GymGeneral運(yùn)動(dòng)間歇計(jì)時(shí)器開(kāi)源分享
- 工業(yè)計(jì)時(shí)器警報(bào)開(kāi)源分享
- 游戲回合時(shí)間計(jì)時(shí)器開(kāi)源分享
- 簡(jiǎn)單的健身計(jì)時(shí)器開(kāi)源分享
- 自動(dòng)皂液器與計(jì)時(shí)器開(kāi)源
- 帶繼電器的Arduino倒數(shù)計(jì)時(shí)器開(kāi)源分享
- RFID競(jìng)賽計(jì)時(shí)器開(kāi)源分享
- 紅綠燈計(jì)時(shí)器開(kāi)源分享
- 電子計(jì)時(shí)器pcb圖下載 12次下載
- 運(yùn)動(dòng)計(jì)時(shí)器的設(shè)計(jì)實(shí)驗(yàn)工程文件免費(fèi)下載 3次下載
- 時(shí)鐘計(jì)時(shí)器設(shè)計(jì)與制作 43次下載
- 數(shù)字計(jì)時(shí)器Multisim設(shè)計(jì) 0次下載
- 時(shí)鐘計(jì)時(shí)器元件清單 29次下載
- 納祥科技客戶(hù)案例 | 集計(jì)時(shí)、照明、裝飾于一體的電子沙漏計(jì)時(shí)器方案 700次閱讀
- 使用定時(shí)器和數(shù)碼管實(shí)現(xiàn)簡(jiǎn)易秒計(jì)時(shí)器 3.7k次閱讀
- 如何使用7段顯示器和分立元件構(gòu)建一個(gè)飆車(chē)計(jì)時(shí)器電路 2.6k次閱讀
- 構(gòu)建一個(gè)計(jì)時(shí)器電路的教程 4.7k次閱讀
- 在系統(tǒng)重新啟動(dòng)期間禁用看門(mén)狗計(jì)時(shí)器 3.4k次閱讀
- 自動(dòng)數(shù)字計(jì)時(shí)器是如何工作的? 4.8k次閱讀
- 基于51單片機(jī)的計(jì)時(shí)器設(shè)計(jì) 1.6w次閱讀
- 利用Excel制作秒表計(jì)時(shí)器? 1.4w次閱讀
- 如何用AT89C2051單片機(jī)自制一個(gè)倒計(jì)時(shí)器 1.1w次閱讀
- 三菱plc計(jì)時(shí)器編程實(shí)例 3.5w次閱讀
- 74Ls192構(gòu)成倒計(jì)時(shí)器_基于74LS192的30秒倒計(jì)時(shí)設(shè)計(jì)詳解 9w次閱讀
- 基于VHDL的電子計(jì)時(shí)器的設(shè)計(jì)方法詳解 2.7w次閱讀
- 兩千分鐘計(jì)時(shí)器原理圖 1.9w次閱讀
- 可編程計(jì)時(shí)器電路圖 6.3k次閱讀
- 門(mén)球比賽計(jì)時(shí)器電路圖 3.7k次閱讀
下載排行
本周
- 1新一代網(wǎng)絡(luò)可視化(NPB 2.0)
- 3.40 MB | 1次下載 | 免費(fèi)
- 2冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 1次下載 | 10 積分
- 3MDD品牌三極管MMBT3906數(shù)據(jù)手冊(cè)
- 2.33 MB | 次下載 | 免費(fèi)
- 4MDD品牌三極管S9012數(shù)據(jù)手冊(cè)
- 2.62 MB | 次下載 | 免費(fèi)
- 5LAT1218 如何選擇和設(shè)置外部晶體適配 BlueNRG-X
- 0.60 MB | 次下載 | 3 積分
- 6LAT1216 Blue NRG-1/2 系列芯片 Flash 操作與 BLE 事件的互斥處理
- 0.89 MB | 次下載 | 3 積分
- 7收音環(huán)繞擴(kuò)音機(jī) AVR-1507手冊(cè)
- 2.50 MB | 次下載 | 免費(fèi)
- 8MS1000TA 超聲波測(cè)量模擬前端芯片技術(shù)手冊(cè)
- 0.60 MB | 次下載 | 免費(fèi)
本月
- 1愛(ài)華AIWA HS-J202維修手冊(cè)
- 3.34 MB | 37次下載 | 免費(fèi)
- 2PC5502負(fù)載均流控制電路數(shù)據(jù)手冊(cè)
- 1.63 MB | 23次下載 | 免費(fèi)
- 3NB-IoT芯片廠(chǎng)商的資料說(shuō)明
- 0.31 MB | 22次下載 | 1 積分
- 4UWB653Pro USB口測(cè)距通信定位模塊規(guī)格書(shū)
- 838.47 KB | 5次下載 | 免費(fèi)
- 5蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
- 0.04 MB | 4次下載 | 1 積分
- 6蘇泊爾DCL6909(即CHK-S009)單芯片電磁爐原理圖資料
- 0.08 MB | 2次下載 | 1 積分
- 7100W準(zhǔn)諧振反激式恒流電源電路圖資料
- 0.09 MB | 2次下載 | 1 積分
- 8FS8025B USB的PD和OC快充協(xié)議電壓誘騙控制器IC技術(shù)手冊(cè)
- 1.81 MB | 1次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191439次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183353次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問(wèn)
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論