Ðề tài: CCS C for PIC16F877A
View Single Post
Old 01-08-2007, 02:34 PM   #3
tuanta
Nhập môn đệ tử
 
Tham gia ngày: Jul 2007
Bài gửi: 1
:
Unhappy Lỗi với chân RB3

Xin chào,

Mình đang sử dụng con PIC16F873A, chương trình viết trên CCS C. Mình gặp một lỗi rất khó hiểu là khi làm việc với portB, có duy nhất chân RB3 là mình không sao điều khiển được. Chẳng hạn mình dùng lệnh output_high(PIN_B3) thì không bao giờ nó High cả. Mạch test mình làm cũng rất đơn giản, giống như mạch của NHH post thôi. Mình đã nghĩ là do con PIC của mình nó hỏng riêng chân đấy, nên mình đã thử mua mấy con PIC16F873A khác về dùng, tình trạng vẫn hệt như vậy. Sau đó mình lại tiếp tục thử bằng cách chuyển sang con PIC16F876A xem sao, thì lỗi gặp cũng y hệt! Xin mọi người lời khuyên.

(Mạch nạp mình dùng là Galep-4).
Trích:
Nguyên văn bởi nhh View Post
Chào cả nhà!

Để lập trình cho PIC, mọi người có thể chọn cho mình những ngôn ngữ lập trình khác nhau như ASM, CCS C, HT-PIC, pascal, basic,...
Với nhh, đầu tiên tìm hiểu và viết chương trình cơ bản bằng ASM để hiểu rõ cấu trúc sau đó thì viết bằng CCS C cũng viết lại những cái cơ bản và đi dần lên, tốc độ lúc này nhanh hơn khi viết bằng ASM rất nhiều.

Khi viết bằng CCS C thông thường thì dịch ra file.hex có dài hơn so với khi viết bằng ASM. Hai ngôn ngữ CCS C và HT-PIC được ưa chuộng hơn cả, CCS C dễ học,gần gũi với ASM còn HT-PIC là dạng ANSI C.

Để lập trình và biên dịch CCS C, dùng chương trình PIC C Complier,sau khi soạn thảo các bạn ấn F9
để dịch,nếu thành công sẽ có thông báo như sau:



Ngoài ra, để xem code ASM như thế nào,sau khi dịch bạn chọn mục C/ASM List như hình dưới đây:



Link download trình biên dịch CCS C ở đây: http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar
Phiên bản mới hơn tải tại: www.kho.tailieuvietnam.net, vào Download Home > Điện tử tàn thư > Vi điều khiển - Vi xử lý - PLC

Chúng ta cùng nhau tìm hiểu lần lượt các phần sau:

1.I/O + Delay
2.Timer và ngắt Timer
3.Ngắt ngoài
4.ADC, PWM,... (tập trung mổ xẻ nhiều)
5......

Tạm thời cứ như vậy đã, sau này sẽ tính tiếp!
Nào,chúng ta bắt đầu thôi!
Trích:
Nguyên văn bởi nhh View Post
Chương trình này làm nhấp nháy con led ở chân RB0 1s sáng, 1s tắt.
Code:
#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=10000000)
main()
{
while(true)
	{
	output_high(PIN_B0);
	delay_ms(1000);
	output_low(PIN_B0);
	delay_ms(1000);
	}
}
Trên đây:
Code:
#include<16F877A.h>
Khai báo con PIC bạn sử dụng, file này chương trình viết sẵn nhằm khai báo các bit, thanh ghi quan trọng trong con pic này.Các bạn có thể vào thư mục cài đặt C:\Program Files\PICC\Devices\16F877A.h để xem nó khai báo được những gì trong đó!
Code:
#fuses NOWDT,PUT,HS,NOPROTECT
Thiết lập các config
Code:
#use delay(clock=10000000)
Khai báo tần số dao động cấp cho PIC
Code:
output_high(PIN_B0)
Xuất ra chân RB0 mức logic 1 (tức 5V), do khi thực hiện hàm này đã bao hàm luôn việc tác động lên thanh ghi TRISB (dùng chọn chân I/O) do vậy ta không cần viết lệnh chọn chân I/O nữa.
Code:
output_low(PIN_B0)
Ngược lại
Code:
delay_ms(1000)
Tạo trễ khoảng thời gian theo mili giây là 1000 (tức 1s)
Chú ý hàm này chỉ có tác dụng khi có khai báo tần số dao động cấp cho PIC

Và bây giờ thử làm cho tất cả 8 led nối với portB chớp tắt 1s xem nào!Phải chăng ta sẽ làm như sau (Viết trong vòng lặp while):
Code:
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
output_high(PIN_B4);
output_high(PIN_B5);
output_high(PIN_B6);
output_high(PIN_B7);
delay_ms(1000);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
delay_ms(1000);
}
Viết như thế này thì quá dài và thiếu chính xác nữa, có cách nào khác hay hơn không ? Sao ta không xuất đẩy hẳn portB lên mức cao,tạo trễ 1s rồi ép cho nó xuống mức thấp,tạo trễ 1s cùng một lúc nhỉ !
Bài tiếp theo sẽ đưa ra câu trả lời....
tuanta vẫn chưa có mặt trong diễn đàn