Tôi chưa tìm ra cách nào hay về việc kiểm tra trong một thanh ghi 8 bit/16 bit có số bit 1/0 là chẵn hay lẻ. vd:01110010 > số bit 1 là 4 ( chẵn)... bằng asm. Không biết ai có cách gì hay không, xin chỉ giáo.
Thông báo
Collapse
No announcement yet.
Hỏi về cách đếm bit chẵn, lẻ.
Collapse
X
-
Nguyên văn bởi avr Xem bài viếtTôi chưa tìm ra cách nào hay về việc kiểm tra trong một thanh ghi 8 bit/16 bit có số bit 1/0 là chẵn hay lẻ. vd:01110010 > số bit 1 là 4 ( chẵn)... bằng asm. Không biết ai có cách gì hay không, xin chỉ giáo.
dễ ụi vậy mà không nghĩ ra à.Mãi đi tìm vàng.
-
Nguyên văn bởi KVLV Xem bài viếtbạn chỉ cần kiểm tra bit 0, nếu bit0=0 là số chẳn (even), nếu bít 0=1 thì là lẽ (odd).
dễ ụi vậy mà không nghĩ ra à.
Nguyên văn bởi avr Xem bài viếtTôi chưa tìm ra cách nào hay về việc kiểm tra trong một thanh ghi 8 bit/16 bit có số bit 1/0 là chẵn hay lẻ. vd:01110010 > số bit 1 là 4 ( chẵn)... bằng asm. Không biết ai có cách gì hay không, xin chỉ giáo.
Nhưng bạn dùng tiêu chí nào để gọi là Cách hay???
Thường thì dân lập trình quan tâm tới 3 tiêu chí:
- Chương trình gọn gàng, dễ đọc dễ kiểm soát.
- Thực thi nhiệm vụ nhanh.
- Tiết kiệm tài nguyên phần cứng (ROM, RAM...)
Tiếc là 3 tiêu chí này ít khi đạt được cùng lúc.Hôm nay trời nắng chang chang.
Mèo con đi học chẳng mang thứ gì.
Chỉ mang một cái bút chì.
Và mang một mẩu bánh mì con con.
Comment
-
Nguyên văn bởi KVLV Xem bài viếtbạn chỉ cần kiểm tra bit 0, nếu bit0=0 là số chẳn (even), nếu bít 0=1 thì là lẽ (odd).
dễ ụi vậy mà không nghĩ ra à.
Vd: trong r16 đang lưu số 17 (thập phân). Kiểm tra thế nào với asm vì nó cũng hạn chế với các phép toán.
Comment
-
Nguyên văn bởi Acxen_lupine Xem bài viếtBạn ấy hỏi về việc đếm số bít 1 hoặc 0 trong 1 thanh ghi mà... Có phải kiểm tra giá trị thanh ghi là chẵn hay lẻ đâu.
Cách thì rõ ràng là có nhiều cách.
Nhưng bạn dùng tiêu chí nào để gọi là Cách hay???
Thường thì dân lập trình quan tâm tới 3 tiêu chí:
- Chương trình gọn gàng, dễ đọc dễ kiểm soát.
- Thực thi nhiệm vụ nhanh.
- Tiết kiệm tài nguyên phần cứng (ROM, RAM...)
Tiếc là 3 tiêu chí này ít khi đạt được cùng lúc.
Comment
-
cách hay thì cũng không biết... mà asm thì càng chẳng muốn nghĩ
ở đây mình có 1 cái test thử trên 89... 1 đoạn code = C ( bác xem tự hiểu )
bài toán của mình : cho 1 biến ( gọi là number ) ... đếm số 1 trong đó ... nếu được kết quả 2,4,6,8 ( chẵn ) thì bộ đệm buff=0; ( chẵn ) và buff=1; ( lẻ ) ... Mình để nguyên view asm !
Code:_main: MOV SP+0, #128 ;89c51_test.c,3 :: void main() ;89c51_test.c,6 :: cnt=0; MOV _cnt+0, #0 ;89c51_test.c,7 :: for(i=0;i<8;i++) MOV _i+0, #0 L_main0: CLR C MOV A, _i+0 SUBB A, #8 JNC L_main1 ;89c51_test.c,9 :: if((number & 0x80)==0x80)cnt++; MOV A, _number+0 ANL A, #128 MOV R1, A XRL A, #128 JNZ L_main3 INC _cnt+0 L_main3: ;89c51_test.c,10 :: number= number<<1; MOV R0, #1 MOV A, _number+0 INC R0 SJMP L__main9 L__main10: CLR C RLC A L__main9: DJNZ R0, L__main10 MOV _number+0, A ;89c51_test.c,7 :: for(i=0;i<8;i++) INC _i+0 ;89c51_test.c,11 :: } SJMP L_main0 L_main1: ;89c51_test.c,12 :: if((cnt==2)||(cnt==4) || (cnt==6) || (cnt==8))buff=0; // chan MOV A, _cnt+0 XRL A, #2 JZ L__main8 MOV A, _cnt+0 XRL A, #4 JZ L__main8 MOV A, _cnt+0 XRL A, #6 JZ L__main8 MOV A, _cnt+0 XRL A, #8 JZ L__main8 SJMP L_main6 L__main8: MOV _buff+0, #0 SJMP L_main7 L_main6: ;89c51_test.c,13 :: else buff=1; // le MOV _buff+0, #1 L_main7: ;89c51_test.c,16 :: } SJMP #254 ; end of _main
Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
cũng bài tương tự nhưng với AVR ... có tác động R16, R27
Code:_main: LDI R27, 255 OUT SPL+0, R27 LDI R27, 0 OUT SPL+1, R27 ;MyProject.c,3 :: void main() ;MyProject.c,6 :: cnt=0; LDI R27, 0 STS _cnt+0, R27 ;MyProject.c,7 :: for(i=0;i<8;i++) LDI R27, 0 STS _i+0, R27 L_main0: LDS R16, _i+0 CPI R16, 8 BRLO L__main14 JMP L_main1 L__main14: ;MyProject.c,9 :: if((number & 0x80)==0x80)cnt++; LDS R16, _number+0 ANDI R16, 128 CPI R16, 128 BREQ L__main15 JMP L_main3 L__main15: LDS R16, _cnt+0 SUBI R16, 255 STS _cnt+0, R16 L_main3: ;MyProject.c,10 :: number= number<<1; LDS R16, _number+0 LSL R16 STS _number+0, R16 ;MyProject.c,7 :: for(i=0;i<8;i++) LDS R16, _i+0 SUBI R16, 255 STS _i+0, R16 ;MyProject.c,11 :: } JMP L_main0 L_main1: ;MyProject.c,12 :: if((cnt==2)||(cnt==4) || (cnt==6) || (cnt==8))buff=0; // chan LDS R16, _cnt+0 CPI R16, 2 BRNE L__main16 JMP L__main12 L__main16: LDS R16, _cnt+0 CPI R16, 4 BRNE L__main17 JMP L__main11 L__main17: LDS R16, _cnt+0 CPI R16, 6 BRNE L__main18 JMP L__main10 L__main18: LDS R16, _cnt+0 CPI R16, 8 BRNE L__main19 JMP L__main9 L__main19: JMP L_main6 L__main12: L__main11: L__main10: L__main9: LDI R27, 0 STS _buff+0, R27 JMP L_main7 L_main6: ;MyProject.c,13 :: else buff=1; // le LDI R27, 1 STS _buff+0, R27 L_main7: ;MyProject.c,16 :: } L_end_main: L__main_end_loop: JMP L__main_end_loop ; end of _main
Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
Nguyên văn bởi avr Xem bài viếtAnh đang nói về việc kiểm tra một số lưu trong thanh ghi là chẵn/lẻ cũng được vì nó cũng là cách làm cho cái kia, nhưng anh nói rõ hơn được không?
Vd: trong r16 đang lưu số 17 (thập phân). Kiểm tra thế nào với asm vì nó cũng hạn chế với các phép toán.
cách của tôi thì dùng luật toán rotate bit left hoặc rotate bit right, kiểm tra carry bit (CY). trong loop kiểm tra CY đếm xem bao nhiêu CY=1, bao nhiêu CY=0, nếu số đếm có bit0=0 thì chẳn, bit0=1 thì là lẽ . nếu 8 bit thì rotate 8x, 16 bit thì rotate 16x.
à cái này là áp dụng cho asm. tôi không học AVR nên không biết dùng lệnh nào, tôi gợi ý, bạn viết code nha.Mãi đi tìm vàng.
Comment
-
Nguyên văn bởi queduong Xem bài viếtcách hay thì cũng không biết... mà asm thì càng chẳng muốn nghĩ
ở đây mình có 1 cái test thử trên 89... 1 đoạn code = C ( bác xem tự hiểu )
bài toán của mình : cho 1 biến ( gọi là number ) ... đếm số 1 trong đó ... nếu được kết quả 2,4,6,8 ( chẵn ) thì bộ đệm buff=0; ( chẵn ) và buff=1; ( lẻ ) ... Mình để nguyên view asm !
Code:_main: MOV SP+0, #128 ;89c51_test.c,3 :: void main() ;89c51_test.c,6 :: cnt=0; MOV _cnt+0, #0 ;89c51_test.c,7 :: for(i=0;i<8;i++) MOV _i+0, #0 L_main0: CLR C MOV A, _i+0 SUBB A, #8 JNC L_main1 ;89c51_test.c,9 :: if((number & 0x80)==0x80)cnt++; MOV A, _number+0 ANL A, #128 MOV R1, A XRL A, #128 JNZ L_main3 INC _cnt+0 L_main3: ;89c51_test.c,10 :: number= number<<1; MOV R0, #1 MOV A, _number+0 INC R0 SJMP L__main9 L__main10: CLR C RLC A L__main9: DJNZ R0, L__main10 MOV _number+0, A ;89c51_test.c,7 :: for(i=0;i<8;i++) INC _i+0 ;89c51_test.c,11 :: } SJMP L_main0 L_main1: ;89c51_test.c,12 :: if((cnt==2)||(cnt==4) || (cnt==6) || (cnt==8))buff=0; // chan MOV A, _cnt+0 XRL A, #2 JZ L__main8 MOV A, _cnt+0 XRL A, #4 JZ L__main8 MOV A, _cnt+0 XRL A, #6 JZ L__main8 MOV A, _cnt+0 XRL A, #8 JZ L__main8 SJMP L_main6 L__main8: MOV _buff+0, #0 SJMP L_main7 L_main6: ;89c51_test.c,13 :: else buff=1; // le MOV _buff+0, #1 L_main7: ;89c51_test.c,16 :: } SJMP #254 ; end of _main
Giả sử bạn có một byte dữ liệu cần kiểm tra dữ liệu cần kiểm tra chứa trong thanh ghi trong R0
Bạn chỉ cần MOV nó vào thanh ghi A bằng lệnh
Code:MOV A, R0
Khi đã có party lẻ rùi mà muốn sử dụng Party chẵn thì bác lại thực hiện 2 lện sau
Code:MOV C,P //Chuyển Bit party vào cờ nhớ C CPL C // Đảo ngược cờ nhớ C
Vậy với 1 byte dữ liệu:
--1 lệnh ta sẽ có được party lẻ
--3 lệnh ta sẽ có được party chẵn
Với 2 byte dữ liệu( 16bit) thì làm thế nào??: ta đặc các trường hợp như sau
16 bit có party là chẵn
16 bit có party là lẻ
TRường hợp 1: 16bit có party chẵn
các khả năng xảy ra : Mỗi byte có trong 2 byte đều đồng thời có party chẵn, hoặc mỗi byte trong 2 byte đó đều có 1 party lẻ
Trường hợp 2: 16bit có party lẻ
Chỉ có 1 khả năng duy nhất xảy ra là 1 trong 2 byte đó là party lẻ, byte còn lại là party chẵn
Như vậy: Ta có thể thực hiện phép XOR để thực hiện phép tính với 16bit
Bước 1: Thực hiện party 8 bit vói byte cao ta được bit party là PH
Bước 2: Thực hiện party 8 bit với byte thấp ta được bit party là PL
Bước 3: Thực hiên XOR với PH và PL ta thu được Party 16bit
Chú ý: Cách này thực hiện với 8051 nhé
Comment
-
Nguyên văn bởi KVLV Xem bài viếttôi xem lại câu hỏi đầu tiên của bạn, giờ mới hiểu bạn hỏi gì.
cách của tôi thì dùng luật toán rotate bit left hoặc rotate bit right, kiểm tra carry bit (CY). trong loop kiểm tra CY đếm xem bao nhiêu CY=1, bao nhiêu CY=0, nếu số đếm có bit0=0 thì chẳn, bit0=1 thì là lẽ . nếu 8 bit thì rotate 8x, 16 bit thì rotate 16x.
à cái này là áp dụng cho asm. tôi không học AVR nên không biết dùng lệnh nào, tôi gợi ý, bạn viết code nha.
Theo mình thì không cần đếm: Chỉ cần quay qua cờ nhớ 8 hoặc 16 lần thôi. Nếu như R16 của bạn đang lưu cái số bạn cần kiểm tra. ban đầu bạn gán thanh ghi R1 bằng 0 nếu như bạn muốn tính party lẻ
Quay qua cờ nhớ. Cứ khi nào cờ nhớ là bit 1 thì bạn NOT R1 = FF là được.
Nếu byte đó có 1 số 1 (số lẻ bit 1) thì bạn sẽ NOT 1 lần sau 8 trong đó có 7 lần là số 0 nên không bị NOT nên sẽ thu được byte cuối cùng thu được là R1=FF
Nếu byte đó có 2 số 1 (số chẵn bít 1)thì bạn sẽ NOT R1 hai lần kết quả sẽ thu được byte cuối cùng là R1= 00 tương ứng.
Tương tự với việc tính party chẵn
Comment
-
Nguyên văn bởi congbinh1989 Xem bài viếtCách này của bác hay. Nhưng có vẻ như là "Dùng búa tạ đập ruồi". Xin lỗi vì đã chê bác nhé.
Giả sử bạn có một byte dữ liệu cần kiểm tra dữ liệu cần kiểm tra chứa trong thanh ghi trong R0
Bạn chỉ cần MOV nó vào thanh ghi A bằng lệnh
Code:MOV A, R0
Khi đã có party lẻ rùi mà muốn sử dụng Party chẵn thì bác lại thực hiện 2 lện sau
Code:MOV C,P //Chuyển Bit party vào cờ nhớ C CPL C // Đảo ngược cờ nhớ C
Vậy với 1 byte dữ liệu:
--1 lệnh ta sẽ có được party lẻ
--3 lệnh ta sẽ có được party chẵn
Với 2 byte dữ liệu( 16bit) thì làm thế nào??: ta đặc các trường hợp như sau
16 bit có party là chẵn
16 bit có party là lẻ
TRường hợp 1: 16bit có party chẵn
các khả năng xảy ra : Mỗi byte có trong 2 byte đều đồng thời có party chẵn, hoặc mỗi byte trong 2 byte đó đều có 1 party lẻ
Trường hợp 2: 16bit có party lẻ
Chỉ có 1 khả năng duy nhất xảy ra là 1 trong 2 byte đó là party lẻ, byte còn lại là party chẵn
Như vậy: Ta có thể thực hiện phép XOR để thực hiện phép tính với 16bit
Bước 1: Thực hiện party 8 bit vói byte cao ta được bit party là PH
Bước 2: Thực hiện party 8 bit với byte thấp ta được bit party là PL
Bước 3: Thực hiên XOR với PH và PL ta thu được Party 16bit
Chú ý: Cách này thực hiện với 8051 nhéModule RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
Nguyên văn bởi queduong Xem bài viếtĐúng vậy , làm cách của bạn trong 8051 là đơn giản hơn rất nhiều . Ở trên " chủ thớt " có hỏi về AVR ... mình chỉ đưa 2 đoạn mã ( cùng 1 chương trình ) ... 1 cái cho 8051 và 1 cái cho AVR để chủ thớt tự so sánh.
Comment
-
Vậy có thể có vài cách:
-Đếm số bít 1/0 bằng cách rotate ra cờ C ( theo KLVL) rồi:
So sánh thủ công với 2,4,6....,16 như anh Dương đưa ra, cái này đã có 1 admin khác chỉ tôi vài dòng C rồi thôi, ko hiểu.
So sánh như anh KVLV thì có thể là một cách của asm nhưng tôi cũng ko hiểu lắm cho con avr.
- Theo congbinh1989 thì chắc chỉ được cho 89Cxx, có vẻ như cách của bạn là xor tất cả các bit 1 trong thanh ghi nếu kết quả là 0/1 thì biết chẵn, lẻ.
Tóm lại, là những cách quen thuộc nhưng chắc chắn.
Cảm ơn các bạn nhé.
Comment
-
Nguyên văn bởi congbinh1989 Xem bài viếtXét với AVR
Theo mình thì không cần đếm: Chỉ cần quay qua cờ nhớ 8 hoặc 16 lần thôi. Nếu như R16 của bạn đang lưu cái số bạn cần kiểm tra. ban đầu bạn gán thanh ghi R1 bằng 0 nếu như bạn muốn tính party lẻ
Quay qua cờ nhớ. Cứ khi nào cờ nhớ là bit 1 thì bạn NOT R1 = FF là được.
Nếu byte đó có 1 số 1 (số lẻ bit 1) thì bạn sẽ NOT 1 lần sau 8 trong đó có 7 lần là số 0 nên không bị NOT nên sẽ thu được byte cuối cùng thu được là R1=FF
Nếu byte đó có 2 số 1 (số chẵn bít 1)thì bạn sẽ NOT R1 hai lần kết quả sẽ thu được byte cuối cùng là R1= 00 tương ứng.
Tương tự với việc tính party chẵnNguyên văn bởi avr Xem bài viếtVậy có thể có vài cách:
-Đếm số bít 1/0 bằng cách rotate ra cờ C ( theo KLVL) rồi:
So sánh thủ công với 2,4,6....,16 như anh Dương đưa ra, cái này đã có 1 admin khác chỉ tôi vài dòng C rồi thôi, ko hiểu.
So sánh như anh KVLV thì có thể là một cách của asm nhưng tôi cũng ko hiểu lắm cho con avr.
- Theo congbinh1989 thì chắc chỉ được cho 89Cxx, có vẻ như cách của bạn là xor tất cả các bit 1 trong thanh ghi nếu kết quả là 0/1 thì biết chẵn, lẻ.
Tóm lại, là những cách quen thuộc nhưng chắc chắn.
Cảm ơn các bạn nhé.
Cách của bác Queduong là cách cơ bản, an toàn.Hôm nay trời nắng chang chang.
Mèo con đi học chẳng mang thứ gì.
Chỉ mang một cái bút chì.
Và mang một mẩu bánh mì con con.
Comment
Bài viết mới nhất
Collapse
-
bởi NgocTTKTrong bối cảnh Khách hàng B2B ngày càng kỳ vọng vào trải nghiệm mua sắm liền mạch, cá nhân hóa và khả năng tương tác theo thời gian thực, việc Doanh nghiệp áp dụng phần mềm quản lý đơn bán hàng B2B trở thành yếu tố quan trọng để đáp ứng nhu cầu của thị trường. Tuy nhiên, làm sao để DN có thể...
-
Channel: Xu hướng, nhu cầu và thị trường
hôm nay, 10:13 -
-
bởi NgocTTKTrong bối cảnh Khách hàng B2B ngày càng kỳ vọng vào trải nghiệm mua sắm liền mạch, cá nhân hóa và khả năng tương tác theo thời gian thực, việc Doanh nghiệp áp dụng phần mềm quản lý đơn bán hàng B2B trở thành yếu tố quan trọng để đáp ứng nhu cầu của thị trường. Tuy nhiên, làm sao để DN có thể...
-
Channel: Xu hướng, nhu cầu và thị trường
hôm nay, 09:50 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi tuyennhanBác Vị đã nhắc khéo rất mong dinhthuong nhận ra việc trên còn rất nhiều vấn đề đàng sau nhất là trong kinh doanh , sản xuất .
-
Channel: Điện tử công suất
hôm nay, 07:53 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi vi van phamKhông liên quan gì đến solar MPPT của Dinhthuong, vì bây giờ tôi xin phép nói chuyện riêng với nhac sỹ và các bạn thích chế cháo:
1- Bà xã tôi làm mạch nhốt muỗi vào chai nước uống, không thấy hết muỗi mà thấy ngày càng nhiều muỗi,...-
Channel: Điện tử công suất
Hôm qua, 21:28 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi ti500Xem video hình như bác vẫn dùng jumper để chuyển đổi điện áp? Chưa hiểu bác mod lại thế nào. Mạch này xài pin nên chắc cần hiệu suất cao, nếu autovolt thì theo bác tổn hao thêm bao nhiêu là chấp nhận được?
-
Channel: Điện tử công suất
Hôm qua, 19:23 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi dinhthuong80Vâng bác, giờ đèn bắt và giệt muỗi quá trời, rồi máy đuổi muỗi Doctor Ho,... mà chả cái nào ra hồn!
Led cực tím 365nm thì thua ạ, vì máy test màu nguồn ánh sáng công ty cháu chỉ đo được từ 380nm - 780nm thôi....-
Channel: Điện tử công suất
Hôm qua, 12:50 -
-
bởi vyvian leeGiải pháp quản lý Đơn bán hàng B2B là giải pháp công nghệ giúp các DN quản lý toàn bộ quy trình tiếp nhận, theo dõi và thực hiện các đơn hàng từ Khách hàng B2B. Công cụ này cho phép DN xử lý khối lượng đơn hàng lớn, quản lý các chính sách giá...
-
Channel: Quảng cáo
Hôm qua, 10:00 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi vi van phamUống rượu 1 mình ko có chuyện gì để nói, chợt nghỉ ra đang sửa cái đèn bắt muỗi. Nhờ đinhthuong giúp đỡ cho biết cái led nào là 365nm.
Ngày xưa sửa cho sếp cái đèn, đổ ra rất nhiều muỗi trong đó. Ngày nay mua cái đèn chẳng...-
Channel: Điện tử công suất
Hôm qua, 03:20 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi ti500Đùa với bác tí thôi vì lâu rồi mình cũng không vào diễn đàn vì thấy chán. Dù sao cũng cảm ơn bác đã đưa ra các bài toán thực tế để anh em có sự động não không hề nhẹ.
Xem video bác gửi em vẫn chưa hiểu nó nói về cái gì...-
Channel: Điện tử công suất
10-02-2025, 18:05 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi dinhthuong80Chào bạn ti500, cảm ơn bạn đã dẫn dùm link [mình muốn dẫn link đó mà ... không nhớ gì nhiều về nó!]
Mạch mà ĐT đề nghị người ta cải tiến để đáp ứng yêu cầu/khắc phục vấn đề như đã mô tả là mạch pin sạc ở trong cái nắp vỏ có hình đính kèm ấy, sơ đồ mạch đó là sơ đồ rất nhiều...-
Channel: Điện tử công suất
10-02-2025, 15:08 -
Comment