[Hỏi] Không hiểu vì sao Hitech C biên dịch sai?

cheese

Trứng gà
Chào các bạn, mình lập trình cho PIC16F887 bằng MPLAB 8.56 + Hitech C 9.71. Tuy nhiên không hiểu sao khi viết lệnh gộp như Kiểu viết 2 thì chương trình chạy sai. (Mình không nghĩ là Kiểu viết 2 có gì sai <-- nhờ các b check lại xem). Cụ thể hàm này có chức năng quét từng phần tử của gcan, dịch trái 1 bit, sau đó gán bit LSB (bit bìa bên phải) thành 1. Tuy nhiên nếu viết gộp như Kiểu viết 2 thì chương trình chỉ dịch trái chứ không gán bit LSB lên 1??? Xem mã assembly nó dịch ra thì kiểu viết 2 không thấy nó dịch ra dòng nào??!! Mong được các bạn debug giúp! Thanks rất nhiều!

Code:
unsigned char gcan[5] = { 0b01110010,0b11011000,0b00011011,0b10010010,0b01101100};
void countdown()
{
	const unsigned char position = 0;
	unsigned char i, j;
	
	for (i = 0; i <= 7; i++)
	{
		for (j = 0; j <= 4; j++)
		{
			//*Kieu viet 1
			//gcan[position + j] = ((gcan[position + j] << 1));
			//gcan[position + j] |= 0x01;

			//*Kieu viet 2
			gcan[position + j] = ((gcan[position + j]) << 1) | 0x01;
		}
	}
}
p/s: Mình debug bằng cách mô phỏng trên MPLAB + mạch thật. Cái position đó là mình để lại cho giống cái code gốc. Mình sẽ đính kèm project để các bạn tiện mô phỏng xem Watch thử.
View attachment TestHitechC_err.zip
View attachment main.c.txt
 

Manhdd

Cố Vấn CLB
Staff member
Mình cũng không rõ trình dịch bị sao nữa. Nếu thử dùng lệnh gộp:
Code:
gcan[0] = (gcan[0] << 1) | 0x01;
Thì việc tính toán lại suôn sẻ.
 

cheese

Trứng gà
Mình thử viết trên Visual C thì vẫn chạy đúng. Mình nghĩ là do trình dịch, nhưng không biết là do mình dùng bản cr**k (bản PRO) hay là do hạn chế của chính trình biên dịch. Đoạn code đơn giản trên mà nó dịch còn sai thì quả thật không đáng tin cậy. Không biết có ai đọc manual của HitechC thấy nó đề cập về cái hạn chế này chưa.
 

nguyenquoctrung-hhk

Thành Viên PIF
mình nghĩ là do trình dịch hightech C, lúc mình mới tham gia lớp C4 nghe mấy anh hướng dẫn nói phải sài đúng phiên bản PRO 9.65 và MPLAB 8.73a, mình úp lên diễn đàn không được do dung lượng vượt quá giới hạn,hihi! mấy anh nói sài bản khác là nó báo lỗi, do mình sài bản lậu mà :)), bạn nên down thử hai bản trên cài rồi chạy thử coi có bị lỗi không, chắc không bị đâu, tại mình đang sài mà :))
 

cheese

Trứng gà
mình nghĩ là do trình dịch hightech C, lúc mình mới tham gia lớp C4 nghe mấy anh hướng dẫn nói phải sài đúng phiên bản PRO 9.65 và MPLAB 8.73a, mình úp lên diễn đàn không được do dung lượng vượt quá giới hạn,hihi! mấy anh nói sài bản khác là nó báo lỗi, do mình sài bản lậu mà :)), bạn nên down thử hai bản trên cài rồi chạy thử coi có bị lỗi không, chắc không bị đâu, tại mình đang sài mà :))
À, nếu vậy b giúp mình chạy debug thử đoạn code đó trên bản IDE b đang dùng thử xem nó chạy đúng không. Mấy bữa nay mạng chậm rì, mình k tải gì đc. Thực ra nó k báo lỗi gì hết, build successful luôn, chỉ có điều hoạt động không đúng thôi.
 
Top