|
26-03-2006, 05:58 PM | #1 |
Đệ tử 9 túi
|
CCS C cho PIC16F877A
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! thay đổi nội dung bởi: nhh, 30-06-2007 lúc 05:58 PM. |
26-03-2006, 06:07 PM | #2 |
Đệ tử 9 túi
|
I/O + Delay _ Delay 1s RB0
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); } } Code:
#include<16F877A.h> Code:
#fuses NOWDT,PUT,HS,NOPROTECT Code:
#use delay(clock=10000000) Code:
output_high(PIN_B0) Code:
output_low(PIN_B0) Code:
delay_ms(1000) 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); } Bài tiếp theo sẽ đưa ra câu trả lời....
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 thay đổi nội dung bởi: nhh, 17-12-2006 lúc 12:00 PM. Lý do: Update |
01-08-2007, 02:34 PM | #3 | ||
Nhập môn đệ tử
Tham gia ngày: Jul 2007
Bài gửi: 1
: |
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:
Trích:
|
||
12-10-2007, 12:59 AM | #4 | |
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 2
: |
Trích:
Những function : delay() , rs232(), i2c thì tìm ở đâu vậy ??? thay đổi nội dung bởi: cooloo, 12-10-2007 lúc 04:54 AM. Lý do: thêm vào |
|
12-10-2007, 02:43 AM | #5 |
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 12
: |
Hỏi về PWM
Oe oe, các bác lừa em nhá. Các bác bảo là tập trung mổ xẻ phần PWM làm em đọc mãi hết hai mấy trang mà thấy có mỗi 2 bài liên quan. Bác nào biết về phần này thì chỉ bảo em với ạ.
Em đang có một con step motor 4 dây (đỏ, xám- đen, vàng). Em đang tìm cách điều khiển nó (chạy, dừng, đảo chiều) nhưng mà chưa biết làm thế nào cả. Các bác cho em hỏi: 1. Em dùng 16f877 điều khiển nó có được không? 2. Cần phải có những kiến thức gì để điều khiển nó? Bác nào có tài liệu về phần này bằng tiếng Việt thì share cho em với ạ. Em cám ơn các bác ạ!!!! |
26-03-2006, 06:18 PM | #6 |
Đệ tử 8 túi
|
Hihi.
Sợ ASM rồi hả! |
26-03-2006, 06:30 PM | #7 |
Đệ tử 9 túi
|
Ah ..ah!
Sợ thì không hẳn nhưng viết nó phức tạp quá.... làm dễ phát chán ... Nhưng không sao chính cứ post mấy cái tutorial nhanh nhanh lên, nhh vẫn dùng asm như thường à ..... Cái nào đơn giản ,dễ học thì mình vào thôi....
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
26-03-2006, 06:39 PM | #8 |
Đệ tử 9 túi
|
Delay 1s portB
Ăc..ặc..đang post thì bị cúp điện,bực cả mình...
Và đây là câu trả lời cho việc delay led ở portB 1s Code:
#include<16F877A.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) #use fast_io(b) #byte portb=0x6 main() { set_tris_b(0); while(true) { portb=255; //all led on delay_ms(1000); portb=0; //all led off delay_ms(1000); } } Code:
#byte portb=0x6 Code:
set_tris_b(0) Trong HELP hướng dẫn lệnh này như sau: "These functions allow the I/O port direction (TRI-State) registers to be set. This must be used with FAST_IO and when I/O ports are accessed as memory such as when a #BYTE directive is used to access an I/O port. Using the default standard I/O the built in functions set the I/O direction automatically." Rõ ràng khi set byte làm I/O nếu ta thêm khai báo: Code:
#use fast_io(b) Phần I/O + Delay tạm thời xong như vậy, bác nào có phản hồi thì tiếp tục thảo luận.Xong phần này có thể viết về xuất led 7 đoạn, quét phím, LCD,....Bác nào viết thì cứ post lên cho bà con thảo luận nhé ! Hẹn gặp lại vài hôm nữa ở bài Timer/Counter ! Chào!
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 thay đổi nội dung bởi: nhh, 17-12-2006 lúc 11:59 AM. |
20-04-2006, 02:01 PM | #9 | |
Đệ tử 1 túi
Tham gia ngày: Apr 2006
Bài gửi: 16
: |
Một phương án khác:
#include <16F877A.h> #fuses HS, NOWDT, NOLVP, XT #use delay(clock=4000000) void main() { byte leds = 0xff; set_tris_b(0x00); // configure pins of PORTB as output while (true) { output_b(leds); leds = ~leds; // toggle leds delay_ms(1000); } } Trích:
|
|
08-06-2007, 06:31 PM | #10 |
Đệ tử 6 túi
Tham gia ngày: Mar 2007
Bài gửi: 150
: |
cho em hoi trong ccs co ho tro vong lap " for" ko vay cac bac .. sao em lam hoai ma ko duoc vay .. bien dich van dung ma chay thi ko duoc...
-------------------------------- Code:
#include<16F877.h> #device *=16 ADC=8 #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) #use fast_io(b) #byte p3=0x06 #byte porta=0x05 void main() { int8 const led[]={1,2,4,8,16,32,64,128},a; set_tris_b(0); set_tris_a(0); set_tris_c(0); set_tris_d(0); while(true) { for( a=0;a<8;a++) p3=led[a]; delay_ms(100); } } thay đổi nội dung bởi: namqn, 08-06-2007 lúc 07:52 PM. |
08-06-2007, 07:56 PM | #11 |
Trưởng lão PIC bang
|
Như thế nào là chạy không được?
Theo code của bạn, trong vòng while quá trình sau sẽ được thực hiện, nếu a là biến: 1. Xuất 8 lần dữ liệu ra p3 (địa chỉ 0x06) 2. Làm trễ 100 ms 3. Quay lại bước 1 Tôi không dùng CCS C nên bạn phải kiểm tra lại xem khai báo như bạn đã làm thì a là biến hay là hằng. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
10-06-2007, 12:21 AM | #12 |
Đệ tử 6 túi
Tham gia ngày: Mar 2007
Bài gửi: 150
: |
Em biet no sai o dau roi. Sau moi lan gia tri a tang len 1 . phai delay mot khoan thoi gian, neu ko no se chay den gia tri cuoi cung roi xuat ra portb , vay p3=led[7]=128; nhu vay xem nhu vong lap ko co tac dung(co vay thoi cugn so y thiet(~_~).. Vay doan code dung la 8 con led se chay duoi nhau hoai (^_^)..)
----------------------------- Code:
#include<16F877.h> #device *=16 ADC=8 #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) #use fast_io(b) #byte p3=0x06 void main() { int8 const led[]={1,2,4,8,16,32,64,128},a; set_tris_b(0); while(true) { for(a=0;a<8;a++) { p3=led[a]; delay_ms(20); } } } thay đổi nội dung bởi: namqn, 10-06-2007 lúc 12:57 AM. |
27-03-2006, 08:10 PM | #13 | |
Đệ tử 9 túi
|
Trích:
Code:
#include <16F877.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=8 #use delay(clock=10000000) Int8 adc; main() { setup_adc(adc_clock_internal); setup_adc_ports(AN0); set_adc_channel(0); delay_ms(10); while(true) { adc=read_adc(); output_B(adc); } } thay đổi nội dung bởi: nhh, 24-09-2007 lúc 02:36 PM. Lý do: Nhầm tí |
|
20-04-2006, 03:34 PM | #14 |
Đệ tử 1 túi
Tham gia ngày: Apr 2006
Bài gửi: 16
: |
Một cách viết khác để tham khảo:
#include <16F877A.h> #fuses HS, NOWDT, NOPROTECT, NOLVP #device 16F877*=16, ADC=8 #use delay(clock=4000000) void main() { setup_adc(adc_clock_internal); setup_adc_ports(ALL_ANALOG); set_adc_channel(0); // TM Board: VR3=0, VR2=1, VR1=2 delay_ms(10); while (true) output_b(read_adc()); } [QUOTE=nhh]Đây là 1 ví dụ nhỏ về ADC,chân RA0 lấy tín hiệu Analog từ biến trở và xuất giá trị số biến đổi tương ứng qua tám led nối ở portB Code:
#include <16F877.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=8 #use delay(clock=10000000) Int8 adc; main() { setup_adc(adc_clock_internal); setup_adc_ports(AN0); set_adc_channel(0); delay_ms(10); while(true) { adc=read_adc(); output_B(adc); } } |
30-06-2007, 01:44 AM | #15 |
Đệ tử 6 túi
Tham gia ngày: Oct 2006
Bài gửi: 147
: |
dịch
tui dốt tiếng anh quá, mọi người có thể dịch những từ dưới ra tiếng việt được ko? thanhk!
#FUSES NOWDT #FUSES XT #FUSES NOPUT #FUSES NOPROTECT #FUSES BROWNOUT #FUSES LVP #FUSES NOCPD #FUSES NOWRT #FUSES NODEBUG |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 26 | 07-05-2024 08:55 AM |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 11 | 04-05-2024 04:43 AM |
Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
Pic16f877a TỪ DỄ TỚi KhÓ | ntc | Cơ bản về vi điều khiển và PIC | 373 | 23-05-2009 10:24 PM |