2009年10月28日 星期三

debugger

最近程式出現了bug,可是還真是奇怪,明明就是每支副程式都測試過,可是合在一起就是有問題


我以前一直沒有用ICD3 的debugger的功能,原來這個這麼好用!


設定如下,先選好debugger工具,因為我是ICD3,所以就選ICD3嚕



compiler完後,將程式燒進ICD3,對,不是燒進MCU,因為拔掉ICD3,MCU是沒有功能的。


設定好欲觀看的變數。



使用watch,觀看變數


執行


當程式執行到斷點時,即會停止,將變數資料show在watch視窗裡。


用ICD3 debugger的好處是因為,有些功能是只有硬體debugger才有辦法的,像如果我要線上除錯ADC是否正確,這個功能就很重要,因為我的程式出錯是因為和EEPROM有關系,所以就更需要這樣的功能來幫助除錯了!


那麼我的bug到底是什麼?


哈哈!


其實就是自己的觀念不正確嚕


誰知道這段程式結束後,var2的答案是什麼嗎?


如果答對了,就代表觀念正確,如果答錯了,就有可能和我一樣,觀念錯誤!


void test(void){


int var1;


int var2;


if (var1==0) var2=0;


else if (var1==1) var2=1;


else if (var1==2) var2=2;


else var2=55; 


}


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


答案是有可能var2 是0、1、2,也有可能是55,都有可能。


我一直以為在區域變數裡面宣告的變數,初值會是0。


結果,利用debugger工具來觀看變數時,初值竟然不是0。


悶了@@


後來請教老師和學長的結果是:區域變數的初值本來就是不可掌握的,所以最好的方式都是設一下初值會比較好。


而為什麼之前在測試程式的時後並沒有出錯,是因為我習慣把副程式丟在一個程式比較精簡的地方去做測試,等到正確後,才會把這支副程式整合在一起。可能是因為這樣的關系,才讓這個bug現在才出現。


不過陰錯陽差的學到1個debugger 工具和 觀念,這樣也是不錯。


2009年10月27日 星期二

發現問題!

前幾天提到的奇怪的演算法,真的很奇怪


本來以為測試已經ok,結果沒想到真的是待確認的想法。


不過答案告訴我們,如果單純這樣做,一定會有bug。


怎麼說呢?


假設地圖為下。



假設老鼠走的路徑如藍色這條


當老鼠走到這格時,碰巧前方又有路,那麼,又把後方的路給封起來,這樣執行flood。


哈。


可想而知的是,flood一定是死在裡面得不到理想的答案!


原因是,雖然裡面2格還沒走過,可是因為藍色走過的關系


所以已經知道這是一個封閉的空間,然後又把路封住,這樣演算法就會跑到無窮迴圈內。


還好有及早發現,不然這個bug發生時的時後,就有趣了!


如何有效的做直線加速

之前在做直線加速時,是有點try&error


在做報告的時後,想到比較有效的方式


利用等加速度公式來使用


d為加速距離,a為加速度,v1為初始速度,v2為最高速。



移項後重新整理



值得注意的是,距離包含了加速和減速,所以應該把所有的距離除2,這樣才是可以加速或是減速的真正距離。


利用matlab來實現自己的想法,一個點數為9cm。


左圖是每9公分可以加到的速度,因為這支老鼠的極限是160cm。


右圖是煞車的距離,一樣也是每9cm計算一個點。



今天把這個想法寫到老鼠裡,因為是建表的關系,所以除了讓直線加速更靈活的使用外,另外就是在加速前,不需要使用加速度運動的公式重新計算煞車的距離,這樣又可以省下不少運算的時間了。


 


不過還有一個比較有趣的想法,其實都可以不用計算這些


假設最高速沒有上飽和,那麼,就只要一直做加速的動作,等到車子走到d/2的位置,進行減速的動作,這樣就可以讓直線運動做到最極限了。


我覺得這個想法也很有趣,不過我沒有選擇這個做法。給有興趣的人參考!



2009年10月26日 星期一

加速時的想法

最近因為做報告的關系,重新整理了一下資料


順便研究一下自己的程式是怎麼寫的


當一條路是直線的時後,這時後應該如何決定最高速


當初在做這個的時後,是有點try & error


不過因為做報告的時後,想到一個比較簡單且有效的管理機制


這個等我做好了再分享我怎麼做


今天和學弟在討論自走車的加減速時,又聽到一個有趣的想法


他說,當車子行徑到應該要走的距離一半時,如果還在做加速度的話,那就跳到減速度去


這樣就可以回到原本的速度


哈哈,好有趣的想法


這樣可以做到最有效的速度管理。


沒關系,先做做看我的想法,再來試試看學弟的想法好了!


 


ps:幾個星期沒有認真寫程式,奇怪的是,我好開心,哈哈,我想,這真的是我的興趣!!!


2009年10月24日 星期六

非死不可(facebook)

這個禮拜好像都沒有認真做到什麼事


不過一整個星期就這樣過了


天啊


