Các câu lệnh trong bộ nhớ chương trình được thực hiện với một cấp ống dẫnriêng.. Có 6 trong 32 thanh ghi có thể được sử dụng như 3 con trỏ thanh ghi địa chỉ giántiếp 16 bit cho việc ghi
Trang 1Chương II: Tìm hiểu vi điều khiển AVR
2.1 Giới thiệu Tổng quan về AVR
− AVR là một họ vi điều khiển do hãng Atmel sản xuất Atmel cung cấp các vi điềukhiển phổ biến như 8051, AT91 ARM7, Atmel AVR 8-bit RISC, và mới đây là DSPdual-CPU AT57 Atmel AVR32 là một vi điều khiển lai DSP với 7 tầng pipeline vàkhả năng thực thi song song AVR là chip 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í
Hình 1 ảnh một chip AVR
2.1.1 Ưu thế của MCU AVR:
Kết nối phần cứng cho AVR đơn giản với những linh kiện thông dụng như điện trở,
tụ điện, thạch anh Dòng ra điều khiển Port lớn và không cần dùng điện trở kéo.Thiết kế mạch nạp cho AVR khá đơn giản giao tiếp qua cổng LPT, COM, USB Hỗtrợ ISP lập trình trực tiếp trên mạch
Hỗ trợ lập trình trên nền ngôn ngữ ASM, C với nhiều công cụ hỗ trợ nhưCodeVision, AVR Studio
Hầu hết các chip AVR có những tính năng (features) sau:
Xung External OSC lên đến 16Mhz và Internal OSC 8Mhz
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ó thể ghi và xóa trên 1000 lần Bên cạnh đó bộ nhớ EEPROM có thể lập trìnhđược
32 Port xuất nhập
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
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
Trang 2Giao diện nối tiếp Serial Peripheral Interface (SPI).
2.1.2Một số dòng AVR:
Nhìn chung AVR có các dòng chính sau:
* tinyAVR — the ATtiny series
- 1–8 kB program memory
- 6–32-pin package
- Limited peripheral set
* megaAVR — the ATmega series
- 4–256 kB program memory
- 28–100-pin package
- Extended instruction set (Multiply instructions and instructions for handlinglarger program memories)
- Extensive peripheral set
- XMEGA — the ATxmega series
- 16–384 kB program memory
- 44–64–100-pin package (A4, A3, A1)
- Extended performance features, such as DMA, "Event System", andcryptography support
- Extensive peripheral set with DACs
- Application specific AVR
- megaAVRs with special features not found on the other members of theAVR family, such as LCD controller, USB controller, advanced PWM, CANetc
Một số dòng AVR phổ biến như :
AT90S1200 , AT90S2313 , AT90S2323 AT90S2343, AT90S2333, AT90S4433, AT90S4414, AT90S8515, AT90S4434, AT90S8535, AT90C8534, ATtiny10, ATtiny11, ATtiny12, ATtiny15, ATtiny22, ATtiny26, ATtiny28, ATmega16, ATmega8/8515/8535, ATmega161, ATmega162, ATmega163, ATmega169 ATmega32 ATmega323 ATmega103 ATmega64/128/2560/2561
Trang 32.2 Cấu trúc phần cứng của Atmega16
2.2.1 Cấu trúc vi điều khiển Atmega 16
Sơ đồ cấu trúc CPU của ATmega16
để tăng tối đa hiệu suất và tính tương thích, vi điều khiển AVR sử dụng kiến trúcHavard tức là bộ nhớ dữ liệu và bộ nhớ chương trình tách biệt nhau cả về vùng nhớ
và đường bus Bộ nhớ chương trình của AVR là bộ nhớ Flash có dung lượng 128
Kb
Trang 4Bộ nhớ chương trình có độ rộng bus là 16 bit Những địa chỉ đầu tiên của bộ nhớchương trình được dùng cho bảng vecto ngắt Bộ nhớ chương trình Flash được chiathành 2 phần, phần chương trình khởi động và phần chương trình ứng dụng Cả haiphần đều dành những bit khóa cho việc bảo vệ ghi và đọc/ghi Lệnh SPM dùng ghivào phần bộ nhớ chương trình Flash ứng dụng phải ở một nơi nhất định trong phần
bộ nhớ chương trình khởi động
Bộ nhớ dữ liệu của AVR chia làm 2 phần chính là bộ nhớ SRAM và bộ nhớEEPROM Tuy cùng là bộ nhớ dữ liệu nhưng hai bộ nhớ này lại nằm tách biệt nhau
và được đánh địa chỉ riêng
Các câu lệnh trong bộ nhớ chương trình được thực hiện với một cấp ống dẫnriêng Khi một lệnh được thực hiện thì lệnh tiếp theo được mang về sẵn từ bộ nhớchương trình Ý tưởng này cho phép mỗi lệnh được thực hiện trong chỉ một chu kỳxung nhịp Bộ nhớ chương trình trong hệ thống là bộ nhớ Flash có thể lập trình lại Truy cập nhanh tệp thanh ghi chứa 32 thanh ghi 8 bit làm việc mục đích chungvới thời gian truy cập trong một chu kỳ xung nhịp Điều này cho phép đơn vị xử lý
số học và logic (ALU) hoạt động trong một chu kỳ đơn Một hoạt động điển hìnhcủa ALU là hai toán hạng được lấy ra từ tệp thanh ghi, hoạt động thực hiện tínhtoán giữa các toán hạng, sau đó kết quả lại được lưu vào tệp thanh ghi, tất cả cáccông việc đó được thực hiện trong một chu kỳ xung nhịp
Có 6 trong 32 thanh ghi có thể được sử dụng như 3 con trỏ thanh ghi địa chỉ giántiếp 16 bit cho việc ghi địa chỉ vùng nhớ dữ liệu, cho phép có thể tính toán địa chỉ.Một trong số những con trỏ địa chỉ này có thể dược dùng nhưmột con trỏ địa chỉ đểtra bảng trong bộ nhớ chương trình Flash Các thanh ghi này là các thanh ghi 16 bit
X, Y và Z
ALU hỗ trợ các phép tính số học và logic giữa các thanh ghi hoặc giữa hằng sốvới một thanh ghi Các phép tính với 1 thanh ghi riêng lẻ có thể cũng được thựchiện trong ALU Sau mỗi phép tính số học thanh ghi trạng thái được cập nhật đểphản ánh thông tin về kết quả của phép tính Dòng chương trình được qui định bởicác lênh nhảy có điều kiện và không điều kiện và các lệnh gọi, có thể trực tiếp địachỉ trong toàn bộ không gian địa chỉ Hầu hết các lệnh của AVR có dạng 1 từ 16bit Mỗi địa chỉ của bộ nhớ chương trình chứa một lệnh 16 hoặc 32 bit
Trang 5Trong suốt thời gian phục vụ ngắt hoặc gọi chương trình con, địa chỉ của bộ đếmchương trình được cất vào ngăn xếp (stack) Ngăn xếp thực tế được đặt trong vùng
dữ liệu chung SRAM, do đó kích thước của ngăn xếp chỉ bị giới hạn bởi tất cả kíchthước SRAM và cách sử dụng SRAM Tất cả người sử dụng chương trình phải khaibáo vị trí ban đầu của SP (stack pointer: con trỏ ngăn xếp) trong chương trình reset(trước khi thực hiện các chương trình con hay thực hiện ngắt) Con trỏ ngăn xếp SPđược đọc/ghi có thể truy nhập vào vùng nhớ I/O Bộ nhớ dữ liệu SRAM có thể truynhập dễ dàng thông qua 5 chế độ địa chỉ khác nhau được hỗ trợ trong kiến trúc củaAVR
Đơn vị ngắt linh hoạt có các thanh ghi điều khiển riêng của nó trong vùng nhớI/O với một bit cho phép ngắt toàn cục trong thanh ghi trạng thái Tất cả các ngắtđều có các vector ngắt riêng biệt trong bảng vector ngắt Các ngắt có quyền ưu tiênngắt khác nhau tùy thuộc vào vị trí của vector ngắt Vector ngắt có địa chỉ càngthấp có mức ưu tiên càng cao
Vùng nhớ I/O chứa 64 địa chỉ cho các chức năng ngoại vi như các thanh ghi điềukhiển, SPI, và các chức năng I/O khác Vùng nhớ I/O có thể truy cập trực tiếp hoặcnhư các vị trí trong vùng nhớ dữ liệu theo địa chỉ trong tệp thanh ghi từ $20 đến
$5F
2.2.2 Tính năng vi điều khiển AVR Atmega16
Ngày nay công nghệ số đã và đang được ứng dụng rộng rãi trong mọi ngành của hoahọc kỹ thuật Ở các nước công nghiệp, truyền động điện đã ứng dụng rất thành côngcông nghệ này với những ưu việt hơn so với phương pháp điều khiển tương tự truyềnthống như:
- Mềm dẻo trong việc thay đổi cấu trúc và tham số của hệ thống tự động
Trang 6khiển thuộc họ AVR của hãng Atmel, là một dòng vi điều khiển tích hợp cao vớinhững chức năng cơ bản nhưng rất cần thiết trong những ứng dụng cụ thể
Vi điều khiển ATmega16 cung cấp những tính năng sau:
- 16K bytes bộ nhớ chương trình dạng flash có thể Read-While-Write
- 512 bytes EEPROM
- 1K byte RAM tĩnh (SRAM)
- 32 đường kết nối I/O mục đích chung
- 32 thanh ghi làm việc mục đích chung được nối trực tiếp với đơn vị xử lý số học vàlogic (ALU)
- Một giao diện JATG cho quét ngoại vi
- Lập trình và hỗ trợ gỡ rối trên chip
- 3 Timer/Counter linh hoạt với các chế độ so sánh
- Các ngắt ngoài và ngắt trong (21 nguyên nhân ngắt)
- Chuẩn truyền dữ liệu nối tiếp USART có thể lập trình
- Một ADC 10 bit, 8 kênh với các kênh đầu vào ADC có thể lựa chọn bằng cách lậptrình
- Một Watchdog Timer có thể lập trình với bộ tạo dao động bên trong
- Một cổng nối tiếp SPI ( serial peripheral interface)
- 6 chế độ tiết kiệm năng lượng có thể lựa chọn bằng phần mềm
- Lựa chọn tần số hoạt động bằng phần mềm
- Đóng gói 40 chân kiểu PDIP
- Tần số tối đa 16MHz
- Điện thế 4,5– 5,5V
2.2.3 Mô tả hoạt động của cấu trúc
Thanh ghi trạng thái là một thanh ghi có 8 bit lưu trữ trạng thái của ALU sau cácphép tính số học và logic
Hình 5 Thanh ghi trạng thái SREG
Trang 7C: Carry Flag ;cờ nhớ (Nếu phép toán có nhớ cờ sẽ được thiết lập)
Z: Zero Flag ;Cờ zero (Nếu kết quả phép toán bằng 0)
N: Negative Flag (Nếu kết quả của phép toán là âm)
V: Two’s complement overflow indicator (Cờ này được thiết lập khi tràn số bù 2)
V, For signed tests (S=N XOR V) S: N
H: Half Carry Flag (Được sử dụng trong một số toán hạng sẽ được chỉ rõ sau)
T: Transfer bit used by BLD and BST instructions(Được sử dụng làm nơi chung giantrong các lệnh BLD,BST)
I: Global Interrupt Enable/Disable Flag (Đây là bit cho phép toàn cục ngắt Nếu bitnày ở trạng thái logic 0 thì không có một ngắt nào được phục vụ.)
Con trỏ ngăn xếp (SP)Là một thanh ghi 16 bit nhưng cũng có thể được xem như
hai thanh ghi chức năng đặc biệt 8 bit Có địa chỉ trong các thanh ghi chức năng đặcbiệt là $3E (Trong bộ nhớ RAM là $5E) Có nhiệm vụ trỏ tới vùng nhớ trong RAMchứa ngăn xếp
Hình 6 Thanh ghi con trỏ ngăn xếp
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưuvào ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí Và con trỏ ngăn xếp sẽ giảm
1 khi thực hiện lệnh push Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽtăng 1 và khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2
Như vậy con trỏ ngăn xếp cần được chương trình đặt trước giá trị khởi tạo ngănxếp trước khi một chương trình con được gọi hoặc các ngắt được cho phép phục vụ
Và giá trị ngăn xếp ít nhất cũng phải lơn hơn hoặc bằng 60H (0x60) vì 5FH trỏ lại làvùng các thanh ghi
Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình trạng sẵn
xàng cho đổi dữ liệu của mình.Ví dụ:Khi bộ truyền nhận UART nhận được một byte
Trang 8nó sẽ báo cho CPU biết thông qua cờ RXC,hợc khi nó đã truyền được một byte thì
Bộ nhớ ngăn xếp là vùng bất kì trong SRAM từ địa chỉ 0x60 trở lên Để truy nhậpvào SRAM thông thường thì ta dùng con trỏ X,Y,Z và để truy nhập vào SRAM theokiểu ngăn xếp thì ta dùng con trỏ SP Con trỏ này là một thanh ghi 16 bit và đượctruy nhập như hai thanh ghi 8 bit chung có địa chỉ :SPL :0x3D/0x5D(IO/SRAM) vàSPH:0x3E/0x5E
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưu vàongăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí.Và con trỏ ngăn xếp sẽ giảm 1khi thực hiện lệnh push Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽtăng 1 và khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2 Như vậycon trỏ ngăn xếp cần được chương trình đặt trước giá trị khởi tạo ngăn xếp trước khimột chương trình con được gọi hoặc các ngắt được cho phép phục vụ Và giá trị ngănxếp ít nhất cũng phải lớn hơn 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi
Ví dụ:
char cSREG;
cSREG = SREG; /* store SREG value */
/* disable interrupts during timed sequence */
Trang 92.2.4 sơ đồ chân và chức năng của ATmega16
Hình 2 Sơ đồ chân ATmega 16
Vi điều khiển ATmega16 được hỗ trợ lập trình với ngôn ngữ lập trình bậc cao nhưngôn ngữ lập trình C Điều này giúp cho người sử dụng rất tiện lợi trong việc lậptrình cho vi điều khiển
Mô tả các chân vi điều khiển ATmega16
- VCC: chân cấp nguồn một chiều
- GND: chân nối đất
- Port A (PA7 PA0): Cổng A được dùng làm lối vào analog của bộ chuyển đổi A/D.Cổng A cũng được dùng như một cổng I/O 8 bit hai chiều
trực tiếp nếu bộ chuyển đổi A/D không được sử dụng Các chân của port được
cung cấp điện trở kéo lên bên trong (được chọn cho từng bit)
- Port B(PB7 PB0): Cổng B là một cổng I/O 8 bit hai chiều trực tiếp có các điện trởkéo lên bên trong (được chọn cho từng bit) Ngoài ra Port B còn được sử dụng chocác chức năng đặc biệt khác:
Trang 10- Port C(PC7 PC0): Port C cũng là một cổng I/O 8 bit hai chiều trực tiếp với cácđiện trở kéo lên bên trong (được chọn cho từng bit) Khi giao diện JTAG được phéphoạt động, các điện trở kéo lên của các chân PC5(TDI), PC3(TMS), và PC2(TCK) sẽvẫn hoạt động cả khi xảy ra reset Port C được sử dụng cho giao diện JTAG và cácchức năng đặc biệt khác như trong bảng:
- Port D(PD7 PD0): là một cổng I/O 8 bit hai chiều trực tiếp có các điện trở kéo lênbên trong (được chọn cho từng bit) Port D cũng được dùng cho các chức năng đặcbiệt khác của ATmega16 như trong bảng:
- RESET : Là đầu vào reset Một tín hiệu mực thấp đặt vào chân này trong khoảngthời gian dài hơn độ dài xung nhỏ nhất sẽ phát ra một reset, ngay cả khi xung nhịpkhông hoạt động Xung ngắn hơn thì không đảm bảo để phát ra một reset
Trang 11- XTAL1: đầu vào cho bộ khuếch đại đảo dao động và đầu vào đến mạch hoạt độngđồng hồ xung nhịp bên trong
- XTAL2: đầu ra cho bộ khuếch đại đảo dao động
- AVCC: là chân cấp nguồn áp cho Port A và bộ chuyển đổi A/D Chân này nênđược nối với VCC cả khi ADC không được sử dụng nếu ADC được sử dụng, chânAVCC nên được nối với VCC qua bộ lọc thông thấp
- AREF: chân điện áp tham chiếu của bộ chuyển đổi A/D
2.3.ngôn ngữ lập trình
Ngôn ngữ lập trình C là ngôn ngữ khá mạnh và được nhiều người sử dụng Lậptrình bằng ngôn ngữ cấp cao như C giúp xây dựng các ứng dụng nhanh chóng và dễdàng hơn Sau đây sẽ giới thiệu một cách cơ bản nhất về cách viết chương trình choAVR sử dụng ngôn ngữ C
Một chương trình C cho AVR thường bao gồm những thàn phần cơ bản như: chúthích (comments), biểu thức (expressions), câu lệnh (statements), khối (blocks), cáctoán tử, cấu trúc điều khiển (flow controls), hàm (function)…
Chú thích (comments): Chú thích là những đoạn trong chương trình dùng để giảithích hay bình phẩm những gì ta làm trong chương trình, phần chú thích không đượcbiên dịch vì vậy nó không có bất kỳ ảnh hưởng nào đến hoạt động của chương trình
Có hai cách để tạo phần chú thích trong C là chú thích theo từng dòng bằng cách đặt
ở đầu dòng chú thích dấu “//” và chú thích block bằng cách kẹp đoạn cần chú thíchvào giữa /*…*/
Tiền xử lý (preprocessor): là một tiện ích của ngông ngữ C, các preprocessor đượctrình biên dịch xử lý trước tất cả các phần khác Các preprocessor được bắt đầu bằngdấu “#”, trong ngôn ngữ C có hai preprocessor được sử dụng phổ biến nhât đó là
#include và #define Preprocessor #include dùng để chỉ định 1 file được đính kèmtrong quá trình xử lý, và #define dùng để định nghĩa một chuỗi thay thế hoặc 1macro
Biểu thức (expressions): là một phần của các câu lệnh, biểu thúc có thể bao gồmcác biến, các toán tử, gọi hàm… Biểu thức trả về một giá trị đơn Biểu thức khôngphải là một câu lệnh hoàn chỉnh
Trang 12Câu lệnh (statements): là một dòng lệnh hoàn chỉnh có thể bao gồm các từ khóa(key words), các biểu thức các câu lệnh khác và được kết thúc bằng dấu “;”.
Khối (blocks): là sự kết hợp của nhiều câu lệnh để cùng thực hiện một nhiệm vụnào đó Khối được kẹp giữa hai dấu mở khối “{” và đóng khối “}”
Toán tử (operators): là những ký hiệu báo cho trình biên dịch biết nhũng nhiệm vụcần thực hiện
- Các toán tử đại số
- Các toán tử logic và quan hệ
Trang 13- Các toán tử truy nhập và kích thước
- Các toán tử thao tác bit
Cấu trúc điều khiển (flow controls): Các cấu trúc điều khiển cho phép chươngtrình thực hiện đúng theo ý tưởng của người viết chương trình Các cấu trúc điềukhiển thường dùng trong lập trình C:
- “If (điều kiện) câu lệnh;” Nếu điều kiện là đúng thì thực hiện câu lệnh tiếp theosau, câu lệnh có thể được viết cùng dòng hay dòng sau từ khóa if Điều kiện là mộtbiểu thức bất kỳ có thể là sự kết hợp của nhiều điều kiện thông qua các toán tử quan
hệ AND(&&), OR(||), … Điều kiện được cho là đúng khi nó khác 0
Trong trường hợp cần thực thi nhiều câu lệnh khi một điều kiện nào đó thỏa mãn
ta có thể đặt các câu lệnh đó trong một khối:
If (điều kiện) {
Ccâu lệnh ;
…
}
Trang 14- “If (điều kiện) câu lệnh 1; else câu lệnh 2;”: Nếu điều kiện đúng thì thực hiệncâu lệnh 1, nếu không đúng thì thực hiện câu lệnh 2 Việc đặt else và các câu lệnhtrên cùng 1 dòng hay khác dòng không làm thay đổi ý nghĩa của cấu trúc;
Nếu cần thực hiện nhiều câu lệnh thì các câu lệnh cần được dặt trong 1 khối:
Trang 15- Cấu trúc lặp While: “while (điều kiện) câu lệnh 1” Ý nghĩa của cấu trúc lặp while làthực hiện câu lệnh 1 (hoặc 1 khối câu lệnh đặt trong dấu “{ }”) khi điều kiện còn đúng.
- Cấu trúc lặp for : “for (biểu thức 1; biểu thức 2; biểu thức 3) câu lệnh” Trong đó biểuthức 1 là biểu thức khởi tạo, biểu thức 2 là điều kiện, biểu thức 3 là biểu thức thực hiện sau.Biểu thức 1 được thực hiện 1 lần sau đó chương trình kiểm tra điêu kiện qua biểu thức 2,nếu điều kiện đúng câu lệnh được thực hiện, sau đó thực hiện biểu thức 3 rồi lại quay lạikiểm tra điều kiện Cứ như vậy tới khi điều kiện không còn đúng nữa thì chương trình thoátkhỏi vòng lặp
Hàm (functions): Trong C có rất nhiều hàm, mỗi hàm dùng để thực hiện một chức năng
cụ thể Các hàm trong C thường được thiết kế nhỏ gọn, để có những hàm phức tạp ngườidùng cần tự tạo ra
Các từ khóa (key words): Từ khóa là những từ quy định của ngôn ngữ C như tên các kiểu
dữ liệu (char, int, unsigned int, …); tên các cấu trúc điều khiển (if, while, for,…) Cần chú ýkhông được đặt tên biến trùng với từ khóa Các kiểu dữ liệu thường dùng khi lập trình C choviđiều khiển:
Tên kiểu dữ liệu Số byte Khoảng dữ liệu
Singed long int 4 - 2147483647 đến 2147483647Long long int 8 - (263 – 1) đến (263 – 1)
Unsigned long long
int
8 0 đến (264 – 1 )Signed long long int 8 - (263 –1) đến (263 –1)
2.3.1 Hướng dẫn cài đặt và tạo một project mới
Cài đặt trình biên dịch CoddeVision AVR C trong thư mục mặc định :