Bộ nhớ dữ liệutrê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
Trang 1LỜI NÓI ĐẦU
Ngày nay với sự phát triển của khoa học kỹ thuật và công nghệ trên thế giới ởnhiều lĩnh vực khác nhau đang diễn ra Đặc biệt là sự phát triển như vũ bão của khoahọc máy tính là công cụ hỗ trợ đắc lực và quan trọng trong các ngành công nghệthông tin và tự động hóa Nó giúp con người lưu trữ xử lý thông tin, tính toán, điềukhiển và đo lường Hơn nữa cùng với sự phát triển mạnh mẽ của vi điều khiển, việckết hợp giữa máy tính và Vi điều khiển đã có nhiều nhiều ứng dụng to lớn trong thực
tế
Đề tài: “Thiết kế bộ chuông báo giờ học dùng vi điều khiển” do cô giáo
Phạm Thanh Loan đưa ra nhằm giúp cho việc nghiên cứu và phát triển các ứng
dụng của Vi điều khiển và Máy tính trong đo lường và điều khiển thuận lợi hơn
Công việc chính phải thực hiện trong đề tài này là xây dựng bộ hiển thị thờigian thực trên LCD Lập trình điều khiển rơle đóng ngắt chuông điện theo giờ đãđược cài đặt sẵn Đề tài bao gồm những nội dung sau:
Chương I Giới Thiệu Chung Về Họ Vi điều khiển AVR.
Chương II Giới Thiệu Về VĐK AVR ATMEGA16.
Chương III: Giới Thiệu IC thời gian thực DS1307.
Chương IV: Thiết Kế Mạch Chuông Báo Giờ Học.
Trong quá trình thực hiện đề tài, mặc dù có sự cố gắng, nhưng em cũng khôngtránh khỏi những thiếu sót Em rất mong nhận được những ý kiến đóng góp từ quýThầy Cô và các bạn sinh viên
Hà nội, ngày 08/ 02/ 2010
Trang 2MỤC LỤC
LỜI NÓI ĐẦU 1
MỤC LỤC 2
Chương 1: GIỚI THIỆU TỔNG QUAN VỀ HỌ VĐK AVR……….5
1/ Tổng quan về họ vi điều khiển AVR 5
1.1/ Giới thiệu 5
1.2/ Phân loại AVR 5
2./ Tổ chức của AVR 6
3/ Cấu trúc tổng quát bên trong của AVR 10
3.1/ Stack Pointer (Con trỏ- Ngăn xếp) 11
3.2/ Thanh ghi trạng thái - SREG (STATUS REGISTRY) 12
3.3/ Quản lý ngắt 13
3.4/ Macro và chương trình con 19
3.5/ Giao Tiếp Truyền Thông Nối Tiếp TWI – I2C 20
Chương 2: GIỚI THIỆU VỀ VI ĐIỀU KHIỂN AVR ATMEGA16L 25
1/ Sơ đồ khối 25
2/ Các đặc tính của của ATMEGA16 26
3/ Cấu trúc bộ nhớ 27
3.1/ Bộ nhớ chương trình (Bộ nhớ Flash) 27
3.2/ Bộ nhớ dữ liệu SRAM, EEPROM 28
4/ Các cổng vào ra (I/O) 29
5/ Bộ định thời 30
6/ Bộ biến đổi A/D 36
Chương 3: GIỚI THIỆU IC THỜI GIAN THỰC DS1307 42
1/ Giới thiệu chung về DS1307 42
2/ Chế độ hoạt động và chức năng của DS1307 43
Chương 4: THIẾT KẾ MẠCH CHUÔNG BÁO GIỜ HỌC 50
1/ Sơ Đồ Nguyên Lý 50
Trang 32/ Nguyên lý hoạt động của mạch 54
3/ Thiết bị phần cứng 55
4/ Phần mềm thiết kế và lập trình 59
4.1/ Phần mềm thiết kế phần cứng 59
4.2/ Mạch nạp cho AVR 59
4.3/ Phần mềm mô phỏng 61
4.4/ Phần mềm lập trình CodeVisonAVR 62
5/ Lưu đồ thuật toán và chương trình 64
6/ Kết quả mô phỏng 88
7/ Kết luận 91
TÀI LIỆU THAM KHẢO 92
Trang 4NHẬN XÉT CỦA GIÁO VIÊN
-
Trang 5-Chương 1:
GIỚI THIỆU TỔNG QUAN VỀ HỌ VĐK AVR
1/ Tổng quan về họ vi điều khiển AVR.
1.1/ Giới thiệu.
Vi điều khiển AVR (Atmel Norway design) thuộc họ vi điều khiển Atmel, nó
là họ vi điều khiển mới trên thị trường cũng như đối với người sử dụng Đây là họ viđiều khiển được chế tạo theo cấu trúc RISC (Reduced Intruction Set Computer) cócấu trúc khá phức tạp Ngoài các tính năng như các họ vi điều khiển khác, nó còn tíchhợp nhiều tính năng mới rất thuận tiện cho người thiết kế và lập trình Sự ra đời củaAVR bắt nguồn từ yêu cầu thực tế là hầu hết khi cần lập trình cho vi điều khiển,chúng ta thường dùng những ngôn ngữ bậc cao HLL (Hight Level Language) ngay cảvới loại chíp xử lý 8 bit trong đó ngôn ngữ C là phổ biến nhất Tuy nhiên khi biêndịch thì kích thước đoạn mã sẽ tăng nhiều so với dùng ngôn ngữ Assembly Từ nhữngyêu cầu đó hãng Atmel đã phát triển một cấu trúc đặc biệt cho ngôn ngữ C để giảmthiểu sự chênh lệch kích thước mã nói trên Kết quả là họ vi điều khiển AVR ra đờivới việc làm giảm kích thước đoạn mã khi biên dịch và thêm vào đó là thực hiện lệnhđúng chu kỳ máy với 32 thanh ghi tích luỹ và đạt tốc độ nhanh hơn các họ vi điềukhiển khác từ 4 đến 12 lần Vì thế nguyên cứu về AVR là một đề tài mới mẻ và lý thúgiúp cho sinh viên biết thêm về một họ vi điều khiển mới hiện nay
1.2/ Phân loại AVR.
+ AT90S8535: không có lệnh nhân và chia trên thanh ghi
+ ATMEGA 8, 16, 32 (AVR loại 8 bit, 16 bit, 32 bit) là loại AVR tốc độ cao,tích hợp sẵn ADC 10 bit
+ AVR tích hợp sẵn LCD driver: Atmega 169, 329
Trang 6+ AVR có tích hợp SC (Power stage controller): AT90PWM thường dùngtrong các ứng dụng điều khiển động cơ hay chiếu sáng nên gọi là lighting AVR.
+ Attiny 11, 12, 15: AVR loại nhỏ
2./ Tổ chức của AVR
AVR có cấu trúc Harvard, trong đó đường truyền cho bộ nhớ dữ liệu (datamemory bus) và đường truyền cho bộ nhớ chương trình (program memory bus) đượctá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 1 mô tả 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,trong các chip AVR mới chúng ta có thêm phần Boot Flash setion Khi nói về bộ nhớchương trình, chúng ta tự hiểu là Application section.Thực chất, application sectionbao gồm 2 phần: phần chứa các instruction (mã lệnh cho hoạt động của chip) và phầnchứa các vector ngắt (interrupt vectors) Các vector ngắt nằm ở phần đầu củaapplication 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 load vàophần này
Chức năng chính của bộ nhớ chương trình là chứa instruction.Tất cả các thanhghi quan trọng cần khảo sát nằm trong bộ nhớ dữ liệu của chíp
Trang 7Hình 1.1 Tổ chức bộ nhớ của AVR.
Bộ nhớ dữ liệu (data memory): Đây là phần chứa các thanh ghi quan trọngnhấ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ệutrê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 1, phầnnày bao gồm 32 thanh ghi có tên gọi là register file (RF), hay General PurposeRgegister – GPR, hoặc đơn giản là các Thanh ghi Tất cả các thanh ghi này đều là cácthanh ghi 8 bits như trong hình 2
Hình 1.2 Thanh ghi 8 bits.
Thanh ghi chức năng chung
Tất cả các chip trong họ AVR đều bao gồm 32 thanh ghi Register File có địachỉ 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
Trang 8phầ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 Các thanh ghi này có các đặc điểm sau:
Được truy cập trực tiếp trong các instruction
Các toán tử, phép toán thực hiện trên các thanh ghi này chỉ cần 1 chu kỳ xungclock
Register File được kết nối trực tiếp với bộ xử lí trung tâm – CPU của chip
Chúng là nguồn chứa các số hạng trong các phép toán và cũng là đích chứa kếtquả trả lại của phép toán
Tất cả các instruction sử dụng RF làm toán hạng đều có thể truy nhập tất cảcác RF một cách trực tiếp trong 1 chu kỳ xung clock, ngoại trừ SBCI, SUBI, CPI,ANDI và LDI, các instruction này chỉ có thể truy nhập các thanh ghi từ R16 đến R31
Thanh ghi R0 là thanh ghi duy nhất được sử dụng trong instruction LPM(Load Program Memory) Các thanh ghi R26, R27, R28, R29, R30 và R31 ngoàichức năng thông thường còn được sử dụng như các con trỏ (Pointer register) trongmột số instruction truy xuất gián tiếp Hình 3 mô tả các chức năng phụ của các thanhghi
Trang 9Hình 1.3 Register file.
Tóm lại 32 RF của AVR được xem là 1 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 RF thường được sử dụng như các toánhạ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/OMemory) 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 Vùng nhớ I/O có thể được truy cập như SRAM hay như các thanh ghi I/O Nếu sử dụng instruction truy xuất SRAM để truy xuất vùng nhớ này thì địa chỉ của chúng được tính từ 0x0020 đến 0x005F Nhưng nếu truy xuất như các thanh ghi I/O thì địa chỉ của chúng đựơc tính từ 0x0000 đến 0x003F.
Trang 10Xét ví dụ instruction OUT dùng xuất giá trị ra các thanh ghi I/O, lệnh này sửdụng địa chỉ kiểu thanh ghi, cấu trúc của lệnh như sau: OUT A, Rr, trong đó A là địachỉ của thanh ghi trong vùng nhớ I/O, Rr là thanh ghi RF, lệnh OUT xuất giá trị từthanh ghi Rr ra thanh ghi I/O có địa chỉ là A Giả sử chúng ta muốn xuất giá trị chứatrong R6 ra thanh ghi điều khiển hướng của PORTD, tức thanh ghi DDRD, địa chỉtính theo vùng I/O của thanh ghi DDRD là 0x0011, như thế câu lệnh của chúng ta sẽ
có dạng: OUT 0x0011, R6 Tuy nhiên trong 1 trường hợp khác, nếu muốn truy xuấtDDRD theo dạng SRAM, ví dụ lệnh STS hay LDS, thì phải dùng địa chỉ tuyệt đốicủa thanh ghi này, tức giá trị 0x0031, khi đó lệnh OUT ở trên được viết lại là STS0x0031, R6
Chúng ta dùng khái niệm “địa chỉ I/O” cho các thanh ghi trong vùng nhớ I/O
để nói đến địa chỉ không tính phần Register File, khái niệm “địa chỉ bộ nhớ” của thanh ghi là chỉ địa chỉ tuyệt đối của chúng trong SRAM Ví dụ thanh ghi DDRD có
“địa chỉ I/O” là 0x0011 và “địa chỉ bộ nhớ” của nó là 0x0031, “địa chỉ bộ nhớ” =
“địa chỉ I/O” + 0x0020.
Phần 3: RAM tĩnh, nội (internal SRAM), là vùng không gian cho chứa cácbiế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ácthanh RAM trong máy tính nhưng có dung lượng khá nhỏ (khoảng vài KB, tùy thuộcvào loại chip)
Phần 4: RAM ngoại (external SRAM), các chip AVR cho phép người sử dụnggắ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ầnquan 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 1, phần bộ nhớ EEPROM được tách riêng và có địa chỉ tính từ0x0000
3/ Cấu trúc tổng quát bên trong của AVR.
Hình 4 biểu diễn cấu trong bên trong của 1 AVR Bạn thấy rằng 32 thanh ghitrong Register File được kết nối trực tiếp với Arithmetic Logic Unit -ALU (ALU
Trang 11cũng được xem là CPU của AVR) bằng 2 line, vì thế ALU có thể truy xuất trực tiếpcùng lúc 2 thanh ghi RF chỉ trong 1 chu kỳ xung clock
Hình 1.4 Cấu trúc bên trong AVR.
Các instruction được chứa trong bộ nhớ chương trình Flash memory dưới dạngcác thanh ghi 16 bit Bộ nhớ chương trình được truy cập trong mỗi chu kỳ xung clock
và 1 instruction chứa trong program memory sẽ được load vào trong instructionregister, instruction register tác động và lựa chọn register file cũng như RAM choALU 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
Trang 12AVR 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 1 số vi điềukhiển khác như PIC nhưng thời gian thực thi vẫn nhanh hơn.
3.1/ Stack Pointer (Con trỏ- Ngăn xếp).
Stack được sử dụng để chứa dữ liệu tạm thời cho việc lưu trữ các biến địaphương và cho việc lưu trữ địa chỉ trở về sau khi gọi các chương trình và các ngắt.Đây là một thanh ghi 16 bit nhưng cũng có thể được xem như hai thanh ghi chứcnăng đặc biệt 8 bit Có địa chỉ trong các thanh ghi chức năng đặc biệt là $3E (Trong
bộ nhớ RAM là $5E) Có nhiệm vụ trỏ tới vùng nhớ trong RAM chứa ngăn xếp
Hình 1.5 Thanh ghi con trỏ ngăn xếp
Stack được hiểu như là 1 “tháp” dữ liệu, dữ liệu được chứa vào stack ở đỉnh
“tháp” và dữ liệu cũng được lấy ra từ đỉnh Kiểu truy cập dữ liệu của stack gọi làLIFO (Last In First Out – vào sau ra trước) Hình 6 thể hiện cách truy cập dữ liệu củastack
Trang 13Hình1.6 Stack Pointer.
Khái niệm và cách thức hoạt động của stack có thể được áp dụng cho AVR,bằng cách khai báo một vùng nhớ trong SRAM là stack ta có thể sử dụng vùng nhớnày như một stack thực thụ
Để khai báo một vùng SRAM làm stack chúng ta cần xác lập địa chỉ đầu củastack bằng cách xác lập con trỏ stack-SP (Stack Pointer) SP là 1 con trỏ 16 bit baogồm 2 thanh ghi 8 bit SPL và SPH (SPL chỉ thanh ghi mang giá trị byte thấp của SP,SPH byte cao), SPL và SPH nằm trong vùng nhớ I/O Giá trị gán cho thanh ghi SP sẽ
là địa chỉ khởi động của stack
3.2/ Thanh ghi trạng thái - SREG (STATUS REGISTRY).
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 Đây là thanh ghi trạng thái có 8 bit lưu trữtrạng thái của ALU sau các phép tính số học và logic
Thanh ghi SREG chứa 8 bit cờ (flag) chỉ trạng thái của bộ xử lí, tất cả các bitnày đều bị xóa sau khi reset, các bit này cũng có thể được đọc và ghi bởi chươngtrình Chức năng của từng bit được mô tả như sau:
Trang 14Hình 1.7 Thanh ghi trạng thái.
Bit 0 – C (Carry Flag: Cờ nhớ): là bit nhớ trong các phép đại số hoặc logic(Nếu phép toán có nhớ cờ sẽ được thiết lập)
Bit 1 – Z (Zero Flag: Cờ 0): cờ này được set nếu kết quả phép toán đại số hayphé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): cờ này sẽđược thiết lập khi tràn số bù 2
Bit 4 – S (Sign Bit: Bit dấu): Bit S là kết quả phép XOR giữa 1 cờ N và V,S=N xor V
Bit 5 – H (Half Carry Flag: Cờ nhờ nữa): cờ H là cờ nhớ trong 1 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 2 Instruction BLD (BitLoaD) và BST (Bit STorage) Làm nơi trung gian trong các lệnh về BLD và BST
Bit 7 – I (Global Interrupt Enable): Cho phép ngắt toàn bộ): Bit này phải đượcset 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íchhoạ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 (nếu bít này ở mức 0 thì không có ngắt nào đượcphục vụ)
Chú ý: tất cả các bit trong thanh ghi SREG đều có thể được xóa thông qua cácinstruction không toán hạng CLx và set bởi SEx, trong đó x là tên của Bit
3.3/ Quản lý ngắt.
Interrupts, thường được gọi là ngắt, là một tín hiệu khẩn cấp gửi đến bộ xử lý,yêu cầu bộ xử lý tạm ngừng tức khắc các hoạt động hiện tại để “nhảy” đến một nơikhác thực hiện một nhiệm vụ khẩn cấp nào đó, nhiệm vụ này gọi là trình phục vụ ngắt
Trang 15– isr (interrupt service routine) Sau khi kết thúc nhiệm vụ trong irs, bộ đếm chươngtrình sẽ được trả về giá trị trước đó để bộ xử lý quay về thực hiện tiếp các nhiệm vụcòn dang dở Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tìnhtrạng sẵn xàng cho đổi dữ liệu của mình.
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và lưu
vị trí đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới vectorphuc vụ ngắt và thức hiện chương trình phục vụ ngắt đó chơ tới khi gặp lệnh RETI(return from interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục thực hiện chươngtrình mà trước khi có ngăt nó đang thực hiện Trong trường hợp mà có nhiều ngắt yêucầu cùng một lúc thì CPU sẽ lưu các cờ báo ngắt đó lại và thực hiện lần lượt các ngắttheo mức ưu tiên Trong khi đang thực hiện ngắt mà xuất hiện ngắt mới thì sẽ xảy rahai trường hợp Trường hớp ngắt này có mức ưu tiên cao hơn thì nó sẽ được phục vụ.Còn nó mà có mức ưu tiên thấp hơn thì nó sẽ bị bỏ qua
Hình 8 minh họa cách tổ chức ngắt thông thường trong các chip AVR Sốlượng ngắt trên mỗi dòng chip là khác nhau, ứng với mỗi ngắt sẽ có vector ngắt,vector ngắt là các thanh ghi có địa chỉ cố định được định nghĩa trước nằm trong phầnđầu của bộ nhớ chương trình Ví dụ vector ngắt ngoài 0 (external interrupt 0) của chipatmega AVR có địa chỉ là 0x00 (theo datasheet từ Atmel) Trong lúc chương trìnhchính đang thực thi, nếu có một sự thay đổi dẫn đến ngắt xảy ra ở chân INT0 (chân4), bộ đếm chương trình (Program Counter) nhảy đến địa chỉ 0x009, giả sử ngay tạiđịa chỉ 0x001 chúng ta có đặt 1 lệnh RJMP đến một trình phục vụ ngắt (IRS1 chẳnghạn), một lần nữa bộ đếm chương trình nhảy đến IRS1 để thực thi trình phục vụ ngắt,kết thúc ISR1, bộ đếm chương trình lại quay về vị trí trước đó trong chương trìnhchính, quá trình ngắt kết thúc Không mang tính bắt buộc nhưng tôi khuyên bạn nên
tổ chức chương trình ngắt theo cách này để tránh những lỗi liên quan đến địa chỉchương trình
Trang 16Hình 1.8 Ngắt.
Bảng 1 Các Vector Ngắt và Reset.
Trang 173.3.1/ Ngắt ngoài (External Interrupt).
Ngắt ngoài là cách rất hiệu quả để thực hiện giao tiếp giữa người dùng và chip.Trên chip AVR có 2 ngắt ngoài có tên là INT0 và INT1 tương ứng với chân (PD2) và(PD3) Khi làm việc với các thiết bị ngoại vi của AVR, hầu như chúng ta chỉ thao táctrên các thanh ghi chức năng đặc biệt - SFR (Special Function Registers) trên vùngnhớ IO, mỗi thiết bị bao gồm một tập hợp các thanh ghi điều khiển, trạng thái, ngắtkhác nhau, điều này đồng nghĩa chúng ta phải nhớ tất cả các thanh ghi của AVR Có
Trang 183 thanh ghi liên quan đến ngắt ngoài đó là MCUCR, GICR và GIFR Cụ thể các thanhghi được trình bày bên dưới.
Thanh ghi điều khiển MCU – MCUCR (MCU Control Register) là thanh ghixác lập chế độ ngắt cho ngắt ngoài
Hình 1.9 Kết nối ngắt ngoài
Giả sử chúng ta kết nối các ngắt ngoài trên AVR như hình 9, các button dùngtạo ra các ngắt Có 4 khả năng (tạm gọi là các MODES) có thể xảy ra khi chúng tanhấn và thả các button Nếu không nhấn, trạng thái các chân INT là HIGH do điện trởkéo lên, khi vừa nhấn 1 button, sẽ có chuyển trạng thái từ HIGH sang LOW, chúng tagọi là cạnh xuống -Falling Edge, khi button được nhấn và giữ, trạng thái các chânINT được xác định là LOW và cuối cùng khi thả các button, trạng thái chuyển từLOW sang HIGH, gọi là cạnh lên – Rising Edge Trong những trường hợp cụ thể, 1trong 4 MODES trên đều hữu ích, ví dụ trong các ứng dụng đếm xung (đếm encodercủa servo motor chẳng hạn) thì 2 MODE “cạnh” phải được dùng Thanh ghi MCUCRchứa các bits cho phép chúng ta chọn 1 trong 4 MODE trên cho các ngắt ngoài Dướiđây là cấu trúc thanh ghi MCUCR
Hình 1.10 Cấu trúc thanh ghi MCUCR
MCUCR là một thanh ghi 8 bit nhưng đối với hoạt động ngắt ngoài, chúng tachỉ quan tâm đến 4 bit thấp của nó (4 bit cao dùng cho Power manager và Sleep
Trang 19Mode) Bốn bit thấp là các bit Interrupt Sense Control (ISC) trong đó 2 bit ISC11:ISC10 dùng cho INT1 và 2 bit ISC01: ISC00 dùng cho INT0 Chức năng của các bitxem bảng 2, đây là bảng “chân trị” của 2 bit ISC11, ISC10 Bảng chân trị cho các bitISC01, ISC00 hoàn toàn tương tự.
Bảng 2: INT1 Sense Control
Thanh ghi điều khiển ngắt chung – GICR (General Interrupt Control Register)(chú ý trên các chip AVR cũ, như các chip AT90Sxxxx, thanh ghi này có tên là thanhghi mặt nạ ngắt thông thường GIMSK, tham khảo thêm datasheet của các chip này).GICR cũng là 1 thanh ghi 8 bit nhưng chỉ có 2 bit cao (bit 6 và bit 7) là được sử dụngcho điều khiển ngắt, cấu trúc thanh ghi như bên dưới
Hình 1.11 Thanh ghi GICR
Bit 7 – INT1 gọi là bit cho phép ngắt 1(Interrupt Enable), set bit này bằng 1nghĩa là cho phép ngắt INT1 hoạt động, tương tự, bit INT0 điều khiển ngắt INT0
Thanh ghi cờ ngắt chung – GIFR (General Interrupt Flag Register) có 2 bitINTF1 và INTF0 là các bit trạng thái (hay bit cờ - Flag) của 2 ngắt INT1 và INT0.Nếu có 1 sự kiện ngắt phù hợp xảy ra trên chân INT1, bit INTF1 được tự động setbằng 1 (tương tự cho trường hợp của INTF0), chúng ta có thể sử dụng các bit này đểnhận ra các ngắt, tuy nhiên điều này là không cần thiết nếu chúng ta cho phép ngắt tựđộng, vì vậy thanh ghi này thường không được quan tâm khi lập trình ngắt ngoài Cấutrúc thanh ghi GIFR được trình bày trong hình 12
Trang 20Hình 1.12 Thanh ghi GIFR
Sau khi đã xác lập các bit sẵn sàng cho các ngắt ngoài, cuối cùng ta cần set bit
I, tức bit cho phép ngắt toàn cục, trong thanh ghi trạng thái chung của chip (thanh ghiSREG) Một chú ý khác là vì các chân PD2, PD3 là các chân ngắt nên bạn phải setcác chân này là Input (set thanh ghi DDRD) Quá trình thiết lập ngắt ngoài được trìnhbày trong hình 13
Hình 1.13 Thiết lập ngắt ngoài.
Ngắt ngoài với C: Avr-libc hỗ trợ một thư viện hàm cho ngắt khá hoàn hảo, để
sử dụng ngắt trong chương trình viết bằng C (avr-gcc) ta cần khai báo thư việninclude file “interrupt.h” nằm trong thư mục con “avr” File header interrupt.h chứađịnh nghĩa các hàm và phương thức phục vụ cho viết trình phục vụ ngắt
3.4/ Macro và chương trình con.
Macro là khái niệm chỉ một đoạn code nhỏ để thực hiện một công việc nào
đó, nếu có 1 đoạn code nào đó mà rất hay sử dụng khi lập trình thì nên dùng macro đểtránh việc phải viết đi viết lại đoạn code đó Lập trình ASM cho AVR cho phép sửdụng Macro
Chương trình con cũng là 1 đoạn code thực hiện 1 chức năng đặc biệt nào đó.
Tuy nhiên khác với Macro, mỗi khi gọi chương trình con, con trỏ chương trình nhảyđến chương trình con đề thực thi chương trình con và sau đó quay về chương trình
Set mode với MCUCR
Enable Interupt Với GICR
Enable bit I Trong SREG
Trang 21chính Như thế chương trình con chỉ được biên dịch 1 lần và có thể sử dụng nhiều lần,
nó làm giảm dung lượng chương trình Đây là ưu điểm và cũng là điểm khác biệt lớnnhất giữa chương trình con và Macro Tuy nhiên cần chú ý là việc nhảy đến chươngtrình con và nhảy về chương trình chính cần vài chu kỳ máy, có thể làm chậm chươngtrình, đây là nhược điểm của chương trình con so với macro
Chương trình con cho AVR luôn được bắt đầu bằng 1 nhãn (Label), đó cũng làtên và địa chỉ của chương trình con Chương trình con thường được kết thúc với câulệnh RET (Return)
Để gọi chương trình con từ 1 vị trí nào đó trong chương trình, chúng ta có thểdùng lệnh CALL hoặc RCALL (Relative CALL) Mỗi khi các lệnh này được gọi, bộđếm chương trình được tự động được PUSH vào stack và khi chương trình con kếtthúc bằng lệnh RET, bộ đếm chương trình được POP trở ra và quay về chương trìnhchính Lệnh CALL có thể gọi 1 chương trình con ở bất kỳ vị trí nào trong khi RCALLchỉ gọi trong khoảng bộ nhớ 4KB, nhưng RCALL cần ít chu kỳ xung clock hơn khithực thi
Hai instruction khác có thể được dùng để gọi chương trình con đó là JMP(Jump) và RJMP (Relative Jump) Khác với các lệnh call, các lệnh jump không chophép quay lại vì không tự động PUSH bộ đếm chương trình vào Stack, để sử dụngcác lệnh này gọi chương trình con ta cần một số lệnh jump khác ở cuối chương trìnhcon
3.5/ Giao Tiếp Truyền Thông Nối Tiếp TWI – I2C.
TWI (Two-Wire Serial Intereafce) là một module truyền thông nối tiếp đồng
bộ trên các chip AVR dựa trên chuẩn truyền thông I2C I2C là viết tắc của từ Integrated Circuit là một chuẩn truyền thông do hãng điện tử Philips Semiconductorsáng lập và xây dựng thành chuẩn năm 1990 Tìm hiểu TWI của AVR không chỉ giúp
Inter-ta giao tiếp giữa các AVR với nhau mà có thể dùng TWI để điều khiển bất kỳ mộtthiết bị nào theo chuẩn I2C (các chip nhớ, bộ chuyển đổi ADC, DCA, đồng hồ thờigian thực…)
TWI (I2C) là một truyền thông nối tiếp đa chip chủ (multi-master serialcomputer bus) Được hiểu là trong trên cùng một bus có thể có nhiều hơn một thiết bị
Trang 22làm Master, đồng thời một Slave có thể trở thành một Master nếu nó có khả năng.TWI (I2C) được thực hiện trên 2 đường SDA (Serial DATA) và SCL (Serial Clock)trong đó SDA là đường truyền/nhận dữ liệu và SCL là đường xung nhịp Căn cứ theochuẩn I2C, các đường SDA và SCL trên các thiết bị có cấu hình “cực góp mở” (open-drain hoặc open-collector), nghĩa là cần có các “điện trở kéo lên” (pull-up resistor)cho các đường này Ở trạng thái nghỉ (Idle), 2 chân SDA và SCL ở mức cao Hình 14
mô tả một mô hình mạng TWI (I2C) cơ bản
Hình 1.14 Mạng TWI (I2C) với nhiều thiết bị và 2 điện trở kéo lên cho SDA, SCL
Master: Là chip khởi động quá trình truyền nhận, phát đi địa chỉ của thiết bị
cần giao tiếp và tạo xung giữ nhịp trên đường SCL
Slave: Là chip có một địa chỉ cố định, được gọi bởi Master và phục vụ yêu cầu
từ Master
SDA- Serial Data: Là đường dữ liệu nối tiếp, tất cả các thông tin về địa chỉ
hay dữ liệu đều được truyền trên đường này theo thứ tự từng bit một Chú ý là trongchuẩn I2C, bit có trọng số lớn nhất (MSB) được truyền trước nhất, đặc điểm nàyngược lại với chuẩn UART
SCL – Serial Clock: Là đường giữ nhịp nối tiếp TWI (I2C) là chuần truyền
thông nối tiếp đồng bộ, cần có 1 đường tạo xung giữ nhịp cho quá trình truyền/nhận,
cứ mỗi xung trên đường giữ nhịp SCL, một bit dữ liệu trên đường SDA sẽ được lấymẫu (sample) Dữ liệu nối tiếp trên đường SDA được lấy mẫu khi đường SCL ở mứccao trong một chu kỳ giữ nhịp, vì thế đường SDA không được đổi trạng thái khi SCL
Trang 23ở mức cao (trừ START và STOP condition) Chân SDA có thể được đổi trạng tháikhi SCL ở mức thấp.
Hình 1.15 Điều kiện khởi động và điều kiện dừng
START Condition - Điều kiện bắt đầu: từ trạng thái nghỉ, khi cả SDA và SCL
ở mức cao nếu Master muốn thực hiện một “cuộc gọi”, Master sẽ kéo chân SDAxuống thấp trong khi SCL vẫn cao Trạng thái này gọi là START Condition (gọi tắt làS)
STOP Condition - Điều kiện kết thúc: sau khi thực hiện truyền/nhận dữ liệu,nếu Master muốn kết thúc quá trình nó sẽ tạo ra một STOP condition STOPcondition được Master thực hiện bằng cách kéo chân SDA lên cao khi đường SCLđang ở mức cao STOP condition chỉ được tạo ra sau khi địa chỉ hoặc dữ liệu đã đượctruyền/nhận
REPEAT START – Bắt đầu lặp lại: Khoảng giữa START và STOP condition
là khoảng bận của đường truyền, các Master khác không tác động được vào đườngtruyền trong khoảng này Trường hợp sau khi kết thúc truyền/nhận mà Master khônggởi STOP condition lại gởi thêm 1 START condition gọi là REPEAT START Khảnăng này thường được dùng khi Master muốn lấy dữ liệu liên tiếp từ các Slaves
Address Packet Format – Định dạng gói địa chỉ: Trên mạng TWI (I2C), tất cảcác thiết bị (chip) đều có thể là Master hay Slave Mỗi thiết bị có một địa chỉ cố địnhgọi là Device address Khi một Master muốn giao tiếp với một Slave nào đó, nó trướchết tạo ra một START condition và tiếp theo là gởi địa chỉ Device address của Slavecần giao tiếp trên đường truyền, vì thế xuất hiện khái niệm “gói địa chỉ” (AddressPacket) Gói địa chỉ trong TWI (I2C) có định dạng 9 bits trong đó 7 bit đầu (gọi làSLA, được gởi liền sau START condition) chứa địa chỉ Slave, một bit READ/WRITE
và một bit ACK-Ackknowledge (xác nhận) Do bit địa chỉ có độ dài 7 bits nên về mặt
Trang 24lý thuyết, trên 1 mạng TWI (I2C) có thể tồn tại tối đa 27=128 thiết bị có địa chỉ riêngbiệt Tuy nhiên, có một số địa chỉ không được sử dụng như các địa chỉ có định dạng1111xxx (tức các địa chỉ lớn hơn hoặc bằng 120 không được dùng) Riêng địa chỉ 0được dùng cho “cuộc gọi chung” (General call) Bit READ/WRITE (R/W) đượctruyền tiếp sau 7 bit địa chỉ là bit báo cho Slave biết Master muốn “đọc” hay “ghi”vào Slave Nếu bit này bằng 0 (gọi là W) thì quá trình “Ghi” dữ liệu từ Master đếnSlave được yêu cầu, nếu bit này bằng 1 (gọi là R) thì Master muốn “đọc” dữ liệu từSlave về Tám bits trên (SLA+R/W) được Master phát ra sau khi phát STARTcondition, nếu một Slave trên mạng nhận ra rằng địa chỉ mà Master yêu cầu trùngkhớp với Device address của chính mình, nó sẽ “đáp trả” lại Master bằng cách phát ra
1 tín hiệu “xác nhận” ACK bằng cách kéo chân SDA xuống thấp trong xung thứ 9.Ngược lại, nếu không có Slave đáp ứng lại, chân SDA vẫn ở mức cao trong xung giữnhịp thứ 9 thì gọi là tín hiệu “không xác nhận” – NOT ACK, lúc này Master cần cónhững ứng xử phù hợp tùy theo mỗi trường hợp cụ thể, ví dụ Master có thể gởi STOPcondition và sau đó phát lại địa chỉ Slave khác…Như vậy, trong 9 bit của gói địa chỉthì chỉ có 8 bit được gởi bởi Master, bit còn lại là do Slave Ví dụ Master muốn yêucầu “đọc” dữ liệu từ Slave có địa chỉ 43, nó cần phát đi một byte như sau trên đườngtruyền: (43<<1)+1, trong đó (43<<1) là dịch số 43 về bên trái 1 vị trí vì 7 bit địa chỉnằm ở các vị trí cao trong gói địa chỉ, sau đó cộng giá trị này với “1” tức là quá trình
“đọc” được yêu cầu
General call – Cuộc gọi chung: Khi Master phát đi gói địa chỉ có dạng 0 (thựcchất là 0+W) tức nó muốn thực hiện một cuộc gọi chung đến tất cả các Slave Tấtnhiên, cho phép hay không cho phép cuộc gọi chung là do Slave quyết định Nếu cácSlave được cài đặt cho phép cuộc gọi chung, chúng sẽ đáp lại Master bằng ACK.Cuộc gọi chung thường xảy ra khi Master muốn gởi dữ liệu chung đến các Slaves.Nếu cuộc gọi chung có dạng 0+R là vô nghĩa vì không thể có chuyện Master nhận dữliệu từ tất cả các Slave cùng thời điểm
Data Packet Format – Định dạng gói dữ liệu: Sau khi địa chỉ đã được phát đi,Slave đã đáp lại Master bằng ACK thì quá trình truyền/nhận dữ liệu sẽ diễn ra giữacặp Master/Slave này Tùy vào bit R/W trong gói địa chỉ, dữ liệu có thể được truyền
Trang 25theo hướng từ Master đến Slave hay từ Slave đến Master Dù di chuyển theo hướngnào, gói dữ liệu luôn bao gồm 9 bits trong đó 8 bits đầu là dữ liệu và 1 bit cuối là bitACK Tám bits dữ liệu do thiết bị phát gởi và bit ACK do thiết bị nhận tạo ra Sau đóMaster sẽ quyết định gợi tiếp byte dữ liệu khác hay không Nếu Slave phát tín hiệuNOT ACK (không tác động SDA ở xung thứ 9) sau khi nhận dữ liệu thì Master sẽ kếtthúc quá trình gởi bằng cách phát đi STOP condition Hình bên dưới mô tả định dạnggói dữ liệu trong TWI (I2C).
Hình 1.16 Truyền dữ liệu trên I2C
Phối hợp gói địa chỉ và dữ liệu: một quá trình truyền/nhận TWI (I2C) thườngđược bắt đầu từ Master, Master phát đi một START condition sau đó gởi gói địa chỉSLA+R/W trên đường truyền Tiếp theo nếu có một Slave đáp ứng lại, dữ liệu có thểtruyền/nhận liên tiếp trên đường truyền (1 hoặc nhiều byte liên tiếp)
Multi-Master Bus –Đường truyền đa chip chủ: TWI (I2C) là chuẩn truyềnthông đa chip chủ, nghĩa là tại một thời điểm có thể có nhiều hơn 1 chip làm Masternếu các chip này phát ra START condition cùng lúc Nếu các Master có cùng yêu cầu
và thao tác đối với Slave thì chúng có thể “cùng tồn tại” và quá trình truyền/nhận cóthể thành công Tuy nhiên, trong đa số trường hợp sẽ có một số Master bị “thất lạc”(lost) Một Master bị lost khi nó truyền/nhận 1 mức cao trên SDA trong khi cácMaster khác truyền/nhận 1 mức thấp
Trang 26Sơ đồ khối của ATmega16
Trang 27Hình 2.1 Sơ đồ cấu trúc ATmega16
2/ Các đặc tính của của ATMEGA16.
ATmega16 có các đặc điểm sau:
- Hiệu năng cao, tiêu thụ năng lượng ít, ít xảy ra lỗi
- Kiến trúc RISC – Reduce Insruction Set Computer (máy tính dùng tập lệnhrút gọn, bộ xử lý dùng ít lệnh hơn những bộ vi xử lý khác)
- Tốc độ thực hiện lệnh lên tới 16 triệu lệnh trong 1 giây với tần số 16MHz
Trang 28- 16KB bộ nhớ Flash với khả năng đọc trong khi ghi.
- 512 byte bộ nhớ EEPROM có thể thực hiện 100.000 lần ghi/xoá
- 1KB bộ nhớ SRAM bên trong
- 32 thanh ghi chức năng chung, 32 đường vào ra chung
- 2 bộ định thời/bộ đếm 8 bit với các chế độ tỷ lệ định trước và chế độ sosánh
- 1 bộ định thời/ bộ đếm 16 bit với các chế độ tỷ lệ định trước riêng biệt, chế
độ so sánh và chế độ bắt giữ
- Bộ thời gian thực với bộ tạo dao động riêng biệt
- Ngắt nội và ngắt ngoại, USART, giao tiếp nối tiếp 2 dây
- Giao diện SPI chủ/ tớ
- Watchdog Timer khả trình với bộ tao dao động bên trong riêng biệt
- 8 kênh ADC 10 bit,
- Atmega 16 hỗ trợ đầy đủ các chương trình và công cụ phát triển hệ thốngnhư: trình biên dịch C, macro assemblers, debugger/simulators (chươngtrình mô phỏng), evaluation kit (kit thử nghiệm),
Bộ nhớ Flash có thể ghi/xoá ít nhất 10.000 lần Bộ đếm chương trình (PC) là
12 bit Bản đồ bộ nhớ chương trình như hình vẽ
Trang 30ra hai chiều có thể định hướng theo từng bit Và chứa cả điện trở pull-up (có thể lậptrình được) Mặc dù mỗi port có các đặc điểm riêng nhưng khi xét chúng là các cổngvà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,
Trang 31DDRB, DDRC, DDRD) và cuối cùng là địa chỉ chân vào của cổng (PINA, PINB,PINC, PIND).
a) Thanh ghi DDRx
Đây là thanh ghi 8 bit (ta có thể đọc và ghi các bit ở thanh ghi này) và có tácdụ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 bittrong 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
b) 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 Px và trong trường hợp nếu cổng được định nghĩa là cổng ra thì khi taghi 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ênmức1) thì điện trở kéo lên (pull-up) của chân tương ứng của port đó sẽ được kíchhoạt Thanh ghi này sau khi khởi động vi điều khiển sẽ có giá trị là 0x00
c) Thanh ghi PINx
Đây là thanh ghi 8 bit chứa dữ liệu vào của PORTx (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
1 Để đọc dữ liệu từ ngoài thì ta phải thực hiện các bước sau:
- Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit ntrong port) đó là đầu vào (xóa thanh ghi DDRx hoặc bit)
- Sau đó kích hoạt điện trở pull-up bằng cách set thanh ghi PORTx (bit)
- Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit)
2 Để đưa dữ liệu từ vi điều khiển ra các cổng cũng có các bước hoàn toàn tương tự.Ban đầu ta cũng phải định nghĩa đó là cổng ra bằng cách set bit tương ứng của cổngđó… và sau đó là ghi dữ liệu ra bit tương ứng của thanh ghi PORTx
5/ Bộ định thời.
Bộ định thời (timer/counter0) là các module độc lập với CPU Chức năngchính của các bộ Timer/Counter, như tên gọi của chúng là định thì (tạo ra một khoảng
Trang 32thời gian, đếm thời gian…) và đếm sự kiện Trên các chip AVR, các bộTimer/Counter còn có thêm chức năng tạo ra các xung điều rộng PWM (Pulse WidthModulation), ở một số dòng AVR, một số Timer/Counter còn được dùng như các bộcanh chỉnh thời gian (calibration) trong các ứng dụng thời gian thực Các bộTimer/Counter được chia theo độ rộng thanh ghi chứa giá trị định thời hay giá trị đếmcủa chúng.
Bộ định thời (timer/counter0) là một module định thời/đếm 8 bit, có các đặcđiểm sau:
Sơ đồ cấu trúc của bộ định thời:
Hình 2.4 Sơ đồ cấu trúc bộ định thời.
Trang 33Thanh ghi OCR0 luôn được so sánh với giá trị của bộ định thời/bộ đếm Kếtquả so sánh có thể được sử dụng để tạo ra PWM hoặc biến đổi tần số ngõ ra tại chânOC0.
b) Đơn vị đếm.
Phần chính của bộ định thời 8 bit một đơn vị đếm song hướng có thể lập trìnhđược Cấu trúc của nó như hình dưới đây:
Hình 2.5 Đơn vị đếm
Count: tăng hay giảm TCNT0 1
Direction: lựa chọn giữa đếm lên và đếm xuống
Clear: xóa thanh ghi TCNT0
ClkT0: xung clock của bộ định thời
TOP: báo hiệu bộ định thời đã tăng đến giá trị lớn nhất
BOTTOM: báo hiệu bộ định thời đã giảm đến giá trị nhỏ nhất (0)
Trang 34c) Đơn vị so sánh ngõ ra.
Hình 2.6 Sơ đồ đơn vị so sánh ngõ ra
Bộ so sánh 8 bit liên tục so sánh giá trị TCNT0 với giá trị trong thanh ghi sosánh ngõ ra (OCR0) Khi giá trị TCNT0 bằng với OCR0, bộ so sánh sẽ tạo một báohiệu Báo hiệu này sẽ đặt giá trị cờ so sánh ngõ ra (OCF0) lên 1 vào chu kỳ xungclock tiếp theo Nếu được kích hoạt (OCIE0=1), cờ OCF0 sẽ tạo ra một ngắt so sánhngõ ra và sẽ tự động được xóa khi ngắt được thực thi Cờ OCF0 cũng có thể được xóabằng phần mềm
d) Mô tả các thanh ghi.
- Thanh ghi điều khiển bộ định thời/bộ đếm TCCR0 (Timer/Counter Control Register) Là thanh ghi điều khiển hoạt động của T/C0
Hình 2.7 Thanh ghi điều khiển bộ định thời
Bit 7- FOC0: So sánh ngõ ra bắt buộc
Bit này chỉ tích cực khi bit WGM00 chỉ định chế độ làm việc không cóPWM Khi đặt bit này lên 1, một báo hiệu so sánh bắt buộc xuất hiện tại đơn vị tạodạng sóng
Trang 35Bit 6, 3 - WGM01:0: Chế độ tạo dạng sóng
Các bit này điều khiển đếm thứ tự của bộ đếm, nguồn cho giá trị lớn nhất của
bộ đếm (TOP) và kiểu tạo dạng sóng sẽ được sử dụng
Bit 5:4 - COM01:0: Chế độ báo hiệu so sánh ngõ ra
Các bit này điều khiển hoạt động của chân OC0 Nếu một hoặc cả hai bitCOM01:0 được đặt lên 1, ngõ ra OC0 sẽ hoạt động
Bit 2:0: Các bit CS00, CS01 và CS02 gọi là các bit chọn nguồn xung nhịpcho T/C0 (Clock Select) Chức năng các bit này được mô tả trong bảng 3
Ba bit này dùng để lựa chọn nguồn xung cho bộ định thời/bộ đếm
Bảng 3
- Thanh ghi bộ định thời/bộ đếm TCCT0 (Timer/Counter Register).
Là 1 thanh ghi 8 bit chứa giá trị vận hành của T/C0 Thanh ghi này cho phépbạn đọc và ghi giá trị một cách trực tiếp
Hình 2.8 Thanh ghi bộ định thời
Thanh ghi bộ định thời/bộ đếm cho phép truy cập trực tiếp (cả đọc và ghi) vào
bộ đếm 8 bit
- Thanh ghi so sánh ngõ ra-OCR0.
Trang 36Hình 2.9 Thanh ghi so sánh ngõ ra
Thanh ghi này chứa một giá trị 8 bit và liên tục được so sánh với giá trị của bộđếm
- Thanh ghi mặt nạ ngắt TIMSK (Timer/Counter Interrupt Mask Register).
Là thanh ghi mặt nạ cho ngắt của tất cả các T/C trong Atmega AVR, trong đóchỉ có bit TOIE0 tức bit số 0 (bit đầu tiên) trong thanh ghi này là liên quan đến T/C0,bit này có tên là bit cho phép ngắt khi có tràn ở T/C0 Tràn (Overflow) là hiện tượngxảy ra khi bộ giá trị trong thanh ghi TCNT0 đã đạt đến MAX (255) và lại đếm thêm 1lần nữa
Hình 2.10 Thanh ghi mặt nạ ngắt TIMSK Bit 1-OCIE0: Cho phép ngắt báo hiệu so sánh
Bit 0-TOIE0: Cho phép ngắt tràn bộ đếm
- Thanh ghi cờ ngắt bộ định thời TIFR (Timer/Counter Interrupt Flag Register).
Là thanh ghi cờ nhớ cho tất cả các bộ T/C Trong thanh ghi này bit số 0, TOV0
là cờ chỉ thị ngắt tràn của T/C0 Khi có ngắt tràn xảy ra, bit này tự động được set lên
1 Thông thường trong điều khiển các T/C vai trò của thanh ghi TIFR không quá quantrọng
Hình 2.11 Thanh ghi cờ ngắt bộ định thời
Bit 1-OCF0: Cờ so sánh ngõ ra 0
Trang 37255, tín hiệu kích tiếp theo sẽ làm thanh ghi TCNT0 trở về 0 (tràn), lúc này bit cờ trànTOV0 sẽ tự động được set bằng 1 Với cách thức hoạt động như thế có vẻ T/C0 “vôdụng” vì cứ tăng từ 0 đến 255 rồi lại quay về không và quá trình lặp lại Tuy nhiên,yếu tố tạo sự khác biệt chính là “tín hiệu kích” và ngắt tràn, kết hợp 2 yếu tố nàychúng ta có thể tạo ra 1 bộ định thời gian hoặc 1 bộ đếm sự kiện Trước hết bạn hãynhìn lại bảng 2.1 về các bit chọn xung nhịp cho T/C0 Xung nhịp cho T/C0 chính làtín hiệu kích cho T/C0, xung nhịp này có thể tạo bằng nguồn tạo dao động của chip(thạch anh, dao động nội trong chip…) Bằng cách đặt giá trị cho các bit CS00, CS01
và CS02 của thanh ghi điều khiển TCCR0 chúng ta sẽ quyết định “bao lâu” thì sẽ kíchT/C0 một lần Ví dụ mạch ứng dụng của bạn có nguồn dao động clkI/O = 1MHz tức chu kỳ 1 nhịp là 1us (1 micro giây), bạn đặt TCCR0=5 (SC02=1, CS01=0, CS00=1),căn cứ theo bảng 1 tín hiệu kích cho T/C0 sẽ bằng clkI/O/1024 nghĩa là sau 1024usthì T/C0 mới được “kích” 1 lần, nói cách khác giá trị của TCNT0 tăng thêm 1 sau1024us (chú ý là tần số được chia cho 1024 thì chu kỳ sẽ tăng 1024 lần) Quan sát 2dòng cuối cùng trong bảng 1 bạn sẽ thấy rằng tín hiệu kích cho T/C0 có thể lấy từ bênngoài (External clock source), đây chính là ý tưởng cho hoạt động của chức năng đếm
sự kiện trên T/C0 Bằng cách thay đổi trạng thái chân T0 chúng ta sẽ làm tăng giá trịthanh ghi TCNT0 hay nói cách khác T/C0 có thể dùng để đếm sự kiện xảy ra trênchânT0
6/ Bộ biến đổi A/D.
Vi điều khiểnATmega16 có một bộ biến đổi ADC tích hợp trong chip với cácđặc điểm:
Độ phân giải 10 bit
Sai số tuyến tính: 0.5LSB
Trang 38 Độ chính xác +/-2LSB.
Thời gian chuyển đổi: 65-260μs.s
8 Kênh đầu vào có thể được lựa chọn
Có hai chế độ chuyển đổi free running và single conversion
Có nguồn báo ngắt khi hoàn thành chuyển đổi
Loại bỏ nhiễu trong chế độ ngủ
Hình 2.12 Sơ đồ bộ biến đổi.
Tám đầu vào của ADC là tám chân của PORTA và chúng được chọn thôngqua một MUX
Để điều khiển hoạt động vào ra dữ liệu của ADC và CPU chúng ta có 3 thanhghi: ADMUX là thanh ghi điều khiển lựa chọn kênh đầu vào cho ADC, ADC SRA là
Trang 39thanh ghi điều khiển và thanh ghi trạng thái của ADC, ADCH và ADCL là 2 thanhghi dữ liệu.
a) ADMUX: Multiplexer select register.
Đây là thanh ghi điều khiển 8 bit
Hình 2.13 Thanh ghi ADMUX
Với 4 bit được định nghĩa là MUX3, MUX2, MUX1, và MUX0, ứng với các
tổ hợp logic ta có thể chọn kênh đầu vào Cụ thể:
Trang 40Đây là thanh ghi điều khiển và lưu trạng thái của ADC.
Hình 2.14 Thanh ghi điều khiển và trạng thái ADC
Bit 7-ADEN: ADC enable
Đây là bit điều khiển hoạt động của ADC.Khi bit này được set 1 thì ADC cóthể hoạt động và ngược lại.Nếu như ta ngừng hoạt động của ADC trong khi nó đangchuyển đổi thì nó sẽ kết thúc quá trình chuyển đổi.Mặc dù chưa chuyển đổi xong
Bit 6-ADSC: ADC start conversion
Trong chế độ chuyển đổi đơn thì bit này phải được set lên 1 để bắt đầu chuyểnđổi.Trong chế độ chuyển đổi tự do thì bit này cần được set lên 1 để bắt đầu lầnchuyển đổi đầu tiên Bit này được giữ sốt trong quá trình chuyển đổi và được xóa khi
mà chuyển đổi xong
Bit 5-ADATE: ADC Auto Trigger enable
Khi bit này được set thì ADC sẽ bắt đầu chuyển đổi mỗi khi có một nguồnkích hoạt xuất hiện Việc lựa chọn nguồn kích hoạt được thực hiện bằng cách set cácbit trong thanh ghi SFIOR
Bit 4-ADIF: ADC interrupt Flag
Bit này được set lên 1 bởi phần cứng khi quá trình chuyển đổi đã hoàn thành
và thanh ghi dữ liệu đã được cập nhật Bit này được xóa bằng phần cứng nếu nhưngắt này được phép và được phục vụ Hoặc nó có thể được xóa bằng cách ghi giá trịlogic “0” vào cờ này Cụ thể khi ngắt bị cấm ta có thể sử dụng các lệnh sbi và cbi đểtác dụng lên bit này
Bit 3-ADIE: ACD interrupt Enable
Nếu bit này set 1 và ngắt toàn cục được cho phép thì ngắt này được phép phục
vụ (khi chuyển đổi xong dữ liệu) và nếu bị xóa thì ngược lại
Bit 2, 1, 0 (ADPS2, ADPS 1, ADPS0): Bit lựa chọn xung nhịp (Tốc độ)
Nguồn xung được lấy từ nguồn xung của vi điều khiển (XTAL) và được chiatần thông qua bộ chia tần