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 trong thanh ghi dịch đầu ra không đổi trạng thái
X L L X L L Xóa thanh ghi dich nạp dữ
liệu vào thanh ghi chứa X X H L X L Z Xóa thanh ghi dịch đầu ra ở
trạng thái trở kháng cao
OE MR
X L H H Q6’ kđ
Dịch chuyển trạng thái cao vào thanh ghi dịch, giá trị trước đó của bít thứ 6 trong thanh ghi dịch được chuyển sang đầu ra Q7’
X L H X kđ Qn’
Nội dụng của thanh ghi dịch được chuyển sang thanh ghi chứa và chuyển sang đầu ra
L H X Q6’ Qn’
Dịch chuyển nội dung của thanh ghi dịch đồng thời nội dung của thanh ghi dịch cũ được chuyển vào thanh ghi chứa và các đầu ra song song
Phải sử dụng 3 chân của vi điều khiển để nối với các chân DS, SH_CP, ST_CP của IC 74HC595. Các bit dữ liệu mã hóa mức logic cần cấp cho các cột của một hàng ma trận LED sẽ được truyền liên tiếp qua chân DS của IC 74HC595.
Để đồng bộ bit thì vi điều khiển mỗi khi xuất một bit tới chân DS sẽ phát một xung có sườn dương (từ 0 lên 1) vào chân SH_CP. Sau khi truyền xong hết dữ liệu, để các LED trên cột sáng thì ta phải chuyển dữ liệu trong thanh ghi dịch vào các đầu ra của IC 74HC595 bằng cách cấp một xung sườn dương vào chân ST_CP. Chú ý để IC có thể hoạt động và đẩy dữ liệu ra các chân đầu ra thì chân phải nối đất, chân
nối dương nguồn.
Khi mở rộng Led ma trận ta ghép nhiều IC 74HC595 nối tiếp nhau như hình 2.10. Các chân SH_CP được nối chung với một nguồn cấp xung, các chân ST_CP cũng được nối chung với nhau, đầu ra Q7’ của IC phía trước được nối với đầu vào DS của IC tiếp theo. Khi đó dữ liệu sẽ được dịch đồng bộ từ IC này sang IC khác và đầu ra của các IC cũng được chốt đồng bộ.[1]
OE MR
Hình 2.10: Ghép nối tiếp các IC 74HC595. 2.2.3 IC giải mã địa chỉ 74HC138 Hình 2.11: Hình ảnh thực tế IC 74HC138. Hình 2.12: Sơ đồ chân IC 74HC138.
IC 74HC138 là bộ giả mã 3 đầu vào A0, A1, A2 và 8 đầu ra đảo từ Y0 đến Y7. Nó có 3 đầu vào cho phép IC 74HC138 hoạt động, hai đầu vào tích cực mức thấp E1, E2 và một đầu vào tích cực mức cao E3. Tất cả các đầu ra của 74HC138 sẽ ở mức cao trừ khi E1, E2 ở mức thấp và E3 ở mức cao.
Khi các đầu vào E1, E2 ở mức thấp và E3 ở mức cao thì đầu ra của IC 74HC138 sẽ được quyết định bởi đầu vào. Các trạng thái đầu ra phụ thuộc vào trạng thái đầu vào được mô tả ở bảng 2.2.
Khi mở rộng Led ma trận ta tăng thêm số lượng IC để cấp nguồn cho tất cả các hàng, các IC này có thể cùng nối chung hoặc riêng chân điều khiển. Hoặc chỉ sử dụng
một IC nhưng cấp nguồn đồng thời cho tất cả các ma trận, khi đó một chân của IC sẽ được nối với các hàng của các ma trận khác nhau.
Theo nguyên tắc quét Led ma trận thì tại mỗi thời điểm ta chỉ cấp nguồn cho một hàng của ma trận do đó có thể dùng 74HC138 để cấp nguồn cho các hàng của Led ma trận. Các đầu vào (A0, A1, A2) của 74HC138 sẽ được nối với các chân của IC đệm tăng dòng 74HC245. Thông qua việc gửi tín hiệu từ vi điều khiển tới các chân đầu vào của 74HC138 ta có thể chọn được hàng cần cấp nguồn.