Lập trình vđk pic với mplab c18

1.1 Giới thiệu

MPLAB IDE là phần mềm được hỗ trợ bởi Microchip, dùng để soạn thảo code cho các ứng dụng

của PIC. Hiện tại, tháng 8/2010 MPLAB IDE đã có phiên bản 8.51. Trong tài liệu này tôi chọn

phiên bản 8.36 vì nó có khá nhiều lỗi về cấu hình .Các phiên bản khác như 8.43, bạn có thể

không chọn cấu hình ban đầu nhưng bản thân nó có thể tự động tìm kiếm các thư viện cần

thiết trong quá trình biên dịch. Với phiên bản 8.36chúng ta phải cấu hình toàn bộ cho IDE.

1.2 Cài đặt MPLAB IDE 8.36

Bước 1: Double Click vào file setup trong thư mục MPLAB IDE 8.36. Màn hình Welcome sẽ

hiện ra như sau. Bạn chọn Next để tiếp tục.

pdf121 trang | Chia sẻ: Mr Hưng | Lượt xem: 1005 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Lập trình vđk pic với mplab c18, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
aller là 16 (T2CKPS1 = 1), thì giá trị của PR2 là PR2 = 20MHz/ (4 * 16 * 2KHz) - 1 ~ 155 12.2.2 Thiết lập PWM Duty Cycle Duty Cycle của CCP1 được thiết lập trong 2 thanh ghi CCPR1L (8bit) và 2 bit DC1B1:0 trong thanh ghi CCP1CON. Tuy nhiên đối với động cơ nhỏ thì với 8 bit là đủ, ta có thể để mặc định DC1B1:0 = 00 ngay khi khởi tạo. Giá trị của CCPR1L càng cao thì duty cycle càng lớn, và như vậy điện áp ngõ ra của CCP1 (RC2) càng cao. Sau khi đã thiết lập xong 2 thông số trên, các bước còn lại là thiết lập chiều output cho chân RC2, cho phép timer2 đếm bằng cách set bit TMR2ON lên 1, và cấu hình CCP1CON là chế độ Single PWM. 12.3 Xây dựng chương trình Kiến trúc chương trình gồm có 2 module chính PWM và LCD. Hình 12.2 : Kiến trúc chương trình PWM Module PWM gồm có 2 file pwm.h khai báo các interface và pwm.c để hiện thực các interface đó. Interface trong pwm.h như sau: Code: #ifndef _PWM_H_ #define _PWM_H_ #include void init_pwm(); void set_DC(unsigned char duty_cycle); #endif 12.3.1 Hàm init_pwm Hàm này hiện thực quá trình khởi động cho module PWM. Trước tiên là cấu hình prescaller cho timer2, nạp giá trị PWM Period và chọn chế độ PWM trong thanh ghi CCP1CON. Code: 91 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH void init_pwm() { T2CONbits.TMR2ON = 0; //turn off timer2 T2CONbits.T2CKPS0 = 0; T2CONbits.T2CKPS1 = 1; //prescaler 1:16 PR2 = 155; //PWM period CCP1CONbits.DC1B0 = 0; //PWM duty cycle CCP1CONbits.DC1B1 = 0; //2 bits LSB CCPR1L = 0x00; //8bits MSB CCP1CONbits.P1M0 = 0; //PWM single mode CCP1CONbits.P1M1 = 0; CCP1CONbits.CCP1M0 = 0;//select PWM function CCP1CONbits.CCP1M1 = 0; CCP1CONbits.CCP1M2 = 1; CCP1CONbits.CCP1M3 = 1; TRISCbits.TRISC2 = 0; //config RC2 output T2CONbits.TMR2ON = 1; //start timer2 } 12.3.2 Hàm set_DC Hàm này chỉ đơn giản là thiết lập duty cycle trong thanh ghi CCPR1L. Giá trị trong thanh ghi này càng cao thì áp ra ở chân RC2 càng cao, giá trị tối đa là 255 tương ứng với khoảng 5V. Code: void set_DC(unsigned char duty_cycle) { CCPR1L = duty_cycle; } Chương trình demo cho phần này được hiện thực trong thư mục Bai13_PWM. Hàm main sẽ tăng dần duty cycle lên và động cơ sẽ quay nhanh dần. Giá trị của duty cycle (hay tốc độ của động cơ) sẽ được hiển thị ra LCD. 12.4 Code mẫu Download tại đây 92 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Bài 16 : Giao tiếp UART RS232 13.1 Nguyên lý giao tiếp UART Uart RS232 là chuẩn giao tiếp khá phổ biến và được hỗ trợ ở hầu hết các dòng vi điều khiển vì khoảng cách xa và chi phí thấp. Dòng 8051 hỗ trợ 1 kênh giao tiếp uart. Dữ liệu được truyền đi trên chân TX gồm 1 start bit (mức 0), data và 1 stop bit (mức 1). Tốc độ truyền : đơn vị bit per second (bps) còn gọi là Baud (số lần thay đổi tín hiệu trong 1 giây – thường sử dụng cho modem). Đối với đường truyền thì Baud và bps là như nhau. UART là phương thức truyền nhận bất đồng bộ. nghĩa là bên nhận và bên phát không cần phải có chung tốc độ xung clock (ví dụ : xung clock của vi điều khiển khác xung clock của máy tính) . Khi đó bên truyền muốn truyền dữ liệu sẽ gửi start bit (bit 0) để báo cho bên thu biết để bắt đầu nhận dữ liệu và khi truyền xong dữ liệu thì stop bit (bit 1) sẽ được gửi để báo cho bên thu biết kết thúc quá trình truyền. Khi có start bit thì cả hai bên sẽ dùng chung 1 xung clock (có thể sai khác một ít) với độ rộng 1 tín hiệu (0 hoặc 1) được quy định bởi baud rate, ví dụ baud rate = 9600bps nghĩa là độ rộng của tín hiệu 0(hoặc 1) là 1/9600 = 104 ms và khi phát thì bên phát sẽ dùng baud rate chính xác (ví dụ 9600bps) còn bên thu có thể dùng baud rate sai lêch 1 ít(9800bps chẳng hạn). Truyền bất đồng bộ sẽ truyển theo từng frame và mỗi frame có cấu trúc như sau: Ngoài ra trong frame truyền có thể có thêm bit odd parity (bit lẻ) hoặc even parity (bit chẵn) để kiểm tra lỗi trong quá trình truyền. Bit parity này có đặc điểm nếu sử dụng odd parity thì số các bit 1 + odd parity bit sẽ ra 1 số lẻ còn nếu sử dụng even parity thì số các bit 1 + even parity bit sẽ ra 1 số chẵn. 13.2 Giao tiếp UART với máy tính Để giao tiếp COM giữa vi điều khiển và máy tính, ta kết nối mạch theo sơ đồ như sau: 93 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Hình 13.1 : Kết nối máy tính và vi điều khiển Do mức điện áp của tín hiệu logic 1/0 ở cổng COM của máy tính khác với vi điều khiển, nên MAX 232 có tác dụng chuẩn hoá mức điện áp giữa máy tính và điều khiển trong quá trình truyền nhận dữ liệu. Nếu giao tiếp trực tiếp giữa 2 vi điều khiển, ta không cần phải sử dụng MAX 232. 13.3 UART trong PIC18F Trong phần này xin giới thiệu các bước thiết lập việc truyền 1 byte UART, việc cấu hình nhận UART cũng tương tự như truyền. Trình tự các bước như sau : • Nạp giá trị vào 2 thanh ghi BRGH: BRG để thiết lập tốc độ truyền theo công thức Baudrate = Fosc/ (64 * ([BRGH : BRG] + 1)). • Enable serial port bằng cách clear bit SYNC và set bit SPEN • Nếu muốn thiết lập interrupt, thì set thêm TXIE, GIE và PEIE. • Set bit TXEN để cho phép truyền. • Nạp dữ liệu vào thanh ghi TXREG. • Khi truyền xong cờ TXIF sẽ bật lên 1, ta sẽ kiểm tra cờ này trước khi truyền dữ liệu mới. Hiện thực bằng code như sau : 94 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Code: void init_uart_transmit() { //step 1 : Select baurate TXSTAbits.BRGH = 0; BAUDCONbits.BRG16 = 1; SPBRGH = 0; SPBRG = 25; //9600 //step 2 : enable ASYN TXSTAbits.SYNC = 0; RCSTAbits.SPEN = 1; //step 3 : enable uart transmission interrupt PIE1bits.TXIE = 1; PIR1bits.TXIF = 0; INTCONbits.GIE = 1; INTCONbits.PEIE = 1; //step 4 : disable bit 9 TXSTAbits.TX9 = 0; //step 5 : enable transmission TXSTAbits.TXEN = 1; } Sau khi enable việc truyền, ta chỉ cần ghi dữ liệu và thanh ghi TXREG và kiểm tra cờ TXIF bật lên: Code: void uart_transmit(unsigned char data) { TXREG = data; while(PIR1bits.TXIF == 1){} } 13.4 Kiểm tra truyền nhận UART Để kiểm tra việc truyền nhận uart có đúng hay không ta thường dùng 1 số ứng dụng hyper terminal để kiểm tra. Lúc này máy tính của chúng ta sẽ là đối tượng dùng để giao tiếp với BKIT PIC. Trong đĩa CD này có phần mềm hyper terminal khá thông dụng chứa trong thư mục Terminal, bạn chỉ cần double click vào file Terminal.exe là khởi động được chương trình. 95 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Hình 13.2 : Hyper Terminal Công việc còn lại là cấu hình cho cổng COM truyền nhận uart cho tương thích với giao thức truyền nhận của board 89. Các thông số thông thường là Baud rate 9600, Data bit 8bit, không có Parity (chọn none) và 1 Stop bit. Nhấn nút Connect để kết nối. Kể từ đây nếu board 89 có gửi dữ liệu lên, dữ liệu này sẽ nằm trong phần Receive. Ngược lại, muốn gửi dữ liệu xuống board 89 ta gõ vào textbox và ấn Send. 13.5 Download • Code mẫu • Phần mềm Terminal 96 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Bài 17 : Giao tiếp với bàn phím PS2 13.6 Ngắt ngoài 13.6.1 Giới thiệu ngắt ngoài Ngắt ngoài trên vi điều khiển thường là một chân vào có khả năng phát hiện sự thay đổi tín hiệu bên ngoài. Có thể chia ngắt thành hai loại : Ngắt cạnh và ngắt mức. Ngắt cạnh có hai loại: ngắt cạnh lên xảy ra khi có sự chuyển tín hiệu từ mức thấp lên mức cao ở chân ngắt ngoài. Tương tự ngắt cạnh xuống xảy ra khi có sự chuyển tín hiệu từ mức cao xuống mức thấp. Ngắt mức cũng có hai loại: ngắt mức cao và mức thấp. Ngắt mức cao (thấp) xảy ra khi tín hiệu tại chân ngắt ngoài ở mức cao (thấp) trong tối thiểu 1 chu kì. Trong vi điều khiển PIC chí có chế độ ngắt cạnh(lên/xuống) không tồn tại chế độ ngắt mức. 13.6.2 Ngắt ngoài trong vi điều khiển PIC Trong vi điều khiển PIC, có 3 ngắt ngoài INT0, INT1, INT2 nắm tương ứng với các chân RB0, RB1, RB2. Và trong vi điều khiển PIC chỉ có hai loại ngắt là ngắt cạnh lên và ngắt cạnh xuống. Đối với ngắt ngoài INT1 và INT2 có hai mức ưu tiên ngắt là ngắt có độ ưu tiên cao và độ ưu tiên thấp, còn đối với ngắt ngoài INT0 thì luôn cố định là ngắt có độ ưu tiên cao. Các chân ngắt ngoài khi sử dụng phải được cấu hình ở chế độ input. 13.6.3 Các thanh ghi để cấu hình ngắt ngoài cho PIC Ngắt trong ci điều khiển PIC được cấu hình qua các thanh ghi INTCON, INTCON2, INTCON3. • Thanh ghi INTCON Code: Bit 7 GIE Global Interrupt Enable Nếu IPEN = 0 1 = cho phép ngắt 0 = cấm tất cả các ngắt Nếu IPEN = 1 1 = cho phép ngắt mức cao 0 = cấm tất cả các ngắt Bit 6 PEIE Peripheral Interrupr Enable Nếu IPEN = 0 1 = cho phép ngắt ngoại vi 0 = cấm các ngắt ngoại vi Nếu IPEN = 0 1 = cho phép ngắt mức thấp 0 = cấm ngắt mức thấp Bit 4 INT0IE External Interrupt 0 Enable 1 = cho phép ngắt ngoài 0 0 = tắt ngắt ngoài 0 Bit 0 INT0IF External Interrupt Flag 97 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH 1 = cờ báo ngắt của ngắt ngoài 0 0 = không có tín hiệu ngắt ngoài 0 • Thanh ghi INTCON2 Code: Bit 6 INTEDG0 External Interrupr 0 Edge Select 1 = ngắt ngoài 0 khi có cạnh lên 0 = ngắt ngoài 0 khi có cạnh xuống Bit 5 INTEDG1 External Interrupr 1 Edge Select 1 = ngắt ngoài 1 khi có cạnh lên 0 = ngắt ngoài 1 khi có cạnh xuống Bit 4 INTEDEG2 External Interrupt 2 Edge Select 1 = ngắt ngoài 2 khi có cạnh lên 0 = ngắt ngoài 2 khi có cạnh xuống • Thanh ghi INTCON3 Code: Bit 7 INT2IP External Interrupt 2 Priority 1 = độ ưu tiên cao 0 = độ ưu tiên thấp Bit 6 INT1IP External Interrupt 1 Priority 1 = độ ưu tiên cao 0 = độ ưu tiên thấp Bit 4 INT2IE External Interrupt 2 Enable 1 = cho phép ngắt ngoài 2 0 = tắt ngắt ngoài 2 Bit 3 INT1IE External Interrupt 1 Enable 1 = cho phép ngắt ngoài 1 0 = tắt ngắt ngoài 1 Bit 1 INT2IF External Interrupt 1 Flag 1 = cờ báo ngắt của ngắt ngoài 0 0 = không có tín hiệu ngắt ngoài 0 Bit 0 INT1IF External Interrupt 1 Flag 1 = cờ báo ngắt của ngắt ngoài 0 0 = không có tín hiệu ngắt ngoài 0 Các cờ ngắt ngoài INT0IF, INT1IF, INT2IF phải được xóa bằng chương trình trong hàm xử lý ngắt của chúng. 13.7 Giao tiếp PS/2 Dữ liệu trong giao tiếp PS/2 được truyền nối tiếp từng bit. Khi một phím được nhấn, 11 bit bao gồm Start bit, 8 bit dữ liệu (bit trọng số thấp truyền trước), 1 bit parity và 1 stop bit sẽ được gửi đi: 98 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Hình 14.1 Dạng sóng của giao tiếp PS/2 Ta sẽ lấy dữ liệu tại cạnh xuống của clock, chân của clock được nối vào chân ngắt ngoài INT0 của vi điều khiển Atmega32 (PD2) như sau: Hình 14 14.2 Sơ đồ kết nối PS/2 Khi 1 phím được nhấn xuống, mã make_code sẽ được gửi lên. Trong khoảng thời gian phím đó được đè xuống thì mã make_code vẫn được định kì gửi lên. Khi thả phím ra thì bàn phím gửi lên mã break_code và make_code. Bảng mã make_code và break_code của các phím như sau: 99 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Dễ dàng nhận ra mã break_code của 1 phím gồm 0xF0 và mã make_code của phím đó. 13.8 Xây dựng chương trình Gạt bit 2 của Switch3 lên ON để gắn điện trở kéo lên cho chân CLOCK và DATA của bàn phím PS/2 13.8.1 Khởi tạo ngắt ngoài Code: void init_ext_int0(void) { INTCONbits.INT0IE = 1; // set external interrupt0 INTCONbits.INT0IF = 0; // clear external interrupt0 flag INTCON2bits.INTEDG0 = 0;// interrupt when appear an falling edge on RB0/INT0 TRISBbits.TRISB0 = 1; // set input for CLOCK pin TRISBbits.TRISB1 = 1; // set input for DATA pin } 100 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH 13.8.2 Xử lý ngắt Phần chính của bài thực hành này là lấy cho được dữ liệu truyền lên từ bàn phím. Quá trình dịch từng bit để lấy dữ liệu 8 bit trong chuỗi 10 bit được hiện thực trong hàm phục vụ ngắt ngoài INT0. Code: #pragma code #pragma interrupt high_isr void high_isr(void) { if (INTCONbits.INT0IF) { INTCONbits.INT0IF = 0; count_bits ++; if (count_bits == 1) ps2_scan_code = 0; if (count_bits >1 && count_bits < 10) { ps2_scan_code = ps2_scan_code >> 1; if (PS2_DATA == 1) ps2_scan_code |= 0x80; parity ^= PS2_DATA; } if (count_bits == 12) { scan_code = ps2_scan_code; ps2_scan_code = 0; parity = 0; } } } Biến count_bits dùng để đếm số bit gửi về, khi count_bit_input = 11 ta sẽ có được dữ liệu scan_code từ bàn phím truyền lên. Bạn sẽ phải xử lý để phân loại đây là mã make_code hay break_code, có được nhấn kèm với phím Shift hay Caps Lock hay không để chuyển sang mã ASCII cho kí tự được nhấn. 13.9 Download • Code mẫu 101 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Bài 18 : Graphics LCD 128x64 14.1 Giới thiệu GLCD 128x64 Graphic LCD được sử dụng trên mạch BKIT PIC là loại LCD chấm, không màu, có độ phân giải 128x64 tức 8192 chấm. GLCD được thiết kế để điều khiển được từng chấm, nên có thể dùng để hiển thị bất kỳ ký tự hay hình ảnh nào. Với mỗi chấm tương ứng một bit dữ liệu, GLCD 128x64 cần 8192 bits RAM hay 1024 bytes RAM để hiển thị toàn màn hình. Loại GLCD YM12864J sử dụng 2 chip điều khiển KS0108 rất phổ biến của Samsung, mỗi chip có 512 bytes RAM. Do đó, nó tương tự như 2 LCD 64x64 ghép lại với nhau. Hình 15 1 GLCD 128x64 14.1.1 Chức năng các chân của GLCD 128x64 Chức năng các chân: 102 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Các chân từ 4 đến 17 được kết nối trực tiếp đến vi điều khiển. Các chân còn lại được kết nối tùy theo chức năng tương ứng của nó. Chân EN Khi thực hiện một quá trình giao tiếp với GLCD, ban đầu, chân EN được kéo xuống thấp. Trong khi đó, các chân điều khiển khác được thiết lập. Sau khi thiết lập xong, chân EN được kích lên mức cao để cho phép tín hiệu. Sau khoảng thời gian cần thiết cho quá trình hoàn tất, chân EN lại được kéo xuống thấp để sẵn sàng cho một quá trình khác. Chân RS và RW Hai chân này được kết hợp để thiết lập cho các thanh ghi của GLCD theo bảng sau: Chân CS1 và CS2 Chọn chip điều khiển GLCD – KS0108 để giao tiếp, tích cực mức cao. 14.1.2 Tổ chức bộ nhớ RAM Chip điều khiển GLCD KS0108 chỉ có một loại bộ nhớ là RAM, không có bộ nhớ chứa bộ font CGROM hay chứa mã font tự tạo CGRAM như của Text LCD. Dữ liệu ghi vào RAM sẽ được hiển thị trực tiếp trên GLCD. Mỗi chip KS0108 có 512 bytes RAM tương ứng với 4096 chấm trên một nửa (64x64) LCD. RAM của KS0108 được truy cập theo từng byte, nghĩa là mỗi lần viết một giá trị vào một byte nào đó trên RAM của GLCD, sẽ có 8 chấm bị tác động, 8 chấm này nằm trên cùng 1 cột. Do đó, 64 dòng GLCD được chia thành 8 pages, mỗi page có độ cao 8 bit và rộng 128 cột (tính cả 2 chip). Sơ đồ bố trí RAM: Hình 15 2 Sơ đồ bố trí RAM của GLCD 128x64 103 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Với mỗi chip KS0108, RAM chia thành 8 page, mỗi page bao gồm 64 cột, mỗi cột bao gồm 8 chấm. Các page được gọi là địa chỉ X, mang giá trị từ 0 đến 7, X = 0 tương ứng với page 0 và tương tự. Các cột được gọi là địa chỉ Y, cột đầu tiên có giá trị Y = 0 và cột cuối cùng có giá trị Y = 63. Mỗi cột là một byte RAM, D0 đến D7, với D0 tương ứng điểm trên cao và D7 tương ứng điểm bên dưới. Các lệnh di chuyển được hỗ trợ theo cặp địa chỉ X, Y. Minh họa hiển thị ký tự “a” trên GLCD: Hình 15 3 Ký tự "a" trên GLCD Như hình trên, ký tự “a” được xác định bằng cách ghi dữ liệu vào X = 0 và Y = 0...7 theo bảng sau: Hình 15 4 Dữ liệu RAM cho ký tự "a" Giá trị Data là các giá trị cần nạp cho vùng RAM tương ứng. 14.1.3 Các lệnh của GLCD 128x64 Bảng lệnh 104 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH 1. Lệnh hiển thị ON/OFF Dữ liệu được hiển thị lên màn hình khi bit D (DB0) bằng 1 và ngược lại khi D bằng 0. Khi D bằng 0, dữ liệu vẫn tồn tại trong DDRAM. Lập trình: • RW = 0 • RS = 0 • Opcode = 0x3E + D (D = 0:1) 2. Hiển thị Start Line Chọn một dòng nào đó của RAM để làm dòng đầu tiên được hiển thị lên, nghĩa là “cuộn” hình ảnh trong RAM lên một khoảng LOffset, với LOffset có giá trị từ 0 đến 63. Phần bị che khuất khi cuộn sẽ được hiển thị tiếp ngay bên dưới. Ví dụ với LOffset = 20: Hình 15 5 Cuộn lên 20 dòng Lập trình: • RS = 0 • RW = 0 • Opcode = 0xC0 + LOffset 3. Thiết lập trang (địa chỉ X) 105 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Thiết lập địa chỉ X để truy xuất RAM. Lập trình: • RS = 0 • RW = 0 • Opcode = 0xB8 + X 4. Thiết lập địa chỉ Y Thiết lập địa chỉ Y để truy xuất RAM. Lập trình: • RS = 0 • RW = 0 • Opcode = 0x40 + Y 5. Đọc trạng thái Đọc trạng thái của GLCD, chủ yếu kiểm tra bit BUSY (bit 7). Lập trình: • RS = 0 • RW = 1 6. Ghi dữ liệu hiển thị Ghi dữ liệu vào RAM tại địa chỉ X, Y. Sau khi ghi xong, giá trị Y sẽ tự động được tăng lên 1 đơn vị, chuyển sang cột tiếp theo hoặc trở về cột đầu tiên, tức Y = 0. Lập trình: • RS = 1 • RW = 0 7. Đọc dữ liệu hiển thị Đọc dữ liệu từ RAM tại địa chỉ X, Y. Sau khi đọc xong, giá trị Y sẽ tự động được tăng lên 1 đơn vị, chuyển sang cột tiếp theo hoặc trở về cột đầu tiên, tức Y = 0. Lập trình: • RS = 1 • RW = 1 14.2 Xây dựng chương trình 14.2.1 Khởi tạo graphic LCD Quá trình khởi tạo được thực hiện như sau: • Khởi tạo các chân liên kết với glcd(thiết lập input/output). • Chọn chip điều khiển thứ nhất. • Thiết lập chân RS ở chế độ ghi lệnh. • Gửi lệnh bât màn hình (0x3F). • Gửi lệnh để thiết lập địa chỉ Y (0x40 + Y). • Gửi lệnh để thiết lập địa chỉ X (địa chỉ trang) (0xB8 + X). • Gửi lênh chọn dòng nào trong RAM để hiển thị lên. • Làm tương từ bước thứ 2 cho chip thứ 2. Tương ứng với từng lệnh trên trong chương trình như sau: Code: 106 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH glcd_write_byte(GLCD_ON_DISPLAY); glcd_write_byte(GLCD_SET_Y_ADDR); glcd_write_byte(GLCD_SET_PAGE); glcd_write_byte(GLCD_START_LINE); Với các tham số truyền vào có giá trị như sau: Code: #define GLCD_ON_DISPLAY 0x3F // DB0: turn display on #define GLCD_START_LINE 0xC0 // 11XXXXXX: set lcd start line #define GLCD_SET_PAGE 0xB8 // 10111XXX: set lcd page (X) address #define GLCD_SET_Y_ADDR 0x40 // 01YYYYYY: set lcd Y address 14.2.2 Ghi dữ liêu lên GLCD Hàm ghi dữ liêu(một byte) có thể viết như sau: Code: GLCD_CTRL_PORTbits.GLCD_CTRL_RW = 0;// chế độ ghi GLCD_DATA_PORT = abyte; // ghi dữ liệu GLCD_CTRL_PORTbits.GLCD_CTRL_E = 1; // sau khi ghi bật chân EN lên 1 để cho phép tín hiệu _nop();_nop();_nop(); GLCD_CTRL_PORTbits.GLCD_CTRL_E = 0;// cho chân EN xuống 0 lại để chuẩn bị cho lần thiết lập tiếp theo _nop();_nop();_nop(); Chi tiết cụ thể về quá trình xuất dữ liệu lên GLCD các bạn có thể tham khảo chương trình mẫu kèm theo. 14.3 Download Code mẫu 107 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Bài 19 : Giao tiếp SD Card bằng SPI 15.1 Giới thiệu tổng quan về Sdcard 15.1.1 Sơ lược về SD card Hình 18 18.1 Các loại SD Card Secure Digital (SD) Card là bộ nhớ flash tích hợp cao với khả năng truy xuất tuần tự và ngẫu nhiên. Với tốc độ truyền nhận dữ liệu nhanh và ổn định, kích thước nhỏ gọn, khả năng lưu trữ cao từ 4MB đến 2GB, SD thích hợp cho các thiết bị kỹ thuật số cầm tay như máy nghe nhạc, điện thoại di động, PDA, máy quay phim, chụp ảnh 15.1.2 Sơ đồ khối của SD card Hình 18 18.2 Sơ đồ khối của SD Card 108 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH 15.1.3 Sơ đồ chân 15.1.4 Các thanh ghi bên trong 15.1.5 Chuẩn giao tiếp với SD card SD Card hỗ trợ 2 chế độ giao tiếp là chế độ SD Card và SPI. Host (hệ thống chủ - vi điều khiển) có thể chọn một trong hai chế độ này để thực hiện giao tiếp với SD Card. Chế độ SD Card hỗ trợ 2 chế độ con là 1-bit và 4-bit, tốc độ truyền dữ liệu nhanh. Chế độ SPI tuy có tốc độ thấp hơn nhưng dễ sử dụng và được hỗ trợ trong hầu hết các hệ thống – vi điều khiển. Trong tài liệu này, chúng ta sẽ sử dụng SPI để giao tiếp với SD Card. 15.2 Giới thiệu về FAT 15.2.1 Tổng quan FAT FAT (File Allocation Table – Bảng cấp phát tập tin) là kiến trúc hệ thống tập tin được sử dụng cho máy tính và hầu hết các loại thẻ nhớ. Được phát triển bởi Microsoft từ năm 1976. FAT quản lý bộ nhớ bằng cách chia nhỏ bộ nhớ (sector, cluster) và đánh dấu các khối nhỏ đó bằng các bit địa chỉ. Một sector chứa 512 byte bộ nhớ. Một cluster chứa nhiều sector. Số sector 109 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH trong một cluster là cố định và do người dùng chọn lúc định dạng bộ nhớ. Ở chế độ mặc định một cluster chứa 8 sector. Khi lưu trữ một file, FAT cấp phát một hoặc nhiều cluster có tổng kích thước không nhỏ hơn kích thước file đó. Ví dụ file có kích thước 5kB sẽ được cấp phát 2 cluster (8 sector/cluster) để lưu trữ. Nếu số sector trong mỗi cluster càng lớn sẽ gây nhiều lãng phí bộ nhớ, ngược lại nếu số này càng nhỏ thì hệ thống hoạt động càng chậm. Các phiên bản FAT là FAT12, FAT16, FAT32. Điểm khác nhau cơ bản giữa các phiên bản là về giới hạn quản lý bộ nhớ. FAT12 dùng 12 bit để đánh dấu địa chỉ các cluster, nên có thể quản lý gần 212 cluster (trừ một số địa chỉ để đánh dấu các vùng đặc biệt). Tương tự FAT16 dùng 16 bit, FAT32 dùng 28 bit để đánh dấu địa chỉ. 15.2.2 Cấu trúc phân vùng FAT Một hệ thống file FAT gồm 4 phần: 1. Reserved sectors: Nằm ở vị trí đầu tiên (sector 0) là Boot sector (tên đầy đủ là Partition Boot Record). Sector này chứa một vùng gọi là BIOS Parameter Block (với một số thông tin của hệ thống file, chi tiết về kiểu file, và con trỏ tới các phần khác) và thường chứa boot loader code của hệ điều hành. Tổng số Reverved sector cũng được lưu trong một trường của Boot sector. Những thông tin quan trọng của Boot sector một cấu trúc gọi là Drive Parameter Block trong DOC và OS/2. Riêng FAT32 có thêm một File System Information Sector (sector 1) và một Backup Boot Sector (sector 6). 2. FAT Region: Gồm hai bảng, là bản đồ của vùng Data Region, cho biết những cluster nào đã được dùng. 3. Root Directory Region: Đây là Directory Table, chứa thông tin về file và thư mục trong thư mục gốc (root directory), chỉ có trên FAT12 và FAT16. 4. Data Region: Đây là nơi thực sự file và thư mục được lưu trữ và chiếm hầu hết dung lượng của phân vùng ổ đĩa. FAT32 lấy cluster đầu tiên của Data Region làm Root Directory Table. 15.2.3 Bảng cấp phát tập tin Phân vùng bộ nhớ được chia nhỏ thành những phần nhỏ kề nhau, có kích thước bằng nhau gọi là cluster. Kích thước của cluster thường từ 2kB đến 32kB, phụ thuộc vào kiểu FAT, kích thước phân vùng bộ nhớ và lựa chọn của người dùng. Mỗi file chiếm một hoặc nhiều cluster tùy thuộc vào kích thước của file đó; như vậy, một file được chứa bởi một dãy các cluster tạo thành một danh sách liên kết. Các cluster của một file không nhất thiết phải liền kề nhau, điều này thường gây ra tình trạng phân mảnh (fragmented). Bảng cấp phát tập tin FAT là một danh sách các mục (entry) vẽ nên bản đồ của từng cluster trên phân vùng ổ đĩa. Mỗi entry chứa các thông tin: • số của cluster tiếp theo trong dãy các cluster • entry đánh kết thúc của dãy cluster (end of clusterchain – EOC) • entry đặc biệt đánh dấu một cluster lỗi (bad cluster) • entry đặc biệt đánh dấu cluster không dùng • cờ zero đánh dấu cluster chưa dùng Kích thước FAT entry khác nhau ở mỗi phiên bản. FAT12 và FAT16 dùng 12 và 16 bit cho mỗi entry. Trong FAT32, mỗi entry là 32 bit, nhưng thực sự chỉ dùng 28 bit, 4 bit cao dự trữ (không dùng, thường là 0). 15.2.4 Directory table 110 Lập trình VĐK PIC với MPLAB C18 – ĐHBK TP HCM - BKIT4U 4RUM – EDITTER : TRI - IUH Mỗi file/directory (cũng hiểu là một folder) khi lưu trữ được biểu thị là một entry 32-byte trong bảng Directory Table. Mỗi entry ghi: tên, thuộc tính (attributes: archive, directory, hidden, read-only, system and volume), ngày tạo lập, địa chỉ của cluster dữ liệu đầu tiên, và kích thước của file/directory. Tất cả các Directory Table đều được chứa trong vùng Data Region (trừ ở FAT12 và FAT16, Root Directory Table chiếm một vùng riêng gọi là vùng Root Directory Region). Mô tả một Directory entry (cả Root Directory và subdirectory): 15.3 Giới thiệu bộ thư viện MDD SD card giao tiếp thông qua SPI, chúng ta có thể làm tất cả các bước từ cấu hình SPI cho PIC, sau đó gửi lệnh từ vi điều khiển xuống SD card rồi chờ tín hiệu trả về, đọc master boot record

Các file đính kèm theo tài liệu này:

  • pdfhoc_lap_trinh_voi_pic_18_4423.pdf
Tài liệu liên quan