Giáo trình Vi điều khiển, vi xử lý có kết cấu nội dung gồm 7 chương, nội dung cuốn giáo trình giới thiệu đến các bạn những nội dung về vi điều khiển, vi xử lý, cấu trúc vi điều khiển Pic 16F, lập trình hợp ngữ, một số ứng dụng của vi điều khiển,...
GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU CHƯƠNG 1: GIỚI THIỆU VI ĐIỀU KHIỂN- VI XỬ LÝ Giới thiệu vi điều khiển PIC 1.1 Giới thiệu vi điều khiển Bộ vi điều khiển viết tắt Micro-controller mạch tích hợp chip lập trình được, dùng để điều khiển hoạt động hệ thống Theo tập lệnh người lập trình, vi điêu khiển tiến hành đọc, lưu trữ thông tin, xử lý thông tin, đo thời gian tiến hành đóng mở cấu Trong thiết bị điện điện tử, vi điều khiển điều khiển hoạt động ti vi, máy giặt, đầu đọc lase, lò vi ba, điện thoại …Trong hệ thống sản xuất tự động, vi điều khiển sử dụng robot, hệ thống đo lường giám sát Các hệ thống thơng minh vai trò vi điều khiển ngày quan trọng Hiện thị trường có nhiều họ vi điều khiển như: 6811 Motorola, 8051 Intel, Z8 Zilog, PIC Microchip Technology 1.2 Giới thiệu vi điều khiển PIC PIC bắt nguồn từ chữ viết tắt “Programmable Intelligent Computer” ( Máy tính khả trình thơng minh) sản phẩm hãng General Instrument đặt cho dòng sản phẩm họ PIC 1650 Lúc Pic dùng để giao tiếp với thiết bị ngoại vi cho máy chủ 16 bit CP1600, người ta gọi PIC với tên “ Peripheral Interface Controller” ( điều khiển giao tiếp ngoại vi) Năm 1985 General Instrument bán phận vi điện tử họ, chủ sở hữu (Microchip Technology) huỷ bỏ hầu hết dự án – lúc lỗi thời Tuy nhiên PIC bổ sung EEPROM để tạo thành điều khiển vào khả trình Ngày có nhiều dòng PIC sản xuất với hàng loạt modul ngoại vi tích hợp sẵn ( :USART, PWM, ADC…) với nhớ chương trình từ 512 word đến 32k word PIC sử dụng tập lệnh RISC, với dòng PIC low-end (độ dài mã lệnh 12 Bit ví dụ PIC12Cxxx) mid-range (độ dài mã lệnh 14 bit , ví dụ PIC16Fxxx), tập lệnh bao gồm khoảng 35 lệnh, 70 lệnh dòng PIC high-end( có độ dài mã lệnh 16bit NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU PIC18Fxxxx) Tập lệnh bao gồm lệnh tính tốn ghi, số, vị trí nhớ, có lệnh điều kiện, nhảy/ gọi hàm, lệnh quay trở về, có chức phần cứng khác ngắt sleep( chế độ hoạt động tiết kiệm điện ) Microchip cung cấp mơi trường lập trình MPLAB0, bao gồm phần mềm mơ trình dịch ASM Hiện có nhiều dòng PIC có nhiều khác biệt phần cứng, điểm qua vài nét sau : 8/16/24/32 bit CPU, xây dựng theo kiến trúc Harvard Flash Rom tuỳ chọn 256 byte đến 256 kbybe Bộ nhớ nội EEPROM - ghi/ xoá lên tới hàng triệu lần Các cổng xuất/nhập (mức lôgic thường từ 0v đến 5v, ứng với mức logic 1, dòng khoảng vài chục mA) 8/16 bit timer Modun giao tiếp ngoại vi nối tiếp không đồng bộ: USART Modun giao tiếp ngoại vi song song (kiểu máy in) Bộ chuyển đổi ADC 10 bit nội gồm kênh đầu vào Module ngoại vi MSSP dùng cho giao tiếp I2C, SPI Modul CCP có chức o Comparator (so sánh) o Capture o PWM: dùng điều khiển động Một số dòng vi điều khiển PIC hỗ trợ thêm: Hỗ trợ điều khiển động pha, pha Hỗ trợ giao tiếp USB Hỗ trợ điều khiển Ethernet Hỗ trợ giao tiếp CAN Hỗ trợ giao tiếp LIN Hỗ trợ giao tiếp IRDA DSP tính xử lý tín hiệu số NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU 1.3 Các thành phần mạch ứng dụng vi điều khiển PIC: 1.4 Các khái niệm bản: Cổng xuất nhập I/O: Trong vi điều khiển PIC16F877A có cổng: Cổng A gồm chân: RA0, RA1 RA5 Cổng B gồm chân: RB0, RB1, RB7 Cổng C gồm chân: RC0, RC1, RC7 Cổng D gồm chân: RD0, RD1, RD7 Cổng E gồm chân: RE0, RE1, RE2 Mỗi cổng thực chất quản lý ghi PORTA, PORTB, PORTC, PORTD, PORTE nằm nhớ RAM vi điều khiển Xem hình sau: NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU Bộ nhớ RAM vi điều khiển PIC 16F877A gồm bank nhớ Nhìn vào bank nhớ ta thấy ghi đặt tên ghi đa mục đích (General Purpose Register) Các ghi đặt tên ghi đặc biệt dùng để điều khiển, quản lý thể trạng thái khối chức vi điều khiển ví dụ PORTA NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU đại diện cho chân cổng A, PORTB đại diện cho chân cổng B v.v Các ghi có địa xác định khơng dùng cho mục đích khác Các ghi đa mục đích dùng để đặt biến chương trình ứng dụng vi điều khiển Nhìn vào đồ nhớ RAM, ta thấy biến đặt từ địa 20F đến 7Fh bank nhớ 0, A0h-EFh, 120h-16Fh, 1A0h-1EFh Trở lại vấn đề cổng, tới ta đưa nhận xét: Thanh ghi PORTA phản ánh trạng thái chân cổng A, nghĩa muốn tín hiệu đầu chân cổng A ta việc đưa giá trị vào bit tương ứng ghi PORTA Cũng đọc giá trị ghi PORTA ta biết trạng thái chân cổng A Ví dụ: Muốn RA0 mức logic (mức 5V), RA1 mức logic (mức 0V), RA2 mức logic 1, RA3 mức logic 0, RA4 mức logic 1, RA5 mức logic 1, ta việc gán giá trị 000110101 cho ghi PORTA X X 1 RA5 RA4 RA3 RA2 RA1 RA0 X: không quan tâm Tương tự với PORTB,PORT C,PORTD,PORTE Tính đa chức chân vi điều khiển: Nhìn vào sơ đồ chân vi điều khiển, ta thấy số chân vi điều khiển có tên gồm nhiều phần với dấu gạch chéo Ví dụ: RA0/AN0, RC7/RX/DT, RC6/TX/CK Đây tính đa chức chân vi điều khiển hay gọi dồn kênh Ý nghĩa là: Bình thường khơng cài đặt tấc chân cổng A, B, C, D, E chân vào số I/O Nếu chương trình ta có cài đặt chức RS232, ADC PWM v.v chân tương ứng với chức hoạt động theo chức Khi chân khơng dùng làm chân vào số bình thường NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU Ví dụ: bình thường chân RA0/ANO chân vào số RA0, chức ADC với kênh vào tín hiệu analog kênh cài đặt chân RA0 /AN0 chân vào ADC, tức hoạt động theo chức AN0 Tương tự vậy, cài đặt giao tiếp với thiết bị ngoại vi theo chuẩn RS232, chân vào số RC7/RX/DT hoạt động đầu vào liệu RS232 tức chức RX chân Cài đặt vào/ra cho chân vào số cổng: Các chân vào/ra số vi điều khiển PIC phải cài đặt chân vào chân hoạt động chức Việc chân cổng X (X=A,B, E) qui định đầu hay đầu vào phụ thuộc vào bit tương ứng ghi TRISX (X=A,B, E) hay Ví dụ: Muốn chân thấp (bit thấp) cổng B (RB0-RB3) chân vào, chân cao (bit cao) cổng B (RB4-RB7) chân giá trị bit ghi TRISB là: 0 0 1 Gợi ý dễ nhớ là: Để chân RB.m (m=0-7) đầu ra, tức Output giá trị TRISB.m Là đầu vào, tức Input giá trị TRISB.m Tương tự chân cổng lại NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA 1 GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU CHƯƠNG 2: CẤU TRÚC VI ĐIỀU KHIỂN PIC 16F 2.1 Cấu trúc chung: Hình 1: Cấu trúc chung vi điều khiển Cấu tạo vi điều khiển chia làm phần sau: - Phần lõi: gồm điều khiển trung tâm có chức chạy chương trình (gồm câu lệnh) nạp vào nhớ chương trình (program memory) trước NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ - GV: TRẦN THÁI ANH ÂU Phần ngoại vi: gồm có timer, biến đổi tương tự số ADC modun khác Phần lõi vi điều khiển chịu trách nhiệm chạy chương trình vi điều khiển quản lý toàn hoạt động khác bao gồm hoạt động ngoại vi Vi điều khiển chạy chương trình gồm lệnh nhớ chương trình, địa lệnh nằm ghi đếm chương trình PC, lúc khởi động PC=0, sau thực lệnh PC=PC+1 vi điều khiển chạy lệnh chương trình Lệnh vi điều khiển nhớ thực mã hóa lệnh thành 14 bit Quá trình thực lệnh gồm bước: - Lệnh nhớ chương trình đưa vào ghi lệnh (địa lệnh nằm ghi PC) Sau lệnh đưa vào giải mã điều khiển để giải mã lệnh Trên sở đó, vi điều khiển biết lệnh lệnh gì, thao tác với liệu nào, phép thao tác v.v.v Trên sở đó, lệnh thao tác với liệu chứa ghi RAM, điều khiển điều khiển đọc liệu RAM đưa vào xử lý số học logic ALU, phép toán thực qua trung gian ghi làm việc W, trình kết thúc kết trả liệu cho chương trình, PC tăng lên đơn vị, vi điều khiển nhảy đến lệnh kế tiếp, tiếp tục chu lệnh NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU 2.2 Bộ nhớ vi điều khiển pic 16f877A Bộ nhớ vi điều khiển PIC chia làm phần: - Bộ nhớ chương trình-FLASH: chứa nội dung chương trình chạy vi điều khiển Bộ đếm chương trình PC (Program counter) thực lệnh chứa nhớ chương trình theo thứ tự từ xuống - Bộ nhớ liệu tạm thời- RAM : Gồm phần: ghi đặc biệt-SFR (Special Function Register) - ghi chức thể trạng thái, điều khiển khối bên vi điều khiển PIC (các ghi trạng thái chân vi điều khiển PORTA v.v, Các ghi Status v.vv, TMR0 cho timer v.v ) Các ghi mục đích chung GPR (general purpose register) nơi lưu giá trị tạm thời, nơi mà biến chương trình nằm - Bộ nhớ liệu không nội dung- EEPROM cho phép chứa liệu liệu không nội dung điện (phần xem thiết bị ngoại vi) 2.2.1 Bộ nhớ chương trình: Bộ nhớ chương trình nơi chứa lệnh mã hóa Q trình mã hóa thực khâu dịch chương trình máy tính file hex nạp chương trình vào nhớ chương trình Mỗi lệnh mã hóa chứa ghi 14 bit nhớ chương trình Như hình dung nhớ chương trình ta có hình ảnh sau: NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU Chương trình vi điều khiển chạy theo thứ tự từ địa thấp đến địa cao, địa lệnh nội dung ghi đếm chương trình PC (Program Counter) Đối với pic16f877a, ghi PC có độ dài 13 bit Nếu dùng bit địa ta phân biệt địa chỉ: 00,01,10,11 Nếu dùng bit địa ta phân biệt địa chỉ: 000,001,010,011,100,101,110,111 Suy ra, PC dùng 13 bit địa ta phân biệt 2^13= 2^3 x 2^10=8K địa Khi bật nguồn cho vi điều khiển (hay ấn nút reset chương trình), PC xóa Sau thực xong lệnh nội dung PC tăng lên đơn vị: PC=PC+1 (trừ số lệnh đặc biệt gọi chương trình con, goto v.v.v) Do vi điều khiển thực lệnh địa chứa ghi PC nên theo phân tích nói, vi điều khiển thực lệnh từ địa thấp đến địa cao 2.2.2 Mã hóa giải mã lệnh: NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU D: Số bit liệu 8, mặc định S: số bit STOP, 1,1.5 Ví dụ: MSCOMM1.Setting= “9600,O,8,1” + CommPort: dạng object.CommPort = value Value số cổng Com có giá trị từ ‐> 16 mặc định có giá trị =1 Các bạn cần phải thiết lập thông số trước mở cổng Sẽ có lỗi error 68 (Device unavailable) không mở cổng + InBuferSize: thiết lập trả lại kích thước đệm nhận, tính = byte Mặc định 1024 byte Các bạn không nhầm lẫn với đặc tính InBufferCount số byte chờ đệm nhận + InputLen : object.InputLen [ = value ] thiết lập trả lại số byte lần thuộc tính Input đọc đệm nhận Mặc định giá trị Value=0 tức thuộc tính Input đọc hết nội dung đệm nhận thuộc tính gọi Nếu số kí tự đệm nhận khơng = InputLen thuộc tính Input trả lại kí tự rỗng “” Ví bạn cần phải chọn cách kiểm tra InBufferCount để chắn số kí tự u cầu có đủ trước dùng lệnh Input Tính chất có ích đọc liệu máy mà liệu định dạng khối có kích thước cố định + InputMode: object.InputMode [ = value ] Value = hay = comInputModeText liệu nhận dạng văn kiểu kí tự theo chuẩn ANSI Dữ liệu nhận sâu Value=1 hay = comInputModeBinary dùng nhận kiểu liệu kí tự điều khiển nhúng, kí tự NULL, Giá trị nhận từ Input mảng kiểu Byte + OutBuferSize: giống InBuferSize, mặc định 512 + ParityReplace: thiết lập trả lại kí tự thay kí tự khơng lỗi giống + PortOpen: thiết lập trả lại tính trạng cổng(đóng mở) object.PortOpen [ = value ] value = true cổng mở value =false cổng đóng xóa tồn liệu đệm nhận truyền Cần phải thiết lập thuộc tính CommPort với tên cổng trước mở cổng giao tiếp Thêm vào đó, cổng giao tiếp thiết bị bạn phải hỗ trợ giá trị thuộc tính Setting thiết bị bạn hoạt động đúng, khơng hoạt động dở khơng nói chạy khơng tốt Đường DTR RTS giữ lại trạng thái cổng NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU + RthresHold: object.Rthreshold [ = value ] value kiểu số nguyên Thiết lập số kí tự nhận trước gây lên kiện comEvReceive Mặc định = tức khơng có kiện OnComm nhận liệu Thiết lập = tức kiện OnComm xảy kí tự chuyển đến đệm nhận + Settings: object.Settings [ = value ] thiết lập trả lại thơng số tần số baud, bít liệu, bít chẵn lẻ, bít stop Nếu Value khơng có giá trị mở gây lỗi 380 (Invalid property value) + SThreshold: thiết lập và trả lại số kí tự nhỏ cho phép đệm gửi để xảy kiện OnComm = comEvSend Theo mặc định giá trị = tức truyền không gây kiện OnComm Nếu thiết lập thơng số =1 kiện OnComm xảy đệm truyền rỗng Sự kiện OnComm = comEvSend xảy mà số kí tự đệm truyền nhỏ = Sthreshold Nếu số kí tự đệm ln lớn Sthreshold kiện xảy Truyền nhận liệu: + CommEvent: trả lại phần lớn kiện giao tiếp có lỗi CommEvent xảy có lỗi xảy kiện Sau số số lỗi: Sự kiện Giá trị Miêu tả kiện comEventBreak 1001 Xảy nhận tín hiệu Break comEventFrame 1004 Lỗi hệ thống Phần cứng phát lỗi hệ thống comEventOverrun 1006 Xảy cổng tự tràn( Overrun) Một kí tự khơng đọc từ phần cứng trước kí tự tới kí tự bị comEventRxOver 1008 Xảy đệm nhận bị tràn Khơng có đủ chỗ cho liệu đệm nhận comEventRxParity 1009 Lỗi Parity Phần cứng phát lỗi Parity comEventTxFull xảy đệm truyền bị đầy Bộ đệm truyền bị đầy 1010 ghi liệu lớn vào đệm comEventDCB 1011 Một lỗi không mong muốn khôi phục lại lỗi điều khiển thiết bị( DCB – Device Control Block) cho cổng Một số kiện : Sự kiện comEvSend Giá trị Miêu tả kiện Xảy số kí tự đệm truyền nhỏ giá trị NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU SthresHold comEvReceive Xảy đệm nhận số kí tự giá trị RthresHold Sự kiện tạo liên tục bạn dùng thuộc tính Input để lấy hết liệu từ đệm nhận RcomEvCTS Xảy có thay đổi đường CTS( Clear To Send) comEvDSR Xảy thay đổi đường DSR( Data Set Ready) Sự kiện xảy đường DSR thay đổi từ ‐> comEvCD Xảy có thay đổi đường CD( Carrier Detect) comEvRing Phát chuông (Ring).Một số UART không hỗ trợ Xảy nhận kí tự kết thúc file ( kí tự 26 bảng mã kiện comEvEOF ASCII) + EOFEnable : object.EOFEnable [ = value ] định hành động MSComm tìm thấy kí tự kết thúc file Nếu value=true tìm thấy kí tự kết thúc file gây lên kiện comEvEOF OnCommEvent Nếu value= false khơng gây lên kiện + InBufferCout: trả lại số kí tự có đệm nhận Bạn xố đệm nhận cách đặt thuộc tính =0 Khơng nhầm với thuộc tính InBufferSize tổng kích thước đệm nhận + Input: nhận xoá liệu đệm nhận Nếu InputMode comInputModeText giá trị trả xâu tức có kiểu String , liệu dạng text biến kiểu Variant Nếu InputMode = comInputModeBinary thuộc tính trả lại liệu dạng nhị phân dạng mảng kiểu byte biến Variant + OutBufferCount: trả lại số kí tự đệm truyền + Output: ghi liệu vào đệm truyền truyền kiểu text kiểu nhị phân Nếu truyền kiểu text cho biến Variant = kiểu String, truyền kiểu nhị phân cho cho Output= variant = mảng kiểu Byte NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU 7.14.3 Các bước để thực việc truyền nhận từ máy tính dùng VB: Cài đặt thuộc tính Setting qui định tốc độ truyền khung truyền Ví dụ: MSCOMM1.Setting= “9600,N,8,1” Qui định thuộc tính RThreshold xác định số kí tự nhận đệm nhận làm phát sinh kiện Oncomm Ở nói thêm kiện Oncomm: Đây kiện lỗi, kiện đệm nhận nhận N kí tự (N= RThreshold), kiện đệm truyền truyền N kí tự (N=SThreshold) v.v Vì vậy, ta muốn sau đệm nhận nhận N kí tự tiến hành lấy liệu vào biến để xử lý ta phải cài đặt trước thuộc tính RThreshold N: MSCOMM1.RThreshold=N Và có N kí tự đến đệm nhận, kiện OnComm xảy chương trình VB nhảy vào hàm Private Sub MSComm1_OnComm() Thân hàm End Sub Trong thân hàm, ta xử lý liệu Ví dụ đọc liệu vào biến: Biến= MSCOMM1.INPUT Qui định dạng liệu nhận dạng Text hay Binary thuộc tính InputMode Ví dụ: Nhận dạng liệu dạng Binary mscomm1.InputMode= comInputModeBinary Nhận liệu dạng Text MSComm1.InputMode=comInputModeText NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU Muốn truyền liệu dùng thuộc tính Output o MSCOMM1.Output= chuỗi cần truyền 7.15 Phần mềm vi điều khiển: Sử dụng phần mềm CCS để lập trình cho vi điều khiển PIC Các phần cần thiết muốn giao tiếp với máy tính : - Khai báo tốc độ thạch anh dùng, sai không truyền #use delay(clock=4000000) - // Dùng thạch anh 4MHZ Khai báo cài đặt truyền thông cho vi điều khiển theo chuẩn RS 232 sử dụng #use rs232 (tham số cài đặt 1, tham số cài đặt 2,… ) Các tham số cài đặt có nhiều, quan tâm đến số tham số sau: o BAUD=x: Tốc độ truyền, hay dùng 9600 19200 Lưu ý tốc độ truyền phải giống cài đặt máy tính Ví dụ: BAUD=9600 o XMIT= Pin: Qui định chân truyền liệu chân chức vi điều khiển, ví dụ: vi điều khiển 16F RC6 Ví dụ: XMIT=PIN_C6 o RCV= Pin: Qui định chân nhận liệu chân chức vi điều khiển, ví dụ: vi điều khiển 16F RC7 Ví dụ: RCV=PIN_C7 o Parity=x: Khai báo dạng kiểm tra chẵn lẻ, x= N, E O Lưu ý phải giống cài đặt Parity phần mềm máy tính Ví dụ: Parity=N o Bits= n: Số bit liệu, NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ o - GV: TRẦN THÁI ANH ÂU Stop=n: Số bit Stop, mặc định Hàm nhận liệu: o KBhit(): cho biết trạng thái đệm nhận có liệu hay khơng Bằng chưa có liệu đến Bằng có liệu đến Cú pháp: value= KBhit() o Getc(): Cú pháp: value=getc() Hàm đợi vi điều khiển nhận kí tự đọc kí tự vào biến value Vì hàm đợi nhận kí tự nên không muốn thời gian đợi ta nên dùng hàm Kbhit() để xem vi điều khiển nhận kí tự hay khơng trước dùng hàm để đọc kí tự - Hàm truyền chuỗi kí tự: Printf() Cú pháp: Printf(Chuỗi kí tự cần truyền) Hàm truyền chuỗi kí tự từ vi điều khiển Có thể định dạng chuỗi kí tự cần truyền %nt n số kí tự cần truyền ví dụ: %2.3 nghĩa truyền kí tự phần nguyên kí tự thập phân t dạng truyền, dạng sau: c Character s String or character u Unsigned int d Signed int Lu Long unsigned int NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU Ld Long signed int x Hex int (lower case) X Hex int (upper case) Lx Hex long int (lower case) LX Hex long int (upper case) f Float with truncated decimal g Float with rounded decimal e Float in exponential format w Unsigned int with decimal place inserted Specify two numbers for n The first is a total field width The second is the desired number of decimal places - Hàm truyền kí tự: Putc() Cú pháp: Putc(kí tự cần truyền) 7.16 Ví dụ truyền liệu máy tính vi điều khiển: (Xem file đính kèm- dài q- khơng có tiền in- chịu khó cóp nhé- sorry) NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU CHƯƠNG 7: MỘT SỐ ỨNG DỤNG CỦA VI ĐIỀU KHIỂN ỨNG DỤNG 3: CHUẨN GIAO TIẾP I2C- CHIP ĐỒNG HỒ THỜI GIAN THỰC DS1307 7.17 Cuẩn giao tiếp I2C: a Sơ đồ chuẩn giao tiếp I2C: Chuẩn giao tiếp I2C chuẩn giao tiếp dây: gồm tín hiệu SDA(tín hiệu liệu) tín hiệu xung Clock SCL Chuẩn giao tiếp I2C có giao thức kiểu Master/Slaver Trong đó, thiết bị chủ điều khiển hoạt động trình giao tiếp Các ưu điểm: - Đơn giản, tốc độ truyền nhanh - Giao diện nối tiếp - Đồng - Hai chiều I2C giao tiếp đồng bộ: - Dữ liệu truyền theo tín hiệu xung clock (SCL) - Tín hiệu SCL điều khiển liệu thay đổi liệu đọc I2C giao tiếp master/slaver: - Master nơi phát xung clock (SCL), điều khiển q trình truyền nhận - Tín hiệu xung clock (SCL) chung cho tấc Slaver - Slaver đưa tín hiệu SCL xuống mức thấp để ngăn chặn truyền I2C giao tiếp chiều: Cùng thời điểm, hai thiết bị truyền nhận liệu Tuy nhiên, Master qui định luồng liệu truyền b Mức tín hiệu: Chuẩn giao tiếp I2C sử dụng dây tín hiệu : - SDA: Serial DAta, tín hiệu liệu nối tiếp, truyền liệu đến từ Master SCL: Serial Clock, tín hiệu xung đồng hồ qui định liệu đọc liệu ghi Tín hiệu Master điều khiển Các trạng thái đặc biệt tạo nên giao tiếp I2C là: - - Start: kí hiệu S NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ - stop: kí hiệu P - Data: liệu: NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GV: TRẦN THÁI ANH ÂU GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU - Kết thúc trạng thái stop, SCL SDA lên mức cao cho biết trạng thái đường truyền rỗi c Khung truyền: - Ghi liệu từ Master đến Slaver: - Đọc liệu từ Slaver: 7.18 Chip đồng hồ thời gian thực: Hình dáng: Sơ đồ kết nối NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU Các ghi chức năng: Qui trình gửi lệnh để ghi byte từ vi điều khiển đến DS1307: - Tạo trạng thái Start: i2c_start(); - Gửi địa DS1307: địa mặc định 0xd0 với bit qui đinh hướng truyền liệu, 0: i2c_write(0xd0); - Gửi địa byte nhớ DS1307 cần ghi: i2c_write(address); - Gửi liệu đến DS1307: i2c_write(data); NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU - Tạo trạng thái Stop: i2c_stop(); Qui trình gửi lệnh để đọc byte liệu từ DS1307 lên vi điều khiển: - Tạo trạng thái Start: i2c_start(); - Gửi địa DS1307: địa mặc định 0xd0: i2c_write(0xd0); - Gửi địa byte nhớ DS1307 cần ghi: i2c_write(address); - Tạo lại trạng thái Start: i2c_start(); - Gửi địa DS1307: địa mặc định 0xd0 với bit qui đinh hướng truyền liệu, 1: i2c_write(0xd1); - Dùng lệnh đọc liệu: data=i2c_read(0); - Tạo trạng thái Stop: i2c_stop(); Chương trình mẫu: Chương trình chính: #include #use delay(clock=8000000) #fuses HS,NOWDT,NOPROTECT,NOLVP #include "ds1307.c" #include void main(void) { int8 sec,min,hour,day,date,month,year; char second_digit1, second_digit2, min_digit1, min_digit2,hour_digit1,hour_digit2; write_ds1307(0,sec & 0x7F); // enable oscillator(bit =0) lcd_init(); //write_ds1307(2,0x15); while(true) NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ { sec=read_ds1307(0); // read second min=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour second_digit2 = (sec / 0x10) ; second_digit1 = (sec % 0x10) ; min_digit2 = (min / 0x10) ; min_digit1 = (min % 0x10); hour_digit2= (hour/0x10); hour_digit1=hour%0x10; lcd_putcmd(0x80); printf(lcd_putchar,"RTC: "); printf(lcd_putchar,"%u",hour_digit2); printf(lcd_putchar,"%u",hour_digit1); printf(lcd_putchar," : "); printf(lcd_putchar,"%u",min_digit2); printf(lcd_putchar,"%u",min_digit1); printf(lcd_putchar,": "); printf(lcd_putchar,"%u",second_digit2); printf(lcd_putchar,"%u",second_digit1); delay_ms(500); NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GV: TRẦN THÁI ANH ÂU GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ } } Chương trình DS1307.c #define DS1307_SDA PIN_C4 #define DS1307_SCL PIN_C3 #use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL) //========================== // KHOI TAO DS1307 //========================== void init_DS1307() { output_float(DS1307_SCL); output_float(DS1307_SDA); } //========================== // GHI BYTE ĐẾN DS1307 //========================== void write_DS1307(byte address, BYTE data) { short int status; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_write(data); i2c_stop(); i2c_start(); NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GV: TRẦN THÁI ANH ÂU GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ status=i2c_write(0xd0); while(status==1) { i2c_start(); status=i2c_write(0xd0); } } //========================== //DOC BYTE TU DS1307 //========================== BYTE read_DS1307(byte address) { BYTE data; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_start(); i2c_write(0xd1); data=i2c_read(0); i2c_stop(); return(data);} } NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GV: TRẦN THÁI ANH ÂU ... THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU 2.2 Bộ nhớ vi điều khiển pic 16f877A Bộ nhớ vi điều khiển PIC chia làm phần: - Bộ nhớ chương trình- FLASH:... HĨA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ - GV: TRẦN THÁI ANH ÂU Phần ngoại vi: gồm có timer, biến đổi tương tự số ADC modun khác Phần lõi vi điều khiển chịu trách nhiệm chạy chương trình vi điều. .. Variable count3 - GV: TRẦN THÁI ANH ÂU Dùng dẫn cblock: Cblock địa Biến1, biến 2, NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU Endc Ví dụ: