• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::

論壇索引


Board index » All Posts (biko)




Re: EEPROM最大值問題
資深會員
資深會員


假設這顆EEP有256 BYTES(我沒看Datasheet所以不知道容量)

又假設您已經寫好將值寫入/讀出EEP的函式如下:
extern void eep_write(unsigned char addr, unsigned char *data, unsigned int data_len);
extern void eep_read(unsigned char addr, unsigned char *data, unsigned int data_len);

其中 addr:要寫入/讀出資料的位址
*data:存放寫入/讀出資料的空間
len:要寫入/讀出的資料長度

假設您要存的資料有:

unsigned long long_data;//4bytes
unsigned int int_data;//2bytes
unsigned char byte_data;//1bytes
float float_data;//2bytes

eep 的規畫是:

addr 0 ~ 3存long_data
addr 4 ~ 5存int_data
addr 6 ~ 9存float_data
addr 10 存byte_data

將資料存入:
eep_write(0, (unsigned char *)&long_data, sizeof(long));
eep_write(4, (unsigned char *)&int_data, sizeof(int));
eep_write(6, (unsigned char *)&float_data, sizeof(float));
eep_write(10, &char_data, 1);

將資料讀出:
eep_read(0, (unsigned char *)&long_data, sizeof(long));
eep_read(4, (unsigned char *)&int_data, sizeof(int));
eep_read(6, (unsigned char *)&float_data, sizeof(float));
eep_read(10, &char_data, 1);

綜合以上,其實跟eep的最小儲存單位(byte)是沒關系的。我記得Microchip有的eep的最小儲存單位是2bytes,其實用法也差不多,重要的還是您怎麼去規畫。

例如以最小單位為1byte的eep來說,您可以將一個您定義的整個struct直接寫入到eep裡(只要eep容量夠)

//定義
typedef struct{
unsigned long a;
unsigned char b;
float c;
double d;
}struct_a;

//宣告
struct_a a;

eep_write(0, (unsigned char *)&a, sizeof(struct_a));//這樣就可以直接將全部的值寫到eep裡了,根本不需要去煩惱資料型態的問題。




參照:

jnmoonwind 寫道:
25LC160A看DATE SHEET 為8 bit是否最大值只能255值

有辦法,可以存更大嗎?

是有想說過要用除的再乘回去但除法都只能留商值

是否有辦法能存到更大值呢?謝謝

發表於: 2009/10/7 10:30
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已…
解決問題最重要,.....
頂部


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



參照:

jnmoonwind 寫道:
想請問一下
我們需要用到除法
但MPLAB除法只會留下商數
是否有辦法連小數一起留下呢?
謝謝

例:10/4=2.5
有辦法讓2.5顯示出來嗎?

謝謝

發表於: 2009/10/7 10:14
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已…
解決問題最重要,.....
頂部


Re: 請教GPS To Uart Receive By PIC24F
資深會員
資深會員


以這個函式來看,這一行的寫法應該是錯的。
因為函式的原型是以字元指標為引數,但是您呼叫它時給它的卻是字元(不是字元陣列)
putsLCD(RX_ARRAY[0]);
我認為應該改成
putsLCD(RX_ARRAY);//<--這樣才是對的
另外這個函式是以判斷\0為停止條件
所以您傳給這個函式必需是字串(就是字元陣列後面要加\0)而不是字元陣列,不然如果這個字元陣列都以後的記憶體空間裡都沒有\0的話,那就沒完沒了了。

參照:

黃金葛 寫道:
TO : biko兄
很感謝妳回覆我的問題!!
putsLCD(RX_ARRAY[0]) ;<--這一行Compile可以過!!
putsLCD()函式
void putsLCD(unsigned char *TheString)
{
while( *TheString != 0x00 )
{
while ( LCD_IsBusy()) ;
LCD_PutChar(*TheString++ ) ;
}
}

發表於: 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還是會保留一個空間,讓記憶體都是成雙成對的。







參照:

austin1211 寫道:
請教線上先進,
我的程式碼在使用取得 uiData2 會發生位址錯誤中斷

unsigned int uiData1 ;
unsigned int uiData2 ;

unsigned char HR[64] ;


uiData1 = *( (unsigned int *)&HR[0] ) ;
uiData2 = *( (unsigned int *)&HR[1] ) ;

請教要如何修改

發表於: 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:



jpg  (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"的設定



參照:

test838 寫道:
不, 很抱歉, 可能我沒寫清楚, 如同我寫的, 我 48 也試過了

>我的外部是 12MHz, 我試過48, 8, 6, ....等頻率. 皆無法運作
> #define F_OSC 48000000

發表於: 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
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已…
解決問題最重要,.....
頂部



« 1 ... 84 85 86 (87) 88 89 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------