住的地方從上個星期六就在修水電和洗衣機,洗衣機最討厭了,到今天為止還沒修好,半個月了,受不了,不過第一次把衣服拿到外面的洗衣機洗還滿有趣的,之前沒洗衣機用手洗,洗到快死掉了@@


那剩的時間都在幹嘛?


玩facebook,這東西還滿好玩的,一發不可收拾,不管是小遊戲、開心農場、開心水族箱……等等


還有看了一票的電影


哈哈


本來是要放鬆心情,沒想到愈放鬆愈累


該來收收心了,我要拒玩facebook,因為我也不想玩了!


現在的時間規劃要比以前更重要,以前是一個人過得好就好,現在就不能這樣做了!


這個學習表要學的東西很多,雖然很多,但我還是希望可以在我畢業的時後做完這些事~


一步一步來吧!


到11月底,還是先玩電腦鼠吧!


因為


老大幫我爭取了的大陸比賽,嗯,沒錯,我11/7、8、9、10要去大陸北京!


然後回來台灣沒幾天又要去日本比賽


好像11月會很忙錄!


沒關系!


老鼠,我來陪你了!


2009年10月20日 星期二

如何讓搜尋時減少迴轉的次數

上一篇有提到,奇怪的演算法


其實也沒有什麼


也只是簡單的做法,讓搜尋時盡量讓老鼠只執行直走、左轉和右轉就好。


那這樣的程式會動到很多嗎?


其實不會


只要做簡單的判斷和小技巧


就可以輕鬆搞定這個想法了


以下是我的做法


1、判斷下一格是否為ㄇ字型的牆面資訊,如果是的話,就不理會,這樣老鼠就會進入回轉了!



2、當下一格不是ㄇ字型的牆面資訊,就如同下圖一樣,補了一面不存在的牆,然後再執行演算法,不過記得演算法執行完的時後,要把這面假的牆給拆掉,不然迷宮可是會天下大亂的。


我就是利用這個想法,讓老鼠在搜尋降低回轉的機率,嗯,看起來也成功了!


因為我是使用向心法則,如果是中左、中右的話,其實就不太會有這樣的問題。


電腦鼠好玩的地方就在這裡,當想通了,要實現就很簡單


之前想了很久還是沒有著落


現在靈感來了


果然一試就成功


果然,老鼠可以有很多想法!!!


 


2009年10月14日 星期三

奇怪的演算法

之前就有想過


如何讓老鼠可以變得中右法則


可是又是朝著中心前進。


呵呵


突然想到一個不用改變演算法


就可以讓老鼠盡量不回轉的方法


也成功了


好久沒有動電腦鼠了


跑起來真的怪怪的


連灌個新版的c compiler都會讓程式現bug


真是的


太邪門了


不過這陣子應該還會再玩老鼠吧


有些想法還不錯


也挺有趣的


再接再厲!


2009年10月13日 星期二

無意間看到的2個有趣的網站

雖然之前就看過了,不過第一次看到有人把資料分享的那麼完整,連source code都有


不過要親手做一台這樣的東西,也還滿費功夫的


如果有人做成功的話,記得分享一下怎麼做


http://www.elektroda.pl/rtvforum/viewtopic.php?p=6984995


另一個電子電路的blog


裡面有很多有趣的應用


http://www.electronics-lab.com/blog/


 


如果可以將裡面的小作品都實作過一次的話,應該會很厲害!


2009年10月10日 星期六

MCU 如何判斷為何種 RESET

RESET 百百種,不過MCU如何知道自己是被那種RESET啟動的?


可以利用簡單的判斷式來決定


POR: Power-on Reset  這個就是電路上會有個RC電路,當開電的時後,就是利用這個RC電路來幫忙RESET
EXTR: Pin Reset (MCLR) 這個就是RESET的按鍵,如果按鍵被壓下,即RESET
SWR: RESET Instruction 軟體RESET,像我就常常利用RESET來決定之後的動作
WDTR: Watchdog Timer Reset   看門狗RESET,防止當機的一個不錯的機制
BOR: Brown-out Reset    電壓不足RESET,電源電量不足就會RESET
TRAPR: Trap Conflict Reset   錯誤捕捉reset
IOPR: Illegal Opcode Reset  不合法的執行碼告成的reset
UWR: Uninitialized W Register Reset  尚未定義的reset


 


只要偵測這些狀態,大概就可以把mcu做好冷開機、暖開機、熱開機的設定了


之前常常把BOR 還有LVD 搞混了,原來BOR和LVD 是2個不太類似的功能


BOR : Brown-out Reset    電壓不足即產生RESET


LVD : Low Voltage Detect 電壓不足即產生中斷


reset 偵測比較好做,LVD我現在還不太會使用,現在還不知道那裡設定有問題,如果成功了的話,再來寫BLOG了吧。


不過可以得知MCU 如何reset 也是一個不錯的課題


型態設定2

有時後因為寫了


unsigned int 或是unsigned char ,會覺得很廢時,所以有些人會重新定義


