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: http://i82.photobucket.com/albums/j257/nhhao/ccsc.gif 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: http://i82.photobucket.com/albums/j257/nhhao/ccsc1.gif 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! |
I/O + Delay _ Delay 1s RB0
1 Attachment(s)
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> 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:
{ Bài tiếp theo sẽ đưa ra câu trả lời.... http://www.freewebtown.com/nhhao/PIC...201s%20RB0.GIF |
Hihi.
Sợ ASM rồi hả! |
Ah ..ah!
Sợ thì không hẳn nhưng viết nó phức tạp quá....:D 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.... |
Delay 1s portB
1 Attachment(s)
Ăc..ặc..đang post thì bị cúp điện,bực cả mình...:mad:
Và đây là câu trả lời cho việc delay led ở portB 1s Code:
#include<16F877A.h> 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! http://www.freewebtown.com/nhhao/PIC/delay1sportb.gif |
2 Attachment(s)
Trích:
Code:
#include <16F877.h> |
Cám ơn nhh đã trả lời cho mình, do lần trước mình khai báo chưa đúng cách giữa 16f877A và *=16 đúng ra phải viết liền như bạn minh lại viết cách ra như thế này "16f877A *=16". Nhân tiện cho mình hỏi luôn ý nghĩa của việc khai báo "#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT"
|
Trích:
Tui cứ tưởng ko ma nào vào luồng này chứ ! Khai báo: Code:
"#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT -NOWDT:tắt WDT -NOPROTECT:tắt PROTECT -NOLVP:không dùng LVP -NOBROWNOUT:ko BROWNOUT Còn cụ thể ý nghĩa thế nào,bạn vào help của CCS C gõ :"#fuses" Chào! |
Cái luồng bên này nhh vẽ hình cẩu thả quá!
Cái chân MCLR*, bạn phải nối thên cái công tắc ấn vào. nhh nối như vậy thì không reset được con PIC đâu Hai cái chân Vss phải được nối mass. Chân nào không xài, nhh nên đánh dấu bỏ đi (trong thanh công cụ của ORCAD có cái dấu này đó). Nếu mình chịu khó cẩn thận hơn một chút thì sẽ hạn chế được rất nhiều sự bỡ ngỡ cho người mới học. Bạn coi mấy cái hình mình vẽ trong mấy cái Tutorial thì thấy, từng chi tiết đều được chú ý cả, không thể tùy tiện được. :D |
Thank you!
Đúng là mình ko chú ý chỗ này!Mình sẽ sửa và up lên lại! |
cho mình hỏi viết chương trình như thế nào để có thể nạp qua bootloader cho 877A dùng Tinybootloader . Bạn có thể viết 1 ví dụ nháy led như trên đc ko
|
Viết chương trình như bình thường, không có gì thay đổi, nhưng vị trí đầu tiên của chương trình phải lưu ý. Bạn xem hướng dẫn tinybootloader.
Chúc vui. |
Timer
Hi....!
Trong Pic16f877a có 3 timer : + Timer0 : 8 bit + Timer1 : 16 bit + Timer2 : 8 bit Timer dùng cho nhiều ứng dụng : định thời, capture, pwm, ... 1.Timer0 Thanh ghi tác động: http://www.freewebtown.com/nhhao/PIC...i tac dong.GIF Các lệnh: Code:
setup_TIMER_0(mode); RTCC_INTERNAL : chọn xung clock nội RTCC_EXT_L_TO_H : chọn bit cạnh lên trên chân RA4 RTCC_EXT_H_TO_L : chọn bit cạnh xuống trên chân RA4 RTCC_DIV_2 :chia prescaler 1:2 RTCC_DIV_4 1:4 RTCC_DIV_8 1:8 RTCC_DIV_16 1:16 RTCC_DIV_32 1:32 RTCC_DIV_64 1:64 RTCC_DIV_128 1:128 RTCC_DIV_256 1:256 rtcc_state là một trong những constant sau: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L ps_state là một trong những constant sau: RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256 WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS Mình cũng chưa hiểu ý nghĩa của hàm WDT_..., ko biết có phải khai báo như trên thì sau khoảng thời gian ms bao nhiêu đó đặt sau WDT_ thì sẽ reset lại Pic ?????:confused: 2.Timer1 Thanh ghi tác động: http://www.freewebtown.com/nhhao/PIC...i tac dong.GIF Các lệnh: Code:
setup_TIMER_1(mode); T1_DISABLED : tắt Timer1 T1_INTERNAL : xung clock nội (Fosc/4) T1_EXTERNAL : xung clock ngoài trên chân RC0 T1_EXTERNAL_SYNC : xung clock ngoài đồng bộ T1_CLK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8 3.Timer2 Thanh ghi tác động: http://www.freewebtown.com/nhhao/PIC...i tac dong.GIF Các lệnh: Code:
setup_TIMER_2(mode, period, postscale); T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period là số nguyên từ 0-255, xác định giá trị xung reset postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt. |
Intterupt
INTERRUPT
Các lệnh dùng cho ngắt: Code:
enable_interrupts(level); //cho phép ngắt kiểu level GLOBAL : ngắt toàn cục INT_RTCC : tràn TMR0 INT_RB : có thay đổi trạng thái một trong các chân RB4 đến RB7 INT_EXT : ngắt ngoài INT_AD : chuyển đổi AD đã hoàn tất INT_TBE : bộ đệm chuyển RS232 trống INT_RDA : data nhận từ RS232 sẵn sàng INT_TIMER1 : tràn TMR1 INT_TIMER2 : tràn TMR2 INT_CCP1 : có capture hay compare trên CCP1 INT_CCP2 : có capture hay compare trên CCP2 INT_SSP : có hoạt động SPI hay I2C INT_PSP : có data vào cổng parallel slave INT_BUSCOL : xung đột bus INT_EEPROM : ghi vào eeprom hoàn tất INT_TIMER0 : tràn TMR0 INT_COMP : kiểm tra bằng nhau comparator edge bao gồm: L_TO_H : cạnh lên H_TO_L : cạnh xuống Sau khai báo trên để vào đoạn chương trình ngắt, khai báo: #INT_......... Ví dụ vào thực thi ngắt ngoài, ta có đoạn code: Code:
#INT_EXT |
Ngắt Timer0
1 Attachment(s)
Đây là chương trình dùng ngắt Timer0 định thì 1s.
Đầu tiên led ở chân RB0 sáng, sau 1s sẽ dịch sang trái, nghĩa là led 1 trên chân RB1 sáng , lần lượt như vậy cho các led trên portB và lặp lại mãi mãi. Code:
#include <16F877A.h> |
Múi giờ GMT. Hiện tại là 05:10 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam