Tài liệu Tài liệu sử dụng CCS (tiếng việt) doc

13 609 5
Tài liệu Tài liệu sử dụng CCS (tiếng việt) doc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

I / _ GIỚI THIỆU: _Đây tài liệu hướng dẫn sử dụng CCS lập trình ngôn ngữ C cho vi điều khiển PIC Microchip Tác giả tên TRẦN XUÂN TRƯỜNG , SV K2001 ,ĐH BK HCM Là thành viên txt2203 diễn đàn diendandientu.com Mọi đóng góp ý kiến tài liệu xin vào mục Vi xử lý-Vi điều khiển diễn đàn email đến địa : txt2203@yahoo.com Rất cám ơn đóng góp ý kiến bạn yêu thích lập trình vi xử lý tài liệu II / _ VÀI VẤN ĐỀ VỀ TÀI LIỆU NÀY : _Tài liệu hướng dẫn sử dụng phần mềm CCS phiên , lập trình C cho VĐK _Tài liệu trình bày vấn đề sau : _ Chương : Giới thiệu sơ lược CCS Viết chương trình C CCS _ Chương : Sử dụng biến hàm , cấu trúc lệnh , thị tiền xử lý _ Chương : Các hàm xử lý số _ Chương : Xử lý ADC , hàm vào , C _ Chương : Truyền thông với PC , xử lý chuỗi _ Chương : Các hàm xử lý bit _ Chương : vấn đề TIMER _ Chương : Truyền thông I2C , SPI PARALLEL _ Chương : Các vấn đề PWM , Capture Compare _ Chương : Vấn đề ngắt ( interrupt ) _Trong chương có hướng dẫn sử dụng hàm thích hợp cho chủ đề _Tài liệu viết đến đâu đưa lên mạng cho người tham khảo đến Hầu hết trình bày sử dụng cách , sau bổ sung thêm VD,chương trình, thêm đến đâu thông báo đến Các bạn nhớ theo dõi CHƯƠNG : HƯỚNG DẪN SỬ DỤNG CCS – VIẾT CHƯƠNG TRÌNH C TRONG CCS I / _ GIỚI THIỆU CCS : _Chương trình CCS dùng cho tài liệu PCW COMPILER version 3.07 (2001 ) 3.222 (2004) , bao gồm : PCB , PCM PCH Lập trình cho họ PIC 12 bit , 14 bit PIC 18 _Để viết chương trình C : chạy CCS , vào New để tạo file C Trên toolbar : _Chọn “Microchip 12 bit” để viết chương trình cho PIC 12 bit “Microchip 14 bit” để viết chương trình cho PIC 14 bit “Microchip PIC18” để viết chương trình cho PIC18 _Chọn “Compiler” để biên dịch chương trình bạn viết _CCS trình biên dịch dùng ngôn ngữ C lập trình cho VĐK Đây ngôn ngữ lập trình đầy sức mạnh , giúp bạn nhanh chóng việc viết chương trình so với ngôn ngữ Assembly _Tuy nhiên C vạn , thực thứ ý muốn Trong số trường hợp , sinh mã chạy sai (tham khảo cải tiến version CCS web : info.CCS.com Mặt khác , sinh mã không theo ý muốn ( dù không sai , ví dụ sinh nhiều mã lệnh không quan trọng thực thi hàm ngắt ) làm chậm tốc độ thực thi chương trình bạn đòi hỏi chương trình xử lý với tốc độ cao , ví dụ điều chế PWM _Nhưng CCS C cho phép bạn phối hợp ASSEMBLY cùnh với C , điều cho phép chương trình bạn trở nên uyển chuyển , kết hợp sức mạnh ngôn ngữ , việc phối hợp làm cho việc viết chương trình trở nên khó khăn _CCS cung cấp công cụ tiện ích giám sát hoạt động chương trình : C/ASM list : cho phép xem mã ASM biên dịch xong , giúp bạn quản lý mã nắm thức mã sinh chạy ; SYMBOL giúp quản lý nhớ biến chương trình , // bổ sung II / _ VIẾT CHƯƠNG TRÌNH TRONG CCS : _Sau ví dụ chương trình CCS : #include < 16F877 h > #device PIC6f877 *=16 ADC=10 #use delay(clock=20000000) Int16 a,b; Void xu_ly_ADC ( ) { } #INT_TIMER1 Void xu_ly_ngat_timer ( ) { } Main ( ) { } _Đầu tiên thị tiền xử lý : # có nhiệm vụ báo cho CCS cần sử dụng chương trình C dùng VXL , có dùng giao tiếp PC không , ADC không , DELAY không , _Các khai báo biến _Các hàm _ Các hàm phục vụ ngắt theo sau thị tiền xử lý cho biết dùng ngắt _Chương trình CHƯƠNG : CÁCH SỬ DỤNG BIẾN VÀ HÀM , CÁC CẤU TRÚC LỆNH , CHỈ THỊ TIỀN XỬ LÝ I / _ KHAI BÁO VÀ SỬ DỤNG BIẾN , HẰNG , MẢNG : / _ Khai báo biến , ,mảng : _Các loại biến sau hỗ trợ : int1 soá bit = true hay false ( hay 1) int8 soá byte ( bit) int16 soá 16 bit int32 số 32 bit char ký tự bit float số thực 32 bit short mặc định kiểu int1 byte mặc định kiểu int8 int mặc định kiểu int8 long mặc định kiểu int16 _Thêm signed unsigned phía trước để số có dấu hay không dấu Khai báo mặc định không dấu VD : Signed int8 a ; // số a bit dấu ( bit bit dấu ) Signed int16 b , c , d ; Signed int32 , _Phạm vi biến : Int8 :0 , 255 signed int8 : -128 , 127 Int16 : ,2^15-1 signed int16 : -2^15 , 2^15-1 Int32 : , 2^32-1 signed int32 : -2^31 , 2^31-1 _Khai báo : VD : Int8 const a=231 ; _Khai báo mảng soá :VD : Int8 const a[5] = { 3,5,6,8,6 } ; //5 phần tử , số mảng : a[0]=3 _Một mảng số có kích thước tối đa 256 byte liệu Các khai báo sau hợp lệ : Int8 const a[5]={ }; // sử dụng byte , dấu để bạn điền số vào Int8 const a[256]={ }; // 256 phần tử x byte = 256 byte Int16 const a[12] = { }; // 12 x 2= 24 byte Int16 const a[128] = { }; // 128 x 2= 256 byte Int16 const a[200] = { }; // 200 x =400 byte : khoâng hợp lệ _Lưu ý : đánh không đủ số phần tử vào ngoặc kép khai báo , phần tử lại Truy xuất giá trị vượt số mảng khai báo làm chương trình chạy vô tận _Mảng số thường dùng làm bảng tra (ví dụ bảng tra sin ) , viết dễ dàng nhanh chóng , gọn so với dùng ASM để viết / _ Cách sử dụng biến : _Khi sử dụng phép toán cần lưu ý : tràn số , tính toán với số âm , chuyển kiểu ép kiểu A ) _Một vài ví dụ tràn số , làm tròn : _VD : Int8 a=275; // a =275-256=19 Int8 const a=275 //a=19 Int8 a=40 , b=7 , c; C=a * b ; //c=280-256=24 C=a / b ; //c=5 _Bạn ép kiểu , thường tiết kiệm ram , hay muốn tiết kiệm thời gian tính , VD : Int8 a =8 , b=200; Int16 c ; C= ( int16) a * b ; // c= 1600 , a chuyển sang 16 bit , 16bit*8bit b tự động chuyển sang 16 bit , kết 16 bit c , lưu ý biến a , b bit _8bit * 8bit phép nhân bit , KQ laø bit _16bit * bit phép nhân 16 bit , KQ 16 bit _32bit * 16 bit phép nhân 32 bit , KQ 32 bit _16bit * 16 bit phép nhân laø 16 bit , KQ laø 16 bit v.v _Có thể ép kiểu kết : VD : 16b*8b 16bit , gán vào biến bit KQ cắt bỏ bit cao II / _ CÁC CẤU TRÚC LỆNH : ( statement ) _Gồm lệnh while , case , STATEMENTS STATEMENT if (expr) stmt; [else stmt;] EXAMPLE if (x==25) x=1; else x=x+1; while (get_rtcc()!=0) while (expr) stmt; putc(‘n’); { stmt while (expr); putc(c=getc()); } while (c!=0); for (i=1;i / _ #BIT , #BYTE , #LOCATE vaø # DEFINE: _ #BIT id = x y Với id : tên biến x : biến C ( 8,16,32,…bit) hay số địa ghi y : vị trí bit x tạo biến bit đặt byte x vị trí bit y, tiện dùng kiểm tra hay gán trị cho bit ghi Điểm khác biệt so với dùng biến bit từ khai báo int1 : int1 tốn bit nhớ , đặt ghi đa mục đích CCS tự chọn , #BIT không tốn thêm nhớ id danh định đại diện cho bit định biến x , thay đổi giá trị id ( / ) thay đổi giá trị bit tương ứng y -> thay đổi trị x _VD: #bit TMR1Flag = 0xb.2 //bit cờ ngắt timer1 địa 0xb.2 (PIC16F877) Khi TMR1Flag = xoá cờ ngắt timer1 Int16 a=35; //a=00000000 00100011 #bit b= a.11 //b=0 , b=a.0 b vị trí LSB ( bit thấp , bên trái) Sau : b=1; //a=00001000 00100011 = 2083 _Lưu ý không dùng : if ( 0xb.2 ) mà phải khai báo dùng : if(TMR1Flag) _#BYTE id = x X: địa id : tên biến C Gán tên biến id cho địa (thanh ghi ) x , sau muốn gán hay kiểm tra địa x cần dùng id Không tốn thêm nhớ , tên id thường dùng tên gợi nhớ chức ghi địa Lưu ý giá trị ghi thay đổi lúc hoạt động chương trình nên giá trị id tự thay đổi theo giá trị ghi Không nên dùng id cho ghi đa mục đích cách dùng biến int8 CCS dùng ghi lúc cho chương trình , muốn dùng riêng , dùng #LOCATE _VD: #byte port_b = 0xc6; // 16F877 :0xc6 địa portb Muốn port b có giá trị 120 : port_b=120; #byte status = 0xc3; _ # LOCATE id = x _Làm việc #byte có thêm chức bảo vệ không cho CCS sử dụng địa vào mục đích khác VD: # LOCATE temp = 0xc20 // 0xc20 :thanh ghi đa mục đích Cách sau tương tự : Int8 temp ; #locate temp = 0xc20 _ Sử dụng #LOCATE để gán biến cho dãy địa kề ( cặp ghi ) tiện lợi thay phải dùng biến với #byte VD : CCP1 có giá trị cặp ghi 0x15 ( byte thấp ) 0x16 ( byte cao ) Để gán trị cho CCP1 : Int16 CCP1; #locate CCP1= 0x15 // byte thấp CCP1 0x15 , byte cao CCP1 0x16 Gán trị cho CCP1 tự động gán vào ghi CCP1 = 1133 ; // = 00000100 01101101 0x15 = 00000100 , 0x16 = 01101101 _# DEFINE id text Text : chuoãi hay số Dùng định nghóa giá trị VD : #define a 12345 / _ # DEVICE : # DEVICE chip option chip : tên VĐK sử dụng , không dùng tham số khai báo tên chip # include option : toán tử tiêu chuẩn theo chip: * = dùng pointer bit ( tất PIC ) * = dùng pointer bit ( PIC14 PIC18 ) * = 16 duøng pointer 16 bit ( PIC14 ) ADC = x sử dụng ADC x bit ( , 10 , bit tuyø chip ) , dùng hàm read_adc( ) , trả giá trị x bit ICD = true : tạo mã tương thích debug phần cứng Microchip VD : #device * = 16 ADC = 10 / _ # ORG : # org start , end # org segment #org start , end { } Start , end: bắt đầu kết thúc vùng ROM dành riêng cho hàm theo sau , để riêng không dùng VD : Org 0x30 , 0x1F Void xu_ly( ) { } // hàm bắt đầu địa 0x30 org 0x1E00 anotherfunc( ) { } //hàm bắt đầu tuỳ ý 0x1E00 đến 0x1F00 Org 0x30 , 0x1F { } // đặt vùng ROM _Thường dùng ORG muốn tự xử lý ngắt CCS hay sinh nhiều mã lệnh xử lý trước nhảy vào thực thi hàm ngắt VD : Với 16F877 : vector ngắt 0x4 : # ORG 0x4 , 0x50 Void xu_ly_ngat( ) { } Hàm chèn địa 0x4h Khi có ngắt , PC nhảy tới 0x4h chạy tiếp tới gặp RETFIE ( đặt ASM ) trở vị trí chương trình trước xảy hàm ngắt Khi không dùng khai báo hàm ngắt #INT_ “ rối loạn tùm lum “ mã _Thường không dùng ORG / _ # USE : # USE delay ( clock = speed ) Speed : giá trị OSC mà bạn dùng VD: dùng thạch anh dao động 40Mhz : #use delay( clock = 40000000) _Chỉ có thị chương trình bạn dùng haøm delay_us ( ) vaø delay_ms( ) #USE fast_io ( port) Port : tên port :từ A-G ( tuỳ chip ) _Dùng chương trình dùng lệnh io output_low() , set với lệnh , nhanh so với không dùng thị _Trong hàm main( ) bạn phải dùng hàm set_tris_x( ) để rõ chân vào thị có hiệu lực , không chương trình chạy sai _Không cần dùng yêu cầu đặc biệt VD : # use fast_io( A ) #USE I2C ( options ) _Thiết lập giao tiếp I2C Option bao gồm thông số sau, cách dấu phẩy : Master : chip chế độ master Slave : chip chế độ slave SCL = pin : định chân SCL SDA = pin : định chân SDA ADDRESS =x : định địa chế độ slave FAST : định FAST I2C SLOW : định SLOW I2C RESTART_WDT : restart WDT chờ I2C_READ( ) FORCE_HW : sử dụng chúc phần cứng I2C ( chip hỗ trợ ) NOFLOAT_HIGH : không cho phép tín hiệu float high ( ??? ) , tín hiệu lái từ thấp lên cao SMBUS : bus dùng bus I2C , tương tự _VD : #use I2C ( master , sda=pin_B0 , scl = pin_B1 ) #use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW ) #USE RS232 ( options ) _Thiết lập giao tiếp RS232 cho chip ( có hiệu lực sau nạp chương trình cho chip , giao tiếp RS232 sử dụng để nạp chip ???) Option bao gồm : BAUD = x : thiết lập tốc độ baud rate : 19200 , 38400 , 9600 , PARITY = x : x= N ,E hay O với N : không dùng bit chẵn lẻ XMIT = pin : set chân transmit ( chuyển data) RCV = pin : set chân receive ( nhận data ) _Các thông số hay dùng , tham số khác bổ sung sau VD : #use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7) / _ Một số thị tiền xử lý khác : #CASE : cho phép phân biệt chữ hoa / thường tên biến #OPT n :với n=0 – : định cấp độ tối ưu mã , không cần dùng mặc định ( very tối ưu ) #PRIORITY ints : với ints danh sách ngắt theo thứ tự ưu tiên thực có nhiều ngắt xảy đồng thời , ngắt đứng đầu ngắt ưu tiên , dùng ngắt đưa ngắt vô Chỉ cần dùng dùng ngắt VD : #priority int_CCP1 , int_timer1 // ngắt CCP1 ưu tiên MỘT SỐ VẤN ĐỀ QUAN TRỌNG KHÁC – xem chi tiết phần HELP : _Biểu thức : xem HELP->Expressions , : biểu thị số C: 123 : số decimal 0x3 , 0xB1 : soá hex 0b100110 : soá binary ‘a’ : ký tự “abcd” : chuỗi , ký tự null thêm phía sau _Các toán tử C : xem Operators >= , < = , = = , != ( không ) && : and || : or ! : not ( đảo bit ) >>n : dịch trái n bit

Ngày đăng: 23/12/2013, 00:15

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan