PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 09-07-2009, 04:47 PM   #1
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Bit Va Byte

cac bac cho e hoi ti.
E co 400 bien kieu int1 va e muon ghep no thanh 50 bien kieu int thi lam the nao nhi? thanks!

Bạn phải gõ có dấu, mình đã nhắc ở đây, có vẻ như bạn ko đọc:
http://www.picvietnam.com/forum/show...8&postcount=68

thay đổi nội dung bởi: bien_van_khat, 10-07-2009 lúc 05:04 PM.
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 04:51 AM   #2
vagabondtt1503
Đệ tử 2 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 33
:
Theo ý kiến của mình thì :
Nếu bạn dùng CCS thì int1 là biến 1 bit,vậy phải cần dùng 50 biến int8 (8 bit) để ghép :
Code:
int1 T[];  (T là tập hợp giá trị biến 1 bit cần ghép)
int8 k[] = {0x00,...,0x00};(K là tập hợp giá trị biến 8 bit sau khi ghép )
 
i = 0;
j = 0;
bước 1 :
       k[j] = k[j] + T[i];
       i tăng 1 đơn vị;
       k[j] = k[j] <<1;
   
nếu i < 8 quay lại bước 1;

nếu i > =8
i = 0;
j tăng 1 đơn vị
nếu j >= 8,nhảy đến END
j < 8 ,quay lại bước 1

END//kết thúc
không biết ý bạn ghép theo kiểu nào nên mình chỉ đưa ra cách ghép lần lượt như vậy
vagabondtt1503 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 04:43 PM   #3
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi vagabondtt1503 View Post
Theo ý kiến của mình thì :
Nếu bạn dùng CCS thì int1 là biến 1 bit,vậy phải cần dùng 50 biến int8 (8 bit) để ghép :
Code:
int1 T[];  (T là tập hợp giá trị biến 1 bit cần ghép)
int8 k[] = {0x00,...,0x00};(K là tập hợp giá trị biến 8 bit sau khi ghép )
 
i = 0;
j = 0;
bước 1 :
       k[j] = k[j] + T[i];
       i tăng 1 đơn vị;
       k[j] = k[j] <<1;
   
nếu i < 8 quay lại bước 1;

nếu i > =8
i = 0;
j tăng 1 đơn vị
nếu j >= 8,nhảy đến END
j < 8 ,quay lại bước 1

