VI ĐIỀU KHIỂN AVR

PHẦN 1: KIẾN THỨC AVR
I. Giới thiệu AVR là họ VĐK 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 từng chip của hãng Atmel theo công nghệ RISC ( educed Instruction Set Computer ). Nó ngang hàng với các họ VĐK 8 bit kh| như PIC , Pisoc. 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, có độ ổn định, khả năng tích hợp, sự mềm dẻo trong việc lập trình. 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. Thiết bị lập trình đơn giản ( như mạch nạp STK 200 chỉ cần v{i con điện trở là có thể nạp chương trình cho chip). Một số còn hỗ trợ lập trình on-chip bằng bootloader không cần mạch nạp. Tương thích với ngôn ngữ lập trình C Hầu hết c|c chip AVR có c|c tính năng sau: Giao diện SPI ( Serial Peripheral Interface) đồng bộ Sử dụng xung clock ngo{i lên đến 16Mhz, hoặc xung clock nội lên đến 8Mhz Bộ nhớ chương trình Flash có thể lập trình lại nhiều lần , dung lượng lớn, có bộ nhớ lưu trữ lập trình được EEPROM. Nhiều ngõ v{o ra ( I/O )2 hướng Bộ biến đổi ADC 10 bit C|c kênh băm xung PWM Các chế độ tiết kiệm năng lượng : sleep, stand by,… Bộ dịnh thời Watchdog. Timer/ counter 8 bit, 16bit Bộ so sánh analog Giao diện nối tiếp USART ( tương thích chuẩn RS-232 ) Giao diện nối tiếp Two-Wire-Seril ( tương thích chuẩn I2C) Master và Slaver …

Một số chíp AVR thông dụng: AT90S1200 AT90S2313 AT90S2323 and AT90S2343 AT90S2333 and AT90S4433

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : hanguyen92205@gmail.com

AT90S4414 and AT90S8515 AT90S4434 and AT90S8535 AT90C8534 ATtiny10, ATtiny11, ATtiny12 ATtiny15 ATtiny22 ATtiny26 ATtiny28 ATmega8/8515/8535 ATmega16 ATmega161 ATmega162 ATmega163 ATmega169 ATmega32 ATmega323 ATmega103 ATmega64/128/2560/2561 AT86RF401 ATxmega128A1 ATxmega128A3 Công cụ hỗ trợ Trình biên dịch: có rất nhiều trình biên dịch có thể sử dụng để biên dịch code thành file hex để nạp chip - AvrStudio: là trình biên dịch ASM chính thức cung cấp bởi Atmel, đ}y l{ trình biên dịch hoàn toàn miễn phí và tốt nhất cho lập trình AVR bằng ASM - Wavrasm: cũng được cung cấp bởi Atmel. Hiện tại thì ko còn được sửu dụng. - WinAVR: là trình dịch được phát triển bởi GNU, sử dụng ngôn ngữ C. - CodeVisionAVR: 1 chương trình lập trình C rất hay cho AVR, hỗ trợ nhiều thư viện lập trình - ICCAVR: lập trình C cho AVR - … 2. Chương trình nạp: đa số các trình biên dịch đều tích hợp sẵn 1 chương trình nạp chip hỗ trợ nhiều loại mạch. Việc chọn chương trình nạp sẽ được giới thiệu sau. 3. Mạch nạp: có rất nhiều loại mạch nạp cho AVR - STK200/300 : mạch nạp giao tiếp với máy tính qua cổng LPT. Gồm 2 phiên bản là bản thu gọn với bản dùng IC đệm 74xx244 II. 1.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : hanguyen92205@gmail.com

Mạch nạp tương thích với chương trình nạp PonyProg Mạch nạp USB AVR910: là mạch nạp sử dụng cổng USB nên rất tiện lợi trong quá trình sử dụng

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : hanguyen92205@gmail.com

Mạch nạp USBasp: được đ|nh gi| cao hơn về tính ổn định và tiện lợi. Mạch điện cũng tương đối đơn giản 4. Chương trình mô phỏng: ở đ}y tập trung vào Protues. Protues không những mô phỏng hoạt động bên trong của chip mà còn mô phỏng mạch điện tử rất trực quan, là công cụ hữu ích cho việc học III. Cấu trúc AVR 1. Bộ nhớ chương trình ( program memory): là bộ nhớ Flash lập trình được. Gồm 2 phần : Application Flash Section và Boot Flash section 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 load vào phần này Vì chức năng chính của bộ nhớ chương trình là chứa instruction, chúng ta không có nhiều cơ hội t|c động lên bộ nhớ này khi lập trình cho chip, vì thế đối với người lập trình AVR, bộ nhớ n{y “không qu| quan trọng”. Tất cả các thanh ghi quan trọng cần khảo sát nằm trong bộ nhớ dữ liệu của chip

Tổ chức bộ nhớ của AVR 2. Bộ nhớ dữ liệu ( data memory ): là phần chứa các thanh ghi quan trọng 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. Về cơ bản bộ nhớ này gồm 5 phần:
Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : hanguyen92205@gmail.com

-

Phần 1: là phần đầu tiên trong bộ nhớ dữ liệu, bao gồm 32 thanh ghi có tên gọi là register file (RF), hay General Purpose Register , đơn giản là các thanh ghi. Các thanh ghi đều là các thanh ghi 8 bit

-

-

Tất cả 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 giá trị có dấu từ -128 đến 127 hoặc mã ASCII của 1 ký tự n{o đó. C|c thanh ghi đặt tên theo thứ tự l{ R0 đến R31. Được chia thành 2 phần, phần 1 gồm các thanh ghi từ R0 đến R15 và phần 2 là các thanh ghi từ R16 đến R31 Đặc điểm của các thanh ghi: + Đượ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ỳ xung clock. + Register File được kết nối trực tiếp với bộ xử lý trung tâm của chip + Là nguồn chứa các số hạng trong phép to|n v{ cũng l{ đích kết quả 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ài chức năng thông thường còn được sử dụng như c|c con trỏ (Pointer register) trong một số instruction truy xuất gián tiếp Các chức năng phụ của thanh ghi

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : hanguyen92205@gmail.com

Mail : hanguyen92205@gmail. hay còn gọi là vùng nhớ I/O. ĐT : 0982969872.com . đ}y l{ việc tương đối khó khăn. để gọi các thanh ghi này. + Vì c|c thanh ghi trong vùng I/O không được hiểu theo tên gọi như c|c Register file. khi lập trình cho c|c thanh ghi n{y. Phần 2: là phần năm sau register file. địa chỉ của tất cả c|c thanh ghi trong vùng I/O đều được định nghĩa trước trong 1 file Definition chỉ cần đính kèm file n{y v{o chương trình của bạn là có thể truy xuất các thanh ghi với tên gọi của chúng. 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. người lập trình cần nhớ địa chỉ của từng thanh ghi. trong hầu hết các phần mềm lập trình cho AVR. vì thế chúng được CPU sử dụng trực tiếp v{ nhanh chóng. Bao gồm 64 thanh ghi gọi là 64 thanh ghi xuất nhập. 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.- 32 RF của AVR được xem là 1 phần của CPU. 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. Nguyễn Ngọc Hà . 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. Là cửa ngõ giao tiếp của CPU với thiết bị ngoại vi + Vùng nhớ I/O có thể được truy cập như SRAM hay như c|c thanh ghi I/O. Tuy nhiên.

ĐT : 0982969872. 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 Nguyễn Ngọc Hà . c|c chip AVR cho phép người dùng gắn thêm các bộ nhớ ngoài để chứa biến. vùng này chỉ tồn tại khi người dùng gắn thêm bộ nhớ ngoài vào chip .Phần 4: RAM ngoại. 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.Phần 5: EEPROM : là 1 phần quan trọng của chip.Phần 3: RAM tĩnh. 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. Bộ nhớ này không bị xóa nagy cả khi ngắt nguồn cấp cho chip 3. nội. Mail : hanguyen92205@gmail. tùy thuộc vào loại chip .com . Hoạt động của AVR - Cấu trúc bên trong AVR 32 thanh ghi trong Register File được kết nối trực tiếp với ALU ( Arithmetic Logic Unit) bằng 2 line.

vì vậy có thể nguồn clock lớn nhất cho AVR có thể nhỏ hơn 1 số vi điều khiển kh|c như PIC nhưng thời gian thực thi vẫn nhanh hơn 4.Stack thường được sử dụng trong c|c chương trình con. Stack Là tháp dữ liệu. Trong lúc thực thi chương trình. sau khi thực hiện chương trình con lại muốn quay về vị trí ban đầu trong chương trình chính thì Stack l{ phương c|ch tối ưu dùng để chứa bộ đếm chương trình trong trường hợp này. khi chúng ta cần “nhảy” từ một vị trí trong chương trình chính đến 1 chương trình con. ĐT : 0982969872. instruction register t|c động v{ lựa chọn register file cũng như RAM cho ALU thực thi. Kiểu truy cập dữ liệu này gọi là LIFO ( last in first out ) Stack hoạt đông bằng cách khai báo một vùng nhớ trong SRAM là stack là ta có thể sử dụng vùng nhớ n{y như 1 stack thực thụ.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. Nguyễn Ngọc Hà . dữ liệu được chứa vào stack ở đỉnh tháp và dữ liệu được lấy ra ở đỉnh. 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 instruction register. đị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. Không nên sử dụng Stack để lưu c|c biên thông thường vì đôi khi sẽ l{m chương trình thực thi sai hoặc tốn thời gian vô ích. AVR có ưu điểm l{ hầu hết c|c instruction đều được thực thi trong 1 chu kỳ xung clock.com . Mail : hanguyen92205@gmail.

. có thể làm chậm chương trình.Bit 6 – T ( Bit Coppy Storage ): được sử dụng trong 2 Instruction BLD ( Bit Load ) và BST ( Bit Storage ). thanh ghi SREG có đia chỉ I/O là 0x003F v{ địa chỉ bộ nhớ là 0x005F . có thể đọc ghi bởi chương trình Bit 0 – C ( Carry Flag : Cờ nhớ ): là bit nhớ trong c|c phép đại số hoặc logic 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. ĐT : 0982969872. Việc nhảy đến chương trình con v{ nhảy về chương trình chính cần vài chu kỳ máy. là thanh ghi quan trọng của AVR.com .Bit 2 – N ( Negative Flag : Cờ âm ): được set nếu kết quả phép toán đại số hay phép logic là số âm .Bit 4 – S ( Sign Bit : Bit dấu ): là kết quả giữa phép XOR giữa cờ N và V . . Ngắt Ngoài 1. tất cả đều bị xóa sau khi reset. Chương trình con chỉ được biên dịch 1 lần và sử dụng nhiều lần.5. thường được gọi là ngắt. Bit n{y được set lên 1 nếu trong chương trình có sử dụng ngắt 6.Chương trình con: l{ 1 đoạn code thực hiện chức năng đặc biệt n{o đó. Thanh ghi trạng thái – SREG ( Status Registry ) Nằm trong vùng nhớ I/O. nó làm giảm dung lượng chương trình. 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ơi kh|c thực hiện một Nguyễn Ngọc Hà . .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. IV.Bit 7 – I ( Golbal Interrupt Enable ): Cho phép ngắt toàn bộ. Tuy nhiên khác với Macro. Mail : hanguyen92205@gmail.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 đó. hiệu quả đối với phép toán BCD .Bit 3 – V ( Two’s complement Overflow Flag : Cờ tràn của bù 2 ): hoạt động liên quan đến phần bù nhị phân . mỗi khi gọi chương trình con. nếu có 1 đoạn code n{o đó 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 đó. con trỏ chương trình n{y nhảy đến chương trình con để thực hiện chương trình con v{ sau đó quay về chương trình chính. Macro và chương trình con . Macro không l{m giảm dung lượng chương trình mà chỉ làm cho việc lập trình nhẹ nh{ng hơn. là một tín hiệu khẩn cấp gởi đến bộ xử lí. Ngắt trên AVR Interrupts. Thanh ghi SREG chứa 8 bit cờ chỉ trạng thái của bộ xử lý.

chúng ta chỉ quan t}m đến 4 bit thấp của nó ( 4 bit cao dùng cho Power manager và Sleep mode ). Bảng INT1 sense Control - Thanh ghi diều khiển ngắt chung – GICR ( General Interrupt Control Register ) l{ thanh ghi 8 bit nhưng chỉ có 2 bit cao ( bit 6 v{ bit 7 ) l{ được sử dụng cho điều khiển ngắt. ngắt báo có 1 gói dữ liệu đ~ được nhận…). Ngắt ngoài 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. Mail : hanguyen92205@gmail.com . ĐT : 0982969872. 4 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. ngắt báo quá trình gởi dữ liệu bằng RS232 kết thúc…) hay do c|c t|c nh}n bên ngo{i (ngắt b|o có 1 button được nhấn. nhiệm vụ này gọi là trình phục vụ ngắt – isr (interrupt service routine ). Như vậy. GICR. Có 3 thanh ghi liên quan đến ngắt ngoài là MCUCR. ngắt có mức độ ưu tiên xử lí cao nhất. cấu trúc thanh ghi: Nguyễn Ngọc Hà .MCUCR ( MCU control register ) là thanh ghi các lập chế độ ngắt cho ngắt ngoài Cấu trúc thanh ghi MCUCR: MCUCR l{ thanh ghi 8 bit nhưng với hoạt động ngắt. Sau khi kết thúc nhiệm vụ trong isr. ngắt thường được dùng để xử lí các sự kiện bất ngờ nhưng không tốn quá nhiều thời gian. bộ đếm chương trì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ở. 2.nhiệm vụ khẩn cấp n{o đó. Các tín hiệu dẫn đến ngắt có thể xuất phát từ các thiết bị bên trong chip (ngắt báo bộ đếm timer/counter tràn. GIFR Thanh điều khiển MCU .

Nguyễn Ngọc Hà . ĐT : 0982969872.com . Mail : hanguyen92205@gmail. tương tự bit INT) điều khiển ngắt INT0.Bit 7 – INT1 gọi là bit cho phép ngắt 1( Interrupt enable). 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. PD3 là các chân ngắt nên phải set các chân này là input ( thanh ghi DDRD ). set bit này bằng 1 là cho phép nagwts INT1 hoạt động. việc sau cùng chúng ta cần làm là set các bit I. trong thanh ghi trạng thái chung của chip.Hình ảnh thiết lập ngắt ngoài: Để sử dụng ngắt ngoài với C ta chỉ cần include file “interrupt. 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ác chân PD2.h” nằm trong thư viện của phần mềm lập trình. Thanh ghi cờ ngắt chung – GIFR ( general interrupt flag register ) có 2 bit INTF1 và INTF0 là các bit trạng thái ( hay bit cờ .Flag ) của 2 ngắt INT1 và INT0). Cấu trúc thanh ghi GIFR: Sau khi đ~ x|c lập các bit sẵn sàng cho các ngắt ngoài. File” 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. tức bit cho phép ngắt toàn cục. chúng ta có thể sử dụng các bit này để nhận ra các ngắt.

Mail : hanguyen92205@gmail.Gi| trị trong Timer có thể được viết v{o bất cứ lúc n{o . Chức năng chí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 thời gian.Timer trên AVR l{ 1 modul lý tưởng để tạo ra các tín hiệu dạng này.Tuy nhiên nếu m{ ngắt tr{n được chấp nhận thì cờ ngắt sẽ tự động bị xo| khi ngắt được thực hiện. Trên AVR. đếm thời gian …) v{ đếm sự kiện. 2. Trên chip ATmega16 có 2 bộ Timer/ Counter 8 bit và 1 bộ 16 bit. Timer – Counter 1. Các chế độ hoạt động của Timer .com . chu kỳ nếu cần thiết ). ĐT : 0982969872.Chế Độ Thông Thường: Đ}y l{ chế độ hoạt động đơn giản nhất của Timer .V. thời gian tín hiệu mức HIGH ( duty cycle )của nó có thể được thay đổi Tạo ra PWM tức là tạo ra những tín hiệu xung mà ta có thể điều khiểnduty cycle ( và cả tần số.Khi gi| trị trong Timer bằng gi| trị trong thanh ghi ORC thì gi| trị trong Timer Nguyễn Ngọc Hà . các bộ Timer/ Counter còn có chức năng tạo ra c|c xung điều rộng PWM. Giới thiệu Timer/ Counter ( T/C ) l{ c|c modul độc lập với CPU. Bộ định thời gian: Chúng ta có thể tạo ra 1 bộ định thời thì để c{i đặt một khoảng thời gian n{o đó Bộ đếm sự kiện: chúng ta có thể dùng Timer/ Counter như 1 đếm để đếm các sự kiện ( sự thay đổi trạng thái ) PWM ( Pulse Width Mudulation ): “ xung điều rộng “ l{ kh|i niệm chỉ tín hiệu xung m{ thường thì chu kỳ của nó được cố định.Chế Độ So Sánh (CTC): Đấy l{ chế độ m{ gi| trị trong Timer luôn được so s|nh với gi| trị trong thanh ghi ORC .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ị xo| đi.

Mail : hanguyen92205@gmail.sẽ bị xo| đi.Chế Độ Fast PWM: Cho phép tạo ra sóng với tần số cao.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ì 1 so s|nh sẽ bị lỡ.đầu ra đảo sẽ được set lên 1 khi sự so s|nh giữa thanh ghi ORC v{ gi| trị trong Timer bằng nhau v{ sẽ bị xo| khi gi| trị đạt Bottom. Trong chế độ không đảo đầu ra của ch}n so s|nh OCx sẽ bi xo| khi có phép to|n so s|nh giữa TCNTx v{ thanh ghi ORC l{ bằng nhau.Sự kh|c biệt cơ bản giữa Fast PWM với c|c loại PWM kh|c l{ nó chỉ sử dụng 1 sườn dốc.Chế độ n{y cũng cho phép tạo ra tần số so s|nh ở đầu ra. Sơ đồ thời gian của chế độ CTC .Ngo{i ra với tần số cao giúp l{m giảm kích thước của thiết bị ngo{i như cuộn d}y tụ từ đó giúp l{m giảm to{n bộ chi phí cho hệ thống Sơ đồ dưới đ}y mô tả chu kỳ thời gian của chế độ: Nguyễn Ngọc Hà .com . Trong chế độ đảo .Trong cả hai trường hơp n{y tần số của chế đô Fast PWM đều gấp đôi so với chế độ phase correct PWM sử dụng hai sườn dốc Với tần số cao n{y chế độ độ Fast PWM rất tốt cho c|c ứng dụng như ADC hay chỉnh lưu. V{ sẽ được sét lên 1 khi gi| trị đạt Bottom.Gi| trị trong ORC đóng vai trò l{ gi| trị TOP cho bộ đếm.Bộ đếm sẽ đếm từ Bottom đến Max sau đó khởi động lại từ bottom. 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. ĐT : 0982969872.

ĐT : 0982969872. Mail : hanguyen92205@gmail.Trong chế độ so s|nh không đảo ch}n so s|nh (OCx) sẽ bị xóa khi gi| trị TCNTx bằng gi| trị OCRx trong qu| trình đếm lên v{ sẽ được set bằng 1 khi gi| trị so s|nh xuất hiện trong qu| trình đếm xuống.Chế độ so s|nh đảo thì c|c gi| trị l{ ngược lại.Chế độ Phase correct PWM: Chế độ n{y hoạt động dựa trên hai sườn lên xuống.Biều đồ thời gian chế độ Fast PWM .Bộ đếm sẽ đếm liên tục từ gi| trị BOTTOM đến gi| trị MAX v{ sau đó từ gi| trị MAX đến gi| trị BOTTOM.Biểu đồ thời gian đ}y mô tả hoạt động của to{n bộ qu| trình: Nguyễn Ngọc Hà .Nhưng do tính c}n đối của hai sườn xung thì nó tốt hơn cho điều khiển động cơ Chế độ phase correct PWM hoạt động cố định l{ 8 bit.com .Với hoạt động hai sườn xung n{y thì chế độ n{y không tạo ra được tần số nhỏ như chế độ một sườn xung . Trong chế độ n{y bộ đếm sẽ tăng cho đến khi đạt gi| trị MAX .khi đó nó sẽ đổi chiều đếm.

6 –WG00-WG01: Đ}y l{ c|c bít chọn chế độ trong Timer.Thanh ghi điều khiển . Tần số có thể tính theo công thức như sau: f=fc/N*510 Trong đó N tạo ra bởi bộ chia nó có c|c gi| trị l{:1. Mail : hanguyen92205@gmail.Các giá trị được mô tả trong bảng sau.256 hoặc 1024 3. ĐT : 0982969872.Từ biểu đồ thời gian ta nhận thấy việc thay đổi tần số trong hoạt động của phase correct PWM có thể thay thế bằng hai gi| trị l{ MAX v{ BOTTOM.com .8.64. Nó linh hoạt hơn so với chế độ Fast PWM.TCCRx: Bit 3. Các thanh ghi trong bộ Timer/Counter . Nguyễn Ngọc Hà .

Thanh ghi cờ ngắt-TIFR: Bit 1-OCFx : Khi hai giá trị bằng nhau bít n{y được set lên bằng 1 Bit 1-TVOx : Khi bộ đếm vượt quá giá trị Top thì bít n{y được set bằng 1 Nguyễn Ngọc Hà . ĐT : 0982969872.com . Mail : hanguyen92205@gmail.Bảng dưới đ}y mô tả toàn bộ các giá trị Chọn chế độ cho xung Clock .Bảng chọn chế độ Timer: Bit 5-4 : COM00-COM01: Quy định giá trị đầu ra trong các phép so sánh Bit: 0 – CS2:0 :Đ}y l{ c|c bít quy định xung cấp cho hoạt động của Timer.

Khung dữ liệu đ~ được chuẩn hóa bởi các thiết bị nên không cần đường xung nhịp để b|o trước dữ liệu đến. ĐT : 0982969872.. Frame ( khung truyền ): do truyền thông nối tiếp rất dễ mất hoặc sai lệch dữ liệu. trong khi đó. Như chuẩn RS232 ( COM ) trên các máy tính cá nhân là sựu kết hợp của chip UART và chip chuyển đổi mức điện áp. Mặt kh|c. Mail : hanguyen92205@gmail. Tuy nhiên. cách truyền n{y đòi hỏi ít nhất 2 đường truyền cho 1 quá trình. hardware). Khái niệm USART ( hay UART nếu chr nói đến bộ truyền nhận không đồng bộ ) thường để chỉ thiết bị phàn cứng ( device. tín hiệu theo chuẩn RS232 trên m|y tính c| nh}n thường là -12V ( high) và +12V( low ). Ví dụ: nếu tốc độ baud được đặt là 19200 thì thời gian dành cho 1 bit truyền là 1/19200 ~52.Truyền thông nối tiếp koong đồng bộ vì thế hiệu quả hơn đường truyền thông đồng bộ. Truyền thông nối tiếp: dữ liệu truyền từng bit trên 1 đường truyền. Vì dữ liệu được chia nhỏ thành từng bit khi truyền/ nhận nên tốc đọ truyền sẽ bị giảm. Khung truyền bao gồm c|c quy định về số bit trong 1 lần truyền.083us. bộ truyền và bộ nhận cần có những quy tắc nhất định. Khái niệm đồng bộ để chỉ sự b|o trước trong quá trình truyền để có thể truyền nhận dễ dàng với ít rủi ro trong quá trình truyền.Thanh ghi mặt nạ ngắt-TIMSK: Bit 1 – OCIEx: khi bít n{y được set lên bằng 1 thì cho phép ngắt so sánh Bit 0 –TOIEX : Khi bít n{y được set lên bằng 1 thì cho phép ngắt tràn VI. mức low l{ 0V. Truyền thông không đồng bộ chỏ cần 1 đường truyền cho 1 quá trình. để đảm báo tính chính xác của dữ liệu. để quá trình truyền thành công thì việc tuân thủ các tiêu chuẩn truyền dữ liệu là hết sức quan trọng. không phải chỉ 1 chuẩn giao tiếp. Bên cạnh tốc độ baud.com . các bit báo Nguyễn Ngọc Hà . USART hay UART cần phải kết hợp với 1 bộ chuẩn điện |p để tạo ra 1 chuẩn giao tiếp n{o đó. Giao tiếp UART USART ( Universal Synchronous & Asynchronous serial Reveiver and Transmitter ) là bộ truyền nhận nối tiếp đồng bộ v{ không đồng bộ. quá trình truyền thông thoe kiểu này phải tuân theo 1 số qya tắc nhất định. Tín hiệu từ chip UART thường theo mức TTL: mức logic high là 5V. - - Các khái niệm quan trọng trong phương ph|p truyền thông này: Baud rate ( tốc độ baud ): là số bit truyền trong 1 giây. khung truyền là 1 yếu tố quan trọng tạo nên sựu thành công khi truyền và nhận.

Parity chẵn nghĩa l{ số lượng số 1 trong dữ liệu bao gồm bit parity luôn là số chẵn v{ ngược lại. Data: dữ liệu cần truyền là thông tin chúng ta cần gởi và nhận. Tất cả hoạt động và trạng thái của modul USART được điều khiển và quan sát thông qua các thanh ghi trong vùng nhớ I/O. bit này có chức năng b|o cho c|c thiết bị nhận biết rằng có 1 gói dữ liệu sắp được truyền tới. Modul USART trên chip Atmega16 hoạt động song công . TxD của thiết bị thứ nhất kết nối với RxD của thiết bị thứ 2 v{ ngược lại. 6.7 . Trong truyền thông nối tiếp UART. c|c bit kiểm tra như Parity. Data không nhất thiết phải là gói 8 bit. hoặc nhận ). Stop bits là các bit bắt buộc xuất hiện trong khung truyền. với AVR bit start là mang giá trị 0 và có giá trị điện áp 0V ( với chuẩn RS232 giá trị điện áp của bit start l{ ngược lại ). Tuy nhiên. nếu 1 chip AVR muốn thực hiện việc truyền dữ liệu nó sẽ gởi 1 bit start bằng cách kéo đường truyền xuống mức 0. có 2 loại parity là parity chẵn là parity lẻ. đó l{: - Nguyễn Ngọc Hà .8 . Vì các chân truyền/ nhận dữ liệu chỉ đảm nhiệm 1 chức năng độc lập ( hoặc truyền. chân truyền dữ liệu – TxD ( Transmitted Data ) và nhận dữ liệu – RxD ( Reveied Data ). với AVR vó thể quy đổi số lượng bit của data là 5. đường truyền luôn ở trạng thái cao khi nghỉ ( Idle ). bit có ảnh hưởng nhỏ nhất ( LSB – Least Significant Bit) của data sẽ được truyền trước và cuối cùng là bit có ảnh hưởng lớn nhất ( MSB – Most Significant Bit). Ở modul USART trong AVR. Start là bit bắt buộc phải có trong khung truyền. Mail : hanguyen92205@gmail. 9( tương tự cho hầu hết các thiế bị hôc trợ UART khác). parity không phải là bắt buộc và vì thế chúng ta có thể loại bit này khỏi khung truyền Stop bit: Stop bit là 1 hoặc các bit báo cho thiết bị nhận rằng 1 gói dữ liệu đ~ được gởi xong. để kết nối các chip AVR với nhau( hoặc AVR với các thiết bị hỗ trợ UART khác) ta phải đấu chéo 1 chân này. thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu.com .- - - - như bít Start v{ bit Stop. Sau khi nhận được stop bít. Như vậy. vì thế ta chỉ cần quan t}m đến 2 chân TxD và RxD. ĐT : 0982969872. Có 3 ch}n liên quan đến modul này là chân xung nhịp – XCK. trong AVR USART có thể là 1 hoặc 2 bit Khung truyền phổ biến nhất là: start bit + 8 bit data + stop bit Truyền thông nối tiếp khôn đồng bộ với AVR: ATmega 16 có 1 modul truyền thông nối tiếp USART. Trong đó ch}n XCK chỉ được sử dụng như l{ ch}n ph|t hoặc nhận xung giữ nhịp trong chế độ truyền đồng bộ. Parity Bit: parity l{ bit dùng để kiểm tra dữ liệu truyền. Có 5 thanh ghi được thiết kế riêng cho hoạt động v{ điều khiển của USART. nghĩa l{ qu| trình truyền và nhận dữ liệu có thể xảy ra đồng thời. ở đ}y chúng ta không khảo s|t đến chế độ truyền thông đồng bộ. ngo{i ra số lượng các bit trong 1 data cũng được quy định bởi khung truyền Start bit: Start l{ bit đầu tiên được truyền trong 1 frame truyền.

nếu muốn truyền dữ liệu đầu tiên phải kiểm tra xem bit UDRE có bằng 1 hay không. kiểm tra parity có lỗi ( PE )… 1 số bit quan trọng của thanh ghi này:  UDRE ( USART Data Register Empty ) khi bit này bằng 1 nghĩa l{ thanh ghi dữ liệu UDR đang trống và sẵn sàng cho một nhiệm vụ truyền hay nhận tiếp theo. Mail : hanguyen92205@gmail. Vì thế.  U2X : là bit chỉ định gấp đôi tốc đọ truyền. Trong c|c khung truyền sử dụng 5. Việc nhận dữ liệu truyền bằng phương ph|p nối tiếp không đồng bộ thường được thực hiện thông qua ngắt.    RXCIE (Receive Complete Interrupt Enable) là bit cho phép ngắt khi quá trình nhận kết thúc. UDRIE (USART Data Register Empty Interrupt Enable) là bit cho phép ngắt khi thanh ghi dữ liệu UDR trống.+ UDR: thanh ghi dữ liệu. Nguyễn Ngọc Hà . viết giá trị v{o UDR tương đương đặt giá trị v{o thanh ghi đệm phát. Đọc UDR thu được giá trị thanh ghi dữ liệu nhận. các bit cao của thanh ghi UDR sẽ không được sử dụng + UCSRA ( USART Control and Status Register A ): l{ 1 trong 3 thanh ghi điều khiển hoạt động của modul USART Thanh ghi UCSRA chủ yếu chứa các bit trạng th|i như bit b|o qu| trình nhận kết thúc ( RXC ). tốc độ truyền cao gấp 2 lần so với khi bit này mag giá trị là 0  MPCM là bit chọn chế độ hoạt động đa xử lý + USCRB ( USART Control and Status Register B ): đ}y l{ thanh ghi quan trọng điều khiển USART. 6 hoặc 7 bit dữ liệu. Thực chất thanh ghi này có thể coi như thanh ghi TXB v{ RXB có chung địa chỉ. sau khi chắc chắn rằng UDRE =1 hãy viết dữ liệu vào thanh ghi UDR để truyền đi. truyền kết thúc ( TXC ). dữ liệu tràn ( DOR ). chuẩn bị để gởi đi. là 1 thanh ghi 8 bit chứa các giá trị nhận được v{ ph|t đi của USART. ĐT : 0982969872.com . vì thế bit n{y thường được set bằng 1 khi USART được dung nhận dữ liệu. TXCIE (Transmit Complete Interrupt Enable) bit cho phép ngắt khi quá trình truyền kết thúc. báo thanh ghi dữ liệu trống (UDRE ). khi bit n{y được set lên 1. khung truyền có lỗi ( FE ).

Do đó. ngược lại nếu UMSEL=1. bit TXB8 cũng đóng vai trò bit thứ 9 truyền thông. 2 bit UPM1 và UPM0 ( parity Mode ) được dùng để quy định kiểm tra parity. UPM1:0=11 parity lẻ được sử dụng Nguyễn Ngọc Hà . RXD8 là bit thứ chín này. ĐT : 0982969872. UCSZ2 (Chracter size) bit này kết hợp với 2 bit khác trong thanh ghi UCSRC quy định độ dài của dữ liệu truyền/nhận. khi có gói dữ liệu 9 bit được nhận. tức bit URSEL là bit chọn thanh ghi. nhưng bit n{y được dung trong lúc truyền dữ liệu + UCSRC ( USART Control and status Register C ): chủ yếu quy định khung truyền với chế độ truyền. Bạn nhớ lại rằng USART trong AVR có hỗ trợ truyền dữ liệu có độ dài tối đa 9 bit. tương tự như bit RXD8. Set bit này lên 1 bạn sẽ khởi động bộ phát của USART. UPM1:0=10 thì parity chẵn được sửu dụng.   UMSEL ( USART Mode Select ) là bit lựa chọn giữa 2 chế độ truyền thông đồng bộ v{ không đồng bộ. Khi URSEL = 1. RXB8 (Receive Data Bit 8) gọi là bit dữ liệu 8. chế độ không đồng bộ được lựa chọn. Nếu UMSEL=0.     RXEN (Receiver Enable) là một bit quan trọng điều khiển bộ nhận của USART. nhưng nếu bit URSEL=0 thì thanh ghi UBRRH sẽ được sử dụng. đề kích hoạt chức năng nhận dữ liệu bạn phải set bit này lên 1 TXEN (Transmitter Enable) l{ bit điều khiển bộ phát. cần có 1 bit kh|c đóng vai trò bit thứ chín.com . Chúng ta sẽ khảo sát chi tiết khi tìm hiểu thanh ghi UCSRC. tức là 2 thanh ghi này là 1. vì lẽ đó m{ bit n{y có tên là RXD8 (không phải RXD9) TXB8 (Transmit Data Bit 8). parity không được sử dụng. 8 bit đầu sẽ chứa trong thanh ghi UDR. thanh ghi n{y được chip AVR hiểu l{ thanh ghi điều khiển UCSRC. Mail : hanguyen92205@gmail. Nếu UPM1:0=00. vì thế bit thứ chín sẽ có chỉ số là 8. Tuy nhiên. chế độ đồng bộ được kích hoạt. Vì thế bit 7 trong thanh ghi này. Bạn chú ý l{ c|c bit được đ|nh số từ 0. trong khi thanh ghi dữ liệu là thanh ghi 8 bit. thanh ghi này lại có cùng địa chỉ với thanh ghi UBRRH ( thnah ghi chứa bit cao dùng để xác lập tốc độ baud ).

nó chỉ được USART dùng để tính tộc độ baud dựa vào gái trị của thanh ghi UBRR v{ ngược lại. ĐT : 0982969872. bit stop trong khung truyền bằng AVR USART có thể là 1 hoặc 2 bit. nếu USBS=0 thì Stop bit chỉ là 1 trong khi USBS=1 sẽ có 2 stop được dùng. Mail : hanguyen92205@gmail. Hai bit UCSZ1 và UCSZ2 ( Charater Size ) kết hợp với bit UCSZ2 trong thanh ghi UCSRB tạo th{nh 3 bit quy định độ dài dữ liệu  UBRRL và UBRRH ( USART Baud Rate Register ): 2 thanh ghi thấp và cao quy định tốc độ Baud Giá trị gán cho thanh ghi UBRR không phải là tốc độ Buad. cách tính giá trị cần thiết gán cho thanh ghi UBRR khi đ~ biết tốc độ baud Nguyễn Ngọc Hà .  USBS ( Stop bit Seclect ).com .

Mail : hanguyen92205@gmail. ĐT : 0982969872.com .fOSC là tần số xung nhịp của hệ thống ( thạch anh hay nguồn xung nội …) Bảng c|ch đặt giá trị cho UBRR theo tốc độ baud mẫu Nguyễn Ngọc Hà .

com .… Nguyễn Ngọc Hà . ĐT : 0982969872.- Sử dụng UART Để sử dụng USART trên AVR phải thực hiện 3 việc quan trọng. Mail : hanguyen92205@gmail. bộ nhận. đó l{: c{i đặt tốc độ baud ( thanh ghi UBRR ). UCSRC ) và cuối cùng kích hoạt bộ truyền. ngắt. định dạng khung truyền ( UCSRB.

Chuyển đổi ADC trên AVR Chip AVR ATmega16 của Atmel có tích hợp sẵn các bộ chuyển đổi ADC với độ phân giải 10bit. nguồn cấp ADC cần Nguyễn Ngọc Hà . điện áp tham chiếu – Vref ( reference voltage ) là thông số được đặt bởi người dùng. Có tất cả 8 kênh đơn ( c|c ch}n ADC0 đến ADC7 ).Dữ liệu ở thế giới bên ngo{i l{ tương tự . Một điện áp tham chiếu ( reference) và một mạch chia |p được sử dụng để tạo ra các mức điện áp so sánh khác nhau cho mỗi bộ sa sánh. Chuyển đổi dữ liệu Analog sang Digital Trong các ứng dụng đo lường v{ điều khiển bằng vi điều khiển bộ chuyển đổi tương tự . không được nhỏ hơn gi| trị lớn nhất của input nhưng cũng đừng quá lớn. Mail : hanguyen92205@gmail. nếu điện áp ở ngõ vào là 1V thì giá trị số thu được sau khi chuyển đổi sẽ là: 1023x(1/3)=314. một bộ ADC 10 bit (độ phân giải) có Vref=3V.số ( ADC ) là 1 thành phần rất quan trọng. Chuyển đổi ADC 1. vì thế các bộ chuyển đổi flash ADC thường có độ phân giải ít hơn 8 bit. ADC trong AVR là laoij chuyển đổi xấp xỉ lần lượt ADC trên AVR cần được nuôi bằng nguồn điện áp riêng ở chân AVCC. giá trị điện áp cấp cho AVCC không được khác nguồn nuôi chip (VCC) quá ±0. Trong đó 1023 l{ gi| trị lớn nhất mà một bộ ADC 10 bit có thể tạo ra (1023=210-1).Nhiễu ( noise ) là vấn đề rất quan trọng khi sử dụng các bộ ADC. Các bộ chuyển đổi n{y được cấu thành từ một dãy các bộ so sánh ( OPAMP ). để giảm thiểu sai số chuyển đổi do nhiễu. trong khi đó vi điều khiển là 1 thiết bị số. chúng ta cần tính to|n để chọn 1 điện áp tham chiếu phù hợp.Điện áp tham chiếu( reference voltage ): là giá trị điện áp lớn nhất mà bộ ADC có thể chuyển đổi. các giá trị mà một vi điều khiển có thể thao tác là các con số rời rạc vì thực chất chúng được tạo thành từ sự kết hợp của 2 mức 0 và 1. 2. trong các bộ ADC. Để tạo ra một mạch chuyển đổi flash ADC có độ phân giải n bit. Ví dụ. các bộ so s|nh được mắc song song v{ được kết nối trực tiếp cới tín hiệu analog cần chuyển đổi. ĐT : 0982969872. Quá trình chuyển 1 dữ liệu analog thành 1 dữ liệu digital thường được thực hiện bởi 1 thiết bị gọi l{ “ bộ chuyển đổi tương tự -số “ hay đơn giản là ADC ( Analog to Digital Converter ) Chuyển đổi ADC theo phương ph|p trực tiếp ( direct converting ) hoặc flash ADC. chúng ta sẽ cần đến 2n-1 bộ so sánh. Vì điện áp tham chiếu ảnh hưởng đến độ chính xác của quá trình chuyển đổi. .com . Độ phân giải ( resolution ): dùng để chỉ số bit cần thiết để chứa hết các mức giá trị digital ngõ ra.VII. giá trị này rất lớn khi thiết kế bộ chuyển đổi ADC có độ phân giải cao. việc lựa chọn độ phân giải phải phù hợp với độ chính xác yêu cầu và khả năng xử lý của bộ điều khiển. Độ phân giải liên quan đến chất lượng chuyển đổi ADC.3V. Nếu một mạch chuyển đổi ADC có độ phân giải n bit thi sẽ có 2n mức giá trị có thể có ở ngõ ra ở mức digital.

Một c|ch đơn giản để tạo nguồn AVCC là dùng 1 mạch LC kết nối từ nguồn VCC của chip.phải được lọc kỹ càng. nếu dùng điện |p ngo{i đặt trên chân VREF thì điện áp này phải được lọc thật tốt. Thanh ghi: Co2 4 thanh ghi trong bộ ADC trên AVR trong đó có 2 thanh ghi data chứ dữ liệu sau khi chuyển đổi.56V ( cố định ). Điện áp tham chiếu cho ADC trên AVR có thể được tạo bởi 3 nguồn: dùng điện áp tham chiếu nội 2. Nguyễn Ngọc Hà . Lưu ý là cấn chú ý đến nhiễu khi đặt điện áp tham chiếu. dùng điện áp AVCC hoặc điện |p ngo{i đặt trên ch}n VREF.56V hoặc AVCC thì chân VREF cần được nối với 1 tụ điện. Mail : hanguyen92205@gmail.com . điện áp tham chiếu nội 2. ĐT : 0982969872. nếu dùng điện áp tham chiếu nội 2.56V hoặc điện áp AVCC.  Bit 7: 6-REFS1:0 ( Reference Seclection Bits ):là các bit chọn điện áp tham chiếu. 1 trong 3 nguồn điện áp tham chiếu có thể được chọn l{: điện áp ngoài từ chân VREF. 2 thanh ghi điều khiển và chứa trạng thái của ADC + ADMUX ( ADC Multiplexer Selection Register ): l{ 1 thanh ghi 8 bit điều khiển việc chọn điện áp tham chiếu. kênh và chế độ hoạt động của ADC.

Bit ADLAR sẽ quyết định vị trí của 10bit kết quả trong 16 bit của 2 thanh ghi data. Vì ADC trên AVR có độ phân giải 10 bit. AVR có 2 thanh ghi 8 bit để chứa giá trị sau chuyển đổi. và thanh ADCL chứa 2 bit thấp nhất trong 10 bit kết quả Bit 4:0-MUX4:0 ( Analog Chanel and Gain Selection Bits ) : là 5 bit cho phép chọn kênh. Nếu ADLAR=0 kết quả sẽ được hiệu chỉnh về phía phải( thanh ghi ADCL chứa trọn 8 bit thấp và thanh ghi ADCH chứa 2 bit cao trong 10 bit kết quả). ĐT : 0982969872. Như thế giá trị chuyển đổi sẽ không lấp đầy 2 thanh ghi data.  Bit 5-ADLAR ( ADC Left Adjust Result ): là bit cho phép hiệu chỉnh trái kết quả chuyển đổi.com . chúng ta cần set c|c bit MUX để chọn kênh và chế độ cần sử dụng. Mail : hanguyen92205@gmail. nghĩa l{ kết quả thu được sau chuyển đổi là 1 số nguyên có độ d{i 10bit. chế độ và cả hệ số khuếch đại cho ADC. trong 1 số trường hợp người dùng muốn 10bit kết quả nằm lệch về phía tría trong khi cũng có trường hợp người dùng muốn kết quả nằm về phía phải. và nếu ADLAR=1 thì kết quả được hiệu chỉnh trái ( thanh ghi ADCH chứa trọn 8 bit cao nhất. các bit từ 9 đến 2. Bảng chọn chế độ chuyển đổi Nguyễn Ngọc Hà . Do bộ ADC trên AVR có nhiều kênh và cho phép thực hiện chuyển đổi ADC kiểu so s|nh ( so s|nh điện áp giữa 2 chân analog ) nên trước khi thực hiện chuyển đổi.

com . ĐT : 0982969872.+ ADCSRA ( ADC Control and Status RegisterA ): l{ thanh ghi chính điều khiển hoạt động chứa trạng thái của modul ADC  Bit 7: ADEN ( ADC Enable ): viết giá trị 1 v{o bit n{y l{ đã cho phép modul ADC sử dụng. Mail : hanguyen92205@gmail. Tuy nhiên khi ADEN=1 khhong có nghĩa l{ ADC hoạt động ngay mà cần phải set bit ADSC lên 1 để bắt đầu quá trình chuyển đổi Nguyễn Ngọc Hà .

một ngắt sẽ xảy ra khi một quá trình chuyển đổi ADC kết thúc và các giá trị chuyển đổi được cập nhật ( các giá trị chuyển đổi chứa trong 2 thanh ghi ADCL và ADCH ) Bit 2: ADPS2:0 ( ADC Prescaler Select Bits ): các bit chọn hệ số chia xung nhịp cho ADC. Để thực hiện một chuyển đổi. vì thế người dùng cần kiểm tra giá trị bit n{y trước khi thực hiện đọc giá trị chuyển đổi để đảm bảo quá trình chuyển đổi đ~ được thực sựu hoàn tất. bit này tự động được set lên 1. Do modul ADC trên AVR có độ phân giải 10bit nên cần 2 thanh ghi để chứa giá trị chuyển đổi. Vì vậy ta không cần v{ cũng không nên viết giá trị 0 vào bit này ở bất kỳ tình huống n{o.com . ADC cũng như tất cả các modul khác trên AVR cần được giữ nhịp bằng 1 nguồn xung clock. thông thường chúng ta sẽ set bit ADEN=1 trước v{ sau đó set ADSC=1 Bit 5: ADATE ( ADC Auto Trigger Enable ) Bit 4: ADIF ( ADC Interrupt Flag ): cờ báo ngắt : Khi một chuyển đổi kết thúc.     Bit 6: ADSC ( ADC Start Conversion ): set bit này lên 1 là bắt đầu khởi động quá trình chuyển đổi. bit ADSC sẽ được giữ nguyên giá trị 1. Bit ADLAR trong thanh ghi ADMUX quy định cách mà kết quả được ghi vào Nguyễn Ngọc Hà . C|c bit ADPS cho phép người dùng chọn hệ số chia từ nguồn clock chính đến ADC Bảng hệ số chia xung nhịp cho ADC + ADCL và ADCH ( ADC Data Register ): 2 thanh ghi chứa giá trị cảu quá trình chuyển đổi. Xung nhịp n{y được lấy từ nguồn xung chính của chip thông qua một hệ số chia. tuy nhiên tổng số bit của 2 thanh ghi 8bit là 16. Bit 3: ADIE ( ADC Interrupt Enable ) : bit cho phép ngắt. bit này sẽ được trả về 0. Mail : hanguyen92205@gmail. ĐT : 0982969872. khi quá trình chuyển đổi kết thúc ( tự động ). nếu bit n{y được set lên 1 và bit chp phép ngắt toàn cục trong thanh ghi trạng th|i chip được set. vì thế chúng ta được phép chọn cách ghi 10bit kết quả v{o 2 thanh ghi n{y. trong suốt quá trình chuyển đổi.

vì sau khi ADCH được đọc. cần phải đọc thnah ghi ADCL trước v{ ADCH sau.com . các thanh ghi data có thể được cập nhật giá trị tiếp theo. 3 bit cao trong thanh ghi n{y quy định nguồn kích ADC nếu chế độ Auto Trigger được sử dụng Nguồn kích ADC trong chế độ Auto Trigger Nguyễn Ngọc Hà . 2 thanh ghi data được sắp xếp theo định dạng ADLAR=0. ADCL chứa 8 bit thấp và 2 bit thấp của ADCH chứa 2 bit cao nhất của giá trị thu được. ĐT : 0982969872. + SFIOR ( Special FunctionlO Register C ): thanh ghi chức năng đặc biệt.Thông thường. Để tránh sai kết quả. Mail : hanguyen92205@gmail.

Chuẩn truyền thông SPI SPI ( Serial Peripheral Bus ) là 1 chuẩn truyền thông nối tiếp tốc độ cao do Motorola đề xuất. MOSI của Master v{ Slave được nối trực tiếp với nhau SS. SCK: xung giữ nhịp cho giao tiếp SPI. mỗi nhịp trên chân SCK báo 1 bit dữ liệu đến hoặc đi. SPI đôi khi được gọi là chuẩn truyền thông “4 d}y” vì có 4 đường giao tiếp trong chuẩn n{y đó l{ SCK ( Serial Clock ). SPI là 1 cách truyền thông song công ( full duplex ) nghĩa l{ tại cùng 1 thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. Nếu chip Master kéo đường SS của 1 Slave n{o đó xuống mức thấp thì việc giao tiếp sẽ xảy ra giữa Master v{ Slave đó. Cứ mỗi xung nhịp do Master tạo ra trên đường giữ nhịp SCK một bit trong thanh ghi dữ liệu của Master được truyền qua Slave trên đường MOSI. Giao tiếp SPI 1. Đ}y l{ điểm khác biệt với truyền thông không đồng bộ UART.com . Chỉ có 2 đường SS trên mỗi Slave nhưng có thể có nhiều đường điều khiển SS trên Master. đồng thời một bit trong thanh ghi dữ liệu của chip Slave cũng được truyền qua Master trên đường MISO. SPI là chuẩn truyền động bộ nên cần 1 đường xung giữ nhịp. ĐT : 0982969872. bên phải là chip Slave - - - Nguyễn Ngọc Hà . bên trái là chip Master.VIII. Do 2 gói dữ liệu trên được gửi qua lại đồng thời nên quá trình truyền dữ liệu n{y được gọi là song công. vì thế truyền thông chỉ xảy ra giữa Master và Slaver. Hoạt động: mỗi chip Master hay Slave chỉ có 1 thanh ghi dữ liệu 8 bit. MOSI ( Master Output Slave Input ) và SS ( Slave Select ). MISO của Master v{ Slave được nối trực tiếp với nhau MOSI – Master Output/ Slave Input : nếu l{ chip Master thì đ}y l{ đường Output. Đ}y l{ kiểu truyền thông Master-Slave. trong đó có 1 chip Master điều phối quá trình truyền thông v{ c|c chip Slave được điều khiển bởi Master. Sự tồn tại của chân SCK giúp quá trình truyền ít bị lỗi và vì thế tốc độ truyền của SPI có thể rất cao. còn chip Slave thì đ}y l{ Input. Hình dưới mô tả quá trình truyền 1 gói dữ liệu thực hiện bởi modul SPI trong AVR. Xung nhịp chỉ được tạo ra bởi chip Master MISO – Master Input/ Slave Output : nếu l{ chip Master thì đ}y l{ đường Input còn nếu l{ chip Slave thì đ}y lại là Output. MISO ( Master Input Slave Output ). tùy thuộc vào thiết kế của người dùng. trên c|c chip đường SS sẽ ở mức cao khi không làm việc.Slave Select: SS l{ đường chọn Slave cần giao tiếp. Mail : hanguyen92205@gmail.

SS: Input. phase và các chế độ hoạt động: cực của xung giữ nhịp ( Clock Polarity ) được gọi tắt là CPOL là khái niệm dùng chỉ trạng thái của chân SCK ở trạng thái nghỉ. chúng ta có thể dùng ch}n n{y để điều khiển SS của Slave hoặc bất kỳ chân PORT thông thường Thanh ghi: SPI trên AVR được vận hành bởi 3 thanh ghi bao gồm thanh ghi điều khiển SPCR. Phase ( CPHA ) dùng để chỉ cách mà dữ liệu được lấy mẫu ( sampel ) theo xung giữ nhịp. MOSI. thnah ghi trạng thái SPSR và thanh ghi dữ liệu SPDR + SPCR ( SPI Control Register ) : l{ 1 tahnh ghi 8 bit điều khiển các hoạt động của SPI Nguyễn Ngọc Hà . Mail : hanguyen92205@gmail. Ở trạng thái nghỉ. chân SCK có thể được giữ ở mức cao ( CPOL=1 ) hoặc thấp ( CPOL=0 ). ta cần set các chân SCK . MISO: Output còn MOSI: input va fkhi này chân SS không quan trọng. vì thế nếu muốn sử dụng chúng ta cần xác lập c|c hướng cho các chân này. Truyền thông SPI trên AVR Các chân giao tiếp SPI cũng l{ c|c ch}n PORT thông thường. Việc chọn 1 trong 4 chế độ này không ảnh hưởng đến chất lượng truyền thông mà cho có sựu tương thích giữa Master và Slave 2. còn MISO: output. Các chân SPI trên chip ATmega16 SCK – PB7 (8) MISO – PB6 (7) MOSI – PB5 (6) SS – PB4 (5) Khi chip AVR được sử dụng làm Slave.Cực của xung giữ nhịp. ĐT : 0982969872. Dữ liệu có thể được lấy mẫu ở cạnh lên của SCK ( CPHA=0) hoặc cạnh xuống ( CPHA=1 ). Nếu là Master thì SCK.com . Sự kết hợp của SPOL và CPHA làm nên 4 chế độ hoạt động của SPI.

Nếu bit này set bằng 1 và bit I trong thnah ghi trạng th|i được set bằng 1.com . Chúng ta nên dùng ngắt khi truyền nhận dữ liệu với SPI Bit 6 – SPE ( SPI Enable ): set bit n{y lên 1 để cho phép bộ SPI hoạt động. nếu SPE=0 thì modul SPI dừng hoạt động Bit 5 – DORD ( Data Order ): bit này chỉ định thứ tự dữ liệu c|c bit được truyền và nhận trên c|c đường MISO và MOSI.     Bit 7 – SPIE ( SPI Interrupt Enable ): bit cho phép ngắt SPI. Mail : hanguyen92205@gmail. thứ tự này không quan trọng nhưng phải đảm bảo các bit DORD giống nhau trên cả Master và Slave Bit 4 – MSTR ( Master/Slave Select ): nếu MSTR=1 thì chip được nhận diện là Master. ĐT : 0982969872. Nguyễn Ngọc Hà . ngược lại MSTR=0 thì chip là Slave. Khi giao tiếp giữa 2 AVR với nhau. 1 ngắt sẽ xảy ra sau khi 1 gói dữu liệu được truyền hoặc nhận.Sự kết hợp 2 bit này tạo thành 4 chế độ hoạt động của SPI. Việc chọn chế độ không quan trọng nhưng phải đảm bảo Master và Slave cùng chế độ hoạt động. bit LSB được truyền trước. Bit 3 và 2 – CPOL và CPHA : là 2 bit xác lập cực của xung giữ nhịp và cạnh sample dữ liệu đ~ khảo sát ở trên. khi DORD=0 bit có trọng số lớn nhất của dữ liệu được truyền trước ( MSB ) ngược lại khi DORD=1 .

ĐT : 0982969872. hai bit này kết hợp với bit SPI2X trong thanh ghi SPSR cho phép chọn tốc độ giao tiếp SPI. Bit 1:0 – CPR1:0 . Mail : hanguyen92205@gmail. Bit 6 – WCOL là bit báo va chạm dữ liệu (Write Colision ). Bit 0 – SPI2X gọi l{ bit nh}n đôi tốc độ truyền. bit 7 – SPIF là cờ báo SPI. bit n{y đưucọ AVR set lên 1 nếu chúng ta cố tình viết ra 1 gói dữ liệu mới vào thanh ghi dữ liệu SPDR trong khi quá trình truyền nhận trước chưa kết thúc.com . tốc độ n{y được xác lập dựa trên tốc độ nguồn xung clock chia cho 1 hệ số chia. Trong thanh ghi này chỉ có 3 bit được sử dụng. Bảng tóm tắt các tốc đọ mà SPI trong AVR có thể đạt + SPSR ( SPI status Register ): là 1 thanh ghi trạng thái của Modul SPI. bit SPIF sẽ tự động được set lên 1. bit này kết hợp với 2 bit SPR1:0 trong thanh ghi điều khiển SPCR xác lập tốc độ cho SPI Nguyễn Ngọc Hà . khi 1 gói dữ liệu đ~ được truyền hoặc nhận từ SPI.

trong phạm vi bài viết này chỉ giới thiệu giao thức TWI được hỗ trợ trong các chip của AVR. Truyền thông SPI luôn được khởi xướng bởi chip Master. Để tìm hiểu về I2C có thể tham khảo trên web của NXP – http://nxp. khi dữ liệu vừa được viết vào SPDR xung giữ nhịp sẽ được tự động tạo ra trên SCK và quá trình truyền nhận bắt đầu. Giao tiếp TWI – I2C 1. chọn chế độ SPI (SPOL. khi Master muốn giao tiếp với 1 Slave n{o đó. Đối với các chip Slave. Trên chip Master. Khi phát hiện xung giữ nhịp trên SCK. Trước khi truyền nhận bằng SPI chúng ta cần khởi động SPI. SPSR v{ SPDR. đồng thời 1 Slave có thể trở thành 1 Master nếu nó có khả năng.+ SPDR ( SPI Data Register ): là thanh ghi dữ liệu của SPI. bộ chuyển đổi ADC. chọn loại giao tiếp: Master hay Slave. TWI được thực hiện trên 2 đường SDA ( Serial Data ) v{ SCL ( Serial Colck ) trong đó SDA l{ đường truyền/ nhận dữ liệu và SCL l{ đường xung nhịp. SPHA) và chọn tốc độ giao tiếp. do đó tìm hiểu TWI của AVR ta có thể điều khiển bất kỳ 1 thiết bị nào theo chuẩn I2C ( chip nhớ.…) . nó sẽ kéo chân SS của Slave xuống mức thấp (gọi là chọn địa chỉ) v{ sau đó viết dữ liệu cần truyền vào thanh ghi dữ liệu SPDR. ghi giá trị vào thanh ghi SPDR sẽ kích hoạt quá trình truyền thông SPI. ĐT : 0982969872.TWI là 1 truyền thông nối tiếp đa chip chủ ( multi-master serial computer bus). tức là trên cùng 1 bus có thể có nhiều hơn 1 thiết bị l{m Master. Trên chip Slave. Theo chuẩn I2C. khi chân SS bị kéo xuống nó sẽ sẵn sàng cho quá trình truyền nhận.com . Slave sẽ bắt đầu sample dữ liệu đến trên đường MOSI và gởi dữ liệu di trên MISO IX. DAC. Vận h{nh SPI trên AVR được thực hiện dựa trên việc ghi v{ đọc 3 c|c thanh ghi SPCR. Giao diện TWI – I2C . đồng hồ thời gian thực. I2C ( Inter-Integarted Circuit ) là 1 chuẩn truyền thông do Philips Semiconductor sáng lập và xây dựng thành chuẩn năm 1990. Mail : hanguyen92205@gmail. TWI trong AVR ho{n to{n thương thích I2C. Về cơ bản. c|c đường SDA và SCL trên các thiết bị có cấu hình “ cực góp mở “. dữ liệu được lưu sẵn trong SPDR sẽ được truyền cho Master Sử dụng SPI trên AVR: SPI trên AVR hoạt động không khác nguyên lý chung của chuẩn SPI là mấy. dữ liệu nhận được từ Master sẽ lưu trong thanh ghi SPDR. nghĩa l{ cần có c|c điện trở kéo lên ( pull-up resistor ) cho - Nguyễn Ngọc Hà .com . quá trình khởi động thường bao gồm chọn hướng giao tiếp cho các chân SPI.TWI ( Two – Wire Seril Intereafce ) là 1 modul truyền thông nối tiếp đồng bộ trên các chip AVR dựa trên tiêu chuẩn truyền thông I2C.

Ở trạng th|i nghĩ.c|c đường này. Hình dưới thể hiện mô hình 1 mạng TWI cơ bản. cần có 1 đường tạo xung giữ nhịp cho quá trình/ nhận.com . Mail : hanguyen92205@gmail. TWI là chuẩn truyền thông nối tiếp đồng bộ. bit có trọng số lớn nhất MSB được truyền trước nhất. ngược lại với chuẩn UART SCL: l{ đường giữ nhịp nối tiếp. Trong chuẩn I2C. dữ liệu nối tiếp trên đường SDA được lấy mẫu khi đường SCL ở mức cao trong 1 chu kỳ giữ nhịp. ĐT : 0982969872. Chân SDA có thể được đổi trạng thái khi SCL ở mức thấp Nguyễn Ngọc Hà . 1 bit dữ liệu trên đường SDA sẽ được lấy mẫu. cứ mỗi xung trên đường giữ nhịp SCL. Vì thế đường SDA không được đổi trạng thái khi SCL ở mức cao ( trừ START và STOP condition ). 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 1. - - Master : là chip khởi động quá trình truyền nhận. được gọi bởi Master và phục vụ yêu cầu từ Master SDA : l{ đường dữ liệu nối tiếp. 2 ch}n SDA v{ SCL ở mức cao. 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ó 1 địa chỉ cố định.

Tuy nhiên. vì thế xuất hiện khái niệm “ gói địa chỉ “ ( address Packet ). c|c Master kh|c không t|c động được v{o đường truyền trong khoảng này. trước hết tạo ra 1 START condition và tiếp theo là gởi địa chỉ Device address của Slave cần giao tiếp trên đường truyền. Ngược Nguyễn Ngọc Hà . ĐT : 0982969872. STOP condition đượ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. Riêng địa chỉ 0 được dùng cho “ cuộc gọi chung “. khi cả SDA và SCL ở mức cao nếu Master muốn thực hiện một “cuộc gọi” .- - - START Condition: điều kiện bắt đầu: từ trạng thái nghỉ. tất cả các thiết bị đều có thể là Master hay Slave. trên 1 mạng TWI có thể tồn tại 27=128 thiết bị có địa chỉ riêng biệt. nếu bit này bằng 1 thì Master muốn đọc dữ liệu từ Slave về. 8bit trên ( SLA + R/W ) được Master phát ra sau khi phát START Condition. Trường hợp sau khi kết thúc truyền/ nhận mà Master không gửi STOP condition lại gởi thêm 1 START condition là REPEAT START. 1 bit READ/WRITE và 1 bit ACK-Ackknowledge. Mỗi thiết bị có một địa chỉ cố định gọi là Device address. Nếu bit này bằng 0 thì quá trình ghi dữ liệu từ Master đến Slave được yêu cầu.STOP condition chỉ được tạo ra sau khi địa chỉ dữ liệu đ~ được truyền/ nhận REPEAT START: khoảng giữa START và STOP condition là khoảng bận của đường truyền. Khi 1 Master muốn giao tiếp với 1 Slave n{o đó. Hình dưới mô tả các Master tạo ra START.com . có 1 số địa chỉ không được sử dụng như c|c địa chỉ có dạng 1111xxx ( tức là c|c địa chỉ lớn hơn hoặc bằng 120 không được dùng). STOP và REPEAT START - Address Packet Format – Định dạng gói dữ liệu : trên mạng TWI. nếu Master muốn kết thúc quá trình nó sẽ tạo ra một STOP condition. Bit READ/WRITE ( R/W ) được truyền tiếp sau 7bit địa chirlaf bit báo cho Slave biết Master muốn đọc hay ghi vào Slave. 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 Slave. nó sẽ 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. nếu 1 Slave trên mạng nhận ra rằng địa chỉ mà Master yêu cầu trùng khớp với Device address của mình. Master sẽ kéo chân SDA xuống thấp trong khi SCL vẫn ở mức cao. Do địa chỉ có độ dài 7 bit nên về mặt lý thuyết. Gói địa chỉ trong TWI có định dạng 9bit trong đó 7bit đầu gọi làSLA chứa địa chỉ Slave. STOP Codition: Điều kiện kết thúc : sau khi thực hiện truyền/ nhận dữ liệu. Mail : hanguyen92205@gmail.

8 bit dữ liệu do thiết bị phát gởi ra và bit ACK do thiết bị nhận tạo ra. Như vậy. 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 . Mail : hanguyen92205@gmail. dữ liệu có thể được truyền theo hướn từ Master đến Slave hay ngược lại.Định dạng gói dữ liệu: sau khi đia chỉ được ph|t đi. Nếu Slave phát tín hiệu NOT ACK ( không t|c động SDA ở xung thứ 9 ) sau khi nhận dữ liệu thì Master sẽ kết thúc quá trình gởi bằng c|ch ph|t đi STOP condition. Slave đ~ đ|p lại Master bằng SCK thì quá trình truyền nhận/nhận dữ liệu sẽ diễn ra giữa cặp Master/Slave n{y.NOT ACK. Tùy v{o bit R/W trong gói địa chỉ.lại.com . bit còn lại là do Slave. - - General call – cuộc gọi chung: khi Master ph|t đi gói địa chỉ có dạng 0 tức nó muốn thực hiện 1 cuộc gọi chung đến tất cả các Slave. ĐT : 0982969872. Hình dưới mô tả định dạng gói dữ liệu trong TWI Nguyễn Ngọc Hà . V{ theo hướng nào thì gói dữ liệu luôn bao gồm 9bit trong đó 8 bit đầu là dữ liệu và bit cuối là bit ACK. Slave quyết định cho phép hay không cho phếp cuộc gọi chung. chúng sẽ đ|p lại Master bằng ACK. chân SDA vẫn ở mức cao trong xung giữ nhịp thứ 9 gọi là tín hiệu không xác nhận . Nếu c|c Slave được c{i đặt cho phép cuộc gọi chung. nếu không có Salve đ|p ứng lại. Cuộc gọi chung thường xảy ra khi Master muốn gởi dữ liệu chung đến các Slave. trong 9 bit của gói địa chỉ thì có 8bit được gởi bởi Master.

thanh ghi trạng th|i TWSR.- Phối hợp gói địa chỉ và dữ liệu : một quá trình truyền / nhận TWI thường được bắt đầu từ Master. truyền thông đa chip chủ tương đối phức tạp và vì thế ở đ}y sẽ không đề cập đến trường hợp này 2. dữ liệu có thể truyền/nhận liên tiếp đường truyền. 1 Master bị thất lạc khi nó truyền/nhận 1 mức cao trên SDA trong khi các Master khác truyền/nhận 1 mức thấp. Mail : hanguyen92205@gmail. thnah ghi ddieuf khiển TWCR.Tuy nhiên. Khung truyền thông thường được mô tả như sau: - Multi-Master Bus . trong đa số trường hợp sẽ có một số Master bị thất lạc. TWI trên AVR TWI trên AVR được vận hành bởi 5 thanh ghi bao gồm thanh ghi tốc độ giữ nhịp TWBR. Tiếp theo nếu có 1 Slave đ|p ứng lại. ĐT : 0982969872. Master ph|t đi tín 1 START condition sau đó gởi gói địa chỉ SLA+R/W trên đường truyền. nghĩa l{ tịa 1 thời điểm có thể có nhiều hơn 1 chip l{m Master nếu các chip này phát ra START condition cùng lúc.com . 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. thanh ghi địa chỉ dữ liệu TWDR TWBR ( TWI Bit Rate Register ): l{ 1 thanh ghi 8 bit quy định tốc độ phát xung giữ nhịp trên đường SCL của chip Master Nguyễn Ngọc Hà .Đường truyền đa chip chủ: TWI là chuẩn giao tiếp truyền thông đa chip chủ.

Mail : hanguyen92205@gmail. Bảng 1 tóm tắt tốc độ xung giữ nhịp tạo ra trên SCL đối với các giá trị của tham số + bảng tốc độ xung giữ nhịp : - TWCR ( TWI Control Register ): l{ thanh ghi 8 bit điều khiển hoạt động của TWI  Bit 7. ĐT : 0982969872. TWINT được tự động set lên 1 khi TWI kết thúc một quá trình bất kỳ n{o đó (như ph|t/nhận START.TWINT (TWI Interrupt Flag): là một cờ báo rất quan trọng. TWBR là giá trị thanh thi TWBR và TWPS là giá trị của 2 bits TWPS1 và TWPS0 nằm trong thanh thi trạng thái TWSR.com . Hai bits n{y được gọi l{ bit prescaler. Nguyễn Ngọc Hà .Tốc độ phát xung giữ nhịp được tính theo công thức: Trong đó CPU Clock frequency l{ tần số hoạt động chính của AVR. thông thường người ta hay set TWPS1:0 =00 để chọn Prescaler là 1 (40=1).

Nguyễn Ngọc Hà . trong quá trình truyền dữ liệu. nếu bit n{y được set thì tín hiệu xác ACK sẽ được gởi trong các trường hợp sau: địa chỉ do Master phát ra trùng khớp với địa chỉ của Slave. Đối với chip Slave. chúng ta thường xóa TWINT bằng cách viết 1 v{o nó. tín hiệu ACK chỉ được ph|t trong 1 trường hợp duy nhất đó l{ khi Master nhận dữ liệu từ Slave. sau đó liên tục kiểm tra TWINT. Master ph|t ACK để b|o cho Slave l{ mình đ~ nhận được và muốn tiếp tục nhận từ Slave. TWI sẽ chờ cho đến khi nó rảnh (nhận ra 1 STOP condition) và tiếp tục gởi START condition. nó sẽ phát STOP condition bằng cách viết giá trị 1 v{o bit TWSTO.com . nếu bit n{y được set lên 1 thì qu| trình đ~ ho{n th{nh. Bit 2 – TWEN (TWI Enable Bit): bit kích hoạt TWI trên AVR. TWI sẵn sàng hoạt động. Khi Master muốn kết thúc một cuộc gọi. Bit 4 – TWSTO (TWI STOP Condition Bit): là bit tạo STOP condition cho TWI. khi đó bit TWWC tự động được set lên 1. một cuộc gọi chung đang xảy ra và Slave này cho phép cuộc gọi chung. bit này cần được set và một START condition được tạo ra trên đường truyền nếu đường truyền đang rảnh. khi bit nay được set bằng 1 đồng thời bit I trong thanh ghi trạng th|i chung được set. Bit 6 – TWEA (TWI Enable Acknowledge Bit): là bit kích hoạt tín hiệu xác nhận. Đối với chip Master. khi lập trình điều khiển TWI chúng ta luôn phải xóa TWINT trước khi muốn thực hiện một qu| trình n{o đó. Do đó cần sử dụng ngắt hợp lý. chúng ta cần set bit n{y để nó có thể đ|p ứng lại Master bất cứ khi n{o được gọi. Bit 1 – Reserve: không sử dụng Bit 0 – TWIE (TWI Interrupt Enable Bit): bit cho phép ngắt TWI.       phát nhận địa chỉ…). Chú ý là bit nay cần được xóa bởi phần mềm sau khi START condition đ~ được gởi (viết 0 v{o bit n{y để xóa nó). nếu một cuộc gọi bị lỗi. Slave cũng có thể t|c động vào bit này. Nếu đường truyền không rảnh. Bit 5 – TWSTA (TWI START Condition Bit): là bit tạo START condition. khi TWEN được set lên 1. Mail : hanguyen92205@gmail. ĐT : 0982969872. viết 1 vào TWSTO trên Slave sẽ reset đường truyền về trạng thái rảnh ban đầu Bit 3 – TWWC (TWI Write Collision Flag): khi cờ TWINT đang ở mức thấp tức TWI đang bận. Trong khi lập trình cho TWI. dữ liệu đ~ được Slave nhận từ Master. đối với Master ngắt không cần thiết vì Master chủ động khởi động một cuộc gọi. Vì thế. Khi một chip muốn trở th{nh Master để thực hiện 1 cuộc gọi. Thông thường. bit TWINT cần được giữ mức cao khi ghi dữ liệu v{o thanh ghi TWDR v{ sau đó xóa khi dữ liệu đ~ sẵn sàng. ngắt chỉ được sử dụng cho Slave. Một điểm quan trọng cần lưu ý l{ bit TWINT được xóa khi chúng ta viết giá trị 1 vào nó. Ngắt TWI có thể xảy ra sau bất kỳ hoạt động n{o liên quan đến TWI. khi set một chip ở chế độ Slave. một ngắt TWI xảy ra khi bit TWINT được set bởi phần cứng. nếu chúng ta viết dữ liệu vào thanh ghi dữ liệu (TWDR) thì một lỗi xảy ra. Vì thế. Như thế. Chú ý l{ bit n{y không tự động được xóa bởi phần cứng như c|c cờ báo trong các module khác.

việc viết địa chỉ thường được thực hiện bằng lệnh TWAR = (Device_address<<1)+TWGCE. Nếu TWGCE=1. Ứng với mỗi trường hợp TWI sẽ tạo ra 1 code trong thanh ghi TWSR . Các chế độ hoạt động của TWI TWI trên AVR được gọi là byte-oriented (hướng byte) và interrupt-based (dựa trên ngắt). Cấu trúc thanh ghi được trình bày trong hình dưới. cả Master và Slave đều có thể truyền và nhận dữ liệu. Trong đó TWGCE (TWI General Call Enable) là bit cho phép cuộc gọi chung. Slave có quyền cho phép Master thực hiện cuộc gọi chung với nó hay không. dữ liệu nhận về sẽ được lưu trong TWDR. Vì thế. nhiều tình huống xảy ra khi giao tiếp bằng TWI cho cả Master và Slave.com . Có rất nhiều bước. ĐT : 0982969872. Nguyễn Ngọc Hà . TWSR (TWI Status Register): là 1 thanh ghi 8 bit trong đó có 5 bit chứa code trạng thái của TWI và 2 bit chọn prescaler. Lập trình cho TWI cần xét code trong 5 bit cao của thanh ghi TWSR và đưa ra các ứng xử hợp lý ứng với từng code. đối với Master. dữ liệu chứa trong TWDR sẽ được chuyển ra đường SDA. Trước khi sử dụng TWI như Slave. Slave Reicever (chip tớ nhận) và Slave Transmitter (Chip tớ truyền). cần khai thác ngắt trên AVR một cách hơp lý.Trong các thanh ghi TWCR không cần được set cùng lúc. Bất kỳ một sự kiện nào trong quá trình truyền/nhận TWI cũng có thể gây ra 1 ngắt TWI. Riêng với Slave. - Địa chỉ Slave được tạo thành từ 7 bits. Mail : hanguyen92205@gmail. chúng ta không cần sử dụng ngắt vì chip này hoàn toàn chủ động trong việc truyền và nhận. Trong quá trình gởi. chúng ta phải gán địa chỉ cho chip. nếu TWGCE=0 thì Slave sẽ bỏ qua cuộc gọi chung 3. có tất cả 4 mode trong hoạt động của TWI trên AVR. Master Receiver (Chip chủ nhận). Ví dụ. sử dụng ngắt để tránh bỏ lỡ các cuộc gọi là cần thiết. TWAR (TWI Address Register): là thanh ghi chứa device address của chip Slave. Tuy nhiên. trên thanh ghi TWAR 7 bits địa chỉ này nằm ở 7 vị trí cao. Tất cả các AVR trên mạng TWI đều có thể là Master hay Slave. TWDR (TWI Data Register): là thanh ghi dữ liệu chính của TWI. Chúng ta sẽ lần lượt khảo sát các mode này như sau: Master Transmitter (chip chủ truyền). Trong quá trình nhận. tùy vào từng giai đoạn trong quá trình giao tiếp TWI các bit có thể được set riêng lẻ. TWI trên AVR vì thế hoạt động tương đối độc lập với chip. Slave sẽ đáp ứng lại cuộc gọi chung nếu có.

sau Rs là địa chỉ của Slave mới. Slave address. chân SDA được kéo xuống 0 ở xung thứ 9 Not Acknowledge. Nếu Slave đáp lại bằng một ACK trong xung giữ nhịp thứ 9. Master tạo ra một START condition trên đường SDA. ĐT : 0982969872. Master sẽ tiếp tục gởi 1 hoặc liên tiếp các byte dữ liệu trên SDA. cuộc gọi kết thúc. Chúng ta chỉ thanh ghi này và đối chiếu với bảng code quy định sẵn để biết trạng thái đường truyền và đưa ra quyết định tiếp theo. Cứ sau mỗi byte dữ liệu. Hình dưới mô tả một quá trình Master truyền dữ liệu. bit này bằng 1 được gởi kèm với gói địa chỉ WRITE Bit. SDA ở mức cao ở bit thứ 9 8 bits dữ liệu STOP condition – điều kiện kết thúc. Nếu STOP được phát. Master sẽ tiếp tục phát đi địa chỉ của Slave cần giao tiếp cùng với bit W (ghi) theo định dạng như sau: SLA+W. Nếu Slave gởi một NACK hoặc Master không muốn gởi thêm dữ liệu đến Slave nó sẽ phát đi một STOP condition hoặc một REPEAT START (Rs). Master sẽ kiểm tra ACK từ Slave. Mail : hanguyen92205@gmail. Để bắt đầu. S: Rs: R: W: ACK: NACK: Data: P: SLA: START condition – điều kiện bắt đầu REPEAT START – bắt đầu lặp lại READ Bit. gởi kèm gói địa chỉ Ackowledge.com . bit xác nhận. nếu Rs được phát. các khả năng có thể xảy ra và giá trị tương ứng của thanh ghi TWSR. không xác nhận.Trước khi khảo sát các chế độ hoạt động của TWI chúng ta qui ước một số ký hiệu thường dùng (đây cũng là các ký hiệu dùng trong datasheet của các chip AVR). Master truyền 1 hoặc một số byte dữ liệu đến một hoặc các Slave. nếu đường truyền đang rảnh. một cuộc gọi mới bắt đầu. bit này mang giá trị 0. Nguyễn Ngọc Hà . Ý nghĩa các code trong thanh ghi TWSR trong lúc Master truyền dữ liệu có thể tham khảo thêm datasheet của chip. địa chỉ của Slave cần giao tiếp Master Transmitter mode – Master truyền dữ liệu: Trong chế độ này. Tất cả được TWI mã hóa thành các code chứa trong thanh ghi TWSR (chỉ 5 bit cao).

Để bắt đầu. Master bị lost (code 0x38)…Đối với mỗi loại ứng dụng. Master tạo ra một START condition trên đường SDA. cách “hành xử” sẽ khác nhau đối với các trường hợp thất bại này. nếu đường truyền đang rảnh. Mail : hanguyen92205@gmail. nếu một trong các code thất bại xảy ra chúng ta sẽ thoát khỏi cuộc gọi và đưa đường truyền về trạng thái nghỉ. Ngoài ra còn một số code khác tương ứng với các trường hợp khác như gởi địa chỉ thất bại (code 0x20). chúng ta nhận thấy khi Master truyền dữ liệu. báo ACK lại cho Master. Master Receiver mode – Master nhận dữ liệu: Trong chế độ này. dãy code 0x08 -> 0x18 -> 0x28 ->… -> 0x28 (-> 0x30) là dãy code thành công nhất. Nguyễn Ngọc Hà . ĐT : 0982969872. lúc này Master có thể phát đi một STOP codition sau code 0x30. code 0x28 tức dữ liệu được Master truyền thành công và Slave đã nhận được. Trong bài này sẽ bỏ qua tất cả các trường hợp thất bại. Master nhận một hoặc một số byte dữ liệu từ một Slave.Từ hình trên. code 0x18 báo địa chỉ truyền thành công và đã có Slave xác nhận bằng ACK. code 0x30 tức dữ liệu đã được truyền nhưng Slave không xác nhận lại.com . Code 0x08 báo rằng START codition được truyền thành công.

tiếp theo Master sẽ phát một STOP condition hoặc một REPEAT START. code 0x50 báo dữ liệu được Master nhận thành công và Master cũng đã phát một ACK bit sau khi nhận. trong quá trình Master nhận dữ liệu.com . Khi Master muốn kết thúc quá trình nhận nó sẽ phát một NOT ACK sau khi nhận dữ liệu. code 0x58 xảy ra khi Master nhận dữ liệu thành công nhưng nó không phát ACK mà phát NOT ACK. liền sau đó Master phát STOP để kết thúc cuộc gọi hoặc phát đi một REPEAT START nếu nó muốn tiếp tục gọi các Slaves khác. Mail : hanguyen92205@gmail. Nguyễn Ngọc Hà . Cứ sau mỗi byte dữ liệu.Master sẽ tiếp tục phát đi địa chỉ của Slave cần giao tiếp cùng với bit R (đọc) theo định dạng như sau: SLA+R. Nếu Slave đáp lại bằng một ACK trong xung giữ nhịp thứ 9. báo cho Slave rằng Master không muốn nhận thêm dữ liệu. Master sẽ bắt đầu sample dữ liệu trên SDA. dãy code 0x08 -> 0x40 -> 0x50 ->… -> 0x58 là dãy code thành công nhất. Các trường hợp khác chúng ta không khảo sát. Code 0x08 báo rằng START codition được truyền thành công. nếu Master muốn nhận tiếp byte khác nó phải phát ra 1 ACK ở xung thứ 9 báo cho Slave. ĐT : 0982969872. Từ hình trên. code 0x40 báo địa chỉ + R đã được truyền thành công và đã có Slave xác nhận bằng ACK. Ý nghĩa các code trong thanh ghi TWSR trong lúc Master truyền dữ liệu có thể tham khảo thêm datasheet của chip. các khả năng có thể xảy ra và giá trị code tương ứng của thanh ghi TWSR. Hình dưới mô tả một quá trình Master nhận dữ liệu.

Slave sau đó bắt đầu nhận dữ liệu từ đường SDA. Chế độ Slave phát dữ liệu xảy ra khi Master muốn nhận dữ liệu từ Slave. các khả năng có thể xảy ra và giá trị code tương ứng của thanh ghi TWSR.com . Nếu Slave cho phép ngắt TWI (bit TWIE trong thanh ghi TWCR được set từ lúc đầu) thì một ngắt xảy ra báo có một sự kiện TWI. Khi viết chương trình cho Slave trong chế độ nhận dữ liệu. Cuộc gọi chung cũng diễn ra hoàn toàn tương tự cuộc gọi địa chỉ riêng nhưng code có giá trị khác. bit TWINT của Slave sẽ được set lên 1. Nếu vì một lý do nào đó mà Slave không thể tiếp tục nhận nó có thể phát một NOT ACK sau một byte dữ liệu. Slave chỉ nhận ra cuộc gọi này khi địa chỉ của nó trùng với địa chỉ của Master (Own address mode) hoặc khi Master thực hiện một cuộc gọi chung.- Slave Receiver mode – Slave nhận dữ liệu: Hình dưới mô tả một quá trình Slave nhận dữ liệu. ĐT : 0982969872. Cuộc gọi kết thúc khi Slave nhận được STOP condition. Khi đó. Nếu code trong thanh ghi TWSR là 0x60 thì một cuộc gọi địa chỉ riêng được yêu cầu và Slave cũng đã đáp ứng lại Master bằng một ACK. Cứ sau một byte dữ liệu Slave phải xác nhận một ACK nếu nó còn muốn tiếp tục nhận. chúng ta cần xét cả 2 trường hợp cuộc gọi địa chỉ riêng và cuộc gọi chung. Hình dưới mô tả một quá trình Slave truyền dữ liệu. Mail : hanguyen92205@gmail. Chế độ Slave nhận dữ liệu xảy ra khi Master thực hiện một cuộc gọi phát dữ liệu (SLA+W). các khả năng có thể xảy ra và giá trị code tương ứng của thanh ghi TWSR. - Slave Transmitter mode – Slave truyền dữ liệu: Đây là chế độ cuối cùng trong 4 chế độ của AVR TWI. tương ứng code 0xA0. Như quan sát trong hình 4. Master Nguyễn Ngọc Hà .

byte tiếp theo cũng là byte cuối cùng. code trên Slave trong trường hợp này là 0xC8 và Slave sẽ tự hết thúc quá trình truyền mà không cần chờ Master. nếu dùng “hỏi vòng” cho Slave thì sẽ tốn thời gian chờ vô ích và đôi khi còn bỏ lỡ các cuộc gọi. Vì thế. code trong thanh ghi TWSR sẽ là 0xA8. Slave kết thúc quá trình phát dữ liệu. việc truyền và nhận của Slave sẽ được thực hiện trong các trình phục vụ ngắt TWI. Ứng với mỗi code nhận về từ thanh ghi TWSR (hay ứng với mỗi trạng thái của cuộc gọi) mà Master set các bit tương ứng trong thanh ghi điều khiển TWCR và sau đó chờ bit TWINT được set (quá trình kết thúc) để tiếp tục đọc và xét code TWSR. ĐT : 0982969872. Slave không chủ động thực hiện cuộc gọi mà nó phải chờ yêu cầu từ Master để phục vụ. Khi đó. nó có thể xác nhận 1 ACK cho Slave (vì thật ra Master không hề biết Slave đang truyền byte cuối). Khi lập trình cho Slave trong chế độ phát. Cứ sau mỗi byte dữ liệu. Nếu Master không muốn tiếp tục nhận dữ liệu từ Slave. Sau khi Master nhận byte này. Quá trình chờ và xét này lặp lại cho đến khi Master kết thúc cuộc gọi bằng STOP condition. cần phải có sự “thỏa hiệp” với Master trước để tránh code 0xC8 vì code này không có nhiều ý nghĩa. code 0xB8 sẽ xuất hiện trong trường hợp này. Slave sau đó bắt đầu phát dữ liệu lên đường SDA. Một trường hợp đặc biệt khi bit TWEA (bit ACK) trong thanh ghi TWCR của Slave được reset về 0 trước khi Slave truyền dữ liệu. Master sẽ xác nhận một ACK nếu nó còn muốn tiếp tục nhận.thực hiện một cuộc gọi nhận dữ liệu (SLA+R). trường hợp Slave muốn báo rằng nó đã hết dữ liệu để truyền. Nguyễn Ngọc Hà . Như quan sát trong hình. Slave chỉ nhận ra cuộc gọi này khi địa chỉ của nó trùng với địa chỉ của Master (Own address mode). Mail : hanguyen92205@gmail. Đối với Slave. ngắt là phương pháp bắt cuộc gọi tối ưu nhất. Kỹ thuật chính dùng cho Master khi truyền hay nhận cuộc gọi là hỏi vòng và chờ (polling and waiting). một NOT ACK sẽ được phát và code 0xC0 xuất hiện. Nếu Slave đáp lại bằng một ACK ở xung nhịp thứ 9. Tuy nhiên Slave thì khác. bit TWINT của Slave sẽ được set lên 1.com . Trong bài học này.

Chip AVR ATmega16L Sơ đồ chân ATmega16L có đầy đủ tính năng của họ AVR 2. GIỚI THIỆU 1. 3. ĐT : 0982969872. … 8 kênh ADC 10 bit 1 bộ so sánh Analog – 4 kênh PWM 2 bộ timer/ counter 8 bit. I2C.Phần 2 .. được hỗ trợ sẵn c|c thư viện từ cộng đồng. Mail : hanguyen92205@gmail. 16K flash . 512 byte EEPROM.. 1K SRAM Đóng vỏ 40 chân ( DIP ) và 44 chân ( TQFP ) Có 32 I/O chia làm 4 port Giao tiếp SPI. KIT thí nghiệm CREATIVE AVR BOARD Nguyễn Ngọc Hà . 1 bộ timer/ counter 16 bit 1 bộ định thời Watchdog 1 bộ truyền nhận UART Phần mềm lập trình Codevision Đ}y l{ phần mềm được sử dụng rộng r~i được xây dựng trên ngôn ngữ lập trình C. LẬP TRÌNH C CHO AVR I.com .

loa BUZZER. LCD. UART. cảm biến nhiết độ LM35. biến trở RVAR. hoặc 7-12VDC từ apdapter II. ĐIỀU KHIỂN I/O VỚI LED ĐƠN - Nguyễn Ngọc Hà .Gồm c|c modul Led đơn. IrDA .LED matrix.com . Led 7 đoạn. Mail : hanguyen92205@gmail. MMC/SD . ma trận phím.Hỗ trợ giao tiếp I2C. ĐT : 0982969872.Nguồn cấp 5VDC từ cổng USB.Mạch được tích hợp sẵn mạch nạp nên thuận tiện cho việc sử dụng .

com . ra thì ta t|c động tới các bit DDxn. PORTx được ghi giá trị 0 PINxn để truy cập tại địa chỉ xuất nhập PINx . việc đọc PINx cho phép ta đọc giá trị logic trên các chân của PORTx - - Các cổng của AVR đều có thể đọc. DDxn trong thanh ghi DDRx dùng để điều khiển hướng dữ liệu các chân của cổng này. ghi. Ta có thể thiết lập để từng bit làm cổng vào. ra VD: Để thiết lập PORTA làm cổng ra thì ta có thể xuất dữ liệu ra từ PORTA: PORTA=0xAA ( 10101010 ) Mở chương trình Codevision. Khi PORTx được ghi giá trị 1 khi các chân có cấu tạo như cổng ra thì điện trở kéo là chủ động ( nối với cổng ). PORTxn. Màn hình làm việc: Nguyễn Ngọc Hà . Để thiết lập 1 cổng l{ v{o. PINxn DDxn để truy cập cho địa chỉ xuất nhập DDRx. PINx là các cổng chỉ để đọc. PINx không phải là thanh ghi. các cổng này có thể đọc trạng thái logic cảu PORTx. PORTxn. ĐT : 0982969872. còn ghi “1” thì nó l{ lối ra PORTxn để truy cập địa chỉ xuất nhập PORTx. Mail : hanguyen92205@gmail.C|c led trêm board được nối }m chung nên để led s|ng ta đưa mức logic các chân IO của AVR lên mức cao (5V). Ngắt điện trở kéo ra. Khi có giá trị logic “0” thì nó sẽ trở thành lối v{o. để led tắt ta đưa c|c ch}n IO của AVR xuống mức thấp Thiết lập cổng v{o ra: khi xem xét đến cổng vào ra của AVR ta xét đến 3 thanh ghi bit DDxn. PINxn.

Để tạo Project mới : File -> New Chọn project -> OK .com . ĐT : 0982969872. Chọn Yes trong cửa sổ hiện ra để sử dụng CodeWinzardAVR Nguyễn Ngọc Hà . Mail : hanguyen92205@gmail.

Chọn chip là ATmega16L.com . Mail : hanguyen92205@gmail. Để khởi tạo các cổng IO ta chọn thẻ Port Các chân IO của AVR mặc định là trạng thai IN. Save and Exit Nguyễn Ngọc Hà . tân số thạch anh l{ 8 MHz. muốn chuyển th{nh OUT để đưa ra c|c mức logic ta click chuột v{o c|c nút IN để chuyển thành OUT Chọn File -> Generate. ĐT : 0982969872.

Chọn nơi lưu v{ tên của 3 file . .prj. .h bằng cách thêm dòng lệnh sau bên dưới dòng lệnh #include<mega16.h> Để định nghĩa biến LED l{ PORTA ta khai b|o như sau: #define LED PORTA Trong hàm main có vòng while(1) – vòng lặp vô hạn. Do đó ta thêm thư viện delay. chúng ta soạn đoạn code v{o đó: Để dịch chương trình ấn F9 hoặc chọn : Project -> Compile Ta được cưa sổ thông báo sau Nguyễn Ngọc Hà .h>: #include<delay.cwp ta được cửa số làm việc: Để led nhấp nháy chúng ta cần sử dụng h{m delay_ms(). ĐT : 0982969872.c.com . Mail : hanguyen92205@gmail.

Ta mở chương trinh AVR PROG lên ( kết nối với KIT trước khi mở chương trình ) Nguyễn Ngọc Hà .Nếu chương trình có lỗi phải quay lại chỉnh sửa code . Mail : hanguyen92205@gmail. ở đ}y b|o không có lỗi ta chọn OK Để nạp chương trình lên KIT.com . ĐT : 0982969872.

đưa PORTA. đẩy giá trị hàng chục ra PORTB. bit 7 là dấu chấm ( chân dp) Có 6 led nên ta có thể hiển thị đến h{ng trăm nghìn. ĐIỀU KHIỂN VÀO RA VỚI LED 7 ĐOẠN 1. chục nghìn.0 lên 1 để tắt nguồn led đơn vị. trễ 1 khoảng thời gian. 4 ch}n anode chung được nối với 4 transistor khuếch dòng. Nguyễn Ngọc Hà . đơn vị rùi đưa v{o 6 biến rồi tùy vào 6 biến số đó m{ ta đưa ra từng led. Mô tả Trên KIT có 6 LED 7 thanh Anode chung. Để có thể quét led ta sửu sụng 6 chân của PORT A. đẩy trị số h{ng đơn vị ra PORTB. ĐT : 0982969872.0 xuống o để bật nguồn cho led h{ng đơn vị. Mail : hanguyen92205@gmail. Như vậy.com . Chọn Program để tiến hành nạp chương trình lên chip ( Xem thêm phần hướng dẫn sử dụng mạch nạp AVR USB 910 v{ chương trình nạp AVRProg để hiểu rõ hơn ) III. chục. trễ 1 khoảng thời gian -> đưa PORTA. c|c ch}n điều khiển sáng các thanh còn lại được nối song song nhau v{ đưa v{o PORTB của AVR. Do đầu vào của ta là 1 số bất kỳ lên tới h{ng trăn nghìn nên ta phải tách lấy từng số h{ng trăm nghìn.Tab Browse chọn đường dẫn đến file Hex được tạo ra trong project đ~ tạo ở codevision Chọn chip ATmega16 ở thẻ Divice. Quét led ta l{m như sau: đưa PORTA. tại 1 thời điểm chỉ có 1 led sáng. nghìn.… cứ l{m như vậy cho đến h{ng trăm nghìn. Từ bit 0 -> 6 tương ứng với A-> G. trăm.1 xuống 0 để bật nguồn cho led hàng chục.

ĐT : 0982969872.break. Thực hành C|c bước khởi tạo như phần II. mắt người lưu ảnh nên vẫn thấy led s|ng như lúc n{o cũng bật nguồn cho led 2.} //so 2 case 3: {PORTB=0xB0.break.nhưng do tần số bật tắt led nhanh .} //so 0 case 1: {PORTB=0xF9. Mail : hanguyen92205@gmail.com .break.} //so 4 Nguyễn Ngọc Hà . Chúng ta soạn code gồm 2 hàm như sau v{ đặt ngay phía trên hàm main: void daydulieu(unsigned char x) { switch(x)// tuy vao bien dau vao ma dua ra du lieu tu 0-9 { //logic 1 tat led.break.} //so 1 case 2: {PORTB=0xA4.} //so 3 case 4: {PORTB=0x99. 0 bat led case 0: {PORTB=0xC0.break.

//led thu 2 daydulieu(e). d=(n-a*100000-b*10000-c*1000)/100.d.f.break.} //so 6 case 7: {PORTB=0xF8. //led dau tien daydulieu(f).break. //day ra hang don vi delay_ms(10). b=(n-a*100000)/10000. f=(n-a*100000-b*10000-c*1000-d*100-e*10). c=(n-a*100000-b*10000)/1000.case 5: {PORTB=0x92. //Lay cac so cac hang a=n/100000.} //so 7 case 8: {PORTB=0x80.} //so 9 } } void hienthi(int n) { int a. //day ra hang chuc delay_ms(10). PORTB=0xFF. Mail : hanguyen92205@gmail.e.break.c. //lay hang don vi //Quet led PORTA=0xFE.break. Nguyễn Ngọc Hà . // lay hang tram nghin //lay hang chuc nghin //lay hang nghin //lay hang tram //lay hang chuc e=(n-a*100000-b*10000-c*1000-d*100)/10.} //so 8 case 9: {PORTB=0x90.b.com . //tat toan bo led PORTA=0xFD. ĐT : 0982969872.} //so 5 case 6: {PORTB=0x82.break.

PORTB=0xFF.PORTB=0xFF. delay_ms(10). PORTA=0xDF. Mail : hanguyen92205@gmail. PORTA=0XEF. PORTB=0xFF. ĐT : 0982969872. PORTA=0xF7.com . //led thu 3 daydulieu(d). delay_ms(10). PORTB=0xFF. daydulieu(b). daydulieu(c). //day ra hang tram delay_ms(10). //tat toan bo led PORTA=0xFB. } Trong vòng while(1) ta chỉ dùng 1 câu lệnh để hiển thị như sau: to be continued … Nguyễn Ngọc Hà . PORTB=0xFF. daydulieu(a).

Sign up to vote on this title
UsefulNot useful