Hướng dẫn lập trinh AVR hay Vi điều khiển AVR do hãng Atmel sản xuất được gới thiệu lần đầu năm 1996. AVR có rất nhiều dòng khác nhau bao gồm dòng Tiny AVR (như AT tiny 13, AT tiny 22…) có kích thước bộ nhớ nhỏ, ít bộ phận ngoại vi, rồi đến dòng AVR (chẳn hạn AT90S8535, AT90S8515,…) có kích thước bộ nhớ vào loại trung bình và mạnh hơn là dòng Mega (như ATmega32, ATmega128,…) với bộ nhớ có kích thước vài Kbyte đến vài trăm Kb cùng với các bộ ngoại vi đa dạng được tích hợp trên chip, cũng có dòng tích hợp cả bộ LCD trên chip (dòng LCD AVR).[1] Tốc độ của dòng Mega cũng cao hơn so với các dòng khác. Sự khác nhau cơ bản giữa các dòng chính là cấu trúc ngoại vi, còn nhân thì vẫn như nhau. Năm 2008, Atmel lại tiếp tục cho ra đời dòng AVR mới là megaAVR, với những tính năng mạnh mẽ chưa từng có ở các dòng AVR trước đó. Có thể nói XXmegaAVR là dòng MCU 8 bit mạnh mẽ nhất hiện nay.
1 Mục lục Mở đầu 2 1 Giới thiệu vi xử lý AVR 3 2 Một số phần mềm, thiết bị hỗ trợ cho việc lập trình AVR 5 2.1 Phần mềm CodeVision 5 2.2 Phần mềm mô phỏng Proteus 5 2.3 Mạch nạp và phần mềm nạp 6 3 Ứng dụng của vi xử lý ATmega16 7 3.1 Điều khiển I/O (In/Out) 7 3.2 Ngắt ngoài (Interrupt) 8 3.3 Timer/Counter 9 3.4 Điều khiển độ rộng xung – PWM 11 3.4.1 Khái niệm độ rộng xung 11 3.4.2 Tạo PWM bằng ATmega16 11 3.5 Chuyển đổi ADC 14 3.6 Giao tiếp USART 16 3.6.1 Các thuật ngữ được dùng trong giao tiếp USART 16 3.6.2 Giao tiếp USART trên ATmega16 17 4 Các bài tập ví dụ 19 4.1 Lập trình điều khiển thiết bị ngoài (Led, động cơ…) 19 4.1.1 Phân tích mạch điện 19 4.1.2 Xây dựng nguyên lý điều khiển 19 4.1.3 Mô phỏng trên Proteus 21 4.1.4 Lập trình cho vi xử lý 22 4.1.5 Chạy thử trên mạch mô phỏng 29 4.2 Lập trình ngắt ngoài (INT) 31 4.2.1 Phân tích mạch điện 31 4.2.2 Nguyên lý điều khiển và xây dựng mạch mô phỏng trên Proteus 31 4.2.3 Lập trình cho vi xử lý 32 4.3 Lập trình Timer/Counter 35 4.3.1 Phân tích, xây dựng nguyên lý điều khiển và mạch mô phỏng 35 4.3.2 Lập trình cho vi xử lý 35 4.4 Điều khiển độ rộng xung PWM 42 4.4.1 Phân tích mạch điện 42 4.4.2 Nguyên lý điều khiển 42 4.4.3 Xây dựng mạch mô phỏng trên Proteus 43 4.4.4 Lập trình cho vi xử lý 43 4.5 Chuyển đổi ADC 46 4.5.1 Phân tích mạch điện 46 4.5.2 Nguyên lý điều khiển và mạch mô phỏng trên Proteus 47 4.5.3 Lập trình cho vi xử lý 49 4.6 Truyền nhận dữ liệu với máy tính 58 4.6.1 Phân tích mạch điện 58 4.6.2 Nguyên lý điều khiển và mạch mô phỏng 58 4.6.3 Lập trình cho vi xử lý 59 Phụ lục 64 2 Mở đầu Hiện nay các vi xử lý, hay vi điều khiển (MCU – Micro Controller Unit) đang được sử dụng rộng rãi trong nhiều kĩnh vực như: điều khiển, tự động hóa, đo đạc, truyền thông… So với các phương pháp điều khiển, đo đạc truyền thống (cơ khí, điện tử tương tự…), thì sử dụng vi xử lý có các ưu điểm như: nhỏ gọn, ít tốn năng lượng, thời gian đáp ứng nhanh, có thể lập trình được… Vi xử lý họ AVR của hãng ATMEL hiện đang được sử dụng tương đối phổ biến. Vi xử lý họ AVR là các vi xử lý lập trình được. Sau khi được lập trình, vi xử lý sẽ hoạt động theo thuật toán được viết trong lập trình của người dùng. Như vậy người dùng có thể lập trình cho vi điều khiển hoạt động theo ý đồ của mình để giải quyết một các bài toán (điều khiển, đo đạc…). Trong lập trình cho vi điều khiển, thường sử dụng ngôn ngữ lập trình C và có liên quan tới cấu trúc của vi xử lý, để người đọc chưa được học về ngôn ngữ lập trình C hoặc cấu trúc vi xử lý có thể dễ dàng theo dõi, những phần đó sẽ được diễn giải theo cách càng đơn giản càng tốt. Như vậy người đọc có thể theo dõi tài liệu mà không thấy quá khó hiểu, tuy nhiên cũng vì thế nên các kiến thức được trình bày không đầy đủ và chỉ ở mức cơ bản nhất, để người đọc có thể nhanh chóng tự lập trình được một số ứng dụng cơ bản với vi điều khiển AVR. 3 1 Giới thiệu vi xử lý AVR AVR là tên gọi chung các vi xử lý của hãng ATMEL. Hãng ATMEL sản xuất các vi xử lý với các chức năng, khả năng tính toán khác nhau, được đặt tên khác nhau: ATtiny25, ATtiny48…,ATmega8, ATmega16, ATmega128… Các vi xử lý khác nhau thì khác nhau về dung lượng bộ nhớ ROM, RAM, các khối chức năng, số lượng chân… Trong tài liệu này, các hướng dẫn và ví dụ được viết cho vi xử lý ATmega16. Sơ đồ chân, các khối chức năng và cách sử dụng, đặc tính làm việc… của vi lý được nhà sản xuất ghi trong file “datasheet” kèm theo, có thể tìm trên internet. Hình 1: Vi xử lý ATmega16 Các vi xử lý được lập trình bằng ngôn ngữ lập trình (trong tài liệu này sử dụng ngôn ngữ lập trình C) nhờ các phần mềm (AVRStudio, CodeVision…). Các vi xử lý đều có chung một số đặc tính điện khi làm việc như sau: Điện áp làm việc là +5V. Dòng điện qua các chân của vi xử lý nhỏ (cỡ vài chục mA), nên không thể đấu trực tiếp vi điều khiển với các thiết bị công suất lớn (động cơ…). Vi xử lý Atmega 16 có 2 kiểu đóng gói khác nhau, loại đóng gói như hình sau là loại thường, phổ biến nhất, 40 chân theo sơ đồ: Hình 2:Sơ đồ chân của Atmega16 Tất cả các chân của ATmega16 được đánh số thứ tự từ 1 đến 40 như hình vẽ, chiều của vi xử lý được lấy theo đầu lõm hoặc chấm tròn trên vi xử lý. Khi làm việc, các chân của vi điều khiển có hai mức trạng thái là 0 và 1. Trạng thái 0 ứng với mức điện áp 0 V còn trạng thái 1 ứng với mức điện áp +5V. 4 Chức năng của các chân trên vi xử lý ATmega16 như sau: Chân 10 – VCC: Là chân cấp nguồn +5V cho vi xử lý. Chân 11 và 31 – GND: Là hai chân nối với nguồn âm. Khi thiết kế mạch, phải nối cả hai chân 11 và 31 với nguồn âm. Chân 9 – RESET: Bình thường chân 9 ở trạng thái 0, khi cấp điện +5V vào chân RESET, trạng thái của nó từ 0 lên 1, và reset lại toàn bộ hoạt động của vi xử lý, tương đương với việc ngắt nguồn nuôi vi xử lý rồi cấp nguồn lại. Chân 12 – XTAL1 và 13 – XTAL2: Là hai chân nối với thạch anh. Thạch anh là một linh kiện có tác dụng tạo dao động điện, vi xử lý sẽ hoạt động theo các dao động này (ví dụ 4Mhz, 12 Mhz…). Trong một số trường hợp có thể dùng thạch anh được gắn sẵn trong vi xử lý, hai chân XTAL1 và XTAL2 được bỏ trống. Chân 30 – AVCC: Là chân cấp nguồn cho khối chuyển đổi ADC (Analog to Digital Converter). ACD là một chức năng của vi xử lý, cho phép đo điện áp đặt tại chân 33, 34, …, 40 của vi xử lý. Xem thêm mục Chuyển đổi ADC. Chân 32 – AREF: Điện áp tham chiếu. Chân AREF được sử dụng khi cần dùng chức năng ADC của vi điều khiển. Khi cần dùng chức năng ADC, người dùng cần đặt vào chân AREF một điện áp, gọi là điện áp tham chiếu. Xem thêm mục Sử dụng ADC. Các chân 1 … 8: Được nhóm chung thành một “cổng”, gọi là PORT B, từng chân trong Port B được ký hiệu PB0, PB1, …, PB7 ứng với các chân từ 1 đến 8. Các chân này có thể đảm nhiệm các chức năng khác nhau, tùy vào thiết lập của người dùng khi lập trình. Các chân 14 … 21: Được nhóm chung thành một “cổng”, gọi là PORT D, từng chân trong Port D được ký hiệu PD0, PD1, …, PD7 ứng với các chân từ 14 đến 21. Các chân này có thể đảm nhiệm các chức năng khác nhau, tùy vào thiết lập của người dùng khi lập trình. Các chân 22 … 29: Được nhóm chung thành một “cổng”, gọi là PORT C, từng chân trong Port C được ký hiệu PC0, PC1, …, PC7 ứng với các chân từ 22 đến 29. Các chân này có thể đảm nhiệm các chức năng khác nhau, tùy vào thiết lập của người dùng khi lập trình. Các chân 33 … 40: Được nhóm chung thành một “cổng”, gọi là PORT A, từng chân trong Port A được ký hiệu PA0, PA1, …, PA7 ứng với các chân từ 1 đến 8. Các chân này có thể đảm nhiệm các chức năng khác nhau, tùy vào thiết lập của người dùng khi lập trình. Tóm tắt 1 Vi xử lý ATmega16: Là vi xử lý lập trình được. Điện áp làm việc +5V, dòng nhỏ. Có 4 port là Port A, Port B, Port C, Port D. Mỗi port có 8 chân, có thể đảm nhiệm các chức năng khác nhau. 5 2 Một số phần mềm, thiết bị hỗ trợ cho việc lập trình AVR 2.1 Phần mềm CodeVision Phần mềm CodeVision là phần mềm hỗ trợ lập trình cho vi xử lý AVR bằng ngôn ngữ C. Cách sử dụng cụ thể CodeVision được viết trong các ví dụ trong tài liệu. Hình 3: Giao diện CodeVision 2.2 Phần mềm mô phỏng Proteus Hình 4: Giao diện Proteus Proteus là phần mềm mô phỏng mạch điện trên máy tính, có giao diện trực quan, với các linh kiện điện tử được sắp xếp trên màn hình và được nối dây, đặt các thông số để có thể chạy thử mạch điện trên máy tính. Proteus có sẵn rất nhiều các linh kiện điện tử có thể tìm thấy trên thị trường, bao gồm cả các vi xử lý AVR. Các lệnh theo ngôn ngữ C sau khi được viết bằng CodeVision có thể được đưa vào Proteus để chạy vi xử lý AVR tương ứng. Dùng Proteus ta có thể kiểm tra xem lập trình viết trong CodeVision đã đúng hay chưa, như vậy không cần thiết phải thử trên mạch thật, tiết kiệm thời gian, tiền bạc. Tuy nhiên do là mô phỏng trên máy tính, nên một số phần quan trọng trong mạch thực (nguồn điện, sự tương thích về công suất giữa các phần tử…) không được tính đến, dẫn tới mạch điện mô phỏng chỉ có giá trị tham khảo, kiểm tra nguyên lý hoạt động trước khi tiến hành làm mạch thật. 6 2.3 Mạch nạp và phần mềm nạp Sau khi thử trên Proteus, và làm một mạch điện thật bên ngoài có vi xử lý AVR, để cho vi xử lý AVR chạy được những gì đã lập trình, phải nạp chương trình cho nó (gần giống như cài phần mềm cho máy tính), muốn làm điều đó chúng ta cần mạch nạp và phần mềm nạp. Mạch nạp là một mạch điện nối giữa vi xử lý và máy tính, còn phầm mềm nạp được cài trên máy tính để điều khiển mạch nạp. Sau khi nạp, chương trình chúng ta viết bằng AVRStudio sẽ được nhớ trong bộ nhớ của vi xử lý, và vi xử lý sẽ hoạt động theo như chương trình đó. Tóm tắt 2 Lập trình bằng ngôn ngữ C cho vi điều khiển AVR bằng phần mềm CodeVision hoặc AVRStudio. Chạy mô phỏng vi xử lý trên máy tính để kiểm tra bằng phần mềm Proteus. Nạp chương trình cho vi xử lý bằng mạch nạp và phần mềm Khazama. 7 3 Ứng dụng của vi xử lý ATmega16 Các chức năng cơ bản của vi xử lý ATmega16 sẽ được trình bày trong tài liệu gồm có: Chức năng I/O (In/Out). Ngắt ngoài (INT – INTerrupt). Đếm thời gian (Timer/Counter). Điều khiển độ rộng xung (PWM – Pulse Width Module). Chuyển đổi ADC (Analog to Digital Converter). Truyền nhận dữ liệu với máy tính (USART – Universal Synchronous and Asynchronous serial Receiver and Transmitter). Còn các chức năng khác của ATmega16 như SPI, … sẽ không được trình bày ở đây. 3.1 Điều khiển I/O (In/Out) Điều khiển I/O, hay còn gọi là điều khiển Vào/Ra, là một chức năng cơ bản nhất của vi xử lý. Chức năng I/O cho phép người lập trình gán trạng thái 0 hoặc 1 (ứng với mức điện áp 0V và +5V tương ứng) cho một hoặc nhiều chân trong các Port A, B, C hoặc D. Nói cách khác, người lập trình có thể điều khiển điện áp tại một chân bất kỳ trong số 4 port ở mức 0V hoặc +5V. Với chức năng In/Out, vi xử lý có thể điều khiển bật/tắt trực tiếp hoặc gián tiếp các thiết bị ngoài như đèn Led, động cơ điện… Nếu muốn sử dụng một chân nào đó trong số các port A, B, C hoặc D (chẳng hạn như chân PB6), khi lập trình người dùng phải thiết lập chức năng I/O cho chân PB6. Cách thiết lập sẽ được trình bày trong ví dụ Lập trình điều khiển thiết bị ngoài. Tóm tắt 3.1 Dùng chức năng I/O điều khiển trạng thái các chân vi xử lý. 8 3.2 Ngắt ngoài (Interrupt) Ngắt (Interrupt) trong AVR, bao gồm cả ngắt ngoài, là một tín hiệu khẩn cấp gửi đến bộ xử lý, yêu cầu bộ xử lý dừng các công việc hiện tại (A) để thực hiện một việc nào đó (B). Sau khi khi kết thúc B, bộ xử lý sẽ quay về làm tiếp việc A đang dang dở. Tín hiệu khẩn cấp đó có thể đến từ bên trong vi xử lý (từ bộ Timer, USART…) hoặc từ bên ngoài (nhấn một nút bấm…). Ngắt ngoài là loại ngắt duy nhất độc lập với các thiết bị của vi xử lý, vì tín hiệu ngắt đến từ bên ngoài, ví dụ như khi người dùng bấm một nút bấm ở bên ngoài… Trên Atmega16 có ba bộ ngắt ngoài, ứng với các chân 16 (PD2), 17 (PD3) và chân 3 (PB2), ký hiệu lần lượt là INT0, INT1 và INT2. Hình sau thể hiện một tín hiệu ngắt tạo ra bằng một button (nút bấm) tới ngắt INT0. Hình 5: Tín hiệu ngắt Với mạch điện button như hình trên, khi chưa nhấn nút, điện áp đặt trên chân INT0 gần bằng +5V. Khi nhấn nút, chân INT0 được nối với GND nên điện áp chân INT0 lúc này là 0V. Sau khi nhả nút, điện áp chân INT0 lại trở về +5V. Quá trình điện áp chân INT0 giảm nhanh tử gần +5V xuống 0V gọi là Falling Edge (cạnh xuống), còn quá trình điện áp tăng từ 0V lên +5V gọi là Rising Edge (cạnh lên). Người dùng có thể lập trình cho ngắt INT0 hoạt động khi xảy ra Falling Edge, Rising Edge hoặc cả hai. Nếu chọn Falling Edge, ngắt xảy ra khi vừa nhấn xong nút. Nếu chọn Rising Edge, ngắt xảy ra khi nhả xong nút. Nếu chọn cả Falling Edge và Rising Edge, ngắt sẽ xảy ra 2 lần khi vừa nhấn xong nút và sau khỉ nhả xong nút. Cách kích hoạt chức năng ngắt ngoài INT0, INT1 hoặc INT2 và cách lựa chọn cạnh xuống/cạnh lên được hướng dẫn trong ví dụ Lập trình ngắt ngoài. Ngắt ngoài thường dùng để thực hiện giao tiếp giữa người và vi xử lý (thông qua thao tác nhấn nút), hoặc có thể dùng để đếm sự kiện bên ngoài (ví dụ như số sản phẩm đi qua cảm biến)… Tóm tắt 3.2 ATmega16 có 3 ngắt. Ngắt theo cạnh xuống, cạnh lên hoặc cả hai. 9 3.3 Timer/Counter Timer/Counter, hay còn gọi là bộ đếm thời gian, bộ định thời… có chức năng đếm, hoặc định ra một khoảng thời gian và cả đếm sự kiện. Trên một số vi xử lý, timer/counter còn có thêm chức năng điều chỉnh độ rộng xung (PWM). Trên ATmega16 có 3 bộ timer/counter, gọi tắt là T/C0, T/C1,T/C2. Các bộ T/C hoạt động bằng cách đếm số xung dao động của thạch anh nuôi vi xử lý theo tỉ lệ (Prescale) 1:1 hoặc 1:8, Thạch anh, như đã nói ở phần 1, tạo ra dao động để vi xử lý hoạt động. Mỗi linh kiện thạch anh có một tần số dao động nhất định (ví dụ 4 Mhz, 12Mhz…). Mỗi chu kỳ dao động ứng với một khoảng thời gian Δt nhỏ, bằng cách đếm các dao động này, các bộ T/C có thể định ra các khoảng thời gian khác nhau. Ví dụ với thạch anh 1Mhz, thì chu kỳ dao động là: 6 6 1 10 ( ) 1( ) 1.10 t s s Nếu muốn xác định một khoảng thời gian 1 s 1000ms , bộ T/C sẽ phải dùng một biến đếm để đếm đủ 1000 lần. Các biến đếm đó được đặt tên là TCNT0, TCNT1 hoặc TCNT2 tùy theo bộ T/C0, T/C1, T/C2 tương ứng. Các biến đếm TCNT được lưu trong vi xử lý bằng 8 hoặc 16 bit (bit là các ô nhớ trong vi xử lý và chỉ có hai trạng thái 0 hoặc 1, tổ hợp của các bit này sẽ tương ứng với giá trị của biến TCNT theo hệ nhị phân). Thường dùng tên gọi T/C 8 bit hoặc T/C 16 bit chính là nói tới số bit dùng để lưu giá trị của biến TCNT. Vì số bit bị giới hạn, nên khả năng đếm của biến TCNT bị giới hạn (với 8 bit, có thể đếm tối đa từ 0 đến 255), dẫn tới khoảng thời gian xác định được nếu đếm trực tiếp số dao dộng của thạnh anh cũng bị giới hạn. Giải pháp đưa ra là đếm theo tỉ lệ (prescale) đã nói ở trên. Thay vì đếm mỗi dao động một lần, nếu đếm theo tỉ lệ, ví dụ 1:8, thì cứ 8 dao động của thạnh anh, T/C mới đếm một lần, tức là giá trị TCNT tăng thêm 1. Hình 6: Đếm theo tỉ lệ 1:1 và 1:8 Như vậy với ví dụ ở trên, để định được khoảng thời gian 1ms, bộ T/C chỉ cần đếm: 1000 125 8 (lần) Lúc này biến đếm TCNT chỉ phải chạy, ví dụ như từ giá trị ban đầu 131 tới giá trị tối đa 255 (đủ 125 lần đếm). Khi biến TCNT tới giá trị 255, thì sẽ được reset về giá trị ban đầu để đếm tiếp, đồng thời xảy ra ngắt. Do vậy tín hiệu ngắt của T/C là khi biến TCNT tới giá trị cực đại, và ngắt có T/C tạo ra gọi là ngắt trong. 10 Cách chọn tỉ lệ, giá trị ban đầu, giá trị tối đa và các thiết lập liên quan khác của T/C sẽ được trình bày trong ví dụ Lập trình Timer/Counter. Tóm tắt 3.3 Timer/Counter (T/C) tạo ngắt trong theo các quãng thời gian định trước. ATmega16 có 2 T/C 8 bit và 1 T/C 16 bit. Biến đếm TCNT và tỉ lệ Prescale. [...]... mô phỏng ví dụ Điều khiển thiết bị ngoài 4.1.4 Lập trình cho vi xử lý Lập trình chi vi xử lý AVR, cũng như với các vi xử lý khác, nên tiến hành theo các bước như sau, để tạo thuận lợi trong việc xây dựng thuật toán, kiểm tra và sửa lỗi lập trình Xác định yêu cầu làm việc của vi xử lý Xây dựng thuật toán điều khiển Chuẩn bị lập trình và viết chương trình điều khiển Kiểm tra và sửa lỗi a) Xác... đặc điểm làm việc, … Xây dựng nguyên lý điều khiển Vẽ mạch mô phỏng Lập trình cho vi xử lý Kiểm tra lập trình trên mạch mô phỏng, sửa lỗi lập trình hoặc mạch nguyên lý nếu phát hiện lỗi Làm mạch thật Kiểm tra lỗi trên mạch thật và tiến hành sửa hoặc làm lại mạch nếu cần thiết Các bài tập ví dụ trong tài liệu này sẽ hướng dẫn người đọc chạy mô phỏng trên phần mềm Proteus Phần chạy thử trên mạch... chương trình điều khiển Trong ví dụ này có sử dụng biến x để đặc trưng cho chế độ làm việc của mạch Biến là một khái niệm trong lập trình, để chỉ các giá trị số, giá trị logic, chuỗi ký tự, matrận… Biến có thể có giá trị không đổi hoặc thay đổi trong lập trình tùy thuộc vào cách sử dụng 33 Mỗi kiểu biến có đặc trưng khác nhau (để chỉ giá trị số, giá trị logic…), muốn sử dụng biến trong lập trình cần... vi xứ lý khi làm mạch thật Nếu có lỗi cú pháp hoặc các thủ tục khác trong quá trình lập trình, CodeVision sẽ thông báo có lỗi và có ghi chú lỗi để người lập trình có thể tìm ra và sửa lỗi Hình 33: Ví dụ về lỗi thiếu dấu “;” ở câu lệnh Chỉ dẫn báo lỗi tìm thấy sau khi check đến dòng 120, và lỗi thực sự thì nằm ở dòng 119 Quá trình kiểm tra và sửa lỗi cú pháp lặp đi lặp lại tới khi CodeVision thông báo... khiển ngắt INT0 Hình 37: Mạch mô phỏng ví dụ Lập trình sử dụng ngắt 32 4.2.3 Lập trình cho vi xử lý a) Xác định yêu cầu làm việc của vi xử lý Vi xử lý điều khiển bật/tắt đèn Led theo chu kỳ 0,5s và 2s theo tác động bấm nút của người dùng b) Xây dựng thuật toán điều khiển Thuật toán cho ví dụ được thể hiện trên sơ đồ sau: Hình 38: Sơ đồ thuật toán ví dụ Lập trình sử dụng ngắt ngoài Ý tưởng của thuật toán... trong file “bai1.c” Hình 28: Nơi viết các dòng lệnh d) Viết chương trình điều khiển Khi mới tạo ra file bai1.c đã được ghi rất nhiều dòng lệnh, do phần mềm tự tạo ra theo các thiết lập ở phần “CodeWizardAVR” chúng ta vừa làm Tuy nhiên với bài này, chúng ta chỉ cần theo tác ở một vài vị trí trong file “bai1.c” Trình tự tiến hành được trình bày như sau: Include các file header: Viết thêm dòng lệnh #include... Khai báo biến và nơi viết chương trình ngắt Viết chương trình phục vụ ngắt ngoài: Trình phục vụ ngắt ngoài được viết tại vị trí như trong hình trên Cấu trúc chương trình ngắt có thể được hình dung như sau: interrupt [EXT_INT0] void ext_int0_isr(void) { Nếu x=500, gán giá trị x=2000; Nếu x không bằng 500, gán giá trị x=500; } Phép so sánh điều kiện “nếu” ở trên trong lập trình được gọi là phép so sánh... khiển led 7 thanh hiện các số từ tăng từ 0 đến 9 theo thao tác nhấn nút của người dùng 35 4.3 Lập trình Timer/Counter Các bộ T/C trên ATmega16 có thể đảm nhiệm các vai trò khác nhau với cách thức hoạt động và thiết lập khác nhau, nên cấu trúc và cách sử dụng tương đối phức tạp Vì vậy ví dụ cho lập trình T/C được trình bày sau đây là chức năng đơn giản nhất của bộ T/C, chức năng định thời Đồng thời, để... dụ Lập trình ngắt ngoài INT Đề bài: Dùng bộ T/C điều khiển bật/tắt đèn led theo chu kỳ 0,5s hoặc 2s theo tác động của người dùng 4.3.1 Phân tích, xây dựng nguyên lý điều khiển và mạch mô phỏng Do yêu cầu hoạt động của mạch giống với mạch ví dụ Lập trình ngắt ngoài INT, nên các bước phân tích mạch, xây dựng nguyên lý điều khiển và mạch mô phỏng trên Proteus được tiến hành giống như trong ví dụ Lập trình. .. ví dụ Lập trình ngắt ngoài 4.3.2 Lập trình cho vi xử lý a) Xác định yêu cầu làm việc của vi xử lý Vi xử lý điều khiển thay đổi mức trạng thái 0 và 1 của chân PB5 theo chu kỳ 0,5s hoặc 2s theo tác động ngoài Chu kỳ thay đổi được tạo ra nhờ bộ T/C b) Xây dựng thuật toán điều khiển Người đọc sau khi đọc phân giới thiệu chữ năng IN/OUT, ngắt ngoài, T/C và làm ví dụ Lập trình ngắt ngoài sẽ thấy rằng với . ICR1 ngay từ đầu (Time Period cố định), còn giá trị OCR1B được thay đổi khi vi xử lý hoạt động, nhằm tạo ra PWM có Duty Cycle thay đổi. Cách kích hoạt chế độ Fast PWM, chọn các giá trị OCR1B,. lý AVR tương ứng. Dùng Proteus ta có thể kiểm tra xem lập trình viết trong CodeVision đã đúng hay chưa, như vậy không cần thiết phải thử trên mạch thật, tiết kiệm thời gian, tiền bạc. Tuy. ATmega16 như SPI, … sẽ không được trình bày ở đây. 3.1 Điều khiển I/O (In/Out) Điều khiển I/O, hay còn gọi là điều khiển Vào/Ra, là một chức năng cơ bản nhất của vi xử lý. Chức năng I/O cho