在最後兩個文章中使用MeCrisp-Stellaris製作太陽能電池測試儀

,我咆哮著它如何令人驚嘆但奇怪,然後讓您在基本系統上設置並閃爍一些LED。雖然我指出了Multitasker,但我們還沒有真正使用它。如此開始的系統開始,如此大約是一半的戰鬥。在微控制器內部工作不同於編譯微控制器,並找出工作流程,如何解決問題問題,以及有益資源不一定明顯。此外,在您在系統中攻擊一段時間後,您可能不會注意到MECRISP-Stellaris的一些意識。

理想情況下,你偷看了攜帶某人做他們的事情的人,你會看到他們的一些工作。這是這件作品的目標。如果您已經在我們的MECRISP-STELLARIS-PLUS-HEMBELLO版本中閃過,那麼您就可以隨時遵循。如果沒有,請返回並真正做作業。當你完成的時候,我們仍然會在這裡。這篇文章的許多帖子將非常肯定的是Mecroisp-Stellaris味道,但鑑於它在那裡耗盡了大量的碎片,這不是一個壞地方。

得到適應的

你需要習慣的第一件事就是堆棧。你知道那個老栗子對人們只能在他們腦海中留下五(七個?)嗎?將此投入測試。

上次,我簡要介紹了.s(“print stact”)命令。在Hackaday Edition中,我重新定義了傳統的Mecrisp。有點不那麼冗長,而且我的眼睛更可讀。如果你發現自己擊中了。很多,你會的,我也寫了一個(暫時)覆蓋“確定”的函數。通過將堆棧打印輸出附加到它來提示,每當您按Enter鍵時。鍵入print.stack並命中輸入一個時間更多的時間查看它是如何工作的。擊中重置按鈕或鍵入重置將擦除RAM中的所有內容,並且包含堆棧打印提示,因此您將返回乾淨的板岩。

現在可能是與堆棧運營商一起玩的好時機。你讀過MECRISP詞彙表嗎?瀏覽那裡的堆棧雜耍操作列表。打開print.stack並播放,直到他們都有意義。

你有沒有跑過單詞?它佔據了一個第四個神話的鏈接列表,以及它們生活的內存位置以及一些額外的細節 – 除非您正在調試系統本身,否則太多了。 MECRISP中有一個額外的,非標準的單詞,只需打印出函數名稱:列表。現在給那次拍攝。如果您還沒有定義幾個單詞,請執行此操作。

:HW。“你好,世界!” CR;
是一個很好的人。

內存中的層數

MECRISP-Stellaris’記憶分為兩個總位置:RAM和Flash。在“ – MECRISP-Stellaris核心 – ”標記之前提供的所有單詞都在RAM中,並將在重置或掉電時丟失。新的RAM功能將附加到列表的前部。

在“MECRISP-Stellaris核心”之後,標記在閃存中起作用。在Flash的早期部分,之前“ – 閃存字典 – ”是傳統的MECRISP核心。從那裡直到“<>”是從通常有用的MECRISP分佈中獲取的單詞,包括一些調試功能和多任務處理。在“<>”之前是EMBELLO庫的貢獻,包括許多GPIO定義,並且在此帖子系列中添加了“<>”之前。

不明顯的是,所有這些標記都帶有周圍的括號是基石。這些允許您清除閃爍,直到內存位置。因此,如果您已將一些額外的功能添加到Flash,並且希望清除到Hackaday Edition默認狀態,則可以輸入<< Hackaday-Extras >>。將刪除額外功能,芯片復位。 (請注意,這丟失了RAM中的任何東西!)命令eraseflash將讓您回到“ – 閃存字典 – ”標記。

重寫歷史

如果您使用相同名稱定義兩次單詞,則字典中將有兩個版本的單詞。當調用或編譯一個單詞時,解釋器通過內存,從RAM的頂部向下看,然後從閃存的末尾回到開頭。因此,RAM中具有相同名稱的單詞在閃存中的那些之前被調用。可以特別奇怪的是,因為它實時編譯,所以在任何調用字中引用的單詞是在定義主叫詞時在頂部的字樣。製作纏結的歷史是一個瘋狂的方式。

