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.
121 trang |
Chia sẻ: Mr Hưng | Lượt xem: 1132 | Lượt tải: 0
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:
- hoc_lap_trinh_voi_pic_18_4423.pdf