【嵌入式學習心得#1】簡易雷達調光的MCU設定,從看懂 ...

文章推薦指數: 80 %
投票人數:10人

事實上目前大多數的韌體嵌入式開發(單晶片),都是用Keil或 IAR(這兩個應該就是大宗了),把寫好的程式碼做compile 將程式碼燒錄進MCU 內。

【嵌入式學習心得#1】簡易雷達調光的MCU設定,從看懂Datasheet開始 Home» 教學文»【嵌入式學習心得#1】簡易雷達調光的MCU設定,從看懂Datasheet開始 Postedon8月28,2018in教學文 作者: RyanHu 最近正式到班,其實我心情是忐忑的,或許到了一個全新的環境這是必然的過程。

不過我忐忑的不是需要熟悉新的人事物,而是我會的東西,到底有沒有符合公司的需求?我其實不知道我自己的能力現在到底在哪,畢竟當初在談的時候,老闆和技術長只有跟我說他們的東西比較底層,我完全是被這個吸引的,因為我就可能可以了解到單晶片到底是怎麼一回事。

我以前學的那些觀念都是用Arduino做實作,很多都是包好的東西,正所謂站在巨人的肩膀上,所以實作比較多像是疊積木,雖然聽起來好像很簡單,但事實不然,很多單晶片底下發生的事情我並不了解原因。

雖然如此,我得說上班至今我所新學的、體會的,都能證明我過去學的東西沒有白學,觀念是正確的。

第一次真正拿給客人的產品 觀念很正確,但我的實務經驗的確少得可憐,而這裡的實務經驗是指面對市場、客人需求。

同一份code應該要怎麼寫才有最好的架構?可以在面對客人各種需求時,做出最快速的調整,這可能是只有來公司上班才有辦法學習到的經驗。

我的第一個案子要做的東西其實很簡單,就是當初我剛開始接觸Arduino時,前輩給我的第一個功課——PWM控制LED燈和馬達。

「太簡單了吧!」腦袋瞬間閃過ArduinoUNO版接跳線出來,寫個簡單的PWMfunction立馬搞定! 如果真有這麼簡單,我就不用花時間再整理一篇文章了。

這次要用的MCU是松翰的SN8F5700系列相容8051,由於成本的考量而選擇了這顆MCU。

試想,如果每一片都用Arduino來做,第一,應該會嚴重虧損到公司直接倒閉;第二,只是個PWM用到Arduino未免貽笑大方;第三,Arduino功能多是增加不必要麻煩。

當初做一個創業專案的時候,估計成本時還真的用Arduino去計算,現在回想起來覺得當時的自己好天真。

難就難在,我並沒有直接對一顆MCU去做過設定的經驗,因為我根本就不了解MCU底層到底是怎麼工作的,經過技術長的解釋,我漸漸摸出整個MCU運作的輪廓,而這一切就要從datasheet開始講起了。

來Kdatasheet吧! 在這次看SN8F5701datasheet(載點)之前,我沒有完整看過任何一份datasheet(這份96頁我基本上全部看完了),之前頂多是查最大容忍電流電壓,而且通常是出問題的時候才查,因為Arduino基本上都包好,除非有跟別的板子做搭配,才會有這方面的需求。

SN8F5701的功能方塊圖(圖片來源) 看好看滿datasheet是因為我現在沒有ArduinoIDE,沒有一堆已經做好現成的library可以給我callfunction,沒有設定好的所有該有的變數。

那我該怎麼辦?事實上目前大多數的韌體嵌入式開發(單晶片),都是用Keil或 IAR(這兩個應該就是大宗了),把寫好的程式碼做compile將程式碼燒錄進MCU內。

只是個complier有什麼了不起?簡單說,這兩家compile出來的東西比較瘦(較不佔記憶體),而且支援相當多市面上常見的一些單晶片型號,而目前的公司習慣用Keil的uVision5,雖然SN8F5701並沒有送給Keil認證,還好官網可以直接載driver。

了解compile工具後,那程式碼到底要怎麼寫?如果沒有library可以callfunction,我個人推薦8051的兩本書《8051單晶片徹底研究–入門篇&基礎篇》,特色是由簡入深,循序漸進。

裡面是用組語,但還好用C就可以實作,不過就算知道C語言可以寫,那內容到底是什麼? 事實上,單晶片寫的function,底層都是一堆暫存器(register)設定出來的,如果用白話文解釋,想像裡面有很多開關,也有別的形式可以設定,用各式各樣的開關組合,排列出某個pattern,創造某些特定的function或模式。

Timer單晶片體驗分享 就舉我第一次接觸這麼底層的單晶片時遇到兩個很炫的東西來當例子吧。

Timer在我玩Arduino的時候就有遇過(我記得我ISR的文章有做相關的分享),記得UNO因為怕會造成原因不明的crash,只有Timer1可以讓開發者使用,但現在厲害了,所有操控權皆在我手。

