PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Bit Va Byte (http://www.picvietnam.com/forum/showthread.php?t=4446)

tkpro 09-07-2009 04:47 PM

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

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 :
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

tkpro 10-07-2009 04:43 PM

Trích:

Nguyên văn bởi vagabondtt1503 (Post 27501)
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

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

Trích:

Nguyên văn bởi tkpro (Post 27510)
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 10-07-2009 11:57 PM

Trích:

Nguyên văn bởi Mr.Bi (Post 27519)
"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

Trích:

Nguyên văn bởi vagabondtt1503 (Post 27501)
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.

cskiller 11-07-2009 01:07 AM

Trích:

Nguyên văn bởi tkpro (Post 27510)
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

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


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

Trích:

Nguyên văn bởi cskiller (Post 27532)
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!

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)
Code:

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



Múi giờ GMT. Hiện tại là 10:51 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam