Với mục đích tìm hiểu, nghiên cứu thiết kế chế tạo bộ điều khiển Led ma trận bằng Smartphone chạy hệ điều hành Android em đã xây dựng một hệ thống quang báo Led ma trận với sơ đồ khối như sau:
Hình 2.1: Sơ đồ khối tổng quát hệ thống phần cứng. 2.1.2 Chức năng của các khối
Khối điều khiển trung tâm Atmega 32
Đây là nơi lưu giữ chương trình điều khiển chính và dữ liệu cho các mạch giải mã hàng và cột. Atmega 32 là một hệ vi xử lý 8 bit đơn chip CMOS có hiệu suất cao, công suất nguồn tiêu thụ thấp và có 32 Kbyte bộ nhớ ROM Flash xoá được/lập trình được, 2 Kbyte RAM, 1024 byte EEPROM. Chip này được sản xuất dựa vào công nghệ bộ nhớ không mất nội dung có độ tích hợp cao.
Khối giải mã hàng
Dùng IC 74HC138 (3 đầu vào, 8 đầu ra) để giải mã cho các hàng của bảng Led ma trận. Giải mã hàng Smartphone Android Bluetooth HC06 Khối hiển thị Led ma trận Dữ liệu hàng Dữ liệu cột Giải mã cột Khối điều khiển trung tâm Atmega32
Nhiệm vụ của khối này là giãi mã tín hiệu chọn dòng từ khối điều khiển trung tâm đưa xuống, để tại mỗi thời điểm chỉ cho một dòng được sáng. Mỗi mô đun Led ma trận P10 có 16 dòng và 32 cột, được quét bởi một mô đun quét dòng, đầu vào là các tín hiệu điều khiển được đưa xuống từ khối điều khiển trung tâm, đầu ra sẽ chọn 1 trong số 16 dòng để hiển thị cho một lần quét. Mỗi mô đun hiển thị tại một thời điểm chỉ cho 1 dòng được sáng.
Mô đun quét dòng phải chọn 1 trong số 16 dòng để hiển thị nên cần tín hiệu chọn dòng từ mô đun điều khiển đưa xuống là các tín hiệu AM, BM. Các tín hiệu chọn dòng sẽ được giải mã bằng IC 74HC138. Trên mỗi dòng của bảng Led ma trận có 32 điểm, do vậy một dòng sẽ có 32 đèn Led. Vì vậy, các tín hiệu chọn dòng này phải đi qua bộ khuếch đại công suất để có thể cung cấp đủ dòng cho 32 đèn sáng đồng thời trong trường hợp cực đại.
Khối giải mã cột
Điều khiển cấp nguồn cho cột dùng IC chốt dịch 74HC595, ta nối các đầu ra của IC 74HC595 song song với các chân cấp nguồn cho các cột của ma trận. Khối giải mã cột nhận dữ liệu quét cột từ khối điều khiển trung tâm, xuất tín hiệu điều khiển cho lần lượt các cột của mô đun Led ma trận.
Khối hiển thị Led ma trận
Khi nhận được dữ liệu về chuỗi ký tự cần hiển thị thì khối giải mã hàng và cột sẽ tạo dữ liệu về mức logic cần cấp cho khối hiển thị Led ma trận. Khi nhận được dữ liệu về màu sắc, hiệu ứng hiển thị thì hai khối này sẽ xác định thủ tục gửi dữ liệu cho các khối chốt dữ liệu hàng và cột đưa ra khối hiển thị. Nội dung dữ liệu điều khiển sẽ được hiển thị lên trên mô đun Led ma trận.
Khối truyền dữ liệu
Xây dựng giao diện điều khiển Led ma trận trên Smartphone chạy hệ điều hành Android truyền dữ liệu cho vi điều khiển Atmega 32 qua mô đun Bluetooth HC-06.
Khối giao tiếp giữa vi điều khiển và Smartphone
Tạo môi trường kết nối giúp cho vi điều khiển và Smartphone giao tiếp được với nhau, nhận biết được các tín hiệu truyền, nhận giữa hai bên.
2.2 Một số linh kiện sử dụng trong mạch 2.2.1 Vi điều khiển Atmega 32 2.2.1 Vi điều khiển Atmega 32
2.2.1.1 Giới thiệu chung về Atmega 32
Hình 2.2: Atmega 32 loại chân cắm. Hình 2.3: Atmega 32 loại chân dán.
AVR là một họ vi điều khiển do hãng Atmel sản xuất. AVR là họ vi điều khiển 8 bits với cấu trúc tập lệnh đơn giản hóa – RISC (Reduced Instruction Set Computer), một kiểu cấu trúc đang thể hiện ưu thế trong các bộ xử lý.
So với các vi điều khiển 8 bits khác, AVR có nhiều đặc tính hơn hẳn, hơn cả trong tính ứng dụng dễ sử dụng và đặc biệt là về chức năng:
- Gần như chúng ta không cần mắc thêm bất kỳ linh kiện phụ nào khi sử dụng AVR, thậm chí không cần nguồn tạo xung clock cho chip (thường là các khối thạch anh).
- Thiết bị lập trình (mạch nạp) cho AVR rất đơn giản, có loại mạch nạp chỉ cần vài điện trở là có thể làm được. Một số AVR còn hỗ trợ lập trình on – chip bằng bootloader không cần mạch nạp…
- Bên cạnh lập trình bằng ASM, cấu trúc AVR được thiết kế tương thích C.
- Nguồn tài nguyên về source code, tài liệu, các chương trình ứng dụng…rất lớn trên internet.
Hầu hết các chip AVR có những tính năng (features) sau:
- Có thể sử dụng xung clock lên đến 16 MHz hoặc sử dụng xung clock nội lên đến 8 MHz (sai số 3%).
- Bộ nhớ chương trình Flash có thể lập trình lại rất nhiều lần và dung lượng lớn, có SRAM (Ram tĩnh) lớn và đặc biệt có bộ nhớ lưu trữ lập trình được EEPROM.
- Nhiều ngõ vào ra (I/O PORT) 2 hướng (bi-directional).
- 8 bits, 16 bits timer/counter tích hợp PWM.
- Các bộ chuyển đổi Analog – Digital phân giải 10 bits, nhiều kênh.
- Chức năng Analog comparator.
- Giao diện nối tiếp USART (tương thích chuẩn nối tiếp RS – 232).
- Giao diện nối tiếp Two – Wire – Serial (tương thích chuẩn I2C) Master và Slaver.
- Giao diện nối tiếp Serial Peripheral Interface (SPI)…[2]
2.2.1.2 Cấu trúc Atmega 32
Vi điều khiển là một lĩnh vực có tốc độ phát triển như vũ bảo của nghành điện tử. Cùng với sự phát triển của ngành điện tử thì nhiều họ vi điều khiển lần lượt được các hãng sản xuất chip cho ra đời như: Z80 của Zilog, PIC của Microchip, AT89 và AVR của Atmel...
Họ vi điều khiển AVR của Atmel là một bước phát triển trên nền của vi điều khiển AT89 đã khá quen thuộc. Nếu như AT89 là vi điều khiển có CPU CISC thì AVR là RISC.
AVR có cấu trúc harvard, trong đó đường truyền cho bộ nhớ dữ liệu (data memory bus) và đường truyền cho bộ nhớ chương trình (program memory bus) được tách riêng. Data memory bus chỉ có 8 bit và được kết nối với hầu hết các thiết bị ngoại vi, với register file. Trong khi đó program memory bus có độ rộng 16 bits và chỉ phục vụ cho instruction registers.
Hình 2.4: Cấu trúc bên trong của vi điều khiển AVR.
32 thanh ghi trong Register file được kết nối trực tiếp với Arithmetic Logic Unit – ALU (ALU cũng được xem là CPU của AVR) bằng 2 line, vì thế ALU có thể truy xuất trực tiếp cùng lúc 2 thanh ghi RF chỉ trong 1 chu kỳ xung clock.
Các instruction được chứa trong bộ nhớ chương trình Flash memory dưới dạng các thanh ghi 16 bit. Bộ nhớ chương trình được truy cập trong mỗi chu kỳ xung clock và một instruction chứa trong program memory sẽ được nạp vào trong instruction
register, instruction register tác động và lựa chọn register file cũng như RAM cho ALU thực thi. Trong lúc thực thi chương trình, địa chỉ của dòng lệnh đang thực thi được quyết định bởi một bộ đếm chương trình – PC (Program counter). Đó chính là cách thức hoạt động của AVR.[2]
AVR có ưu điểm là hầu hết các instruction đều được thực thi trong 1 chu kỳ xung clock, vì vậy có thể nguồn clock lớn nhất cho AVR có thể nhỏ hơn một số vi điều khiển khác như PIC nhưng thời gian thực thi vẫn nhanh hơn.
2.2.1.3 Cấu trúc bộ nhớ
Hình 2.5: Cấu trúc bộ nhớ vi điều khiển Atmega 32.
Bộ nhớ chương trình (Bộ nhớ Flash).
Là bộ nhớ Flash lập trình được, trong các chip AVR cũ (như AT90S1200 hay AT90S2313…) bộ nhớ chương trình chỉ gồm một phần là Application Flash Section
nhưng trong các chip AVR mới chúng ta có thêm phần Boot Flash setion. Bộ nhớ chương trình chúng ta tự hiểu là Application section. Thực chất, Application section bao gồm 2 phần: Phần chứa các instruction (mã lệnh cho hoạt động của chip) và phần chứa các vector ngắt (interrupt vectors). Các vector ngắt nằm ở phần đầu của Application section (từ địa chỉ 0x0000) và dài đến bao nhiêu tùy thuộc vào loại chip. Phần chứa instruction nằm liền sau đó, chương trình viết cho chip phải được nạp vào phần này.[2]
Bộ nhớ dữ liệu [2]
Đây là phần chứa các thanh ghi quan trọng nhất của chip, việc lập trình cho chip phần lớn là truy cập bộ nhớ này. Bộ nhớ dữ liệu trên các chip AVR có độ lớn khác nhau tùy theo mỗi chip, tuy nhiên về cơ bản phần bộ nhớ này được chia thành 5 phần.
Phần 1: Là phần đầu tiên trong bộ nhớ dữ liệu, như mô tả trong hình 2.5, phần
này bao gồm 32 thanh ghi có tên gọi là Register file (RF), hay General Purpose Rgegister – GPR hoặc đơn giản là các thanh ghi. Tất cả các thanh ghi này đều là các thanh ghi 8 bits như hình vẽ 2.6.
Hình 2.6: Thanh ghi 8 bit của vi điều khiển Atmega 32.
32 thanh ghi RF của AVR được xem là một phần của CPU, vì thế chúng được CPU sử dụng trực tiếp và nhanh chóng. Để gọi các thanh ghi này, chúng ta không cần gọi địa chỉ mà chỉ cần gọi trực tiếp tên của chúng. Thanh ghi RF thường được sử dụng như các toán hạng (operand) của các phép toán trong lúc lập trình.
Phần 2: Là phần nằm ngay sau Register file, phần này bao gồm 64 thanh ghi
được gọi là 64 thanh ghi nhập/xuất (64 I/O register) hay còn gọi là vùng nhớ I/O (I/O Memory). Vùng nhớ I/O là cửa ngõ giao tiếp giữa CPU và thiết bị ngoại vi. Tất cả các thanh ghi điều khiển, trạng thái…của thiết bị ngoại vi đều nằm ở đây. Việc điều khiển các PORT của AVR liên quan đến 3 thanh ghi DDRx, PORTx và PINx, tất cả 3 thanh ghi này đều nằm trong vùng nhớ I/O. Xa hơn, nếu muốn truy xuất các thiết
bị ngoại vi khác như Timer, chuyển đổi Analog/Digital, giao tiếp USART…đều thực hiện thông qua việc điều khiển các thanh ghi trong vùng nhớ này.
Phần 3: RAM tĩnh, nội (internal SRAM) là vùng không gian cho chứa các biến
(tạm thời hoặc toàn cục) trong lúc thực thi chương trình, vùng này tương tự các thanh RAM trong máy tính nhưng có dung lượng khá nhỏ (khoảng vài KB, tùy thuộc vào loại chip).
Phần 4: RAM ngoại (external SRAM), các chip AVR cho phép người sử dụng
gắn thêm các bộ nhớ ngoài để chứa biến, vùng này thực chất chỉ tồn tại khi nào người sử dụng gắn thêm bộ nhớ ngoài vào chip.
Phần 5: EEPROM (Electrically Ereasable Programmable ROM) là một phần
quan trọng của các chip AVR mới, vì là ROM nên bộ nhớ này không bị xóa ngay cả khi không cung cấp nguồn nuôi cho chip, rất thích hợp cho các ứng dụng lưu trữ dữ liệu. Như trong hình 2.5 phần bộ nhớ EEPROM được tách riêng và có địa chỉ tính từ 0x0000.
2.2.1.4 Thanh ghi trạng thái của AVR
Nằm trong vùng nhớ I/O, thanh ghi SREG có địa chỉ I/O là 0x003F và địa chỉ bộ nhớ là 0x005F (thường đây là vị trí cuối cùng của vùng nhớ I/O) là một trong số các thanh ghi quan trọng nhất của AVR. Thanh ghi SREG chứa 8 bit cờ (flag) chỉ trạng thái của bộ xử lí, tất cả các bit này đều bị xóa sau khi reset, các bit này cũng có thể được đọc và ghi bởi chương trình. Chức năng của từng bit được mô tả như sau:
Hình 2.7: Cấu trúc thanh ghi trạng thái của AVR.
Bit 0 – C (Carry Flag: Cờ nhớ): Là bit nhớ trong các phép đại số hoặc logic,
ví dụ thanh ghi R1 chứa giá trị 200, R2 chứa 70, chúng ta thực hiện phép cộng có nhớ: ADC R1, R2, sau phép cộng, kết quả sẽ được lưu lại trong thanh ghi R1, trong khi kết quả thực là 270 mà thanh ghi R1 lại chỉ có khả năng chứa tối đa giá trị 255
(vì có 8 bit) nên trong trường hợp này, giá trị lưu lại trong R1 thực chất chỉ là 14, đồng thời cờ C được set lên 1 (vì 270 = 100001110, trong đó 8 bit sau 00001110 = 14 sẽ được lưu lại trong R1).
Bit 1 – Z (Zero Flag: Cờ 0): Cờ này được set nếu kết quả phép toán đại số hay
phép logic bằng 0.
Bit 2 – N (Negative Flag: Cờ âm): Cờ này được set nếu kết quả phép toán đại
số hay phép logic là số âm.
Bit 3 – V (Two’s complement Overflow Flag: Cờ tràn của bù 2): Hoạt động
của cờ này liên quan đến kiến thức số nhị phân (phần bù). Bù 1 một số trong hệ nhị phân mà nó chính là bù cơ số trừ 1 của một số khác. Một số bù 1 có thể có được do đảo tất cả các bit có trong số nhị phân (đổi 1 thành 0 và ngược lại).
Bit 4 – S (Sign Bit: Bit dấu): Bit S là kết quả phép XOR giữa một cờ N và V,
S = N xor V.
Bit 5 – H (Half Carry Flag: Cờ nhờ nữa): Cờ H là cờ nhớ trong một vài phép
toán đại số và phép logic, cờ này hiệu quả đối với các phép toán với số BCD.
Bit 6 – T (Bit Copy Storage): Được sử dụng trong hai Instruction BLD (Bit
LoaD) và BST (Bit STorage). Làm nơi trung gian trong các lệnh BLD và BST.
Bit 7 – I (Global Interrupt Enable): Cho phép ngắt toàn bộ bit này phải được
set lên 1 nếu trong chương trình có sử dụng ngắt. Sau khi set bit này, bạn muốn kích hoạt loại ngắt nào cần set các bit ngắt riêng của ngắt đó. Hai instruction dùng riêng để set và clear bit I là SEI và CLI.
Tất cả các bit trong thanh ghi SREG đều có thể được xóa thông qua các instruction không toán hạng CLx và set bởi SEx, trong đó x là tên của bit. Ví dụ CLT là xóa Bit T và SEI là set bit I.[2]
2.2.1.5 Các cổng vào ra
Vi điều khiển Atmega 32 có 32 đường vào ra chia làm bốn nhóm 8 bit một. Các đường vào ra này có rất nhiều tính năng và có thể lập trình được. Ở đây ta sẽ xét chúng là các cổng vào ra số. Nếu xét trên mặt này thì các cổng vào ra này là cổng vào ra hai chiều có thể định hướng theo từng bit.
Mặc dù mỗi PORTx có các đặc điểm riêng nhưng khi xét chúng là các cổng vào ra số thì dường như điều khiển vào ra dữ liệu thì hoàn toàn như nhau. Chúng ta có thanh ghi và một địa chỉ cổng đối với mỗi cổng, đó là thanh ghi dữ liệu cổng (PORTA, PORTB, PORTC, PORTD), thanh ghi dữ liệu điều khiển cổng (DDRA, DDRB, DDRC, DDRD) và cuối cùng là địa chỉ chân vào của cổng (PINA, PINB, PINC, PIND).[2]
Thanh ghi DDRx
Đây là thanh ghi 8 bit ta có thể đọc, ghi các bit ở thanh ghi này và nó có tác dụng điều khiển hướng cổng PORTx (tức là cổng ra hay cổng vào). Nếu như một bit trong thanh ghi này được set thì bit tương ứng đó trên PORTx được định nghĩa như một cổng ra. Ngược lại nếu như bit đó không được set thì bit tương ứng trên PORTx được định nghĩa là cổng vào.
Thanh ghi PORTx
Đây cũng là thanh ghi 8 bit (các bit có thể đọc và ghi được) nó là thanh ghi dữ liệu của cổng PORTx và trong trường hợp nếu cổng được định nghĩa là cổng ra thì khi ta ghi một bit lên thanh ghi này thì chân tương ứng trên port đó cũng có cùng mức logic.
Trong trường hợp mà cổng được định nghĩa là cổng vào thì thanh ghi này lại mang dữ liệu điều khiển cổng. Cụ thể nếu bit nào đó của thanh ghi này được set (đưa lên mức 1) thì điện trở kéo lên (pull-up) của chân tương ứng của PORT đó sẽ được kích hoạt. Ngược lại nó sẽ ở trạng thái hi-z, thanh ghi này sau khi khởi động vi điều khiển sẽ có giá trị là 0x00.
Thanh ghi PINx
Đây là thanh ghi 8 bit chứa dữ liệu vào của bất kỳ PORTx nào của AVR (trong trường hợp PORTx được thiết lập là cổng vào) và nó chỉ có thể đọc mà không thể ghi vào được.[3]
2.2.2 IC chốt dịch 74HC595
vHình 2.8: Hình ảnh thực tế IC 74HC595. Hình 2.9: Sơ đồ chân IC 74HC595. IC 74HC595 là bộ ghi dịch 8 bít gồm có :
- 1 đầu vào cho phép ( OE ).
- 1 đầu vào chọn thanh ghi dịch (MR). - 1 đầu vào dữ liệu nối tiếp (DS).
- 1 đầu vào cấp xung cho thanh ghi dịch (SH_CP). - 1 đầu vào cấp xung cho thanh ghi chứa (ST_CP). - 8 đầu ra 3 trạng thái ( Q1 đến Q7 và Q7’).
Bảng 2.1: Chức năng hoạt động của 74HC595 [1]
Đầu vào Đầu ra
Chức năng
SH_CP ST_CP DS Q7’ Qn
X X L L X L kđ
MR mức thấp dữ liệu chỉ dịch