Đây là kiểu truyền thông Master-Slave, trong đó có 1 chipMaster điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởiMaster vì thế truyền thông chỉ xảy ra giữa Master và
Trang 1Bài 7 - Giao tiếp SPI
2. Chuẩn truyền thông SPI
3. Truyền thông SPI trên AVR
Bài này giúp các bạn biết cách sử dụng cách truyền thông nối tiếp đồng bộ SPI
Công cụ chính cũng là 2 bộ phần mềm AVRStudio (+gcc-avr) và Proteus Thực
chất ngôn ngữ lập trình vẫn là gcc-avr nhưng tôi không dùng Programmer Notepad
để biết code như thông thường, thay vào đó tôi dùng AVRStudio làm trình biên
tập, bạn tham khảo thêm phần “Lập trình C bằng AVRStudio” trong bài hướng dẫn
sử dụng AVRStudio để biết thêm cách thực hiện Tôi sẽ dùng chip ATmega32 làm
Sau bài này, tôi hy vọng bạn có thể hiểu và thực hiện được:
Nguyên lý truyền thông nối tiếp SPI
Sử dụng module SPI trong AVR ở các chế độ Master và Slave
II Chuẩn truyền thông SPI,
Trang 2SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao dohang Motorola đề xuất Đây là kiểu truyền thông Master-Slave, trong đó có 1 chipMaster điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởiMaster vì thế truyền thông chỉ xảy ra giữa Master và Slave SPI là một cách truyềnsong công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận cóthể xảy ra đồng thời SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4đường giao tiếp trong chuẩn này đó là SCK (Serial Clock), MISO (Master InputSlave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select) Hình 1 thểhiện một kết SPI giữa một chip Master và 3 chip Slave thông qua 4 đường.
SCK: Xung giữ nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền đồng bộ nêncần 1 đường giữ nhịp, mỗi nhịp trên chân SCK báo 1 bit dữ liệu đến hoặc đi Đây
là điểm khác biệt với truyền thông không đồng bộ mà chúng ta đã biết trong chuẩnUART Sự tồn tại của chân SCK giúp quá trình tuyền ít bị lỗi và vì thế tốc độtruyền của SPI có thể đạt rất cao Xung nhịp chỉ được tạo ra bởi chip Master
MISO– Master Input / Slave Output: nếu là chip Master thì đây là đườngInput còn nếu là chip Slave thì MISO lại là Output MISO của Master và các
MOSI – Master Output / Slave Input: nếu là chip Master thì đây là đườngOutput còn nếu là chip Slave thì MOSI là Input MOSI của Master và các Slavesđược nối trực tiếp với nhau
SS – Slave Select: SS là đường chọn Slave cần giap tiếp, trên các chip Slaveđường SS sẽ ở mức cao khi không làm việc Nếu chip Master kéo đường SS củamột Slave nào đó xuống mức thấp thì việc giao tiếp sẽ xảy ra giữa Master và Slave
đó Chỉ có 1 đường SS trên mỗi Slave nhưng có thể có nhiều đường điều khiển SStrên Master, tùy thuộc vào thiết kế của người dùng
Trang 3Hình 1 Giao diện SPI
Hoạt động: mỗi chip Master hay Slave có một thanh ghi dữ liệu 8 bits Cứmỗi xung nhịp do Master tạo ra trên đường giữ nhịp SCK, một bit trong thanh ghi
dữ liệu của Master được truyền qua Slave trên đường MOSI, đồng thời một bittrong thanh ghi dữ liệu của chip Slave cũng được truyền qua Master trên đườngMISO Do 2 gói dữ liệu trên 2 chip được gởi qua lại đồng thời nên quá trình truyền
dữ liệu này được gọi là “song công” Hình 2 mô tả quá trình truyền 1 gói dữ liệuthực hiện bởi module SPI trong AVR, bên trái là chip Master và bên phải là Slave
Hình 2 Truyền dữ liệu SPI
Trang 4Cực của xung giữ nhịp, phase và các chế độ hoạt động: cực của xung giữ nhịp(Clock Polarity) được gọi tắt là CPOL là khái niệm dùng chỉ trạng thái của chânSCK ở trạng thái nghỉ Ở trạng thái nghỉ (Idle), chân SCK có thể được giữ ở mứccao (CPOL=1) hoặc thấp (CPOL=0) Phase (CPHA) dùng để chỉ cách mà dữ liệuđược lấy mẫu (sample) theo xung giữ nhịp Dữ liệu có thể được lấy mẫu ở cạnh lêncủa SCK (CPHA=0) hoặc cạnh xuống (CPHA=1) Sự kết hợp của SPOL và CPHAlàm nên 4 chế độ hoạt động của SPI Nhìn chung việc chọn 1 trong 4 chế độ nàykhông ảnh hưởng đến chất lượng truyền thông mà chỉ cốt sao cho có sự tươngthích giữa Master và Slave.
III Truyền thông SPI trên AVR.
Module SPI trong các chip AVR hầu như hoàn toàn giống với chuẩn SPI mô tả trong phần trên Vì thế, nếu đã hiểu cách truyền thông SPI thì sẽ khống quá khó để thực hiện việc truyền thông này với AVR Phần bên dưới tôi trình bày một số điểmquan trọng khi điều khiển SPI trên AVR
Các chân SPI: Các chân giao tiếp SPI cũng chính là các chân PORT thông thường,
vì thế nếu muốn sử dụng SPI chúng ta cần xác lập hướng cho các chân này Trên chip ATmega32, các chân SPI như sau:
để điều khiển SS của Slaves hoặc bất kỳ chân PORT thông thường nào
Thanh ghi: SPI trên AVR được vận hành bởi 3 thanh ghi bao gồm thanh ghi điều khiển SPCR , thanh ghi trạng thái SPSR và thanh ghi dữ liệu SPDR
SPCR (SPI Control Register): là 1 thanh ghi 8 bit điều khiển tất cả hoạt động
của SPI
* Bit 7- SPIE (SPI Interrupt Enable) bit cho phép ngắt SPI Nếu bit này được set bằng 1 và bit I trong thanh ghi trạng thái được set bằng 1 (sei), 1 ngắt sẽ xảy ra
Trang 5sau khi một gói dữ liệu được truyền hoặc nhận Chúng ta nên dùng ngắt (nhất là đối với chip Slave) khi truyền nhận dữ liệu với SPI.
* Bit 6 – SPE (SPI Enable) set bit này lên 1 để cho phép bộ SPI hoạt động NếuSPIE=0 thì module SPI dừng hoạt động
* Bit 5 – DORD (Data Order) bit này chỉ định thứ tự dữ liệu các bit được truyền và nhận trên các đường MISO và MOSI, khi DORD=0 bit có trọng số lớn nhất của dữ liệu được truyền trước (MSB) ngược lại khi DORD=1, bit LSB được truyền trước Thật ra khi giao tiếp giữa 2 AVR với nhau, thứ tự này không quan trọng nhưng phải đảm bảo các bit DORD giống nhau trên cả Master và Slaves
* Bit 4 – MSTR (Master/Slave Select) nếu MSTR =1 thì chip được nhận diện làMaster, ngược lại MSTR=0 thì chip là Slave
* Bit 3 và 2 – CPOL và CPHA đây chính là 2 bit xác lập cực của xung giữ nhịp
và cạnh sample dữ liệu mà chúng ta đã khảo sát trong phần đầu Sự kết hợp 2 bit này tạo thành 4 chế độ hoạt động của SPI Một lần nữa, chọn chế độ nào không quan trọng nhưng phải đảm bảo Master và Slave cùng chế độ hoạt động Vì thế có thể để 2 bit này bằng 0 trong tất cả các chip Hình 3 trình bày cách sample dữ liệu
trong 4 chế độ của SPI trên AVR
ra khi giao tiếp giữa 2 AVR với nhau, thứ tự này không quan trọng nhưng phải đảm bảo các bit DORD giống nhau trên cả Master và
Slaves.
CPHA=0
Trang 6CPHA=1
Hình 3 Các chế độ hoạt động của SPI
* Bit 1:0 – CPR1:0 hai bit này kết hợp với bit SPI2X trong thanh ghi SPSRcho phép chọn tốc độ giao tiếp SPI, tốc độ này được xác lập dựa trên tốc độ nguồnxung clock chia cho một hệ số chia Bảng 1 tóm tắt các tốc độ mà SPI trong AVR
có thể đạt Thông thường, tốc bộ này không được lớn hơn 1/4 tốc độ xung nhịp chochip
SPSR (SPI Status Register): là 1 thanh ghi trạng thái của module SPI Trong
thanh ghi này chỉ có 3 bit được sử dụng Bit 7 – SPIF là cờ báo SPI, khi một gói
dữ liệu đã được truyền hoặc nhận từ SPI, bit SPIF sẽ tự động được set len 1 Bit 6 – WCOL là bít báo va chạm dữ liệu (Write Colision), bit này được AVR set lên 1 nếu chúng ta cố tình viết 1 gói dữ liệu mới vào thanh ghi dữ liệu SPDR trong khi quá trình truyền nhận trước chưa kết thúc Bit 0 – SPI2X gọi là bit nhân đôi tốc độ truyền, bit này kết hợp với 2 bit SPR1:0 trong thanh ghi điều khiển SPCR xác lập tốc độ cho SPI
Trang 7SPDR (SPI Data Register): là thanh ghi dữ liệu của SPI Trên chip Master,
ghi giá trị vào thanh ghi SPDR sẽ kích quá trình tuyền thông SPI Trên chip Slave,
dữ liệu nhận được từ Master sẽ lưu trong thanh ghi SPDR, dữ liệu được lưu sẵntrong SPDR sẽ được truyền cho Master
của chuẩn SPI là mấy Vận hành SPI trên AVR được thực hiện dựa trên việc ghi vàđọc 3 các thanh ghi SPCR, SPSR và SPDR Trước khi truyền nhận bằng SPI chúng
ta cần khởi động SPI, quá trình khởi động thường bao gồm chọn hướng giao tiếpcho các chân SPI, chọn loại giao tiếp: Master hay Slave, chọn chế độ SPI (SPOL,SPHA) và chọn tốc độ giao tiếp Truyền thông SPI luôn được khởi xướng bởi chipMaster, khi Master muốn giao tiếp với 1 Slave nào đó, nó sẽ kéo chân SS củaSlave xuống mức thấp (gọi là chọn địa chỉ) và sau đó viết dữ liệu cần truyền vàothanh ghi dữ liệu SPDR, khi dữ liệu vừa được viết vào SPDR xung giữ nhịp sẽđược tự động tạo ra trên SCK và quá trình truyền nhận bắt đầu Đối với các chipSlave, khi chân SS bị kéo xuống nó sẽ sẵn sàng cho quá trình truyền nhận Khiphát hiện xung giữ nhịp trên SCK, Slave sẽ bắt đầu sample dữ liệu đến trên đườngMOSI và gởi dữ liệu di trên MISO
Để minh họa cho cách truyền và nhận dữ liệu SPI trên AVR, tôi sẽ thực hiệnmột ví dụ truyền nhân 1 chiều với 1 chip Master và 3 chip Slaves Tất cả các chipđược dùng là ATmega32, chip Master sẽ điều khiển các chip Slaves thông qua 3đường chọn chip PB0, PD1 và PD2 Công việc thực hiện trong ví dụ này như sau:Master sẽ lần lượt chọn 1 trong 3 chip Slaves và gởi các gói dữ liệu tương ứng đếnchúng, chip Slave0 sẽ nhận được các con số từ 0 đến 80, Slave1 nhận 80 đến 160
và Slave2 nhận dữ liệu từ 160 đến 240 Các Slave sẽ hiển thị giá trị mà mình nhậnđược trên các Text LCD kết nối với PORTD ở mỗi Slave Sơ đồ mạch điện vẽbằng Proteus cho ví dụ này được trình bày trong hình 4
Trang 8Hình 4 Mô phỏng ví dụ giao tiếp SPI trên AVR.
Trong bài này, tôi sẽ dùng phần mềm AVRStudio kết hợp với gcc-avr trongWinAVR để lập trình bằng ngôn ngữ C cho AVR Bạn hãy tham khảo thêm bài
Trang 9AVRStudio để biết cách tạo 1 Project lập trình C cho AVR bằng AVRStudio Hãytạo 2 Project riêng, 1 Project có tên SPI_Master cho chip Master và 1 Project cótên SPI_Slave dùng chung cho cả 3 Slaves Copy file myLCD.h dùng cho điềukhiển Text LCD được tạo trong bài “Text LCD” vào cả 2 thư mục chứa 2 Projectsmới tạo Viết đoạn code trong list 0 vào file SPI_Master.c và đoạn code trong list 1vào file SPI_Slave.c.
List 1 Đoạn code cho SPI Master
Trang 11
Tôi sẽ giải thích sơ lượt một số điểm chính trong đoạn code cho chip Master.
Các phần định nghĩa từ dòng thứ 10 đến dòng 17 chỉ có tác dụng làm cho chươngtrình dễ đọc hiểu hơn và có tính tương thích cao hơn, ví dụ nếu bạn muốn sử dụng
ví dụ này cho các chip khác bạn chỉ cần thay đổi các định nghĩa này mà không phảithay đổi trong nội dung các chương trình con Chúng ta định nghĩa để chọnPORTB điều khiển các đường chọn chip SS của Slave (gọi là các đường địa chỉ),dòng 18 định nghĩa Slave(i) là thứ tự chân trên PORT dùng cho chip Slave thứ i
Dễ hiểu hơn, đường SS trên Slave0 sẽ được kết nối và điều khiển bởi chân 0 củaPORTB (chân PB0 và tương tự cho các Slaves còn lại Biến wData định nghĩa trêndòng 20 là một mảng 3 phần tử chứa các con số 8 bits sẽ truyền đến các Slaves
Chương trình con “void SPI_MasterInit(void)”: Chương trình này khởi động
cho chip Master, việc khởi động trước hết là set hướng cho các chân SPI Đối vớiMaster, các chân tạo xung giữ nhịp SCK và chân truyền dữ liệu MOSI cần đượcset Output như trong dòng 24, các chân SPI còn lại là input Dòng 25 giúp kéo điệntrở kéo lên ở chân nhận dữ liệu MISO của Master Dòng lệnh 26
“SPCR=(1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); ”thật sự khởi động SPI với việc set bit SPIE: cho phép ngắt SPI=1, bit SPE=1 chophép SPI hoạt động, MSTR=1 xác lập chip là chip Master CPHA=1 tức chân SCK
sẽ ở mức thấp khi SPI không hoạt động, trong khi CPOL=0 (không set CPOL thìmặc định là 0) thì dữ liệu sẽ được sample (lấy mẫu) ở cạnh xuống của xung SCK.Cuối cùng cả 2 bit SPR1 và SPR0 đều được set lên 1, tốc độ SPI sẽ bằng tốc độnguồn cung nuôi chip chia cho 128 (xem bảng 1) Dòng code 29 set hướng Outputcho các chân dùng làm chân địa chỉ chọn chip Slaves (các chân PB0, PB1, PB2),sau đó kéo các chân này lên mức cao để disable tất cả các Slaves (sau này sẽ kíchhoạt sau)
Chương trình con “void SPI_Transmit(uint8_t i, uint8_t data)”: chương
trình truyền dữ liệu qua SPI của chip Master, chương trình có 2 tham số là địa chỉchip Slave (biến i) và dữ liệu cần truyền (biến data) Trước khi truyền dữ liệu,Master sẽ thực hiện việc chọn Slave, dòng 35 “cbi(ADDRESS_PORT, Slave(i));”thực hiện việc này Thực chất dòng này là kéo chân “i” của PORTB xuống mứcthấp, cũng là kéo chân SS của Slave xuống mức thấp Dòng 36 gán giá trị cầntruyền cho thanh ghi dữ liệu “SPDR=data”, sau khi gán giá trị cho SPDR, xungclock sẽ tự động được Master tạo ra trên SCK, quá trình truyền bắt đầu Quá trìnhtruyền kết thúc thì bit cờ SPIF trong thanh ghi trạng thái SPSR được set lên 1,dòng 36 thực hiện việc chờ bit cờ SPIF để kết thúc quá trình truyền Khi kết thúctruyền 1 byte cho Slave, set chân SS của Slave lên mức cao để vô hiệu hóa SPI,dòng 37
Trang 12Chương trình chính: chương trình chính cho chip Master SPI tương đối đơn
giản, trước hết chúng ta cần gọi chương trình con khởi động SPI ở dòng 43 Trongvòng lặp vô tận while, lần lượt gởi các giá trị đến các Slaves Dòng 46 gọi chươngtrình con gởi giá trị biến wData[0] đến Slave0, dòng 50 truyền biến wData[1] choSlave1 và dòng 54 truyền biến wData[2] cho Slave2
List 2.Đoạn code cho Slave SPI
Trang 14Đoạn code trong list 2 là đoạn code cho chip Slaves, chú ý dòng 3 chúng tainclude file header “interrupt.h” vì việc nhận dữ liệu SPI của SLave được thực hiệnbằng ngắt SPI Các định nghĩa biến trong các dòng code từ 8 đến 15 tương tự nhưtrong chương trình cho chip Master Tôi sẽ tập trung giải thích các điểm khác biệtcho Slaves.
Chương trình con “void SPI_SlaveInit(void)”: Chương trình này khởi động
cho chip Slave, cũng giống như trường hợp của Master, việc khởi động trước hết làset hướng cho các chân SPI Đối với Slave, chỉ có chân truyền dữ liệu MISO là cầnđược set Output như trong dòng 19, các chân SPI còn lại là input Dòng 20 giúpkéo điện trở kéo lên ở các chân nhận dữ liệu MOSI của Slave, và chân chọn Slave
SS Việc tiếp theo là cài đặt các thanh ghi SPI như trong dòng lệnh 21,
“SPCR=(1<<SPIE)|(1<<SPE)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); ”, nếu quan sátdòng lệnh 26 trong List 1 chop chip Master, dòng này không khác là mấy, quátrình khởi động SPI cho Slave tương tự Master với một điểm khác duy nhất là bitMSTR, bit này không được set lên 1 đối với Slaves
Trình phục vụ ngắt “ISR(SPI_STC_vect)”: SPI trên AVR chỉ có duy nhất
một sự kiện gây ra ngắt đó là khi quá trình truyền-nhận kết thúc Tên vector ngắtSPI trong ngôn ngữ lập trình avr-gcc là “SPI_STC_vect Trong ví dụ này, khi mộtngắt SPI xảy ra ở Slave, chúng ta sẽ đọc thanh ghi SPDR và sau đó hiển thị giá trịđọc được trên LCD Dòng 37, rData=SPDR, gán thanh ghi SPDR cho biến rData
Từ dòng 38 đến 42 là cách hiển thị giá trị đọc về trên Text LCD bằng thư việnmyLCD (xem bài Text LCD) Dòng 39 chúng ta khai báo 1 biến tạm dạng mảngđộng, dis, làm buffer chứa giá trị ascii của các ký tự cần hiển thị lên LCD Chú ý làgiá trị nhận về là 1 con số 8 bit, muốn hiển thị giá trị này lên LCD chúng ta khôngthể hiển thị trực tiếp bằng lệnh putChar_LCD vì hàm putChar_LCD xem tham sốnhập vào là mã Ascii, ví dụ chúng ta nhận về số rData=65, nếu dùng hàmputChar_LCD(rData) thì trên LCD chỉ thấy ký tự ‘A’ vì 65 là mã Ascii của ký tự
‘A’ Để LCD hiển thị “65” chúng ta xem 65 là một chuỗi các ký tự, trước hết cầnchuyển số 65 thành các ký tự ‘6’ và ‘5’, hàm “sprintf(dis,"%i",rData)” trong dòngcode 40 thực hiện việc định dạng lại biến rData thành chuỗi các ký tự và chứatrong buffer dis, “%i” là “cờ” định dạng, báo cho hàm sprintf xem rData là một sốnguyên Sau dòng 40, ví dụ rData=65, thì dis=”65” Dòng 42 in chuỗi dis lên LCD:print_LCD(dis);
Chương trình chính: chương trình chính cho chip Slave không làm nhiều
việc vì các việc chính như nhận và hiển thị đã được thực hiện trong trình phục vụngắt SPI Dòng 27 sei() cho phép ngắt toàn cục, điều này là cần thiết để ngắt SPI
có thể xảy ra, dòng 28 gọi chương trình con khởi động SPI cho Slave, sau đó khởi
Trang 15động LCD ở dòng 29 và kết thúc Không có việc gì cần thực hiện trong vòng lặp
C cho AVR
Mô phỏng với Proteus
I Bạn sẽ đi đến đâu.
Bài này nằm trong phần ứng dụng AVR thuộc loạt bài cùng học AVR Trong
bài ứng dụng này chúng ta không khảo sát nhiều cấu trúc AVR mà chủ yếu là tìm
hiểu Text LCD cách điều khiển bằng AVR Công cụ chính cũng là 2 bộ phần mềm
quen thuộc WinAVR và Proteus
Sau bài này, tôi hy vọng bạn có thể hiểu và thực hiện được:
- Cấu trúc Text LCD
- Nguyên lý hoạt động Text LCD
- Phát triển 1 thư viện điều khiển Text LCD bằng AVR cả 2 chế độ 8 bit và 4
bit
- Ví dụ điều khiển Text LCD bằng AVR
Trang 16II Text LCD.
Text LCD là các loại màn hình tinh thể lỏng nhỏ dùng để hiển thị các dòng chữ hoặc số trong bảng mã ASCII Không giống các loại LCD lớn, Text LCD đượcchia sẵn thành từng ô và ứng với mỗi ô chỉ có thể hiển thị một ký tự ASCII Cũng
vì lý do chỉ hiện thị được ký tự ASCII nên loại LCD này được gọi là Text LCD (đểphân biệt với Graphic LCD có thể hiển thị hình ảnh) Mỗi ô của Text LCD bao gồm các “chấm” tinh thể lỏng, việc kết hợp “ẩn” và “hiện” các chấm này sẽ tạo thành một ký tự cần hiển thị Trong các Text LCD, các mẫu ký tự được định nghĩa sẵn Kích thước của Text LCD được định nghĩa bằng số ký tự có thể hiển thị trên 1dòng và tổng số dòng mà LCD có Ví dụ LCD 16x2 là loại có 2 dòng và mỗi dòng
có thể hiển thị tối đa 16 ký tự Một số kích thước Text LCD thông thường gồm 16x1, 16x2, 16x4, 20x2, 20x4…Hình 1 là một ví dụ Text LCD 16x2
Hình 1 Text LCD 16x2
Text LCD có 2 cách giao tiếp cơ bản là nối tiếp (như I2C) và song song Trongphạm vi bài học này tôi chỉ giới thiệu loại giao tiếp song song, cụ thể là LCD 16x2 điều khiển bởi chip HD44780U của hãng Hitachi Đối với các LCD khác bạn cần tham khảo datasheet riêng của từng loại Tuy nhiên, HD44780U cũng được coi là chuẩn chung cho các loại Text LCD, vì thế bạn có thể dùng chương trình ví dụ trong bài này để test trên các LCD khác với rất ít hoặc không cần chỉnh sửa
HD44780U là bộ điều khiển cho các Text LCD dạng ma trận điểm
(dot-matrix), chip này có thể được dùng cho các LCD có 1 hoặc 2 dòng hiển thị
HD44780U có 2 mode giao tiếp là 4 bit và 8 bit Nó chứa sẵn 208 ký tự mẫu kích thước font 5x8 và 32 ký tự mẫu font 5x10 (tổng cộng là 240 ký tự mẫu khác nhau)
Trang 17Trong một số LCD 2 chân LED nền được đánh số 15 và 16 nhưng trong một
số trường hợp 2 chân này được ghi là A (Anode) và K (Cathode) Hình 2 mô tả cách kết nối LCD với nguồn và mạch điều khiển
Trang 18Hình 2 Kết nối Text LCD.
Chân 1 và chân 2 là các chân nguồn, được nối với GND và nguồn 5V Chân 3
là chân chỉnh độ tương phản (contrast), chân này cần được nối với 1 biến trở chia
áp như trong hình 2.Trong khi hoạt động, chỉnh để thay đổi giá trị biến trở để đạt được độ tương phản cần thiết, sau đó giữ mức biến trở này Các chân điều khiển
RS, R/W, EN và các đường dữ liệu được nối trực tiếp với vi điều khiển Tùy theo chế độ hoạt động 4 bit hay 8 bit mà các chân từ D0 đến D3 có thể bỏ qua hoặc nối với vi điều khiển, chúng ta sẽ khảo sát kỹ càng hơn trong các phần sau
2 Thanh ghi và tổ chức bộ nhớ.
HD44780U có 2 thanh ghi 8 bits là INSTRUCTION REGISTER (IR) và DATA REGISTER (DR) Thanh ghi IR chứa mã lệnh điều khiển LCD và là thanh ghi “chỉ ghi” (chỉ có thể ghi vào thanh ghi này mà không đọc được nó) Thanh ghi
DR chứa các các loại dữ liệu như ký tự cần hiển thị hoặc dữ liệu đọc ra từ bộ nhớ LCD…Cả 2 thanh ghi đều được nối với các đường dữ liệu D0:7 của Text LCD và được lựa chọn tùy theo các chân điều khiển RS, RW Thực tế để điều khiển Text
Trang 19LCD chúng ta không cần quan tâm đến cách thức hoạt động của 2 thanh ghi này, vìthế cũng không cần khảo sát chi tiết chúng.
HD44780U có 3 loại bộ nhớ, đó là bộ nhớ RAM dữ liệu cần hiển thị DDRAM (Didplay Data RAM), bộ nhớ chứa ROM chứa bộ font tạo ra ký tự CGROM
(Character Generator ROM) và bộ nhớ RAM chứa bộ font tạo ra các symbol tùy chọn CGRAM (Character Generator RAM) Để điều khiển hiển thị Text LCD chúng ta cần hiểu tổ chức và cách thức hoạt động của các bộ nhớ này:
2.1 DDRAM
DDRAM là bộ nhớ tạm chứa các ký tự cần hiển thị lên LCD, bộ nhớ này gồm
có 80 ô được chia thành 2 hàng, mỗi ô có độ rộng 8 bit và được đánh số từ 0 đến
39 cho dòng 1; từ 64 đến 103 cho dòng 2 Mỗi ô nhớ tương ứng với 1 ô trên màn hình LCD Như chúng ta biết LCD loại 16x2 có thể hiển thị tối đa 32 ký tự (có 32
ô hiển thị), vì thế có một số ô nhớ của DDRAM không được sử dụng làm các ô hiển thị Để hiểu rõ hơn chúng ta tham khảo hình 3 bên dưới
Hình 3 Tổ chức của DDRAM
Chỉ có 16 ô nhớ có địa chỉ từ 0 đến 15 và 16 ô địa chỉ từ 64 đến 79 là được hiển thị trên LCD Vì thế muốn hiển thị một ký tự nào đó trên LCD chúng ta cần viết ký tự đó vào DDRAM ở 1 trong 32 địa chỉ trên Các ký tự nằm ngoài 32 ô nhớtrên sẽ không được hiển thị, tuy nhiên vẫn không bị mất đi, chúng có thể được dùng cho các mục đích khác nếu cần thiết
2.2 CGROM
CGROM là vùng nhớ cố định chứa định nghĩa font cho các ký tự Chúng ta không trực tiếp truy xuất vùng nhớ này mà chip HD44780U sẽ tự thực hiện khi có yêu cầu đọc font để hiện thị Một điều đáng lưu ý là địa chỉ font của mỗi ký tự vùng nhớ CGROM chính là mã ASCII của ký tự đó Ví dụ ký tự ‘a’ có mã ASCII
là 97, tham khảo tổ chức của vùng nhớ CGROM trong hình 4 bạn sẽ nhận thấy địa chỉ font của ‘a’ có 4 bit thấp là 0001 và 4 bit cao là 0110, địa chỉ tổng hợp là
01100001 = 97
CGROM và DDRAM được tự động phối hợp trong quá trình hiển thị của LCD Giả sử chúng ta muốn hiển thị ký tự ‘a’ tại vị trí đầu tiên, dòng thứ 2 của LCD thì các bước thực hiện sẽ như sau: trước hết chúng ta biết rằng vị trí đầu tiên
Trang 20của dòng 2 có địa chỉ là 64 trong bộ nhớ DDRAM (xem hình 3), vì thế chúng ta sẽ ghi vào ô nhớ có địa chỉ 64 một giá trị là 97 (mã ASCII của ký tự ‘a’) Tiếp theo, chip HD44780U đọc giá trị 97 này và coi như là địa chỉ của vùng nhớ CGROM, nó
sẽ tìm đến vùng nhớ CGROM có địa chỉ 97 và đọc bảng font đã được định nghĩa sẵn ở đây, sau đó xuất bản font này ra các “chấm” trên màn hình LCD tại vị trí đầutiên của dòng 2 trên LCD Đây chính là cách mà 2 bộ nhớ DDRAM và CGROM phối hợp với nhau để hiển thị các ký tự Như mô tả, công việc của người lập trình điều khiển LCD tương đối đơn giản, đó là viết mã ASCII vào bộ nhớ DDRAM tại đúng vị trí được yêu cầu, bước tiếp theo sẽ do HD44780U đảm nhiệm