2010年6月30日 星期三

忙碌的六月

這星期真的是忙碌到不行


因為住在外面的房子,合約到期了,所以要搬回板橋的家@@


騎車搬家= =,好累


還好之前已經有陸陸續續的搬東西回家了


今天還把學校跑了好幾遍


主要是辦理離校手續



我集滿印章了


不過我明天才會去換畢業証書吧


這是我的論文的聯結,給有興趣的人參考吧


電腦鼠的設計與實作



ps:今天收到女朋友寫給我的畢業賀卡,開心!!!


當然,內容只有我可以看



2010年6月25日 星期五

程式世界的博大精深

剛從國外回來


頭還有點昏昏的


所以看一點比較可以養神的文章


 


原來


程式的世界是可以很有效率且有趣的


如果design pattern 可以規劃得好


如果註解可以有doxygon 一樣方便理解


如果寫程式可以和source insight 一樣容易閱讀和撰寫


那麼


一個程式的維護和開發就可以如虎添翼了


 


有這樣的感觸的原因是:


1、以前的程式只管功能正確就好


2、以前的程式註解只管自己看得懂就好


3、以前的程式流程圖都在腦子裡,想改什麼,就改什麼


 


未來寫程式給自己勉勵要養成好的習慣


1、先規劃好design pattern


2、程式寫得愈容易懂愈好


3、註解要清楚


4、善用工具


 


 


By the way: 我當兵的梯次終於公佈了,830,太好了,第一志願


 


2010年6月19日 星期六

PWM的解析度

今天學弟問了我一個有趣的問題


我拿的pic18F4550 的PWM範例


原本是這樣


OpenPWM1(150);   //頻率20K
CCPR2L=75; //Dutycycle 50%


可是如果使用到


#include <pwm.h>      


寫好的指令後


SetDCPWM1(75*4); 


程式要這樣設定,才會dutycycle 才會變成50%



重新看了一下pic18f4550的datasheet才發現


原來,PIC18F系列 在PWM的模式下,dutycycle會提升4倍的解析度


好厲害的做法


不過可惜的是,我不是很清楚真正提升解析度的做法


雖然我之前用的dsPIC30F 系列 的MCPWM 會提升2倍的解析度


但dsPIC30F寫的就比較清楚了


原來一個簡單的PWM,裡面就有很多有趣的想法和技術在裡面了


 


2010年6月17日 星期四

學習當PM

最近試著調試自己的心情


學習一個做管理者的心態


雖然大部分的時間還是在學習技術


看了一篇很有趣的文章其中一段內容是這樣:


如果船長不懂得怎麼操舵,看不懂海圖,船員還會聽船長的嗎?

我不知道,按照那位朋友的說法,或許可以幫船長找個顧問,還是找個team leader吧


 


新光的比賽其實是一個滿大的工程


沒錯


我一個人當然沒有辦法完成


所以這是一個需要team work的比賽


如果當其中有螺絲鬆了


早晚會出問題的


為了讓這個螺絲的問題可以解決


約好大家的時間


明天集合大家要討論新光的比賽


 


 


ps:


如果當初的好意變成是互相推責任,那應該不是我樂見的。


雖然我也給自己留了一條退路,但這樣好嗎?


 


2010年6月16日 星期三

好用的註解程式

之前在學stm32的時候,發現他的註解都很特別


今天花時間看了一下到底為什麼要用這麼奇怪的註解


原來他是使用Doxygen 的註解程式


一開始的時候,我還不是很懂有什麼功能


當我去網路上找到這個程式的介紹後,似乎慢慢的了解了


改了一下範例


/**
  ******************************************************************************
  * @file  mac.c
  * @author  DoubleTime
  * @version  V3.0.0
  * @date  2010/06/16
  * @brief  This file Doxygen test
  ******************************************************************************
  * @copy
  *
  *
  *
  *
  *
  *
  *
  *
  *


© COPYRIGHT DoubleTime


  */



    /**
     * teset
     *
     * @param a   a is parameter 1
     * @param b   b is parameter 2
     *
     * @return a+b
     */



int teset(int a, int b){


 return a+b;
}
int kkk;
int main(void){
 kkk=teset(4,5);
 while(1);
}


 


執行完Doxygen後,變成網頁式的程式瀏覽,好漂亮,只要副程上有註解的地方,就可以用滑鼠直接點過去觀看註解,超棒的!



Doxygen 也會把屬於它的註解程式刪除,在觀看程式的時候,乾淨利落



ps:不過短時間,我應該不會花太多時間做這樣程式的註解吧!


一些PIC18F4550 USB的測試

最近在做的USB測試,Microchip給了韌體和軟體端的範例,所以在學習的過程中也算是順利


這是利用USB HID的類別,每1ms 傳64byte 給電腦端,理想上最大傳輸率應該為1ms*64byte=64Kbyte/s