:foo。“foo!” ;
:酒吧foo。“酒吧!” ;
酒吧foo!酒吧!好的。
:foo。“bizzle!” ;重新定義foo。好的。
Foo Bizzle!好的。
酒吧foo!酒吧!好的。

另一方面,這是一個很好的工作方式,利用這些各種內存功能。 RAM在每次重置時都會被刪除,給您一個乾淨的板岩,但通過使用基石,閃光燈也不是不可變的。當然,你必須擦除閃光的更深,假設其中一些是有用的,你必須在以後重新定義更多的單詞。這表明了一種開發的分層技術,最“核心”詞彙最內心。這也是自然的,因為需要被稱為單詞,所以定義基礎知識首先是有意義的。

通過調用CompiletoFlash來調用CompIleToram或Flash,您可以將新單詞編譯為RAM(默認值)。在RAM中原型您的單詞。感到互惠互惠覆蓋它們,因為您想要的很多時代,但請記住,在更改上游的內容以保持呼叫歷史完好無損後必須重新定義任何依賴的單詞。一旦您使用塊的開發,鍵入RESET和CLEAR RAM。現在將這些單詞重新定義為閃存。如果您從底部開發您的應用程序,那麼您會發現這一切都掛在一起。當您在已經寫入閃存的東西中發現了一個錯誤時,基石就會救援。

最後,這種分層的定義性質可以非常方便。例如,閃存中定義的函數init在每個重置時都會在每個重置上運行。它包括設置處理器速度和系統勾號的東西,您可能不想亂七八糟。因為你可以覆蓋init,並且任何編譯都使用編譯時可用的單詞,只需將功能層分成init::init init。“howdy!” CR;。第一個“init”是新單詞的名稱,第二個是調用預先存在的init,並執行所有設置。剩餘的定義是您的播放。在重新啟動時,一切都將在購買時進行。

生物舒適

我在編輯器(vim)中寫了很多代碼,然後將其發送到芯片以播放。非常具體地,我寫了一個呼叫@upload.sh的腳本,其中包含以下內容:

[[$ 1]] &&術語= $ 1 ||術語= / dev / ttyusb0
延遲= 0.2
讀取-r f;做迴聲“$ f”; echo“$ f”> $術語;睡覺$ {divell} s;完畢

要將文件發送到串行端口,因此,Forth_Upload.sh U VIP: Silent W!Forn_Upload.sh
Inoremap U :Silent .w!Forth_upload.sh
nnoremap U:Silent W!Forth_Upload.sh

此設置允許我在我喜歡的編輯器中開發和調整函數,然後將它們幾乎快速發送到第四系統進行測試。我保留一個終端窗口打開,始終登錄到第四系統,所以我可以享受新的單詞定義,然後在交互方式開始與它們一起播放。這很甜蜜。

太陽能電池測試儀

現在到一個快速的真實例子,它將利用上述所有示例。我最近做出了一個關於我在垃圾抽屜裡的一堆小型太陽能電池板的決定。這表示調節面板上的負載並註意到面板產生的電壓和通過負載產生的電流。我掛了兩次萬用表並寫下一些數字,但這無疑是微控制器的工作。

從圖像中清除,這是一個快速的leashup。較大的銅包層具有電流測量電阻器和一對電阻,構造為分壓器,以降壓3.3 V ADC可以處理的3.3 V ADC的面板電壓。

搖擺不定是(鍍銀)可變負載電路,其完全次優:MOSFET通過通過該100​​ UF電容器的PWM的電壓過濾而通過半開啟而散發熱量。 9 V電池和光學耦合器被旋合,確保足夠高的電壓完全打開MOSFET,這需要超過3.3 V.這種可怕但功能,負載電路是後來的添加 – 第一個版本才有一個電位器在這裡,直到通過它通過它的電流運行太多而被吸煙。

按鈕用於從陽台上從設備開始和停止錄製,而無需返回內部。該過程是在新面板中的鱷魚剪輯,並在錄製時按住白色按鈕。按一次小的黑色按鈕劃分新的單元格數據。通過將ESP-Link作為透明的WiFi串行橋將ESP8266運行,數據通過eSp8266串行,數據串行串行數據庫串行序列。熱膠水和紙板圍繞最先進的構建。

