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 nhathung1101Với servo Yaskawa thì dùng phần mềm Wide field 3. Dùng được hay không thì động não đi....
-
Channel: Điện tử công nghiệp
Hôm qua, 00:35 -
-
bởi bqvietServo cuối cùng vẫn chỉ là điều chỉnh tốc độ và đọc phản hồi vị trí
Qua cổng song song LPT cổ
https://www.electronicsforu.com/elec...eed-controller
Qua cổng USB - xem thêm đám FT232RL-
Channel: Điện tử công nghiệp
22-11-2024, 15:56 -
-
bởi thiennam0703Em đang tìm hiểu cách xây dựng chương trình điều khiển động cơ Servo Yaskawa bằng máy tính tuy nhiên khi tìm kiếm trên mạng các hướng dẫn thì thường là điều khiển bằng vi điều khiển hoặc điều khiển bằng PLC hay điều khiển động cơ...
-
Channel: Điện tử công nghiệp
22-11-2024, 15:32 -
-
Trả lời cho Tổng hợp các thông tin về mạch nạp cho AVRbởi bacthoMình cũng bị như vậy mà chưa biết ở đâu
-
Channel: Vi điều khiển AVR
21-11-2024, 21:00 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi nhathung1101Câu trả lời là không dùng được.
Hai lớp dán mặt trước và mặt sau, gọi là film phân cực. Muốn hiểu rõ về nó thì chịu khó search nhé. Ở đây có rất nhiều chó cứ ngửi thấy phân là sủa nhặng, nên không giải thích nhiều....-
Channel: Thiết bị điện tử cá nhân
21-11-2024, 16:20 -
-
Comment on Tổng hợp các thông tin về mạch nạp cho AVRbởi Memem
-
Channel: Vi điều khiển AVR
21-11-2024, 15:10 -
-
Trả lời cho Tổng hợp các thông tin về mạch nạp cho AVRbởi MememMọi người ơi cho em hỏi cái này ạ, hiện tại em đang làm btl về hiển thị giá trị nhiệt độ trên led 7 thanh sử dụng atmega16, code em chạy trên mô phỏng rất oke nhưng khi lắp qua mạch thực thì bị lỗi ở led đầu tiên bị lỗi như thế này...
-
Channel: Vi điều khiển AVR
21-11-2024, 15:10 -
-
bởi mantruongepuNhờ cả nhà tìm giúp mình thông tin IC này với, thấy ghi 943B W58BAL mà mình tìm mấy ngày nay không được, nó được đóng gói dạng TSSOP 8. Cám ơn cả nhà....
-
Channel: Điện tử dành cho người mới bắt đầu
20-11-2024, 14:40 -
-
bởi TherulCảm ơn bạn đã chia sẻ câu chuyện và quá trình phát triển sản phẩm của mình. Trước tiên, thật may mắn khi bạn vượt qua tai nạn và vẫn giữ được niềm đam mê cũng như khả năng sáng tạo trong lĩnh vực kỹ thuật. Việc bạn tiếp tục...
-
Channel: từ PIC tới dsPIC
20-11-2024, 07:20 -
-
Trả lời cho Em muốn hỏi mọi người về nguyên lý hoạt động, tần số của mạch công suất trong máy rửa siêu âm ạ.bởi nguyendinhvanBạn nên nghiên cứu cái chấn lưu đèn ống Compact fluorescent lamp hay đèn compact trước đã. Nó rẻ đỡ tốn kém.
Sau khi hiểu rõ rồi thì chuyển sang cái mạch này.
Ở cái chấn lưu, tần số của nó linh tinh lắm, tùy điện áp nguồn, tùy...-
Channel: Hỗ trợ học tập
19-11-2024, 22:44 -
Comment