不過實際在用的時候,每3ms 才會送出2筆,導至平均速率約為64kB/S*2/3=42KB/S


由USB分析儀看到的結果,也是如此,至於為何如,我也很想知道



圖中的50kB/S 是介面最高50KB/S,而不是傳輸速率,我當初一直被騙= =


這是利用USB CDC的類別,模擬RS232,本來我以為可以破100KB/S ,不過只有約62KB/S。


雖然比RS232的速率還快,但似乎也不是很理想,還要再研究看看


圖中的100kB/S 是介面最高100KB/S,而不是傳輸速率


早上看到PIC18F4550有提供Eye pattern的測試


就找了一下暫存器的設定


UCFGbits.UTEYE=1;


就可以玩USB的eye pattern,不過後來才發現,實驗室的示波器沒有這樣的功能



 


PS:


這次接觸VC++,真的是…… 有難到


或許先把USB放著一陣子好了,先練視窗介面程式好了。不然太多基礎不會了


題外話:


新光保全機器人很久沒玩了


2010年6月15日 星期二

搞笑了

昨天滿腦子的USB的,結果早上5點就起床了orz


一大早的就看了好幾個USB資料,早上果然吸收能力比較強,把一些之前看不懂的,搞懂了


所以今天很早就去學校寫程式了


研究了一下PIC18F4550 USB的stack後,發現寫得很……不是很好懂(或許是我USB的SPEC沒有搞懂),不過大概知道在做什麼


後來想到還有CDC類別的範例程式


所以就又先放下手邊HID的工作,先玩USB的CDC類別


結果,就把範例程式Compiler 燒進去,結果一直抓不到driver


問了李老師,他說他以前用過,沒問題,本來中午吃飽飯要幫我試看看範例的


忘了聊了什麼,結果發現,因為實驗板是李老師設計的,雖然和實驗板相同,但是Crystal不一樣


結果程式改了一下設定,就成功了@@


早上太早起來,頭昏昏的,忘了要改設定,金歹勢


 


後來研究了一下


利用CDC類別,可以傳到60KB/S


而利用HID類別,可以傳到40KB/S


嗯,至少都比RS232來得快多了(10KB/S),不過就整體而言,其實不是很理想,因為USB滿載可以跑到1MB /S才對


 


 


PS:看起來我還是需要學習VC++,範例程式看起來好寞生


2010年6月14日 星期一

跳Tone

最近因為新光保全機器人遇到了一些瓶頸,不管是人或者是製作上的問題


好吧,除了放鬆心情外,在一次偶然的機會,和李老師聊天


嗯,決定往低階的PIC18走,因為範例夠多,學起來比較快


剛好李老師有開課,PIC18F4550,就和旁邊的學弟凹了一塊實驗板,借了一台ICD2,嗯,沒錯,是ICD2,因為我的ICD3借學弟了


不過看了看PIC18F4550,說難用,還挺難用的,說好用,還挺好用的


現在,不方便說太主觀的話


但是對一個學習者的角度來看


學習至上!!!


很快,沒幾天的功夫


我現在可以改USB的HID之韌體(C)和軟體(VC++)的程式了


CCC


改天有空再貼上我在做什麼實驗好了



 


2010年6月5日 星期六

除錯的技巧

常常寫程式都需要除錯


可是當不需要除錯的時候


要把每一行除錯的程式都註解掉(節省code size 和 提升執行速度)


這樣超級麻煩的


我以前常常這樣做


很累,很辛苦


最近學了一招不錯用的debug方式


只要設定define,就讓程式可以原封不動的做調整


 


#include <stdio.h>



typedef  unsigned char u8;



#define DEBUG


void assert_failed(u8* file, int line,int expr);
#ifdef DEBUG
 #define assert_param(expr) ((expr) ? assert_failed((u8 *)__FILE__, __LINE__,(expr)) : (void)0)
 /*******************************************************************************
 * Function Name : assert_failed
 * Description : Reports the name of the source file and the source line number
 * where the assert_param error has occurred.
 * Input : - file: pointer to the source file name
 * - line: assert_param error line source number
 * Output : None
 * Return : None
 *******************************************************************************/
 void assert_failed(u8* file, int line,int expr){
  printf("Wrong parameters value: file %s on line %d\r\n", file, line);
  printf("data: %d\r\n", expr);
 }
#else
 #define assert_param(expr) ((void)0)
#endif/* DEBUG */



int main(void){


 assert_param(66);
 while(1);
}


 


程式只要有定義


#define DEBUG 的話,那麼就會列印資料出來


如果沒有的話,compiler就會呼略這行程式


題外話


上面的這個程式是會有bug的


當assert_param(0) 時,這樣就不會送出0,而是呼略掉這個指令


就留點作業給大家做看看吧


可以利用這樣的想法,規劃自己的debug程式


ps:有效率的管理自己的程式真的非常的重要