END//kết thúc
không biết ý bạn ghép theo kiểu nào nên mình chỉ đưa ra cách ghép lần lượt như vậy
bai toan cua minh cu the nhu sau: cu 10 us mot, doc gia tri tu mot chan cua chip (la 0 hoac 1) . Doc den 400 bit thi quay lai tu dau.sau do gui sang may tinh theo chuan RS232. chinh vi vay ma minh goi chung thanh tung byte de gui cho tien. ban thay sao?
co j mong anh e chi ju[. thanks!

Nội quy diễn đàn bắt buộc phải gõ có dấu, mình đã nhắc ở đây, có vẻ như bạn ko đọc:
http://www.picvietnam.com/forum/show...8&postcount=68

thay đổi nội dung bởi: bien_van_khat, 10-07-2009 lúc 05:04 PM.
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 11:28 PM   #4
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
"10us đọc giá trị" thời gian đâu để PIC làm việc # nữa ta
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 11:56 PM   #5
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi tkpro View Post
bai toan cua minh cu the nhu sau: cu 10 us mot, doc gia tri tu mot chan cua chip (la 0 hoac 1) . Doc den 400 bit thi quay lai tu dau.sau do gui sang may tinh theo chuan RS232. chinh vi vay ma minh goi chung thanh tung byte de gui cho tien. ban thay sao?
co j mong anh e chi ju[. thanks!

Nội quy diễn đàn bắt buộc phải gõ có dấu, mình đã nhắc ở đây, có vẻ như bạn ko đọc:
http://www.picvietnam.com/forum/show...8&postcount=68
mình xin lỗi đã không để ý.
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 11:57 PM   #6
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi Mr.Bi View Post
"10us đọc giá trị" thời gian đâu để PIC làm việc # nữa ta
mình thấy 10 us đọc giá trị vẫn ok đấy chứ. Mình đã thử rồi mà. Thậm chí 1us vẫn làm việc ok(việc đọc dữ liệu)
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 11:58 PM   #7
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi vagabondtt1503 View Post
Theo ý kiến của mình thì :
Nếu bạn dùng CCS thì int1 là biến 1 bit,vậy phải cần dùng 50 biến int8 (8 bit) để ghép :
Code:
int1 T[];  (T là tập hợp giá trị biến 1 bit cần ghép)
int8 k[] = {0x00,...,0x00};(K là tập hợp giá trị biến 8 bit sau khi ghép )
 
i = 0;
j = 0;
bước 1 :
       k[j] = k[j] + T[i];
       i tăng 1 đơn vị;
       k[j] = k[j] <<1;
   
nếu i < 8 quay lại bước 1;

nếu i > =8
i = 0;
j tăng 1 đơn vị
nếu j >= 8,nhảy đến END
j < 8 ,quay lại bước 1

END//kết thúc
không biết ý bạn ghép theo kiểu nào nên mình chỉ đưa ra cách ghép lần lượt như vậy
cách của bạn cũng hay. Về thuật toán mà nói như vậy là có thể Ok rùi.
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-07-2009, 01:07 AM   #8
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Post

Trích:
Nguyên văn bởi tkpro View Post
bai toan cua minh cu the nhu sau: cu 10 us mot, doc gia tri tu mot chan cua chip (la 0 hoac 1) . Doc den 400 bit thi quay lai tu dau.sau do gui sang may tinh theo chuan RS232. chinh vi vay ma minh goi chung thanh tung byte de gui cho tien. ban thay sao?
co j mong anh e chi ju[. thanks!
Bạn có thể tham khảo cách hiện thực đơn giản này:
Code:
...
#define   BITS_COUNT  400
int16 count=0; // Bat dau tai vi tri byte 0
int8 buff[BITS_COUNT/8];  // Dung mat 50 Bytes
....
void SetBitData(int1 value)  // Goi ham moi 10us de luu gia tri cua bit doc duoc 
{
    // Gan lan luot tung bit (13 bits cao xac dinh byte va 3 bits thap xac dinh bit)
    if(value==1) buff[count>>3]|=(1<<(count&0x07));
    else buff[count>>3]&=(~(1<<(count&0x07)));
    if(count++==BITS_COUNT){
         // Nhan du 400 bits va thuc hien truyen du lieu 50 bytes ve may tinh
         count=0;  // Reset lai ve vi tri byte 0
    }
}
...
Regards
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com

thay đổi nội dung bởi: cskiller, 11-07-2009 lúc 01:19 AM.
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-07-2009, 01:18 AM   #9
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Tôi khuyên bạn nên collect 256 bits là tối ưu nhất thay vì 400 để đảm bảo với thời gian 10us, vì với 256 bits có thể dùng 1 byte để count và việc shift bit có thời gian thực thi nhanh hơn rất nhiều:
Code:
...
#define   BITS_COUNT  256
int8 count=0; // Bat dau tai vi tri byte 0
int8 buff[BITS_COUNT/8];  // Dung mat 32 Bytes
....
void SetBitData(int1 value)  // Goi ham moi 10us de luu gia tri cua bit doc duoc 
{
    // Gan lan luot tung bit (5 bits cao xac dinh byte va 3 bits thap xac dinh bit)
    if(value==1) buff[count>>3]|=(1<<(count&0x07));
    else buff[count>>3]&=(~(1<<(count&0x07)));
    if(++count==0){
         // Nhan du 256 bits va thuc hien truyen du lieu 32 bytes ve may tinh
         // Khong can reset count ve 0 vi tu dong tran so 1 byte
    }
}
...
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com

thay đổi nội dung bởi: cskiller, 11-07-2009 lúc 02:58 PM.
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-07-2009, 12:01 PM   #10
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Cách đơn giản nhất là dùng hàm shift_right, shift_left của CCS.

Tuy nhiên lúc này bạn phải khai báo mảng chứa dữ liệu của bạn kiểu char. Do đó, số lượng bit tối đa có thể dịch phụ thuộc vào độ lớn mảng mà CCS cho phép.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-07-2009, 11:18 AM   #11
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi cskiller View Post
Bạn có thể tham khảo cách hiện thực đơn giản này:
Code:
...
#define   BITS_COUNT  400
int16 count=0; // Bat dau tai vi tri byte 0
int8 buff[BITS_COUNT/8];  // Dung mat 50 Bytes
....
void SetBitData(int1 value)  // Goi ham moi 10us de luu gia tri cua bit doc duoc 
{
    // Gan lan luot tung bit (13 bits cao xac dinh byte va 3 bits thap xac dinh bit)
    if(value==1) buff[count>>3]|=(1<<(count&0x07));
    else buff[count>>3]&=(~(1<<(count&0x07)));
    if(count++==BITS_COUNT){
         // Nhan du 400 bits va thuc hien truyen du lieu 50 bytes ve may tinh
         count=0;  // Reset lai ve vi tri byte 0
    }
}
...
Regards
Cám ơn anh! mấy hôm e không vào mạng được. bài toán của e buộc fải dùng 50 byte. Anh có thể giải thích kỹ cho e đoạn chương trình đó được kô? thú thực e vẫn còn lơ mơ lắm.thanks!
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-07-2009, 08:29 AM   #12
LeDuc
Đệ tử 6 túi
 
LeDuc's Avatar
 
Tham gia ngày: Mar 2007
Bài gửi: 150
:
Theo tôi thì thế này : mỗi 10us bạn đọc giá trị 1 lần bạn dịch bít đó vào biến x(kiểu byte) , sau 8 lần thì ghi lưu biến x đó vào byte thứ 1 , cứ thế mà tiếp tục đến byte thứ 50. Như vậy bạn chỉ tốn khoản 51 byte mà thôi . Kô cần phải khai báo mãng 400 bit đâu .
Trong CCS có hỗ trợ cho bạn 2 hàm dịch bit (shift_left và shift_right)
ví dụ : đọc 8 bit từ ngõ vào B1 (mỗi lần đọc cách nhau là 10us)
Code:
  unsigned int x,i;
  for(i=0;i<8;i++)
{
  shift_left(x,1,input(pin_B1)
  delay_us(9);
}
__________________
_________________________________________________
Le Trung Duc
Industry Research & Application Center
NTT Institute of Hi_technolog
ltduc@ntt.edu.vn
leduc_cktd@yahoo.com.vn
http://www.nttc.edu.vn
CNC DIY : http://quangcaosanpham.com/shop/driverservo
0909300332
LeDuc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


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à 05:44 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