我使用的C compiler 就不錯,有做個簡單的定義檔


只要


include <Generic.h>


就可以使用宣告好的型態


裡面有些不錯用的宣告


有興趣的可以自己點開來看看


不過比較好用的就這幾個


typedef unsigned char       BYTE;               // 8-bit
typedef unsigned short int  WORD;               // 16-bit
typedef unsigned long       DWORD;              // 32-bit


typedef unsigned int        UINT;
typedef unsigned char       UINT8;              // other name for 8-bit integer
typedef unsigned short      UINT16;             // other name for 16-bit integer
typedef unsigned long       UINT32;             // other name for 32-bit integer


所以下次如果有人看到別人在使用這樣的變數型態時,別害怕,這只是重新定義而已


型態設定

這個很基本的問題


不過最近又有了新的認定


如果不注意的話,真的會讓程式出現bug


想debug也很困難


舉個例來說吧(以dsPIC 16bit  MCU為例)


long ans;


ans = 100 * 400;


ans = 100u * 400u;


ans = 100ul * 400ul ;


有誰看到這個題目,就可以很準確的看到這個答案呢?


答案在下方


 


 


 


 


 


 


 


 


 


 


 


 


 


ans = 100 * 400;


//ans=-25536;  數學上的答案應該是40000,為什麼會變成-25536,原因是因為假設沒有宣告數值的型態時,compiler會以幾bits 的MCU做compiler,以這個範例就會拿 int(16bit)來做compier,所以答案當然就是溢位嚕


ans = 100u * 400u;


//u是什麼,就是unsigned ,而當沒有明確的指出為何種型態時,也是會以compiler自行決定,而這個的例子就會宣告成 unsigned int,沒有錯,答案就會是標準的40000


ans = 100ul * 400ul ;


//ul是unsigned long,這個答案當然也不會有錯,是40000


 


這個問題很有趣,再舉個例子來說


long ans;


ans = 100 * 700;


ans = 100u * 700u;


ans = 100ul * 700ul ;


有誰看到這個題目,就可以很準確的看到這個答案呢?


答案在下方


 


 


 


 


 


 


 


 


 


 


 


 


 


ans = 100 * 700;


//ans=4464;  數學上的答案應該是70000,不過因為溢位的關系,所以答案就會有所落差


ans = 100u * 700u;


//ans=4464;  數學上的答案應該是70000,不過因為溢位的關系,所以答案就會有所落差


ans = 100ul * 700ul ;


//ul是unsigned long,這個答案當然也不會有錯,是70000


 


如果對compiler不熟的話,真的會是被整的,因為直覺看起來是不會錯的運算式子,因為不熟悉的關系才讓程式出了bug,其實這個要非常的小心


2009年10月9日 星期五

累了嗎?

好不容易比完了重要的比賽


但隨之而來的五味雜陳跟著上來


本以為比完賽會比較清鬆自在


不過似乎沒有比較清鬆,也更不自在


列了一下在比賽前堆起來的工作清單


說也奇怪


還滿多的


比較想做的是


1、ethernet→最近玩了一下,複雜度十足啊


2、瑞蕯的MCU→學弟說還在整理資料,期待他的好消息


3、找研發替代役→履歷寫好了,也放在104了,不過還沒主動找公司,因為找不到合適的


4、論文→哈,我研三了,論文還沒寫會不會太誇張了


5、USB→之前和學弟凹來了USB的實驗板,說實在的,也還沒有時間玩


6、電腦鼠→哈,充滿了五味雜陳的愛物,最近又有新想法,手又癢了


7、DSP引擎→之前都是一點一滴的在玩,不過還是希望可以再透徹一點


8、CAN bus→一個通訊協定,一樣也是沒有時間玩它


9、ARM→聽說學弟有三星的ARM可以玩,然後他又想找ST的ARM來玩,滿期待他的好消息的


10、寫書→哈,想練習自己整理資料的感覺,新奇又好玩


其他的就再說吧,一樣一樣來


說真的,如果真的都要學的話,真的會滿花時間


我的野心很大


不過想完成這些我想是有一定程度的困難


不過給自己設一個較難達成的目標


比較可以刺激自己成長的動力


2009年10月3日 星期六

整理完了

好像我的桌子是最亂的感覺


好像我的儀器佔用了別人的空間


不過似乎每次都被當箭靶攻擊


不開心


別人的旁邊都有屬於自己的空間


而我的空間除了自己的東西外,還要擺放實驗室大家不想管理的物品


不用的時後就像垃圾一樣,要用的時後就來伸手


別人的儀器也是放在桌子與桌子的中間處共用


為何被攻擊的老是我


算了,那就把東西清乾淨吧


儀器也就放我的空間上吧


自己一個人用也樂得開心


 


"學長"


最近常聽到一個名詞


我不喜歡被這樣叫


因為聽到這句話的時後


十之八九就是有事情


反正有爛的事情就叫學長


有好的事情就自己收下


人性嘛


不過我最度爛這樣的人了


這是一篇抱怨文,不想給別人看到!!!