SN8F5701有三個Timer:Timer0、Timer1還有Timer3。

基本上Timer0和Timer1是一樣的東西,表示有兩個Timer可以用,另外Timer3用來做PWM,這個下文會說明。

我這次用了Timer0,他總共有4個mode(詳見datasheet),我用了mode1–16-bitupcountingtimer,我最想分享的還是TH0和TL0的設定(因為真的被搞了一陣子)。

我要用timer0來幫我計時,定時去執行ISR(本次案件即是執行PWM)。

因為mode1是16-bit的countingtimer,需要兩個8bits來計算數字,而TH0即是所謂的high-byteregister,TL0則是low-byteregister,兩者搭配就可以做出最高65536的數值(2的16次方,即是16-bittimer的最大值)。

聽起來很簡單,up-counting表示從小算到65536,接著溢位->flag變1->interrupt(如果有開的話),但我發現每顆MCU對於這裡的設定的方式都不太一樣,光爬文就超過5種,最後終於試到一個對的。

首先,我得說這裡做實驗最快,第一,datasheet可能沒有寫得很詳細;第二,網路上的作法不一定適用(eg.TI,ARMbased,microchip都有些許差異),我實驗的結果其實很簡單,只是有個關鍵我當時沒理解。

這顆SN8F5701,以切10millisecs為例,datasheet裡面表示ftimer0=fcpu/12,如果fcpu沒有特別設定,那fcpu=fosc。

而這MCU的fosc是32MHz,所以ftimer0=32MHz/12,timer0計數(count)一次即為ftimer0的倒數(假設為變數A,單位時間),為了切10millisecs執行一次timer0的interrupt,所以0.01s(10millisecs)/A極為計數次數=26667,又因為是up-counting,所以65536–26667才是最後答案=38869。

換成hexcode得到0x97D5,那TH0(high-byte)即0x97,TL0(low-byte)即0xD5。

ThisfilecontainsbidirectionalUnicodetextthatmaybeinterpretedorcompileddifferentlythanwhatappearsbelow.Toreview,openthefileinaneditorthatrevealshiddenUnicodecharacters. LearnmoreaboutbidirectionalUnicodecharacters Showhiddencharacters #include #include voidTimer0_Init(void); voidmain(){ //initialfunctionwritedownhere,liketheone"setup"functioninArduino Timer0_Init(); // while(1){ //justlikethe"loop"functioninArduino } } voidTimer0_Init(){ TH0=0x97; TL0=0xD5; //…stilllotsofsettingbelow //somesettinghereabouttimer0interrupt } voidTimer0_ISR(void)interruptISRTimer0{ //PMWfunctionm,andotherthing } viewraw main.c hostedwith❤byGitHub 不過上述還差了一個最重要的東西,後來才想通的是datasheet裡面Timer0的mode2,8-bitUpCountingTimerwithSpecifiedReloadValueSupport,這個reload就是reload我在intialfunction裡的設定的初值,而我現在用的mode1,16-bitcountingtimer是沒有這個東西的,因此,我每進一次timer0的interruptfunction我都要重新給一次TH0和TL0值,這樣才會順利work。

p.s:文章幅度長度考量,下篇會提fosc、fcpu和PWM,還有非常非常重要的程式碼架構,待續……。

btw,回歸寫文的感覺真好。

(本文轉載於自造者萊恩,原文連結;責任編輯:周政毅) AboutLatestPostsRyanHu對於IOT軟硬整合相關有極大興趣,鍾愛無人機,目前獨自完成的專案像是瓦力號、GPS自動語音導覽系統、NTP網路自動校時時鐘,喜歡流浪。

LatestpostsbyRyanHu(seeall) 【NB-IoT】菜鳥Maker輕鬆上手DSI2598開發板-1312月,2019 【Maker電子學】ModbusoverTCP實作(上)-2811月,2019 【Maker電子學】ModbusRTU的傳輸資料格式-189月,2019 Like0 相關文章 Author:RyanHu 對於IOT軟硬整合相關有極大興趣,鍾愛無人機,目前獨自完成的專案像是瓦力號、GPS自動語音導覽系統、NTP網路自動校時時鐘,喜歡流浪。

ShareThisPostOn GoogleFacebookTwitter 發表 取消回覆 訂閱MakerPRO週報! 我們為您設計了電子報: 只需留下E-Mail,即可獲得最新的知識文章分享和第一手的活動資訊! 加入MakerPRO粉專線上課程專區近期活動none DesignedbyMakerPRO LoginIDPassword RememberMe ForgotPassword?   Login 跳至工具列 關於WordPressWordPress.org台灣繁體中文線上說明技術支援意見反應登入註冊搜尋



請為這篇文章評分?