CCS sai Ti sai , jtag sai, hay em sai

hienqsb

Thành Viên PIF

em gán biến c bằng 1 biểu thức, biểu thức tính ra 255(đúng ý đồ) mà c bắng 239 (11101111b)
thử nhiều lần cho cùng kết quả nên debug chắc vẫn đúng ko hiểu do cái gì sai
help e với:3cool_adore:
 

honghiep

Cố Vấn CLB
Staff member

em gán biến c bằng 1 biểu thức, biểu thức tính ra 255(đúng ý đồ) mà c bắng 239 (11101111b)
thử nhiều lần cho cùng kết quả nên debug chắc vẫn đúng ko hiểu do cái gì sai
help e với:3cool_adore:
Con trỏ Debug đang dừng ở P1OUT |= b;
tức là dòng đó MCU vẫn chưa thực hiện
đồng nghĩa với việc c chưa được tính, sao ra đúng được bạn?:)
 

messier

Ban Chủ Nhiệm
Thử xem kết quả khi con trỏ chương trình tới dòng P2OUT |= c thử có sai không bạn :D
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
hienqsb chỉ vô cái chỗ màu đỏ 16bit kìa mọi người...mà sao char hết mà vị trí đó lại là int nhỉ :-?
 
b không sai, lấy bit 4,5 của số a đẩy ra P1.6 và P1.7 đúng trong cả 2 trường hợp.
c sai ở chỗ không đẩy được bit 0,1,2,3 của số a rồi dịch trái. vấn đề có lẽ ở chỗ dịch trái 2 bit. em tạo biến nữa rồi thực hiện riêng từng thao tác, debug xem.

hienqsb chỉ vô cái chỗ màu đỏ 16bit kìa mọi người...mà sao char hết mà vị trí đó lại là int nhỉ :-?
cái đó theo anh không quan trọng lắm, anh đoán là do dịch bit nên nó tự mở rộng tầm vực của biến thôi. quan trọng là khi trả về thì nó không trả về đúng.
 

messier

Ban Chủ Nhiệm
Vấn đề là trước đó c = 0x00 rồi nên or lại cũng vậy. Bạn khai báo c là int đi. Cái biểu thức là int mà c là unsigned char kìa
 
giờ sai cả b và c
cái biểu thức của bạn:
b |=... tức b = b |...
tương tự với c
còn biểu thức trong phần watch bạn nhập chỉ là phần phía sau, chưa OR với b, c nên chắc chắn phải khác rồi :D
nói như Hiệp thì khi or với 1 nó phải lên 1 chứ. giá trị biểu thức sau c có kết quả là 11111 thì không lý nào ra c lại là 111 được =))
 

cowboyhere

Cố Vấn CLB
Staff member
thằng ku hàn led không cùng 1 port để layout cho dễ, giờ phải code cực thế đấy.
mục tiêu: lấy bit 4,5 của số a đưa vào P1.7 và P1.6
bit 7 ,6 của a là P2.7, P2.6
bit 3,2,1,0 của a là P2.5, 2.4,2.3,2.2
 

cowboyhere

Cố Vấn CLB
Staff member
mà hay là cái này sai rất ổn định, lần sai sau giống như trước mới ghê mọi người
cái biểu thức là int, hình như mình ko can thiệp đổi kiểu cho nó được messier
à, chỉ để xem thôi, còn gán P2OUT cho c nên nếu khai báo c là int thì cũng:gach
 

hienqsb

Thành Viên PIF
vẫn ko đc a ơi , hình như thằng c= a lun , e thử nhìu lần mà như nhau hết
 

hienqsb

Thành Viên PIF
trời ơi , đoạn sau này chạy đúng rùi nhưng cái a hiển thị bị sai , biểu thức hiển thị theo a nên sai nhưng cái c lại chạy đúng , ko bít cái CCS bị gì nữa
 

thienminh_npn

Thành Viên PIF
trời ơi , đoạn sau này chạy đúng rùi nhưng cái a hiển thị bị sai , biểu thức hiển thị theo a nên sai nhưng cái c lại chạy đúng , ko bít cái CCS bị gì nữa
Anh sẽ giải thích cho em hiểu tại sao a hiển thị sai, c ra đúng nhé:
Khi mà em khai báo tham số tham trị (arguments referenced by values) và biến cục bộ (local variables) cho một hàm trong chương trình C, giá trị của tham số và các biến sẽ được ghi vào các thanh ghi của vi xử lý khi chương trình vừa nhảy vào hàm (8051 có 8 thanh ghi nhớ k? MSP430 cũng vậy). Khi em debug và watch một biến, nhiệm vụ của debugger sẽ là lấy giá trị tại địa chỉ trên vi xử lý của biến mà compiler biên dịch từ đầu (xem address của biến a kìa, register mấy đó thấy k?) lên hiển thị trên ô watch. Cho nên giá trị của a ở đây sai là vì sau khi step over câu lệnh tính c, chương trình hợp ngữ đã mượn thanh ghi chứa a để tính toán các giá trị | & << nên giá trị trong đó bị đổi. Khi debug thì mình chỉ thấy giá trị này còn giá trị gốc thì mất tiêu rồi. Biểu thức nó không ghi address ở đâu nghĩa là nó tính dựa vào giá trị truyền lên từ debugger thui cho nên nó đúng theo giá trị watch được của a.


Khai báo các biến a,b,c là toàn cục thì sẽ thấy được giá trị của tụi nó khi debug. Nhưng viết chương trình hiệu quả thì càng hạn chế biến toàn cục càng tốt, vì khó quản lý, tốn bộ nhớ, chậm.

Còn gì chưa hiểu thì hỏi lại nhé.

Túm lại trả lời cho câu hỏi của thread này: chả ai sai cả, chỉ là hienqsb chưa biết cách làm việc của tụi nó thui.
 
Top