Thanhtam Ho - www.hocavr.com Copyright © 2010 Cùng học AVR Bài - Làm quen AVR Nội dung Giới thiệu Công cụ Ví dụ Mô Các cần tham khảo trước • • AVR Studio Mô với Proteus Download ví dụ I Giới thiệu AVR họ vi điều khiển hãng Atmel sản xuất (Atmel nhà sản xuất dòng vi điều khiển 89C51 mà bạn nghe đến) AVR chip vi điều khiển bits với cấu trúc tập lệnh đơn giản hóa-RISC(Reduced Instruction Set Computer), kiểu cấu trúc thể ưu xử lí Tại AVR: so với chip vi điều khiển bits khác, AVR có nhiều đặc tính hẳn, tính ứng dụng (dễ sử dụng) đặc biệt chức năng: • • • • • • • • • • • • Gần không cần mắc thêm linh kiện phụ sử dụng AVR, chí không cần nguồn tạo xung clock cho chip (thường khối thạch anh) Thiết bị lập trình (mạch nạp) cho AVR đơn giản, có loại mạch nạp cần vài điện trở làm số AVR hỗ trợ lập trình on – chip bootloader không cần mạch nạp… Bên cạnh lập trình ASM, cấu trúc AVR thiết kế tương thích C Nguồn tài nguyên source code, tài liệu, application note…rất lớn internet Hầu hết chip AVR có tính (features) sau: Có thể sử dụng xung clock lên đến 16MHz, sử dụng xung clock nội lên đến MHz (sai số 3%) Bộ nhớ chương trình Flash lập trình lại nhiều lần dung lượng lớn, có SRAM (Ram tĩnh) lớn, đặc biệt có nhớ lưu trữ lập trình EEPROM Bộ nhớ chương trình Flash lập trình lại nhiều lần dung lượng lớn, có SRAM (Ram tĩnh) lớn, đặc biệt có nhớ lưu trữ lập trình EEPROM Nhiều ngõ vào (I/O PORT) hướng (bi-directional) bits, 16 bits timer/counter tích hợp PWM Các chuyển đối Analog – Digital phân giải 10 bits, nhiều kênh Chức Analog comparator Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR • • • • Thanhtam Ho - www.hocavr.com Giao diện nối tiếp USART (tương thích chuẩn nối tiếp RS-232) Giao diện nối tiếp Two –Wire –Serial (tương thích chuẩn I2C) Master Slaver Giao diện nối tiếp Serial Peripheral Interface (SPI) Một số chip AVR thông dụng: • • • • • • • • • • • • • • • • • • • • • • • • AT90S1200 AT90S2313 AT90S2323 and AT90S2343 AT90S2333 and AT90S4433 AT90S4414 and AT90S8515 AT90S4434 and AT90S8535 AT90C8534 ATtiny10, ATtiny11 and ATtiny12 ATtiny15 ATtiny22 ATtiny26 ATtiny28 ATmega8/8515/8535 ATmega16 ATmega161 ATmega162 ATmega163 ATmega169 ATmega32 ATmega323 ATmega103 ATmega64/128/2560/2561 AT86RF401 Trong viết sử dụng chip ATmega8 để làm ví dụ, chọn ATmega8 loại chip thuộc dòng AVR nhất, có đầy đủ tính AVR lại nhỏ gọn (gói PDIP có 28 chân) low cost nên bạn mua để tự tạo ứng dụng Tại Assembly (ASM): bạn không cần biết cấu trúc AVR lập trình cho AVR phần mềm hỗ trợ ngôn ngữ cấp cao BascomAVR (Basic) hay CodevisionAVR (C), nhiên mục đích viết Để hiểu thấu đáo AVR bạn phải lập trình ngôn ngữ nó, ASM Như lập trình ASM giúp bạn hiểu tường tận AVR, tất nhiên để lập Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com trình ASM bạn phải hiểu cấu trúc AVR….Một lý khác bạn mà khuyên bạn nên lập trình ASM trình dịch (compiler) ASM cho AVR hoàn toàn miễn phí, nguồn source code cho AVR viết ASM lớn Tuy nhiên bạn thành thạo AVR ASM bạn sử dụng ngôn ngữ cấp cao C để viết ứng dụng ưu điểm ngôn ngữ cấp cao giúp bạn dễ dàng thực phép toán đại số 16 hay 32 bit (vốn vấn đề khó khăn lập trình ASM) II Công cụ Trình biên dịch: có nhiều trình biên dịch bạn sử dụng đế biên dịch code bạn thành file intel hex để nạp vào chip, số trình dịch quen thuộc kể đến sau: • • • • • • • AvrStudio: trình biên dịch ASM thức cung cấp Atmel, trình biên dịch hoàn toàn miễn phí tất nhiên tốt cho lập trình AVR ASM Phiên 4.18 SP1, bạn download phần mềm AvrStudio trang web thức Atmel 4.623 Wavrasm: cung cấp Atmel, tiền thân AvrStudio Hiện wavrasm không sử dụng nhiều so với AvrStudio trình biên dịch có nhiều hạng chế, bạn quan tâm download WinAVR hay avr-gcc: trình dịch phát triển gnu, ngôn ngữ sử dụng C dùng tích hợp với AvrStudio (dùng Avrstudio làm trình biên tập – editor) Đặc biệt biên dịch miễn phí đa số nguồn source code C viết này, lí tưởng cho bạn viết ứng dụng chuyên nghiệp Việc lập trình avrgcc đề cập phần sau CodeVisionAvr: chương trình ngôn ngữ C hay cho AVR, hỗ trợ nhiều thư viện lập trình Tuy nhiên chương trình thương mại Bạn download demo (đầy đủ chức nhưng giới hạn dung lượng nhớ chương trình 2KB) Website hpinfotech ICCAVR: lập trình C cho avr, download demo BascomAVR: lập trình cho AVR basic, trình biên dịch hay dễ sử dụng, hỗ trợ nhiều thư viện Tuy nhiên khó debug lỗi không thích hợp cho việc tìm hiểu AVR Vì không bạn khuyến khích bạn sử dụng trình dịch Bạn download demo (4K limit) Và nhiều trình biên dịch khác cho AVR mà không kể đây, nhìn chung tất trình biên dịch hỗ trợ C Basic chí Pascal Việc chọn trình biên dịch tùy thuộc vào mục đích, vào mức độ ứng dụng, vào kinh nghiệm sử dụng nhiều lý khác Ví dụ thường dùng Avrstudio avrgcc học sử dụng AVR viết thư viện Nhưng cần viết chương trình ứng dụng thường chọn avrgcc CodeVisionAVR Trong viết hướng dẫn bạn sử dụng AvrStudio để viết chương trình cho AVR ASM Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Chương trình nạp (Chip Programmer): đa số trình biên dịch (AvrStudio, CodeVisionAVR, Bascom…) tích hợp sẵn chương trình nạp chip hỗ trợ nhiều loại mạch nạp nên bạn không lo lắng Trong trường hợp khác, bạn sử dụng chương trình nạp Icprog hay Ponyprog…là chương trình nạp miễn phí cho AVR Việc chọn sử dụng chương trình nạp giới thiệu sau Mạch nạp: tham khảo viết giới thiệu mạch nạp AVR Chương trình mô phỏng: avr simulator trình mô debbug tích hợp sẵn Avrstudio, avr simulator cho phép bạn quan sát trạng thái ghi bên AVR nên phù hợp để bạn debug chương trình Proteus chương trình thứ hai muốn nói đến, Proteus mô hoạt động bên chip mà mô mạch điện tử Proteus mô trực quan, công cụ hữu ích bạn chưa có điều kiện làm mạch điện tử III Ví dụ bạn Sau download AvrStudio, bạn cài đăt phần mềm máy bạn, trình cài đặt đơn giản, bạn theo mặc định nhấn “next” để cài đặt Trong viết thử chương trình đơn giản cho AVR sau chạy mô Proteus Có thể có số câu lệnh bạn không hiểu, đừng lo lắng quá, thứ học cấu trúc AVR bạn giải thich rõ Để thực ví dụ này, bạn tạo Project AVRStudio, phần hướng dẫn chi tiết cho việc tạo Project AVRStudio bạn tham khảo hướng dẫn AVRStudio.Đoạn code ví dụ trình bày List1 List Đoạn code bạn CSEG INCLUDE "M8DEF.INC" ORG 0x000 RJMP BATDAU ORG 0x020 BATDAU: ; KHOI TAO CAC DIEU KIEN DAU LDI R16, HIGH(RAMEND) 10 LDI R17, LOW(RAMEND) 11 OUT SPH, R16 12 OUT SPL, R17 13 LDI R16, 0xFF; 14 OUT DDRB, R16 15 16 ; CHUONG TRINH CHINH Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com 17 MAIN: 18 LDI R16, 0B00000001 19 OUT PORTB, R16 20 RCALL DELAY 21 22 LDI R16, 0B00000010 23 OUT PORTB, R16 24 RCALL DELAY 25 26 LDI R16, 0B00000100 27 OUT PORTB, R16 28 RCALL DELAY 29 30 LDI R16, 0B00001000 31 OUT PORTB, R16 32 RCALL DELAY 33 34 LDI R16, 0B00010000 35 OUT PORTB, R16 36 RCALL DELAY 37 38 LDI R16, 0B00100000 39 OUT PORTB, R16 40 RCALL DELAY 41 42 LDI R16, 0B01000000 43 OUT PORTB, R16 44 RCALL DELAY 45 46 LDI R16, 0B10000000 47 OUT PORTB, R16 48 RCALL DELAY 49 50 RJMP MAIN 51 ; CHUONG TRING CON DELAY 65535 chu ky (khoang 65535us neu xung ;clock cho chip 52 DELAY: 53 LDI R20, 0xFF 54 DELAY0: 55 LDI R21, 0xFF 56 DELAY1: 57 DEC R21 58 BRNE DELAY1 59 DEC R20 60 BRNE DELAY0 61 RET Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Trước tìm hiểu ý nghĩa đoạn code, nhìn lượt qua đoạn code Trước hết việc viết HOA hay viết thường không quan trọng, bạn viết đoạn code với hình thức miễn cú pháp, từ khóa Trong đoạn code: • • • • • Bạn thấy số từ có màu BLUE (ví dụ LDI, OUT, RJMP, RCALL, RET…)đó INSTRUCTiON, tức câu lệnh ngôn ngữ ASM, bạn đọc tài liệu “AVR INSTRUCTION” để tìm hiểu tất INSTRUCTION Các INSTRUCTION sau trình dịch dịch thành mã tương ứng Một số từ bắt đầu bằng dấu chấm “.” DIRECTIVE (ví dụ INCLUDE hay ORG )đó từ khóa mặc định ASM AVR, DIRECTIVE mã lệnh mà dẫn địa nhớ, khởi động nhớ, định nghĩa macro…và không trình dịch dịch thành mã Chi tiết DIRECTIVE tìm thấy tài liệu ASM AVR, tóm tắt DIRECTIVE chức chúng sau: Thông thường INSTRUCTION theo sau toán hạng – operand (tuy nhiên có nhiều trường hợp có toán hạng toán hạng), toán hạng thứ THANH GHI AVR (như đề cập, khảo sát ghi AVR sau), ví dụ : “LDI R16, 0xFF;” toán hạng “R16” tên ghi AVR, “0xFF” số dạng hexadecimal có giá trị tương ứng 255 dạng thập phân hay 11111111 nhị phân Các từ theo sau dấu “:” nhãn – label (ví dụ MAIN, DELAY…), từ tự đặt, thực chất vị trí nhớ chương trình, sử dụng nhãn chương trình Phần sau dấu “;” gọi giải thích – comment, phần không biên dịch, bạn ghi comment đâu chương trình với yêu cầu phải sử dụng dấu “;” trước Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Giải thích đoạn code:có thể chia đoạn code thành phần: phần đầu chứa DIRECTIVE lệnh RJMP dùng để xác định địa nhớ chương trình, phần khởi tạo số điều kiện đầu cho Stack Pointer PORT, phần chương trình chính, phần chương trình ( ý cách bố trí riêng tôi, quen thuộc, bạn bố trí chương trình theo cách riêng bạn) • Phần phần 2: CSEG Chỉ thị CSEG: Code Segment báo cho trình biên dịch phần code theo sau phần chương trình thực thi, phần download vào nhớ chương trình chip .INCLUDE "M8DEF.INC" Chỉ thị INCLUDE báo cho trình biên dịch bắt đầu đọc file đính kèm, trường hợp file “M8DEF.INC”, file chứa khai báo cho chip Atmega8 ghi, ngắt…cho việc truy xuất chương trình bạn, dòng bắt buộc, bạn lập trình cho chip khác bạn đổi tên file đính kèm, ví dụ “m32def.inc” cho chip ATmega32… bạn tìm thấy file thư mục “C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes” .ORG 0x000 Chỉ thị ORG: Set Program Origin, set vị trí nhớ tác động đến, trường hợp trên, ORG 0x000 xác định phần code theo sau nằm địa 000, vị trí đầu tiên, nhớ chương trình Và dòng lênh vị trí là: RJMP BATDAU RJMP: Relative Jump lệnh nhảy không điều kiện đến vị trí nhớ, trường hợp nhảy đến nhãn BATDAU, nhãn BATDAU nằm vị trí 0x020 (số hexadecimal, 0x020 =32 decimal) khai báo sau DIRECTIVE ORG 0x020 .ORG 0x020 BATDAU Như phần nhớ chương trình nằm 0x020 không sử dụng đoạn code chúng ta, phần sử dụng cho mục đích khác, vectơ ngắt ( không đề cập đây) Tiếp theo: ; KHOI TAO CÁC DIEU KIEN DAU LDI R16, HIGH(RAMEND) Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Thanhtam Ho - www.hocavr.com Copyright © 2010 Cùng học AVR LDI R17, LOW(RAMEND) OUT SPH, R16 OUT SPL, R17 Bốn dòng code khởi tạo cho Stack Pointer, tìm hiểu phần Stack chương trình Lời khuyên: bạn nên khởi động chương trình theo cách hiểu chúng rõ sau ! LDI R16, 0xFF OUT DDRB, R16 Bạn ý dòng giải thích sau đây, dòng có tác dụng khởi động PORTB chip ATmega8 tác dụng ngõ xuất tín hiệu (OUTPUT) Trước hết quan sát chip ATmega8 hình sau Hình 1: chip ATmega8 Bạn thấy chip gồm 28 chân, trông có chân ghi PB0(chân 14), PB1(chân 15),…,PB7(chân 10), chân PORTB PORT khái niệm ngõ xuất nhập Trong AVR, PORT giao hướng (bi – directional), dùng để xuất nhận thông tin, PORT có chân Chip Atmega8 có PORT có tên tương ứng PORTB, PORTC PORTD (một số chip AVR khác có PORT) PORT coi “cửa ngõ” then chốt vi điều khiển Trong AVR, PORT liên quan đến ghi (8 bits) có tên tương ứng DDRx, PINx, PORTx với “x” tên PORT, bit ghi tương ứng với chân PORT Trong trường hợp Atmega8 “x” B, C D Ví dụ quan tâm đến PORTB ghi tương ứng có tên DDRB, PINB PORTB, ghi PORTB PINB nối trực tiếp với chân PORTB, DDRB ghi điều khiển hướng ( Input Output) Viết giá trị vào bit ghi DDRB chân tương Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Thanhtam Ho - www.hocavr.com Copyright © 2010 Cùng học AVR ứng PORTB chân xuất (Output), ngược lại giá trị xác lập chân tương ứng ngõ nhập Sau viết giá trị điều khiển vào DDRB, việc truy xuất PORTB thực thông qua ghi PINB PORTB Quay lại với dòng code chúng ta, dòng đầu: “LDI R16, 0xFF”, với LDI – LoaD Immediately, dòng lệnh có ý nghĩa load giá trị 0xFF vào ghi R16, R16 tên ghi nhớ AVR, 0xFF số có dạng thập lục phân, ký hiệu “0x” nói lên điều đó, bạn dùng ký hiệu khác “$” để số thập lục phân, ví dụ &FF, 0xFF=255(thập phân)=0B11111111 (nhị phân) Như sau dòng đầu ghi R16 có giá trị 11111111 (nhị phân) Dòng thứ 2: “OUT DDRB, R16” nghĩa xuất giá trị từ ghi R16 ghi DDRB, tóm lại sau dòng giá trị DDRB sau: 1 1 1 1 Có thể bạn hỏi tải chúng không sử dụng dòng “LDI DDRB, 0xFF” hay “OUT DDRB, 0xFF”, lệnh LDI cho phép thực ghi R16,…R31 lệnh OUT không thực với số Và DDRB=11111111 nên trường hợp tất chân PORTB sẵn sàng cho việc xuất liệu Lúc ghi PINB tác dụng, ghi PORTB ghi xuất, ghi giá trị vào ghi tác động đến chân PORTB.1 • Phần 3: Chương trình MAIN: LDI R16, 0B00000001 OUT PORTB, R16 RCALL DELAY Bạn cần ý dòng toàn phần chương trình chính, trước hết “MAIN:” nhãn tự đặt tên, giống “cột mốc” chương trình Dòng “LDI R16, 0B00000001” bạn hiểu, có khác biệt nhỏ sử dụng số dạng nhị phân cho bạn dễ hiểu Và dòng “OUT PORTB, R16” để xuất giá trị 0B00000001 có sẵn R16 ghi PORTB, lúc chân PB0 chip lên (5V) chân lại mức (0V) Dòng thứ 3: “RCALL DELAY” lệnh gọi chương trình DELAY, tạm hoãn trước thực dòng lệnh tiếp theo: LDI R16, 0B00000010 OUT PORTB, R16 RCALL DELAY Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Ba dòng lệnh giống ba dòng trên, giá trị xuất lúc 0B00000010, chân PB1 lên 5V chân khác xuống mức 0V Và đến đoạn cuối: LDI R16, 0B10000000 OUT PORTB, R16 RCALL DELAY RJMP MAIN • • • Sau kết thức dòng chân PB7 lên 5V, kết thúc vòng xoay Cuối quay vế đầu chương trình dòng “RJMP MAIN” Bây bạn đoán chương trình thực việc gì, quét xoay vòng chân PORTB, kết nối chân PORTB với LED, có hiệu ứng quét LED xoay vòng, thực điều phần mềm Proteus Phần 4: chương trinh DELAY: đoạn chương trình không làm việc trì hoãn khoảng thời gian, nhiên bạn chưa thể hiểu Đây ví dụ đơn giản, cố gắng thực theo cách dễ hiểu cho bạn, đoạn code dài dòng, bạn thực lại đoạn chương trình đoạn code bạn Phần cuối biên dịch đoạn code thành file intel hex để đổ vào chip, nhấn phím F7 để biên dịch Sau biên dịch bạn có file tên “avr1.hex” thưc mục project, dùng file đổ vào chip sau IV Mô Proteus Chúng ta thử nghiệm đoạn chương trình Proteus Nếu bạn thực kết minh họa hình Hướng dẫn cụ thể cách vẽ mạch điện mô phần mềm Proteus bạn xem "Mô Proteus" Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 10 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Trong này, bỏ qua tất trường hợp thất bại, code thất bại xảy thoát khỏi gọi đưa đường truyền trạng thái nghỉ B Master Receiver mode – Master nhận liệu: Trong chế độ này, Master nhận byte liệu từ Slave Để bắt đầu, Master tạo START condition đường SDA, đường truyền rảnh, Master tiếp tục phát địa Slave cần giao tiếp với bit R (đọc) theo định dạng sau: SLA+R Nếu Slave đáp lại ACK xung giữ nhịp thứ 9, Master bắt đầu sample liệu SDA Cứ sau byte liệu, Master muốn nhận tiếp byte khác phải phát ACK xung thứ báo cho Slave Khi Master muốn kết thúc trình nhận phát NOT ACK sau nhận liệu, liền sau Master phát STOP để kết thúc gọi phát REPEAT START muốn tiếp tục gọi Slaves khác Hình mô tả trình Master nhận liệu, khả xảy giá trị code tương ứng ghi TWSR Ý nghĩa code ghi TWSR lúc Master truyền liệu tham khảo thêm datasheet chip Hình Master nhận liệu Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 113 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Từ hình 3, trình Master nhận liệu, dãy code 0x08 -> 0x40 -> 0x50 >… -> 0x58 dãy code thành công Code 0x08 báo START codition truyền thành công, code 0x40 báo địa + R truyền thành công có Slave xác nhận ACK, code 0x50 báo liệu Master nhận thành công Master phát ACK bit sau nhận, code 0x58 xảy Master nhận liệu thành công không phát ACK mà phát NOT ACK, báo cho Slave Master không muốn nhận thêm liệu, Master phát STOP condition REPEAT START Các trường hợp khác không khảo sát C Slave Receiver mode – Slave nhận liệu: Hình mô tả trình Slave nhận liệu, khả xảy giá trị code tương ứng ghi TWSR Chế độ Slave nhận liệu xảy Master thực gọi phát liệu (SLA+W) Như quan sát hình 4, Slave nhận gọi địa trùng với địa Master (Own address mode) Master thực gọi chung Khi đó, bit TWINT Slave set lên Nếu Slave cho phép ngắt TWI (bit TWIE ghi TWCR set từ lúc đầu) ngắt xảy báo có kiện TWI Nếu code ghi TWSR 0x60 gọi địa riêng yêu cầu Slave đáp ứng lại Master ACK, Slave sau bắt đầu nhận liệu từ đường SDA Cứ sau byte liệu Slave phải xác nhận ACK muốn tiếp tục nhận Nếu lý mà Slave tiếp tục nhận phát NOT ACK sau byte liệu Cuộc gọi kết thúc Slave nhận STOP condition, tương ứng code 0xA0 Cuộc gọi chung diễn hoàn toàn tương tự gọi địa riêng code có giá trị khác Khi viết chương trình cho Slave chế độ nhận liệu, cần xét trường hợp gọi địa riêng gọi chung Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 114 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Hình Slave nhận liệu D Slave Transmitter mode – Slave truyền liệu: Đây chế độ cuối chế độ AVR TWI Hình mô tả trình Slave truyền liệu, khả xảy giá trị code tương ứng ghi TWSR Chế độ Slave phát liệu xảy Master muốn nhận liệu từ Slave, Master thực gọi nhận liệu (SLA+R) Như quan sát hình 5, Slave nhận gọi địa trùng với địa Master (Own address mode) Khi đó, bit TWINT Slave set lên Nếu Slave đáp lại ACK xung nhịp thứ 9, code ghi TWSR 0xA8, Slave sau bắt đầu phát liệu lên đường SDA Cứ sau byte liệu, Master xác nhận ACK muốn tiếp tục nhận, code 0xB8 xuất trường hợp Nếu Master không muốn tiếp tục nhận liệu từ Slave, NOT ACK phát code 0xC0 xuất hiện, Slave kết thúc trình phát liệu Một trường hợp Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 115 Thanhtam Ho - www.hocavr.com Copyright © 2010 Cùng học AVR đặc biệt bit TWEA (bit ACK) ghi TWCR Slave reset trước Slave truyền liệu, trường hợp Slave muốn báo hết liệu để truyền, byte byte cuối Sau Master nhận byte này, xác nhận ACK cho Slave (vì thật Master Slave truyền byte cuối), code Slave trường hợp 0xC8 Slave tự hết thúc trình truyền mà không cần chờ Master Khi lập trình cho Slave chế độ phát, cần phải có “thỏa hiệp” với Master trước để tránh code 0xC8 code nhiều ý nghĩa Hình Slave truyền liệu Kỹ thuật dùng cho Master truyền hay nhận gọi hỏi vòng chờ (polling and waiting) Ứng với code nhận từ ghi TWSR (hay ứng với trạng thái gọi) mà Master set bit tương ứng ghi điều khiển TWCR sau chờ bit TWINT set (quá trình kết thúc) để tiếp tục đọc xét code TWSR Quá trình chờ xét lặp lại Master kết thúc gọi STOP condition Tuy nhiên Slave khác, Slave không chủ động thực gọi mà phải chờ yêu cầu từ Master để phục vụ Vì thế, dùng “hỏi vòng” cho Slave tốn thời gian chờ vô ích bỏ lỡ gọi Đối với Slave, ngắt phương pháp bắt gọi tối ưu Trong học này, việc truyền nhận Slave thực trình phục vụ ngắt TWI IV Điều khiển AVR TWI Phần hướng dẫn lập trình điều khiển module TWI AVR WinAVR Các hình 2, 3, cần tham khảo kèm kỹ code phần phát Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 116 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com triển từ hình Để đơn giản, viết hàm giao tiếp TWI file riêng gọi “myTWI.h”, coi thư viện cho TWI dùng trang web Như trình bày, chuẩn I2C cách xếp liệu chip I2C đa dạng Vì thế, muốn giao tiếp với chip I2C bạn thiết phải đọc datasheet chip để hiểu định dạng liệu Các hàm thư viện myTWI phục vụ giao tiếp AVR với nhau, muốn sử dụng chúng giao chip với chip EEPROM 24C1004 chẳng hạn, bạn phải viết thêm hàm mở rộng khác dựa hàm Nội dung file myTWI.h chia thành phần, phần đầu định nghĩa biến, tham số chung, phần gồm hàm truyền/nhận cho Master phần trình phục vụ ngắt TWI cho Slave List trình bày định nghĩa chung file “myTWI.h” List Định nghĩa chung Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 117 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 118 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Phần chủ yếu định nghĩa code trạng thái trình thao tác TWI AVR mà biết khảo sát chế độ hoạt động TWI Thật bạn tham khảo hình 2-5 bảng code datasheet AVR sử dụng code trạng thái trực tiếp lúc lập trình, định nghĩa để tiện theo dõi lúc lập trình Các dòng từ 12 đến 25 định nghĩa code trạng thái cho Slave (cả truyền nhận) Chúng ta định nghĩa số biến toàn cục dùng cho Slave, biến SLAVE_wData[100] mảng 100 phần tử dùng chứa liệu mà Slave truyền, biến Tran_Num số phần tử mảng SLAVE_wData truyền Biến SLAVE_buff[100] liệu nhận từ TWI Rec_Num số liệu sau TWI nhận (dữ liệu SLAVE_buff[Rec_Num]) Biến Device_Addr chứa địa mà Slave AVR lập trình Tương tự, dòng từ 47 đến 57 định nghĩa code trạng thái cho Master mode Trước đó, định nghĩa giá trị tốc độ phát xung giữ nhịp gán cho ghi TWBR (dòng 37, 38) Hai biến TWI_R TWI_W đại diện cho bit R/W truyền gói địa (báo cho Slave biết Master muốn truyền hay nhận liệu) Một số macro dòng 42 đến 45 bao gồm START, STOP condition xóa bit TWINT cách gán giá trị tương ứng cho ghi điều khiển TWI Cuối chương trình void TWI_Init(void) khởi động TWI Quá trình khởi động bao gồm set tốc độ xung giữ nhịp cho Master (dòng 61, 62), gán địa device (dòng 63) xác lập TWI sẵn sàng chế độ Slave Xem lại ghi TWAR, bit địa nằm vị trí cao nên cần phải dịch trái địa vị trí trước gán cho TWAR (Device_Addr [...]... POINTER 8 LDI R17, HIGH(RAMEND) 9 LDI R16, LOW(RAMEND) 10 OUT SPL, R16 11 OUT SPH,R17 12 ; KHOI DONG CAC PORT 13 CLR R16 ; XOA R16, R16=0 14 OUT DDRB, R16 ; DDRB=0, PORTB LA NGO NHAP 15 LDI R16, 0xFF ; SET TAT CA CAC BIT CUA R16 LEN 1 16 OUT PORTB,R16 ;DDRB=0, PORTB =0xFF, KEO LEN CAC CHAN PORTB 17 OUT DDRD, R16 ;DDRD=0xFF, PORTD LA NGO XUAT 18 CLR R25 ;XOA R25, R25 LA THANH GHI DUNG CHUA SO DEM 19 SER R20... 2 010 Cùng học AVR Thanhtam Ho - www.hocavr.com Hình 2 Mô phỏng Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 11 Copyright © 2 010 Cùng học AVR Thanhtam Ho - www.hocavr.com Bài 2 - Cấu Trúc AVR Nội dung 1 Giới thiệu 2 Tổ chức AVR 3 Stack 4 Thanh ghi trạng thái 5 Ví dụ Các bài cần tham khảo trước • • • • Làm quen AVR Assembly cho AVR AVR Studio Mô phỏng với Proteus Download ví dụ I Giới thiệu Bài. .. ngoài 1 – INT1 (xem bảng vector) 9 RJMP INT1_ISR ; Nhảy đến INT1_ISR nếu có ngắt INT1 xảy ra 10 11 ;Tương tự, định vị các vector ngắt khác ở đây……………… 12 ;……………………………………………………………… 13 14 ORG 0x020 ; Định vị chương trình chính 15 BATDAU: Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 33 Copyright © 2 010 Cùng học AVR Thanhtam Ho - www.hocavr.com 16 ; khởi tạo Stack 17 LDI R16, HIGH(RAMEND) 18 LDI R17,... LDI R17, LOW(RAMEND) 19 OUT SPH, R16 OUT SPL, R17 20 21 22 ; set chân PD2 và PD3 như các chân input LDI R16, 0Bxxxx00xx ; x là trạng thái do bạn tự chọn, 0 hoặc 1 23 OUT DDRD, R16 ; PD2 và PD3 là input 24 LDI R16, 0Bxxxx11xx ; x là trạng thái do bạn tự chọn, 0 hoặc 1 25 OUT PORTD, R16 ; mắc điện trở kéo lên cho PD2, PD3 26 27 28 29 ; khởi động ngắt LDI R16, $0B ; $0B=000 010 11, INT1: ngắt cạnh xuống,... ghi R1 chứa giá trị 200, R2 chứa 70, chúng ta thực hiện phép cộng có nhớ: ADC R1, R2, sau phép cộng, kết quả sẽ được lưu lại trong thanh ghi R1, trong khi kết quả thực là 270 mà thanh ghi R1 lại chỉ có khả năng chứa tối đa giá trị 255 (vì có 8 bit) nên trong trường hợp này, giá trị lưu lại trong R1 thực chất chỉ là 14 , đồng thời cờ C được set lên 1 (vì 270 =10 00 011 10, trong đó 8 bit sau 000 011 10 =14 sẽ... TRINH CHINH , BAI 1, VI DU 1, VERSION 2/////////////////////////////// LDI R16, $1 ;LOAD GIA TRI KHOI DONG CHO R16 Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 22 Copyright © 2 010 Cùng học AVR Thanhtam Ho - www.hocavr.com MAIN: OUT PORTB, R16 ; XUAT GIA TRI TRONG R16 RA PORTB RCALL DELAY ; GOI CHUONG TRINH CON DELAY ROL R16 ; XOAY THANH GHI R16 SANG TRAI 1 VI TRI RJMP MAIN ; NEU R16 ≠0, NHAY VE... (ISC) trong đó 2 bit ISC 11: ISC10 dùng cho INT1 và 2 bit ISC 01: ISC00 dùng cho INT0 Hãy nhìn vào bảng tóm tắt bên dưới Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 31 Copyright © 2 010 Cùng học AVR Thanhtam Ho - www.hocavr.com để biết chức năng của các bit trên, đây là bảng “chân trị” của 2 bit ISC 11, ISC10 Bảng chân trị cho các bit ISC 01, ISC00 hoàn toàn tương tự Bảng 2: INT1 Sense Control Thật... những gợi ý trên Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 27 Copyright © 2 010 Cùng học AVR Thanhtam Ho - www.hocavr.com Bài 3 - Ngắt ngoài Nội dung 1 Ngắt trên AVR 2 Ngắt ngoài 3 Ví dụ ngắt ngoài với C Download ví dụ Các bài cần tham khảo trước Cấu trúc AVR WinAVR C cho AVR Mô phỏng với Proteus I Ngắt trên AVR 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í,... chip sẽ có dạng: 000 011 0000 010 010 trong đó 000 01= 1 tức thanh ghi R1 và 00 010 = 2 chỉ thanh ghi R2 Sau phép cộng, kết quả sẽ được lưu vào thanh ghi R1 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 R 31 Thanh ghi R0 là... button (từ khóa button) Hình 9 Ví dụ cho bài 2 Sử dụng AVRStudio tạo 1 project mới với tên gọi avr2 (xem lại cách tạo Project mới trong AVRStudio) Viết lại phần code bên dưới vào vào file avr2 .asm List 1 Ví dụ cấu trúc AVR 1 INCLUDE "M8DEF.INC" 2 CSEG Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 23 Copyright © 2 010 Cùng học AVR Thanhtam Ho - www.hocavr.com 3 ORG 0x0000 4 RJMP BATDAU 5 ORG ... phân)=0B 111 111 11 (nhị phân) Như sau dòng đầu ghi R16 có giá trị 11 111 111 (nhị phân) Dòng thứ 2: “OUT DDRB, R16” nghĩa xuất giá trị từ ghi R16 ghi DDRB, tóm lại sau dòng giá trị DDRB sau: 1 1 1 1 Có... mang số đến vị trí ISC 11 ISC 01 ghi MCUCR Bây đến lượt toán tử OR bitwise “|” (1<