PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 24-06-2008, 10:46 AM   #1
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Vài thủ thuật với CCS C

Mình thấy rất nhiều bạn đã viết chương trình cho PIC bằng C, cụ thể là CCS-C nhưng vẫn không thể tận dụng được ưu thế của ngôn ngữ cấp cao mà thay vào đó là sử dụng C như ASM, chỉ tận dụng được các lệnh rẽ nhánh cơ bản. Trong quá trình viết chương trình cho PIC bằng CCS-C, mình rút ra vài kinh nghiệm khá hay, chia sẻ cho các bạn nào quan tâm. Tất nhiên là chương trình không đòi hỏi tốc độ tốt như viết cho ASM.

[1] F1 Phím này cực kỳ lợi hại, nhấn thử là biết ngay.

[2] Tận dụng tối đa các thư viện dựng sẵn của CCS C cho việc giao tiếp với IC ngoại vi, vì cơ bản việc giao tiếp này không khó, và chỉ có 1 cách duy nhất theo như hoạt động của IC đó, việc gì phải viết lại nhỉ, trong khi người ta đã viết tốt lắm rồi. Tuy nhiên, nếu muốn nâng cao khả năng lập trình cũng nên xem qua người ta viết cái gì nhé . Các thư viện này ở thử mục [C:\Program Files\PICC\Drivers]

[3] Tận dụng các hàm như bit_test(), bit_set(),bit_clear(), input(), output_x(), output_bit(), setup_...() và các chỉ dẫn setup, lệnh setup mà không cần phải quan tâm nhiều đến thanh ghi, các hàm này sử dụng với các định nghĩa sẵn có, được định nghĩa trong các file header, ví dụ nếu #include<16f877a.h> thì file đó nằm ở thử mục [C:\Program Files\PICC\Devices\16f877a.h]

[4] Sử dụng hàm printf và hàm sprintf
[*] Hàm printf có thể xuất 1 chuỗi ký tự có định dạng ra UART, tuy nhiên nó có chức năn buffer ra 1 hàm, có nghĩa là xuất các ký tự ascii ra 1 hàm.
Ví dụ như sau, ta có hàm lcd_putc() trong thư viện LCD.C của CCS như sau:
PHP Code:
void lcd_putcchar c) {
   switch (
c) {
     case 
'\f'   lcd_send_byte(0,1);
                   
delay_ms(2);
                                           break;
     case 
'\n'   lcd_gotoxy(1,2);        break;
     case 
'\b'   lcd_send_byte(0,0x10);  break;
     default     : 
lcd_send_byte(1,c);     break;
   }

hàm này có chức năng gởi 1 ký tự ASCII ra LCD nếu gặp ký tự '\f' thì xóa lcd, '\n' thì xuống dòng, '\b' trở về đầu dòng.

Vậy để xuất ra LCD giá trị của ADC vừa đọc được trong biến adcresult (kiểu int16), nếu theo phương pháp thông thường, phải chuyển đổi biến này sang ascii rồi dùng lcd_putc() gởi từng ký tự đó ra. Vậy sử dụng hàm printf thì sao:
PHP Code:
printf(lcd_putc,"\fGia tri ADC:\n\bHEX:%lx DEC:%lu",adcresult,adcresult); 
đầu tiên, '\f' xóa trắng LCD, in ra dòng chữ "Gia tri ADC:" ở dòng 1, gặp '\n' Xuống dòng, gặp '\b' trở về đầu dòng, gặp %lx chuyển giá trị adcresult ra dạng HEX 16bit (ký tự ascii), gặp %lu chuyển giá trị adcresult ra dạng nguyên 16 bit (ký tự ascii).

[*] Hàm sprintf() cũng tương tự, nhưng buffer cho chuỗi, ví dụ:
PHP Code:
char str[32];
sprintf(str,"\fGia tri ADC:\n\bHEX:%lx DEC:%lu",adcresult,adcresult); 
[5] Sử dụng kiểu cấu trúc, union. Điều này cải thiện đáng kể cách quản lý và sự tiện lợi cho dữ liệu. Ví dụ:
PHP Code:
struct Queue{
     
char name[10];
     
int16 year;
     
int8 month;
     
int8 day;
     
int8 hour;
     
int8 minute;
     
int8 second
     char note
[20];
};
struct Queue schedule[2];

//truy xuất như sau

sprintf(schedule[0].name,"Lich 1");
schedule[0].year 2008;
schedule[0].day 30;
//.....

//nâng cao hơn 1 xíu có thể dùng cấu trúc trong cấu trúc

struct plan {
   
char name[10];
   
Queue date;
   
char job[120];
}

//sử dụng như sau
struc plan myplan;
sprintf(myplan.name,"study pic"); //:D
myplan.date.day 30;
myplan.date.month 2;
sprintf(myplan.job,"self-teach"); //:D 
***************************** Mình cập nhật tiếp ở đây luôn************************************

[6] Sử dụng nhiều cổng RS232, SPI hay I2C

CCS C cung cấp khả năng tạo ra số lượng các cổng RS232, SPI hay I2C trên bất kỳ I/O nào của PIC nhờ thư viện phần mềm. Vậy khi nào thì các bạn có thể sử dụng phần cứng của PIC cho các cổng đó, hay nhận diện các cổng trên PIC như thế nào. Đó là định nghĩa stream, và FORCE_HW.
Một vài ví dụ cụ thể, ví dụ sau về sử dụng 3 cổng RS232, trong đó 1 cổng sử dụng phần cứng, 2 cổng tạo ra bởi thư việc của CCS C
PHP Code:
//Cổng rs232A, xây dựng bằn phần mềm
#use rs232(stream=rs232A, baud=9600, xmit=PIN_A2,rcv=PIN_A3)

//Cổng rs232B, xây dựng bằng phần mềm
#use rs232(stream=rs232B, baud=9600, xmit=PIN_B4,rcv=PIN_B5)

//Cổng  rs232C, llà phần cứng UART của PIC
#use rs232(stream=rs232C, baud=9600, UART1)

//sử dụng như sau
if(kbhit(rs232A)) {
        
printf(rs232B,"Nhan duoc tin hieu tu thang RS232A");
} else if(
kbhit(rs232C)) {
        
printf(rs232B,"Nhan duoc tu thang RS232C");
}

// Ngoài ra còn một các khác để cài đặt RS232 cho phần cứng 
//linh động mà không phụ thuộc vào chỉ dẫn #use rs232

setup_uart(9600rs232C); 
Tương tự như vậy, với I2C và SPI, sử dụng các chỉ dẫn #use SPI #use I2C

[7] ADC của PIC và con trỏ dữ liệu. nếu *=16 thì trình dịch sẽ tự cấu hình con tror là 16 bit nếu truy xuất đến vùng RAM ngoài 0xFF
Nếu bạn muốn sử dụng ADC của PIC như ADC 8 bit, thì có thể thêm chỉ dẫn như sau, để ý, mặc định adc của PIC sử dụng 8 bit thôi nhé:
PHP Code:
#include<16f877a.h>
#device *=16, adc=8

//và có thể sử dụng như sau
int8 result;
result read_adc(ADC_READ_ONLY); 
nhưng nếu dùng ADC 10 bit thì biến result phải khai báo 16 bit
PHP Code:
#device *=16, adc =10
//sử dụng
int16 result;
result read_adc() 

thay đổi nội dung bởi: phamminhtuan, 30-06-2008 lúc 03:47 AM.
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Tags
ccs c, printf, sprintf, struct

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 05:32 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam