Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
新會員
|
用sprintf不行嗎?
C30有 sprintf 阿
發表於: 2007/12/26 17:17
|
|||
|
Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
版主
|
這些都是基本的 itoa( ) 函數的功能,C18 有提供這個轉換函數,但 C30 就沒有所以要自己寫。
itoa( ) 就是將一 int 型態的 16進制的數值轉成10進制的ASCII型態的字串。所以程式裡是先除取商並取得餘數後,再將餘數加上字元 0x30 (ASCII Code = ' ' 空白鍵) 就可以轉成 0x30 ~0x39 的數字 ASCII Code 。
發表於: 2007/12/14 11:19
|
|||
|
Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
資深會員
|
提供另一個概念(先取得個位,十位,百位.....):
345 = 34*10 +5 = (3*10+4)*10+5 x = 345; temp[3] = x %10; // = 5 --個位 x = x/10; //x=34 temp[0]= x%10; // = 4 -- 十位 x=x/10; //x = 5 temp[1] = x%10; // = 5 ---百位 (如果只有三位,可以省略%10)
發表於: 2007/12/14 9:33
|
|||
|
Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
中級會員
|
太感謝了 我也正在用這方面的程式 出現一樣ㄉ問題 終於解決ㄌ
發表於: 2007/12/13 14:20
|
|||
|
Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
初級會員
|
我終於想出來啦,真的很感謝前輩,成功的顯示了^^~原來少個(),太感謝了。
發表於: 2007/12/10 4:16
|
|||
|
Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
資深會員
|
問題在這一行
Temp_Char_10 = The_Number - (Temp_Char_1000*1000 + Temp_Char_100 * 100) /10 ; //取十位數的數字 就當作考試 自己想想吧
發表於: 2007/12/10 0:34
|
|||
|
Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
初級會員
|
這是我依前輩的建議改過後的程式
-------------------------------------------------- // Subroutine to show Time on UART void Show_ADC(void) { unsigned char dummy ; unsigned int ADCValue; unsigned char TXdata[5]; ADCON1bits.SAMP = 1; // start sampling ... for ( dummy = 0 ; dummy < 4 ; dummy ++ ); ConvertADC10(); while (BusyADC10()); // conversion done? ADCValue = (ADCBUF0); // get ADC value sitoa(ADCValue, (unsigned char *)TXdata); putsUART1( (unsigned int *) "VR2 : "); putsUART1( (unsigned char *) TXdata ) ; putsUART1( (unsigned int *) "\r\n" ); } //*********************************************** // Put a unsigned byte in decimal format // to UART Module void sitoa( unsigned int The_Number, unsigned char *buff) { unsigned int Temp_Char_1000, Temp_Char_100, Temp_Char_10, Temp_Char ; unsigned char *temp = (unsigned char *) buff ; Temp_Char_1000 = The_Number /1000 ; //取千位數的數字 temp[0] = Temp_Char_1000 + '0' ; //取千位數的數字 Temp_Char_100 = (The_Number - Temp_Char_1000*1000) /100 ; //取百位數的數字 temp[1] = Temp_Char_100 + '0' ; //取百位數的數字 Temp_Char_10 = The_Number - (Temp_Char_1000*1000 + Temp_Char_100 * 100) /10 ; //取十位數的數字 temp[2] = Temp_Char_10 + '0' ; //取十位數的數字 Temp_Char = The_Number - ( Temp_Char_100*1000 + Temp_Char_100 * 100 + Temp_Char_10 * 10 ) ; //取個位數的數字 temp[3] = Temp_Char + '0' ; //取個位數的數字 temp[4] = 0 ; } ----------------------------------------------------------- 現在我執行的結果變成千位跟百位數字可正常執行,但是十位與個位數,會成亂碼,請問哪裡還不足嗎? 附上執行結果的圖檔與整個程式的筆記本 整個程式的筆記本http://www.badongo.com/file/5514707
發表於: 2007/12/9 22:08
|
|||
|
Re: 30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
資深會員
|
unsigned int TXdata[5];
-> unsigned char TXdata[5]; void sitoa( unsigned int The_Number, unsigned char *buff) { unsigned int Temp_Char_1000, Temp_Char_100, Temp_Char_10, Temp_Char ; unsigned char *temp = buff ; .... 你用 int array, 每單元是 2 bytes, TXdata 會變成 A,0x00,B,0x00,C,0x00,D,0x00,0x00,0x00; A 千位數, 所以只送到第二個 byte = NULL(0x00) 就不送了
發表於: 2007/12/9 7:28
|
|||
|
30f4011_UART傳送至電腦終端機_10位元A/D顯示問題
|
||||
---|---|---|---|---|
初級會員
|
各位好:
如同問題所示。曾百由書上範例12-1是將8位元A/D的10進制電壓值 (0~254),透過UART連上終端機顯示。我想將他改成10位元的A/D顯示出來(0-1023),於是我嘗試修改了範例中的部份程式。下面是我修改後的。 ------------------------------------------------------- // Subroutine to show Time on UART void Show_ADC(void) { unsigned char dummy ; unsigned int ADCValue; unsigned int TXdata[5]; ADCON1bits.SAMP = 1; // start sampling ... for ( dummy = 0 ; dummy < 4 ; dummy ++ ); ConvertADC10(); while (BusyADC10()); // conversion done? ADCValue = (ADCBUF0); // get ADC value sitoa(ADCValue, (unsigned int *)TXdata); putsUART1( (unsigned int *) "VR2 : "); putsUART1( (unsigned int *) TXdata ) ; putsUART1( (unsigned int *) "\r\n" ); } //*********************************************** // Put a unsigned byte in decimal format // to UART Module void sitoa( unsigned int The_Number, unsigned int *buff) { unsigned int Temp_Char_1000, Temp_Char_100, Temp_Char_10, Temp_Char ; unsigned int *temp = (unsigned int *)buff ; Temp_Char_1000 = The_Number /1000 ; //取千位數的數字 temp[0] = Temp_Char_1000 + '0' ; //取千位數的數字 Temp_Char_100 = (The_Number - Temp_Char_1000*1000) /100 ; //取百位數的數字 temp[1] = Temp_Char_100 + '0' ; //取百位數的數字 Temp_Char_10 = The_Number - (Temp_Char_1000*1000 + Temp_Char_100 * 100) /10 ; //取十位數的數字 temp[2] = Temp_Char_10 + '0' ; //取十位數的數字 Temp_Char = The_Number - ( Temp_Char_100*1000 + Temp_Char_100 * 100 + Temp_Char_10 * 10 ) ; //取個位數的數字 temp[3] = Temp_Char + '0' ; //取個位數的數字 temp[4] = 0 ; } --------------------------------------------------------- Build ALL 沒有問題,但是程式執行後,再終端機只顯示,當我可變電阻VR2轉到最低時顯示0,轉到最高時顯示1,請問是還有哪裡我沒有注意到的地方呢,以及程式有什麼問題呢。
發表於: 2007/12/9 3:38
|
|||
|