到數據表!

這種快速和動手的工具建築是閃耀的。 jeelabs stharts庫已經有一些函數簡化了ADC設置,但它們實際上對我來說並不適用,所以我查看了數據表。需要將ADC工作的最小值是打開ADC外設時鐘,使能ADC單元,然後選擇ADC採樣時間。我們可能還希望運行ADC校準程序以確保我們的讀數是正確的。這是您必須使用任何微控制器的低級詳細信息,或者依賴於為您提供的庫。

讀取數據表,打開ADC系統時鐘,我們需要在RCC-APB2ENR內存寄存器中設置ADC1EN位。任何。 MECRISP-Stellaris具有一些支持代碼,可從製造商提供的文件中讀取這些值。我將它們包含在核心/寄存器/目錄中。內存映射文件對所有寄存器具有很大的助記符,但我不會以處理各個位名稱的方式感到興奮。這是一個犛牛在另一天刮鬍子,我正在努力完成任何事情。

這是我想出的一組比特級ADC詞:

\ 掛鉤
\ PB0 – AIN8連接到面板電壓
\ PB1 – AIN9連接到電流檢測電阻

:ADC.RCC-啟用9位RCC-APB2ENR BIS! ; \ set ADC1EN.
:ADC.SET-ADON 0位ADC1-CR2 BIS! ; \ Set Adon啟用ADC
:ADC.SET-BIT 2位ADC1-CR2 BIS! ;

:ADC.Cal-DONE? 2位ADC1-CR2位@ 0 =;
:ADC.ISDONE? 1位ADC1-SR位@;

9位創建一個數字,其中第九位設置和所有其他零,以及RCC-APB2ENR BIS!在相關的ADC控制寄存器中設置所需位。總而言之,漂亮的不透明,還有一個關於數據表的指示的一對一。良好的命名這些底層單詞使事情變得更好一層。例如,負責運行校準的單詞(設置一位,等待到另一個是清除)相對可讀::ADC.Cal ADC.Set-Cal-Bit Begin ADC.Cal Done?直到 ;。

在這裡,我們看到了我們的第一個流量控制,開始…直到構造。買奇怪,對嗎?開始啟動循環,測試功能ADC-Cal-DONE?執行,在堆棧上留下一個真或假值,然後直到讀取此值並循環回到開始,直到該值為真。這與C的相同(!ADC-CAL-DONE()){;}忙碌等待循環。這是另一個右派的介紹:使用?對於返回布爾的任何東西。

再次測試,修復和測試

讓我們來試聽這些話。初始化ADC並讀取它很容易:現在讓我們帶走它們,以確保這些值是我們期待的。鞭打一個快速測試夾具是其主要優勢之一。 :Test-ADC開始ADC @。 CR 10 ms鍵?直到 ;定義讀取ADC的單詞,打印值,然後每十毫秒重複每十毫秒,直到輸入輸入。例如,如果在熒光燈下用太陽能電池板這樣做,您將在擊中面板時拿起電源頻率漣漪,這是您可能一直在考慮的東西。一旦您定義它們,就可以使用新單詞來玩新單詞的能力使這種調查編碼自然流動。

真實的故事時間。當我正在編寫此代碼時,我在ADC輸入上設置了太短的採樣時間。這導致從一個讀數中的值影響到下一個,因為ADC的內部電容沒有時間充電或放電。當電壓高時,我對電流的讀數太高,當電壓低時,電流的讀數太低。我通過寫一行中讀取每個頻道的例程來調試這一點,這是一行讀取每個頻道的例程並打印出價值,我留下了這些詞語。

(佔用每次8個樣本,用於調試)
:讀取8 0 do read-v。循環8 0 do read-i。環形 ;
:readloop開始讀取 – 兩個ms鍵?直到 ;

來自此測試練習的反饋使我能夠將ADC的樣本時間轉換為最大值,因為這在此處都是至關重要的,我使用了一個相當高阻抗的來源。 (默認值是按照p迅速進行樣本

Leave a Reply

Your email address will not be published. Required fields are marked *