PDA

View Full Version : Bit Va Byte


tkpro
09-07-2009, 04:47 PM
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/showpost.php?p=27338&postcount=68

vagabondtt1503
10-07-2009, 04:51 AM
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 :

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

tkpro
10-07-2009, 04:43 PM
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 :

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/showpost.php?p=27338&postcount=68

Mr.Bi
10-07-2009, 11:28 PM
"10us đọc giá trị" thời gian đâu để PIC làm việc # nữa ta

tkpro
10-07-2009, 11:56 PM
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/showpost.php?p=27338&postcount=68

mình xin lỗi đã không để ý.

tkpro
10-07-2009, 11:57 PM
"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
10-07-2009, 11:58 PM
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 :

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.

cskiller
11-07-2009, 01:07 AM
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:

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

cskiller
11-07-2009, 01:18 AM
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:

...
#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
}
}
...

bien_van_khat
11-07-2009, 12:01 PM
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.

tkpro
17-07-2009, 11:18 AM
Bạn có thể tham khảo cách hiện thực đơn giản này:

...
#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!

LeDuc
18-07-2009, 08:29 AM
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)

unsigned int x,i;
for(i=0;i<8;i++)
{
shift_left(x,1,input(pin_B1)
delay_us(9);
}