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

論壇索引


Board index » All Posts (C_H_M)




Re: 請教C語言如何做開根號運算
#31
中級會員
中級會員


在程式前一行加上
[code]

然後在最後一行後再加上
?>
[/code]
這樣程式就不會變樣了. 可以按 "送出" 旁邊的 "預覧觀看" 看一下效果.
(我也是看了別人的文之後才知道的 !)

-----------------------------------------------------------------
反三角函數的部分我再來猜一下.
用你前一個測試程式再加上 atan.c 的函數內容.

// atan.c 中的 PI 定義
#define    PI    3.14159265358979
#define    TWO_PI    6.28318530717958
#define    HALF_PI    1.570796326794895

#include <math.h>
#include <errno.h>

double sqrt_in;
double sqrt_root;

double atan_in;
double atan_r;

unsigned char BUF;
double sqrt(double x);
/*------------------------------------------------------------------------------*/
// MAIN PROGRAM AREA
/*------------------------------------------------------------------------------*/
void main(void)
{
 
atan_in 1;
 
atan_r atan(atan_in) / PI 180;

 
sqrt_in 100;
 
sqrt_root sqrt(sqrt_in);
 if(
sqrt_root == 10)
   { 
BUF=1;
   }
 else
   { 
BUF=0;
   }
}

double
sqrt
(double x)
{
    
double    ogng;
    
short    niter;
    
int    expon;

    if(
0.0) {
        
errno EDOM;
        return 
0.0;
    }
    if(
== 0.0) {
        return 
0.0;
    }
    
og x;
    if(
og 1.0)
        
og 1.0/og;
    
og frexp(og, &expon);
    
og ldexp(ogexpon/2);        /* make an educated guess */
    
if(1.0)
        
og 1.0/og;
    
niter 20;
    do {
        
ng = (x/og og)/2.0;
        if(
ng == og)
            break;
        
og ng;
    } while(--
niter);
    return 
og;
}

// 由 atan.c 中複製而來的程式
double
atan
(double f)
{
    static const 
double    coeff_a[] =
    {
        
33.058618473989548,
        
58.655751569001961,
        
32.390974856200445,
        
5.8531952112628600,
        
0.19523741936234277,
        -
.0024346033004411264
    
};
    static const 
double    coeff_b[] =
    {
        
33.058618473992416,
        
69.675291059524653,
        
49.004348218216250,
        
12.975578862709239,
        
1.0
    
};
    
unsigned char    recip;
    
double        valval_squared;

    if((
val fabs(f)) == 0.0)
        return 
0.0;
    if(
recip = (val 1.0))
        
val 1.0/val;
    
val_squared val val;
    
val *= eval_poly(val_squaredcoeff_a5)/eval_poly(val_squaredcoeff_b4);
    if(
recip)
        
val HALF_PI val;
    return 
0.0 ? -val val;
}


其中要注意 atan() 傳回的是弧度,
要轉成一般人印象中的角度, 需要 atan() / PI * 180 這樣計算.
(式中的意思為, 結果值為幾個 PI , 而一個 PI = 180 度)

發表於: 2008/3/21 17:28
頂部


Re: 請教C語言如何做開根號運算
#32
中級會員
中級會員


我把你的程式複製下來試了一下, 得到了正確的結果.
source code 上看起來也應該是正確的.

我能給你的建議只有重新 Build All 一次看看是否會正確了.

發表於: 2008/3/20 16:25
頂部


Re: 請教C語言如何做開根號運算
#33
中級會員
中級會員


開啟 Watch 監看視窗,

選擇 sqrt_in 項目, 按滑鼠右鍵開啟選單, 點選 properties 開啟屬性視窗.
點選 Size 的項目更改為 24 bits.
相同的, 也更改 sqrt_root 的屬性成為 24 bits.

這樣應該就可以看得到正確的結果值了.

發表於: 2008/3/20 15:12
頂部


Re: 請教C語言如何做開根號運算
#34
中級會員
中級會員


監看時資料錯誤嗎!

可能是監看的資料型態選擇不正確.
PICC double 的資料型態與一般常用的 32 bits double型態是不同的,
它預設為 24 bits 的資料型態.
所以你可能需注意一下監看時的資料型態選擇是否正確.

發表於: 2008/3/20 14:45
頂部


Re: 請教C語言如何做開根號運算
#35
中級會員
中級會員


在主程式中加入 #include <math.h>,
然後把 sqrt.c 加入到你的專案中一起編譯與 link 應該就可以了.

不然也可以把 sqrt.c 的內容如以下的方式直接加入你的程式中.

[color=CC0000]// sqrt.c 中使用到的兩個 include 述敘[/color]
#include <math.h>
#include <errno.h>

double sqrt_in;
double sqrt_root;

