CHNG5 lập TRÌNH c CHO VI điều KHIỂN PIC 16f877a

11 317 1
CHNG5 lập TRÌNH c CHO VI điều KHIỂN PIC 16f877a

Đ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

Chương 5:LẬP TRÌNH C CHO VI ĐIỀU KHIỂN PIC 16F877A 5.1 Giới thiệu chung C ngơn ngữ mạnh nhiều người dùng Nếu nói số lệnh C nhiều Nhưng lập trình cho vi xử lý, cần biết số lượng lệnh khơng nhiều Đầu tiên phải làm quen với: - Các kiểu tốn tử C - Các kiểu liệu - Cấu trúc chương trình - Các cấu trúc điều khiển (các tập lệnh chính) - Cấu trúc điều kiện: if …else… - Các cấu trúc lặp - Vòng lặp while - Vòng lặp do… while - Vòng lặp for - Lệnh break - Cấu trúc lựa chọn: switch… case - Biết sử dụng hàm chương trình Sau nghiên cứu lập trình C cho vi điều khiển PIC, sử dụng phần mềmCCS Cơ lập trình C cho vi điều khiển PIC 5.2 Các thị tiền xử lý Chúng ta nói thị tiền xử lý thường dùng: a/ _#INCLUDE : - Cú pháp : #include #include “ filename” + Filename : tên file cho thiết bị *.h , *.c Nếu định file đường dẫn khác thêm đường dẫn vào Chỉ thị ln phải có để khai báo chương trình viết cho vi điều khiển nào, ln đặt dòng - VD : #include // Chương trình sử dụng cho vi điều khiển 16F877 #include < C:\INCLUDES\COMLIB\MYRS232.C > b / _ # DEVICE : - Cú pháp: # DEVICE_Chip_Option + Chip : tên vi điều khiển sử dụng , khơng dùng tham số khai báo tên chip # include + Option : tốn tử tiêu chuẩn theo chip: * = dùng pointer bit ( tất PIC ) * = dùng pointer bit ( PIC14 PIC18 ) * = 16 dùng pointer 16 bit ( PIC14 ,PIC 18) ADC = x: sử dụng ADC x bit ( , 10 , bit tùy 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 HIGH_INTS = TRUE: cho phép dùng ngắt ưu tiên cao Lưu ý: Khai báo pointer bit, sử dụng tối đa 256 byte RAM cho tất biến chương trình Khai báo pointer 16 bit , sử dụng tồn dung lượng RAM có vi điều khiển.Vì vậy, nên dùng khai báo #device cho pointer ADC - VD : #device * = 16 ADC = 10 c/ _ # USE : c1/ _# USE delay ( clock = speed ) + Speed : giá trị OSC mà dùng - VD: dùng thạch anh dao động 40Mhz : #use delay( clock = 40000000) Chỉ có thị chương trình dùng hàm delay_us ( ) delay_ms( ) c2/ _#USE fast_io ( port) + Port : tên port: từ A-G ( tuỳ chip) Dùng thị 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ị này.Trong hàm main( ) 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 * Lưu ý: Khơng nên dùng thị khơng có u cầu đặc biệt - VD : # use fast_io( A ) // Dùng port A port xuất-nhập c3/ _#USE I2C ( options ) - Thiết lập giao tiếp I2C - Options 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 (nếu 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 khơng phải bus I2C , loại bus khác 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 ) c4/ _#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 , khơng phải 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 ) - VD : #use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7) d/ _ #ASM #ENDASM : - Cho phép đặt đoạn mã ASM thị CCS định nghĩa sẵn biến bit _RETURN_ để gán giá trị trả cho hàm từ đoạn mã Assembly - C đủ mạnh để thay Assmemly nên hạn chế lồng mã Assembly vào thường gây xáo trộn dẫn đến sau biên dịch mã chạy sai - Khi sử dụng biến khơng bank , CCS sinh thêm mã chuyển bank tự động cho biến Nếu sử dụng #ASM CCS khơng sinh thêm mã chuyển bank tự động, ta phải tự thêm vào mã ASM * Lưu ý : Mã Assembly phải theo mã tập lệnh vi điều khiển, khơng phải mã kiểu MPLAB - VD : int find_parity (int data) { int count; #asm movlw 0x8 movwf count movlw loop: xorwf data,w rrf data,f decfsz count,f goto loop movwf _return_ #endasm } e/ _#BIT id = x y + id : tên biến + x : biến C ( 8,16,32,…bit) hay số địa ghi + y : vị trí bit x Chỉ thị có tác dụng 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, dẫn đến thay đổi giá trị biến x - VD: #bit TMR1Flag = 0xb.2 //bit cờ ngắt timer1 địa 0xb.2 // Khi TMR1Flag = xố cờ ngắt timer1 int16 a=35; //a=00000000 00100011 #bit b= a.11 //b=0, b=a.0 b vị trí LSB // Sau : b=1; //a=00001000 00100011 = 2083 * Lưu ý: Khơng dùng được: if ( 0xb.2 ) mà phải khai báo dùng : if(TMR1Flag) f/ _#BYTE id = x + x: địa + id: tên biến C Chỉ thị có tác dụng 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ơngnê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 - VD: #byte port_b = 0xc6; // 16F877 :0xc6 địa portb port_b=120; // Giá trị ghi 0xc6=120 #byte status = 0xc3; g/ _# 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 - 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 CCP1 = 1133 ; // 1133(D) = 00000100 01101101 0x15 = 00000100; 0x16 = 01101101 h/ _# DEFINE id text + Text : chuỗi hay số - Dùng định nghĩa giá trị - VD : #define a 12345 i/ _ # ORG : - Cú pháp: # 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 { } // khơng có đặt vùng ROM - Thường khơng dùng ORG k/ _Một số thị tiền xử lý khác k1/ #CASE : cho phép phân biệt chữ hoa/ chữ thường tên biến, dành cho gười quen lập trình C k2/ #OPT n (n=0 – 9): định cấp độ tối ưu mã, khơng dùng mặc định k3/ #PRIORITY ints: 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 - Lệnh dùng sử dụng ngắt - VD : #priority int_CCP1 , int_timer1 // ngắt CCP1 ưu tiê 5.3 Khai báo biến, hằng,mảng - Khai báo biến: int1 số bit, giá trị TRUE (1) FALSE (0) int8 số ngun byte (8 bit) int16 số ngun 16 bit int32 số ngun 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.Nếu khơng dùng signed unsigned mặc định khơng dấu VD : Signed int8 a ; // số a số bit có dấu Signed int16 b; // số b số 16 bit có dấu Signed int32 c; // số c số 32 bit có dấu + Phạm vi biến : int8 :  255 int16 :  2^16-1 (32767) int32 :  2^32-1 signed int8 : -128 _127 signed int16 : -2^15_ 2^15-1 signed int32 : -2^31 _ 2^31-1 - Khai báo số: VD: int8 const a=231; // a số bit, có giá trị 231 - Khai báo mảng số: VD: int8 const a[5]= { 3,5,6,8,6 } ; // mảng phần tử, số mảng bắt // đầu từ 0: a[0]= 3; a[1]= 5… int32 số ngun 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 Nếu khơng dùng signed unsigned mặc định khơng dấu VD : Signed int8 a ; // số a số bit có dấu Signed int16 b; // số b số 16 bit có dấu Signed int32 c; // số c số 32 bit có dấu + Phạm vi biến : int8 : -255 int16 : _2^16-1 (32767) int32 : _2^32-1 signed int8 : -128 _127 signed int16 : -2^15 _ 2^15-1 signed int32 : -2^31 _ 2^31-1 - Khai báo số: VD: int8 const a=231; // a số bit, có giá trị 231 - Khai báo mảng số: VD: int8 const a[5]= { 3,5,6,8,6 } ; // mảng phần tử, số mảng bắt // đầu từ 0: a[0]= 3; a[1]= 5… 5.4 cấu trúc lệnh * Cấu trúc điều kiện: if….else - Cú pháp: If (điều kiện) s; else se; - Hoạt động: -Phần lệnh else thêm vào câu lệnh if để thị lệnh thực điều kiện (FALSE) * Cấu trúc lặp a/ Vòng lặp while Cú pháp: while(TRUE) {}; - Hoạt động vòng lặp mơ tả sau: - Tạo vòng lặp mãi Chương trình viết dấu ngoặc {}.Lệnh hay dùng chương trình vi xử lý b/ Vòng lặp do-while - Cú pháp: s; while(điều kiện); + s: câu lệnh Nếu khối lệnh thìphải đặt dấu ngoặc {} - Hoạt động: - Chức hồn tồn giống vòng lặp while trừ có điều điều kiện điều khiển vòng lặp tính tốn sau câu lệnh (khối lệnh) thực hiện, lệnh thực lần điều kiện khơng thoả mãn C/ Vòng lặp for - Cú pháp: for ( khởi động; điều kiện lặp; điều khiển) s; - Hoạt động vòng lặp for mơ tả qua hình sau: * Các lệnh rẽ nhánh lệnh nhảy a/ Lệnh break Sử dụng break khỏi vòng lặp điều kiện để kết thúc chưa thoả mãn Lệnh dùng để kết thúc vòng lặp khơng xác định hay buộc phải kết thúc chừng thay kết thúc cách bình thường b/ Lệnh continue Lệnh continue làm cho chương trình bỏ qua phần lại vòng lặp nhảy sang lần lặp c/ Lệnh goto Lệnh cho phép nhảy vơ điều kiện tới điểm chương trình Nên tránh dùng lệnh chương trình d/ Hàm exit Mục đích exit kết thúc chương trình trả mã xác định 3.2.4 Các hàm xử lý số - Bao gồm hàm: sin () hàm sin cos () hàm cosin tan () hàm tang asin () hàm arcsin acos () hàm arccos atan () hàm arctang Abs () lấy trị tuyệt đối ceil () làm tròn theo hướng tăng floor() làm tròn theo hướng giảm exp() tính e^x log() hàm logarit log10() hàm logarit số 10 pow() tính luỹ thừa sqrt() thức 5.5 Các hàm xử lý bit A/ Shift_right ( address , byte , value ) Shift_left ( address , byte , value ) - Dịch phải (trái) bit vào mảng hay cấu trúc Địa địa mảng hay địa trỏ tới cấu trúc Bit byte thấp LSB B/ Bit_clear (var , bit) - Bit_clear () dùng xóa (set = 0) bit định vị trí bit biến var - VD: int8 x; x=12; // x=1100 bit_clear(x, 2); // x=1000b= C/ Bit_set(var, bit) - Bit_set() dùng set bit định vị trí bit biến var + var: biến , 16 , 32 bit D/ Bit_test ( var , bit ) - Dùng kiểm tra vị trí bit biến var - Hàm trả giá trị bit var E / Swap(var ) + var : biến byte - Hàm tráo vị trí bit với bit var - Hàm khơng trả trị - VD : x= ; //x=00000101b swap ( x) ; //x = 01010000b = 80 F/ make8 (var, offset) - Hàm trích byte từ biến var + var: biến 8,16,32 bit + offset: vị trí byte cần trích ( 0,1,2,3) - Hàm trả giá trị byte cần trích - VD : int16 x = 1453 ; // x=0x5AD y = make(x, 1) ; // y= = 0x05 G/ make16 (varhigh, varlow) - Trả giá trị 16 bit kết hợp từ biến bit varhigh varlow Byte cao varhigh, byte thấp varlow H/ make32 (var1, var2, var3, var4) - Trả giá trị 32 bit kết hợp từ giá trị bit hay 16 bit từ var1 tới var4 Trong var2 đến var4 có khơng Giá trị var1 MSB, var2 Nếu tổng số bit kết hợp 32 bit thêm vào MSB cho đủ 32 bit - VD: int a=0x01 , b=0x02 , c=0x03 , d=0x04 ; int32 e ; e = make32 (a, b, c, d); // e=0x01020304 e = make32 (a, b, c, 5) ; // e=0x01020305 e = make32 (a, b, 8); // e=0x00010208 e = make32 ( a, 0x1237) ; // e=0x00011237 5.6 Các hàm delay - Để sử dụng hàm delay , cần có khai báo tiền xử lý đầu file VD: sử dụng OSC 20 Mhz, ta cần khai báo : #use delay(clock = 20000000) - Hàm delay khơng sử dụng timer Chúng thực nhóm lệnh ASM để thực thi từ đầu tới cuối xong khoảng thời gian mà bạn quy định Tuỳ thời gian delay u cầu dài ngắn mà CCS sinh mã phù hợp Có vài lệnh NOP cho thời gian nhỏ, hay vòng lặp NOP, gọi tới hàm phức tạp trường hợp delay dài Các lệnh khơng dùng vào việc mà kéo dài cho đủ thời ... 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 CCP1 = 1133 ; // 1133(D)... dung lượng RAM c vi điều khiển. Vì vậy, nên dùng khai báo #device cho pointer ADC - VD : #device * = 16 ADC = 10 c/ _ # USE : c1 / _# USE delay ( clock = speed ) + Speed : giá trị OSC mà dùng -... cho chương trình - VD: #byte port_b = 0xc6; // 16F877 :0xc6 địa portb port_b=120; // Giá trị ghi 0xc6=120 #byte status = 0xc3; g/ _# LOCATE id = x - Làm vi c #byte c thêm ch c bảo vệ không cho

Ngày đăng: 07/09/2017, 15:28

Hình ảnh liên quan

- Hoạt động của vịng lặp for được mơ tả qua hình sau: - CHNG5 lập TRÌNH c CHO VI điều KHIỂN PIC 16f877a

o.

ạt động của vịng lặp for được mơ tả qua hình sau: Xem tại trang 8 của tài liệu.

Từ khóa liên quan

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

Tài liệu liên quan