AVR là họ vi điều khiển 8 bit theo cơng nghệ mới, với những tính năng rất mạnh được tích hợp trong Chip của hãng Atmel theo cơng nghệ RISC (viết tắt của Reduced Instructions Set Computer - Máy tính với tập lệnh đơn giản hĩa ), nĩ mạnh ngang hàng với các họ vi điều khiển 8 bit khác như PIC, Pisoc. Do ra đời muộn hơn nên họ vi điều khiển AVR cĩ nhiều tính năng mới đáp ứng tối đa nhu cầu của người sử dụng. So với họ 8051, 89xx thì nĩ cĩ độ ổn định, khả năng tích hợp, sự mềm dẻo trong việc lập trình và tiện lợi hơn rất nhiều.
a. Những tính năng chính của Vi điều khiển AVR
– Bộ nhớ chương trình Flash dung lượng lớn cĩ thể lập trình nhiều lần. – Bộ nhớ Ram tĩnh (SRAM) cĩ dung lượng lớn.
– Cĩ thể sử dụng xung CLOCK lên đến 16MHz, hoặc sử dụng xung Clock nội lên đến 8MHz.
– Cĩ nhiều cổng vào ra (I/O).
Cĩ các bộ Timer/Counter 8 bit, 16 bit cĩ tích hợp PWM.
– Cĩ các bộ chuyển đổi Analog – Digital độ phân giải 8 bit, 10 bit và cĩ nhiều kênh chuyển đổi.
– Cĩ giao thức nối tiếp USART. – Cĩ giao thức nối tiếp I2C. – Cĩ giao thức nối tiếp SPI.
b. Cấu trúc bộ nhớ của AVR
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 tệp thanh ghi (Register file). Trong khi đĩ đường truyền cho bộ nhớ chương trình cĩ độ rộng 16 bits và chỉ phục vụ cho thanh ghi lệnh (Instruction registers).
Hình 2.49: Cấu trúc bộ nhớ của AVR
Bộ nhớ chương trình (Program memory): Là bộ nhớ Flash lập trình được, hay cịn gọi là Application section. Thực chất, Application section bao gồm 2 phần: phần chứa các mã lệnh cho hoạt động của Chip (Instruction) 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.
Bộ nhớ dữ liệu (Data memory): 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:
Hình 2.50. Thanh ghi 8 bit
+ Phần 1: Là phần đầu tiên trong bộ nhớ dữ liệu, phần này bao gồm 32 thanh ghi cĩ tên gọi là Register file, hay đơ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 .
Hình 2.51. Register file
Tất cả các Chip trong họ AVR đều bao gồm 32 thanh ghi Register file cĩ địa chỉ tuyệt đối từ 0x0000 đến 0x001F. Mỗi thanh ghi cĩ thể chứa giá trị dương từ 0 đến 255 hoặc các giá trị cĩ dấu từ -128 đến 127 hoặc mã ASCII của một ký tự nào đĩ. Các thanh ghi này được đặt tên theo thứ tự là R0 đến R31. Chúng được chia thành 2 phần, phần 1 bao gồm các thanh ghi từ R0 đến R15 và phần 2 là các thanh ghi R16 đến R31. Tất cả 32 thanh ghi Register file đều cĩ đặc điểm chung sau: Được truy cập trực tiếp trong các lệnh. Các tốn tử, phép tốn thực hiện trên các thanh ghi này chỉ cần 1 chu kỳ xung Clock. Register file được kết nối trực tiếp với bộ xử lí trung tâm (CPU) của Chip. Và chúng là nguồn chứa các số hạng trong các phép tốn và cũng là đích chứa kết quả trả lại của phép tốn.
Tĩm lại 32 thanh ghi Register file 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. Register file thường được sử dụng như các tốn hạng của các phép tốn trong lúc lập trình.
+ Phần 2: 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 tồ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 3: 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ớ ngồ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ớ ngồi vào Chip.
+ Phần 4: 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.54 phần bộ nhớ EEPROM được tách riêng và cĩ địa chỉ tính từ 0x0000.
c. Cách thức hoạt động của Vi điều khiển AVR
Hình 2.57 biểu diễn cấu trúc bên trong của một AVR. Ta thấy rằng 32 thanh ghi Register file được nối trực tiếp với ALU bằng 2 line. Vì thế mà ALU cĩ thể truy suất trực tiếp tới 2 thanh ghi Register file trong cùng một chu kỳ xung Clock.
Các lệnh đượ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ỗi lệnh chứa trong bộ nhớ chương trình được đưa vào trong thanh ghi lệnh Instruction register.
Các thanh ghi lệnh 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.
AVR cĩ ưu điểm là hầu hết các lệnh đề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.
Hình 2.52. Cấu trúc bên trong của AVR
d. Cổng vào ra của Vi điều khiển AVR
Cổng vào ra là một trong số các phương tiện để Vi điều khiển giao tiếp với các thiết bị ngoại vi. Mỗi Chip cĩ số cổng vào ra khác nhau. Các cổng vào ra của Vi điều khiển AVR đều là cổng vào ra hai chiều cĩ thể định hướng được. Tất cả các chân của cổng đều được nối với điện trở kéo lên, ta cĩ thể cho phép hay khơng cho phép điện trở này hoạt động.
Mỗi một cổng vào ra của Vi điều khiển được liên kết với ba thanh ghi PORTx, DDRx, PINx. Ba thanh ghi này sẽ được phối hợp với nhau để điều khiển hoạt động của cổng.
Thanh ghi DDRx: Đây là thanh ghi 8 bit cĩ thể đọc ghi, cĩ chức năng điều khiển hướng của cổng (là lối ra hay lối vào). Khi một bit của thanh ghi này được set lên 1 thì cĩ nghĩa một chân tương ứng với nĩ được thiết lập là ngõ ra. Ngược lại nếu 1 bit của thanh ghi DDRx là 0 thì chân tương ứng với nĩ được thiết lập là ngõ vào.
Hình 2.54: Thanh ghi DDRA
Thanh ghi PORTx: Đây là thanh ghi 8 bit cĩ thể đọc ghi, đây là thanh ghi dữ liệu của PORTx. Nếu một bit của thanh ghi này được thiết lập là 1 thì điện trở treo ở chân tương ứng của nĩ được kích hoạt, ngược lại nếu nếu bit này được thiết lập là 0 thì điện trở treo ở chân tương ứng sẽ khơng được kích hoạt, cổng ở trạng thái cao trở.
Hình 2.55: Thanh ghi PORTA
Thanh ghi PINx: Đây là thanh ghi chỉ đọc chứ khơng ghi, đây là địa chỉ trong bộ nhớ I/O kết nối trực tiếp các chân của cổng. Khi ta đọc PORTx tức là ta đọc dữ liệu được chốt trong PORTx, cịn khi ta đọc PINx thì giá trị logic hiện thời ở chân của cổng tương ứng được đọc.
Hình 2.56: Thanh ghi PINA
DDRxn là bit thứ n của thanh ghi DDRx. PORTxn là bit thứ n của thanh ghi PORTx.
Dấu “x” ở cột thứ 3 là để chỉ giá trị logic là tùy ý.
e. Bộ định thời Timer/counter của AVR
Trong mỗi Chip của họ AVR được tích hợp số bộ định thời khác nhau. Cĩ hai loại bộ định thời là bộ định thời 8 bit và bộ định thời 16 bit.
Hình 2.57. Sơ đồ khối bộ Timer/Counter 8bit
Các thanh ghi cĩ trong một bộ Timer (ở đây ta chọn bộ Timer 0 làm ví dụ): Thanh ghi TCCR0: Là thanh ghi điều khiển bộ Timer/Counter0, thanh ghi điều khiển này gồm 8 bit: FOC0, WGM00, COM01, COM00, WGM01, CS02, CS01, CS00 như hình vẽ:
Hình 2.59. Thanh ghi TCCR0
+ Bit 3 (WGM01) và bit 6 (WGM00) là các bit chọn chế độ hoạt động của Timer.
Bảng 2: Bảng chọn chế độ hoạt động của Timer
+ Bit 4 (COM00) và bit 5 (COM01) là các bít lựa chọn chế độ so sánh kết hợp. Nĩ điều khiển các ngõ ra so sánh ở pin OC0. Nếu một hoặc cả hai bit COM00 và COM01 bằng 1 thì ngõ ra OC0 thực hiện chức năng nhập dữ liệu từ các pin I/O kết nối với nĩ.
Bảng 3: Chế độ so sánh khơng PWM
+ Bit 2 (CS02) bit 1(CS01) và bit 0 (CS00) là các bit chọn nguồn xung để sử dụng cho bộ Timer hoạt động.
Thanh ghi TCNT0: Giá trị của thanh ghi này tăng giảm một đơn vị sau mỗi chu kỳ xung Clock. Thay đổi giá trị thanh TCNT0 khi đang hoạt động sẽ kéo theo những lỗi khi so sánh giữa hai thanh ghi TCNT0 và OCR0.
Hình 2.60. Thanh ghi TCNT0
Thanh ghi OCR0: Thanh ghi OCR0 chứa một giá trị 8 bit, giá trị này được so sánh liên tục với giá trị của thanh ghi Counter TCNT0. Phép so sánh này cĩ thể được sử dụng để tạo ra hành động ngắt ở ngõ ra hay tạo xung ở ngõ ra tại chân OC0.
Hình 2.61. Thanh ghi 0CR0
Thanh ghi TIMSK (Timer/Counter Interrupt Mask Register): Là thanh ghi mặt nạ ngắt.
Hình 2.62. Thanh ghi mặt nạ ngắt
+ Bít 1 (OCIE0): Khi bít này được thiết lập lên bằng 1 thì cho phép một ngắt so sánh.
+ Bít 0 (TOIE0): Khi bít này được thiết lập lên bằng 1 thì cho phép một ngắt tràn. Thanh ghi cờ ngắt TIFR (Timer/Counter interrupt flag register):
+ Bit 1 (OCF0): Bit này được set lên mức 1 khi xảy ra sự so sánh khớp giữa thanh ghi TCCN0 và thanh ghi 0CR0. Cờ OCF0 sẽ được tự động xĩa đi khi ngắt tương ứng được thực thi.
+ Bit 0 (TOV0): Được set lên mức 1 khi bộ định thời tràn và nĩ được xĩa khi ngắt tương ứng được thực thi.
f. Các chế độ hoạt động của bộ Timer
Chế độ hoạt động thường: Đây là chế độ hoạt động đơn giản nhất của Timer.
Bộ đếm sẽ liên tục đếm tăng lên cho đến khi vượt quá giá trị lớn nhất TOP và sau đĩ sẽ được khởi động lại tại giá trị BOTTOM. Trong các hoạt động thơng thường thì cờ tràn sẽ được thiết lập khi giá trị trong Timer đạt giá trị khơng và khơng bị xố đi. Tuy nhiên nếu mà ngắt tràn được chấp nhận thì cờ ngắt sẽ tự động bị xố khi ngắt được thực hiện. Giá trị trong Timer cĩ thể được viết vào bất cứ lúc nào.
Chế độ so sánh: Đây là chế độ mà giá trị trong Timer luơn được so sánh với
giá trị trong thanh ghi ORC. Khi giá trị trong Timer bằng giá trị trong thanh ghi ORC thì giá trị trong Timer sẽ bị xố đi. Giá trị trong ORC đĩng vai trị là giá trị TOP cho bộ đếm. Chế độ này cũng cho phép tạo ra tần số so sánh ở đầu ra. Tuy nhiên trong chế độ này nếu giá trị mới ghi vào thanh ghi ORC mà nhỏ hơn giá trị tức thời của bộ đếm thì thì một so sánh sẽ bị lỡ, khi đĩ bộ đếm sẽ đếm đến giá trị lớn nhất sau đĩ rơi xuống giá trị 0 trước khi so sánh tiếp theo xuất hiện.
Hình 2.64. Sơ đồ thời gian của chế độ so sánh
g. Vi điều khiển ATMEGA32
ATMEGA32 cĩ đầy đủ tính năng của họ AVR, cĩ giá thành vừa phải, rất phù hợp dùng để thiết kế những hệ thống vừa và nhỏ .
ATMEGA32 được đĩng vỏ 40 chân, trong đĩ cĩ 32 chân vào ra dữ liệu và được chia làm 4 PORT: PORTA, PORTB, PORTC và PORTD.
Ngồi 32 chân vào ra dữ liệu trên ATMEGA32 cịn 8chân dùng để nối với nguồn, kết nối với bộ tạo dao động, nối với điện áp tham chiếu, nối với bộ phận Reset…
Hình 2.65. Sơ đồ chân của ATMEGA 32
Một số đặc tính của ATMEGA32 :
• Bộ nhớ FLASH 32KB.
• Bộ nhớ EEPROM 1024 Byte.
• Bộ nhớ SRAM 2KB.
• Các đường dẫn vào/ra (I/O) lập trình được.
• Cĩ giao tiếp SPI. Cĩ giao tiếp I2C.
• Cĩ 8 kênh ADC 10 bit .
• Cĩ 1 bộ so sánh analog.
• Cĩ 4 kênh băm xungPWM .
• Cĩ 2 bộ timer/counter 8 bit.
• Cĩ 1 bộ timer/counter1 16 bit .
• Cĩ 1 bộ định thời Watchdog .
• Cĩ 1 bộ truyền nhận USART lập trình được .
• Giao diện SPI đồng bộ.
• Cĩ 1 bộ so sánh analog.
Điện áp hoạt động từ 2,7 – 5,5 V.
Hình 2.66. Hình dạng bên ngồi của ATMEGA32
2.3.4.4. Truyền thơng :
Truyền thơng nối tiếp khơng đồng bộ.
Thuật ngữ USART trong tiếng anh là viết tắt của cụm từ: Universal Synchronous & Asynchronous serial Reveiver and Transmitter, nghĩa là bộ truyền nhận nối tiếp đồng bộ và khơng đồng bộ. Cần chú ý rằng khái niệm USART (hay UART nếu chỉ nĩi đến bộ truyền nhận khơng đồng bộ) thường để chỉ thiết bị phần cứng (device, hardware), khơng phải chỉ một chuẩn giao tiếp. USART hay UART cần phải kết hợp với một thiết bị chuyển đổi mức điện áp để tạo ra một chuẩn giao tiếp nào đĩ. Ví dụ, chuẩn RS232 (hay COM) trên các máy tính cá nhân là sự kết hợp của chip UART và chip chuyển đổi mức điện áp. Tín hiệu từ chip UART thường theo mức TTL: mức logic high là 5, mức low là 0V. Trong khi đĩ, tín hiệu theo chuẩn RS232 trên máy tính cá nhân thường là -12V cho mức logic high và +12 cho mức low (tham khảo hình 1). Chú ý là các giải thích trong tài liệu này theo mức logic TTL của USART, khơng theo RS232.
Truyền thơng nối tiếp: giả sử bạn đang xây dựng một ứng dụng phức tạp cần
sử dụng nhiều vi điều khiển (hoặc vi điều khiển và máy tính) kết nối với nhau. Trong quá trình làm việc các vi điều khiển cần trao đổi dữ liệu cho nhau, ví dụ tình huống Master truyền lệnh cho Slaver hoặc Slaver gởi tín hiệu thu thập được về Master xử lí…Giả sử dữ liệu cần trao đổi là các mã cĩ chiều dài 8 bits, bạn cĩ thể sẽ nghĩ đến cách kết nối đơn giản nhất là kết nối 1 PORT (8 bit) của mỗi vi điều khiển với nhau, mỗi line trên PORT sẽ chịu trách nhiệm truyền/nhận 1 bit dữ liệu. Đây gọi là cách giao tiếp song song, cách này là cách đơn giản nhất vì dữ liệu được xuất và nhận trực tiếp khơng thơng qua bất kỳ một giải thuật biến đổi nào và vì thế tốc độ truyền cũng rất nhanh. Tuy nhiên, như bạn thấy, nhược điểm của cách truyền này là số đường truyền quá nhiều, bạn hãy tưởng tượng nếu dữ liệu của bạn cĩ giá trị càng lớn thì số đường truyền cũng sẽ nhiều thêm. Hệ thống truyền thơng song song thường rất cồng kềnh và vì thế kém hiệu quả. Truyền thơng nối tiếp sẽ giải quyết vần đề này, trong tuyền thơng nối tiếp dữ liệu được truyền từng bit trên 1 (hoặc một ít) đường truyền. Vì lý do này, cho dù dữ liệu của bạn cĩ lớn đến đâu bạn cũng chỉ dùng rất ít đường truyền. Hình 2 mơ tả sự so sánh giữa 2 cách truyền song song và nối tiếp trong việc truyền con số 187 thập phân (tức 10111011 nhị phân).
Hình 2.68. Truyền 8 bit theo phương pháp song song và nối tiếp.
Một hạn chế rất dễ nhận thấy khi truyền nối tiếp so với song song là tốc độ truyền và độ chính xác của dữ liệu khi truyền và nhận. Vì dữ liệu cần được “chia nhỏ”