[
color=CC0000]// 由 sqrt.c 複製來的 開平方函數[/color]
double
sqrt
(double x)
{
    
double    ogng;
    
short    niter;
    
int    expon;

    if(
0.0) {
        
errno EDOM;
        return 
0.0;
    }
    if(
== 0.0) {
        return 
0.0;
    }
    
og x;
    if(
og 1.0)
        
og 1.0/og;
    
og frexp(og, &expon);
    
og ldexp(ogexpon/2);        /* make an educated guess */
    
if(1.0)
        
og 1.0/og;
    
niter 20;
    do {
        
ng = (x/og og)/2.0;
        if(
ng == og)
            break;
        
og ng;
    } while(--
niter);
    return 
og;
}

void main()
{
 
sqrt_in 6.25;
 
sqrt_root sqrt(sqrt_in);
}


發表於: 2008/3/20 13:37
頂部


Re: 想請問一下 Reset時, 是否能設置其他腳位的準位
#36
中級會員
中級會員


印象裡是沒有這樣的功能存在(若有錯誤請多指教)。

但如果你不介意在硬體上加幾顆電阻, 大致可用以下的方法來保證 reset 時為 low 準位.
因為 pic 在 reset 時會被設置成輸入狀態,
此時 I/O 腳上為高阻抗狀態, 將需要為 low 的 I/O 腳連接一個 約 1K ~ 10K 的電阻到 Vss,
這樣便可以讓一個輸出 I/O 在 reset 時保持在 low 的準位.

發表於: 2008/3/14 17:04
頂部


Re: 可以幫我說明一下這顆 Pic 裡面的記憶體大小嗎?
#37
中級會員
中級會員


程式存在 Program Memory。

SFR 與 RAM 使用相同的位址線, 所以應該可以說是在同一個區域,
但並沒有從 Data Memory (Bytes) 8192 佔用, 所以使用者有 8K RAM可使用。

Program Memory (Bytes) 64K
Program Memory (Instructions) 22,016
這兩個都是敘述 Program Memory 的大小,
(Bytes)是指用 byte 的大小來計算有 64k,
(Instructions)則是指用 機械碼指令 來計算有 22,016 個指令。
microchip 的 PIC24F 系列, 它的 RISC 指令有 3 bytes 的長度喔!

發表於: 2008/3/14 14:34
頂部


Re: 關於F877A的AD中斷問題...
#38
中級會員
中級會員


這是因為主要程式裡沒有令 ADIF=1 的程式存在。

ADIF會被設定為1, 是因為A/D轉換工作的完成,
而你從舊程式改過來時只執行了 init_a2d();
其中並沒有設定 channel 與 ADGO = 1, 所以沒有任何 A/D 轉換被起始,
當然也就不會有 A/D 轉換完成時 ADIF 會被設定為1的動作了。

----------------------------------------------------------------------
建議修改...

將原本的 void init_a2d() 與 unsigned char read_a2d() 工作內容合併為新的 void init_a2d(),

void init_a2d(unsigned char channel){
ADCON0=0b01000000;
ADCON1=0;
ADON=1;

channel&=0x07;
ADCON0&=0xC5;
ADCON0|=(channel<<3);
ADIF=0;
ADGO=1;
}
這樣可以設定好 channel 並使 A/D轉換開始,

然後修改中斷程式內容...
void interrupt usart(void)
{
unsigned char x;
// 參考原本的 read_a2d(), 但不需設定 channel
// 所以直接從 ADRESH 讀取轉換完成的結果值
x=ADRESH;
PORTD = (8>>(x>>6));
ADIF=0;
ADGO=1;
// 最後讓 A/D 轉換再次開始, 否則就不會連續不停的轉換了
}


然後呢! 主程式會有一點點不一樣...
void main(void){

// 因為新的 init_a2d(channel) 需要一個 channel 的引數
init_a2d(1);
GIE=1;
PEIE=1;
ADIE=1;
TRISD=0xF0;
while(1)
{;}

}

發表於: 2008/3/13 9:36
頂部


Re: 請問支援 SSI 介面的料號
#39
中級會員
中級會員


參考一下 SPI 的資料吧!
說不定會適合你的使用需求。

發表於: 2008/3/13 8:25
頂部


Re: PIC24FJ128GA的PORTB無法做寫入控制
#40
中級會員
中級會員


建議你檢查一下有無設定 AD1PCFG ,
因為 PORTB 與 ANALOG INPUT 功能腳共用,
當AD1PCFG:n 被設定為 1 時, PORTB:n 才會被當作 DIGITAL I/O 操作,
這樣操作 PORTB 的 DIGITAL 功能腳位才會正常 。

發表於: 2008/3/7 14:57
頂部



« 1 2 3 (4) 5 6 7 »



:::

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... ]

教育訓練中心

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