Re: 除法小數點問題
|
||||
---|---|---|---|---|
資深會員
|
看不太懂這個問題的核心在哪裡,所以只能就我所認知的題意去解釋,錯了請見諒。
例題:10/4 = 2.5//這是不可能的因為10與4都是整數,所以除完後的值也會是整數。 有幾個方法解決: 1、直接給float: 10.0/4=2.5//為什麼4不用寫成4.0?因為只要算式裡有一個float就夠了,Compiler只要看到裡面有一個float就會把其它的值都轉成float,所以會變成10.0/4.0=2.5 2、強制轉型: int a = 10; int b = 4; float f = (float)a/(float)b; 這時f就會=2.5 參照:
發表於: 2009/10/7 10:14
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
|
以這個函式來看,這一行的寫法應該是錯的。
因為函式的原型是以字元指標為引數,但是您呼叫它時給它的卻是字元(不是字元陣列) putsLCD(RX_ARRAY[0]); 我認為應該改成 putsLCD(RX_ARRAY);//<--這樣才是對的 另外這個函式是以判斷\0為停止條件 所以您傳給這個函式必需是字串(就是字元陣列後面要加\0)而不是字元陣列,不然如果這個字元陣列都以後的記憶體空間裡都沒有\0的話,那就沒完沒了了。 參照:
發表於: 2009/10/7 9:01
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: C30 變數型別轉換問題
|
||||
---|---|---|---|---|
資深會員
|
您好,您這個問題我在去年就問過了,不過也沒有得到答案。
給您網址參考一下。 http://www.microchip.com.tw/modules/n ... t_id=22068#forumpost22068 我的總結是因為您用的是16BITS的CPU,所以才會有這個問題,如果您是在8BITS的CPU的話,就沒有這個問題了。 我在寫電腦端程式時也是遇到相同的問題,這時候我的解決方式是 unsigned int uiData1 ; unsigned int uiData2 ; unsigned char HR[64] ; unsigned char tmp[2]; tmp[0] = HR[1]; tmp[1] = HR[2]; uiData1 = *( (unsigned int *)&HR[0] ) ; //uiData2 = *( (unsigned int *)&HR[1] ) ; uiData2 = *( (unsigned int *)tmp ) ; 因為是16bits的MCU,所以陣列[]裡對單數的INDEX是會把它當成是雙數的。 例如宣告一個陣列 unsigned char a[3];//看起來會用到記憶體3bytes,但是實際上卻是4bytes 又定義一個struct typedef struct{ unsigned char a; unsigned int i; }struct_a; sizeof(a)會= 4bytes而不是3bytes 因為是16 bits MCU的關系,所以Compiler會在unsigned char a之後再放入1 byte的不用空間。 所以如果您定義了以上的struct 然後用指標的方式存取它: struct_a a; unsigned char *p = (unsigned char *)&a; a.a=0x12; a.i=0x1234; p[2] = 會等於少?(Ans 會=0x34, 而不是0x12) 所以為了防止這種錯誤,在16bits的 MCU在定義struct時要這樣做 typedef struct{ unsigned char a; unsigned char b;//雖然這個用不到 unsigned int i; }a; 這樣您在用指標的方式存取這個struct時,才不會出錯。 反正,只要是在16 bits上的MCU您就要小心記憶體都要應該成雙成對的,不可以折散它們,就算您硬要折散,Compiler還是會保留一個空間,讓記憶體都是成雙成對的。 參照:
發表於: 2009/10/2 18:17
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
|
while(1)
{ if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標 { RX_ARRAY[cnt] = RX_DATA ; UART_RX_Flag = 0;//<--要放這裡 if(cnt = 15) { LCD_Delay200usX(50) ; LCD_SetCursor( 0,1); LCD_PutChar(RX_ARRAY[0]) ; putsLCD(RX_ARRAY[0]) ;<--這一行Compile能過哦? LCD_Delay200usX(300) ; cnt = 0 ; } else { cnt++; //UART_RX_Flag = 0;<--不應該放這裡 } } } PS.字串是一種字元陣列,但是字元陣列不一定是字串,我不知道putsLCD()這個函式是怎麼寫的,但是您要注意一下…RX_ARRAY[]是否有'\0'
發表於: 2009/10/2 17:26
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: Uart疑問
|
||||
---|---|---|---|---|
資深會員
|
看您bcb的程式,一開起來看不到有Timer大概就知道有問題了,依您程式的寫法,您在按下Send Button後,所做的事是
開Comm->傳資料出去->接收資料。 看起來流程都對,但是您乎略了一點,您可能以為送到MCU端的資料"馬上"就可以接收到? 因為您從開啟到傳送到接收資料都是在按下Send後就"幾乎"是同一時間完成的,您還沒有考慮到UART的傳輸時間、MCU的處理時間等等....所以"接收"不到資料是正常的。因為資料是在您完成接收的動作後不知道過了多久才跚跚來遲的。 建議您的做法應該是將 1、開Comm 2、傳送 3、接收 4、關閉Comm 這四個分開寫。 1、先將Comm打開(您可以做一個Open Comm的Button) 2、然後開始在Timer裡輪詢您所開啟的Comm是否有資料進來。 3、再按Send來做送資料。(Send Button) 4、Close Button 用Timer來輪詢是給新手或是資料量不大的情況下用的。 最好還是用Thread的方式來寫,不過這就難了… 加油了…
發表於: 2009/7/16 11:47
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: 請問C編譯器是否會將 char 預設視為 unsigned char
|
||||
---|---|---|---|---|
資深會員
|
正確答案應該要去看Compiler的手冊,因為Hitech PICC18預設的char就是unsigned char ,這是沒錯的,因為我有確認過,而且MPLAB裡也有這個選項(預設是不選取的)。
因為這個例子,所以我如果要真正用到有正負號的char的話,都會加上signed char,這是最保險的。 另外建議還是要做正確的宣告,一來可以防止程式在移植時(使用不同的compiler時)出問題,再來,也可以方便其他人看懂您的程式。 Attach file: (0.00 KB)
發表於: 2008/12/25 0:22
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
資深會員
|
假設您的頻率真的是48MHz,那麼套用您的公式
BRGVAL = (F_OSC/16/(BAUDRATE + 1)) = 48000000 / 16 / 9601 = 312 大於1 Bytes 255了 看一下Datasheet裡有關"BRGH"的設定 參照:
發表於: 2008/12/2 1:14
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: 程式碼一問,為何編譯過不了??
|
||||
---|---|---|---|---|
資深會員
|
這是我在猜想啦,因為Microchip的Compiler一直都有更新,而已經出版的舊的Source Code(可能是幾年前的),那時候用的.h檔是用舊的Compiler,所以就用舊格式的.h檔,而您因為用新版本的Compiler,所以會用到新的格式,這就會出問題了。不過問題不太大,通常新舊.h檔最大的不同就是定義的名稱不同而已。
像您的這個例子"OC1CON" 加上一個"1"就好了,很多例子都是這樣的 因為Microchip越來越強,也越來越超值,以前舊的MCU可能只有一個OC模組,所以它不用加上"1",但是現在的MCU動不動就兩三個,甚至幾十個相同功能的模組,這時候就必需用 OC1CON1 ~ OC1CONx 來分類,所以比較新的.h檔都會有編號,或許在小型的MCU雖然只有一個OC,但是較新的.h檔仍然會用OC1CON1來定義,因為這樣整体性看起來會比較好一些,可移植性也較高一些。 雖然我們可以從Microchip上抓很多Source Code來用,但是要一次就編譯過關真的要靠運氣的,有時候就需要像您這次一樣,修改一下Source Code來符合需求(不要改.h檔)。 以上是我自己的判斷,因為我用Microchip的Source Code也遇到相同的問題,如果您對Microchip有興趣的話(或是剛起步),我建議您不僅可以從Source Code著手,有空也可以看一下Compiler附的.h檔,裡面的料很多。
發表於: 2008/11/7 9:51
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: c30 陣列與強制轉型及指標的問題
|
||||
---|---|---|---|---|
資深會員
|
您的例子是用負數,這樣把資料折開太為難我了,所以我再另外出一個列提,您再幫我左看右看一下,是不是像您說的一樣
"只是把unsigned char變成unsigned int的格式。High byte補0。" unsigned char data[4] = {0x12, 0x34, 0x56, 0x78}; unsigned char d = 0x55; unsigned char c = 0xaa; unsigned char e = 0x55; unsigned int a, b; a = *(unsigned int *)&data[0]; a = *(unsigned int *)&data[1]; a = *(unsigned int *)&data[2]; b = *(unsigned int *)&c;//真的會High byte補0?(我是把位址的資料型態強制轉型,而不是單純吧資料型態強制轉型哦!!) a = (unsigned int)data[1];//您說的狀況應該是這個"High byte補0。" ps.我這些動作都是在16bits的MCU上測試的,因為8bitsMCU沒有這個問題。(或許是Compiler需要做設定吧,不知道有沒有人有類似的問題,而且有解答的呢?謝謝)
發表於: 2008/11/7 9:27
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|