PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 29-12-2008, 09:35 AM   #3
binhlt
Đệ tử 1 túi
 
Tham gia ngày: Dec 2006
Bài gửi: 19
:
Cảm ơn namqn tôi mới chỉ bắt đầu làm việc với PIC chừng 1 tháng nay nên còn rất nhiều điều cần phải học hỏi

1: Nói như bạn thì biết chắc là chẳng còn cách nào rồi. Những lệnh đó tôi cũng xem qua và nếu làm theo thì sẽ cần 1 bước để chuẩn bị dữ liệu (nạp vào chẳng hạn) chứ không thể chỉ bằng cách khai báo trực tiếp trong C

2: Nói như bạn nghĩa là cũng chưa có minh chứng gì cụ thể vì vậy mặc dù tôi cũng nghĩ giống bạn nhưng để chắc ăn chắc phải chỉnh lại để RAM cho còn nhiều chỗ trống hơn

3: Trang web bạn đưa giờ tôi mới biết rất cảm ơn bạn. Tôi cũng dùng bản mới nhất rồi nhưng cũng nhận thấy là yêu cầu của mình chắc nhà phát triển không đáp ứng được vì mỗi người khi sử dụng đến những hàm đó sẽ cần đến một sự chính xác khác nhau. Vì thế khi phát triển những hàm đó các nhà phát triển chỉ đi theo 1 con đường duy nhất là chính xác gần tuyệt đối và do đó hàm sin, cos, tan, ... tốn nhiều thời gian hơn những hàm tự phát triển
4: Sau 1 hồi tìm tòi tôi đã có hàm sqrt cực nhanh (tôi có chỉnh 1 chút cho phù hợp với dsPic
Code:
inline  short __attribute__((always_inline)) isqrt(unsigned long x)
{static const unsigned char sqq_table[] 
={ 0,  16,  22,  27,  32,  35,  39,  42,  45,  48,  50,  53,  55,  57,
  59,  61,  64,  65,  67,  69,  71,  73,  75,  76,  78,  80,  81,  83,
  84,  86,  87,  89,  90,  91,  93,  94,  96,  97,  98,  99, 101, 102,
 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118,
 119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132,
 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145,
 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157,
 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168,
 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178,
 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188,
 189, 189, 190, 191, 192, 192, 193, 193, 194, 195, 195, 196, 197, 197,
 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206,
 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215,
 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223,
 224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231,
 231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238,
 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246,
 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253,
 253, 254, 254, 255};

    register unsigned long xn;

    if (x >= 0x10000)
        if (x >= 0x1000000)
            if (x >= 0x10000000)
                if (x >= 0x40000000) {
                    if (x >= 65535UL*65535UL)
                        return 65535;
                    xn = sqq_table[x>>24] << 8;
                } else
                    xn = sqq_table[x>>22] << 7;
            else
                if (x >= 0x4000000)
                    xn = sqq_table[x>>20] << 6;
                else
                    xn = sqq_table[x>>18] << 5;
        else {
            if (x >= 0x100000)
                if (x >= 0x400000)
                    xn = sqq_table[x>>16] << 4;
                else
                    xn = sqq_table[x>>14] << 3;
            else
                if (x >= 0x40000)
                    xn = sqq_table[x>>12] << 2;
                else
                    xn = sqq_table[x>>10] << 1;

            goto nr1;
        }
    else
        if (x >= 0x100) {
            if (x >= 0x1000)
                if (x >= 0x4000)
                    xn = (sqq_table[x>>8] >> 0) + 1;
                else
                    xn = (sqq_table[x>>6] >> 1) + 1;
            else
                if (x >= 0x400)
                    xn = (sqq_table[x>>4] >> 2) + 1;
                else
                    xn = (sqq_table[x>>2] >> 3) + 1;

            goto adj;
        } else
            return sqq_table[x] >> 4;

	/* Run two iterations of the standard convergence formula */
    xn = (xn + 1 + __builtin_divud(x, xn)) >> 1;
nr1:
    xn = (xn + 1 + __builtin_divud(x, xn)) >> 1;
adj:
    if (__builtin_muluu(xn, xn) > x) /* Correct rounding if necessary */
       xn--;
    return xn;
}

thay đổi nội dung bởi: namqn, 11-01-2009 lúc 06:51 AM.
binhlt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 01:52 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam