1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Bài giảng lập trình AVR

88 527 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 88
Dung lượng 12,91 MB

Nội dung

Bài giảng lập trình avr lưu hành nội bộ HVKTQStài liệu để tham gia minirobotcon .Tài liệu sẽ hướng dẫn cô đọng chi tiết từng nội đung liên quan đên AVR.Tài liệu được tổng hợp từ rất nhiều từ các trang avr trong nước cũng như quốc tế .Đọc hết tài liệu này bạn có thể nắm chắc làm tự làm các dự án liên quan đến AVR đặc biệt liên quan đến lv robot

Trang 1

HỌC VIỆN KỸ THUẬT QUÂN SỰ

BỘ MÔN ROBOT ĐB & CĐT - KHOA HÀNG KHÔNG VŨ TRỤ

THIẾT KẾ VÀ LẬP

TRÌNH MINIROBOT

(Dùng cho học viên đào tạo và cuộc thi miniRobocon)

HÀ NỘI 2015

Trang 2

Nội dung của chương này tìm hiểu các khái niệm về cơ bản về ngắt

và ngắt chương trình Trong Phần 3.1, những điều cơ bản của ngắt AVRđược thảo luận Trong mục 3.2, các ngắt Timer sẽ được đề cập đến Ngắtngoài sẽ được thảo luận trong mục 3.3 Trong phần 3.4, thứ tự ưu tiên ngắtcủa vi điều khiển AVR sẽ được nghiên cứu

3.1 Ngắt của vi điều khiển AVR

Trong mục này, đầu tiên chúng ta xem xét sự khác biệt giữa hỏi vòng

và ngắt, sau đó các ngắt khác nhau của AVR sẽ được tìm hiểu

3.1.1 Ngắt và hỏi vòng

Mỗi vi điều khiển có thể được dùng để điều khiển nhiều thiết bị khácnhau Có hai phương pháp mà các vi điều khiển điều khiển các thiết bị là:ngắt hoặc hỏi vòng Với phương pháp dùng ngắt, bất cứ khi nào một thiết

bị cần được sự điều khiển của vi điều khiển, thiết bị thông báo cho nó bằngcách gửi một tín hiệu ngắt Khi nhận được một tín hiệu ngắt, các vi điềukhiển dừng lại tất cả các công việc nó đang làm, chuyển sang chương trìnhđiều khiển thiết bị gọi ngắt Các chương trình liên kết với các ngắt được gọi

là trình phục vụ ngắt(Interrupt Service routine – ISR hay Interrupt handler).Trong phương pháp hỏi vòng, vi điều khiển liên tục giám sát và kiểm tratrạng thái của một thiết bị nhất định; khi điều kiện trạng thái được đáp ứng,

nó thực hiện các trình phục vụ ngắt Sau đó, nó tiếp tục theo dõi trạng tháicủa các thiết bị tiếp theo cho đến khi mỗi mỗi ngắt đều được thực hiện.Mặc dù phương pháp hỏi vòng có thể theo dõi tình trạng của nhiều thiết bị

và thực hiện trình phục vụ ngắt khi các điều kiện ngắt được đáp ứng, tuynhiên phương pháp này không phải là một phương pháp hiệu quả của viđiều khiển Ưu điểm của ngắt là vi điều khiển có thể phục vụ cho nhiềuthiết bị (không phải tất cả trong cùng một thời điểm); mỗi thiết bị có thểđược vi điều khiển điều khiển dựa trên các thứ tự ưu tiên được gán cho nó

Phương pháp hỏi vòng không thể gán thứ tự ưu tiên vì nó kiểm tra tất

cả các thiết bị (round-robin scheduler) Quan trọng hơn, trong phương phápngắt các vi điều khiển cũng có thể bỏ qua (mask) một yêu cầu điều khiểncủa thiết bị nào đó Đây cũng là điều không thể thực hiện với phương pháphỏi vòng

Lý do quan trọng nhất mà ngắt thích hợp hơn phương pháp hỏi vòng

là do trong phương pháp hỏi vòng, vi điều khiển phải lãng phí quá nhiềuthời gian cho việc kiểm tra yêu cầu điều khiển của các thiết bị chưa cầnđiều khiển Vì vậy, ngắt được sử dụng để tránh quá tải cho vi điều khiển

Trang 3

3.1.2 Trình phục vụ ngắt

Mỗi ngắt được liên kết với một chương trình con, chương trình connày gọi là trình phục vu ngắt (ISR hoặc Interrupt Handler) Khi một ngắtđược gọi, vi điều khiển sẽ thực hiện trình phục vụ ngắt Nói chung, tronghầu hết các bộ vi xử lý, đối với mỗi ngắt có một vị trí cố định trong bộ nhớ

để lưu địa chỉ ISR của nó Tập hợp các địa chỉ của ISR được gọi là bảngvector ngắt, như trong Bảng

ROOM(Hex)

Time/Counterl Compare Match

3.1.3 Các bước để thi hành ngắt(Steps in executing an interrupt)

Sau khi kích hoạt một ngắt, các vi điều khiển thực hiện các bước sau:

Trang 4

1 Kết thúc các chương trình đang thực hiện và lưu địa chỉ của lệnh tiếptheo (program counter) trên stack.

2 Nó nhảy đến địa chỉ cố định trong bộ nhớ gọi là bảng vector ngắt.Bảng vector ngắt sẽ chỉ cho vi điều khiển đến địa chỉ của các trìnhphục vụ ngắt (ISR)

3 Vi điều khiển bắt đầu thực hiện chương trình con phục vụ ngắt chođến khi nó thực hiện lệnh cuối cùng của trình phục vụ ngắt

4 Vi điều khiển quay trở lại nơi mà nó bị ngắt Đầu tiên, nó lấy địa chỉchương trình (Program Counter) từ ngăn xếp stack bằng cách đặt cácbyte đầu của ngăn stack xếp vào PC Sau đó, nó bắt đầu thực hiệnchương trình từ địa chỉ đó

3.1.4 Các ngắt với vi điều khiển AVR(Sources of interrupts in the AVR)

Có rất nhiều ngắt trong AVR, tùy thuộc vào số thiết bị ngoại vi đượckết nối với chip Sau đây là một số ngắt thường sử dụng nhất trong AVR:

• Có ít nhất hai ngắt dành cho mỗi Timer, một là ngắt tràn(overflowinterrupt) và ngắt so sánh(Compare interrupt)

• Ba ngắt được thiết lập dành cho các ngắt phần cứng bên ngoài Cácchân PD2 (PORTD.2), PD3 (PORTD.3), và PB2 (PORTB.2) dànhcho các ngoài ngắt INT0, INT1, và INT2, tương ứng

• Truyền thông USART có ba ngắt, một dành cho nhận tín hiệu và haingắt cho truyền tín hiệu

• Ngắt SPI

• Ngắt ADC (analog-to-digital converter)

3.1.5 Kích hoạt và không kích hoạt ngắt (Enabling and disabling an interrupt)

Sau khi vi điều khển được khởi động hoặc khởi động lại, tất cả cácngắt đều bị vô hiệu hóa (mask), có nghĩa rằng không ngắt nào sẽ được đápứng bởi các vi điều khiển nếu chúng được kích hoạt Các ngắt phải đượccho phép (unmask) bằng phần mềm để cho vi điều khiển có thể đáp ứngđược cho chúng Bit D7 của thanh ghi trạng thái SREG (Status Register) cóthể kích hoạt hoặc vô hiệu hóa toàn bộ ngắt của vi điều khiển Hình … chothấy các bit của thanh ghi SREG Bit I dùng để việc vô hiệu hóa tất cả cácngắt bằng cách thiết lập giá trị của nó bằng 0

Trang 5

Hình : Thanh ghi trạng thái(SREG- Status Register)

Để cho phép một ngắt hoạt động, các bước sau đây phải được thựchiện:

• Bit D7 (I) của thanh ghi SREG phải được thiết lập ở mức cao HIGH

để cho phép các ngắt xảy ra Điều này được thực hiện với lệnh "SEI"(Set Interrupt)

• Nếu I = 1, mỗi ngắt được cho phép bằng cách thiết lập mức cao

HIGH bit cho phép ngắt đó hoạt động Trong AVR, có một số thanhghi I/O chứa các bit cho phép ngắt hoạt động Ví dụ, thanh ghiTIMSK có bit cho phép ngắt Timer0, Timer1, và Timer2 hoạtđộng.Chú ý rằng, khi bit I = 0, không ngắt nào được đáp ứng, ngay

cả khi các bit cho phép hoạt động của nó được thiết lập ở mứcHIGH

OCIE0 Bít điều khiển ngắt tràn Timer0

= 0 không cho phép ngắt tràn Timer0

= 1 cho phép ngắt tràn Timer0

TOIE0 Bít điều khiển ngắt so sánhTimer0

= 0 không cho phép ngắt so sánhTimer0

= 1 cho phép ngắt so sánhTimer0

TICIE1 Bít điều khiển ngắt tràn Timer1

= 0 không cho phép ngắt tràn Timer1

= 1 cho phép ngắt tràn Timer1

OCIE1A Bít điều khiển ngắt so sánh kênh Btimer1

= 0 không cho phép ngắt so sánh kênh B Timer1

= 1 cho phép ngắt so sánh kênh B Timer1

Trang 6

OCIE1B Bít điều khiển ngắt so sánh kênh A Timer1

= 0 không cho phép ngắt so sánh kênh A Timer1

= 1 cho phép ngắt so sánh kênh A Timer1

TOIE1 Bít điều khiển ngắt input capture interrupt Timer1

= 0 không cho phép ngắt input capture interrupt Timer1

= 1 cho phép ngắt input capture interrupt Timer1

OCIE0 Bít điều khiển ngắt tràn Timer2

= 0 không cho phép ngắt tràn Timer2

= 1 cho phép ngắt tràn Timer2

TOIE0 Bít điều khiển ngắt so sánhTimer2

= 0 không cho phép ngắt so sánhTimer2

Thay đổi trạng thái cờ ngắt và ngắt Timer

Như đã biết trong Chương …, cờ tràn của Timer sẽ được thiết lập lênmức cao mỗi khi giá trị của thanh ghi đếm của Timer chuyển từ giá trị cựcđại về 0x00 Trong chương này, chúng tôi cũng cho thấy làm thế nào đểtheo dõi cờ timer với sự hướng dẫn "SBRS R2 0, TOVO" Trong phươngpháp hỏi vòng, chương trình phải chờ cho đến khi cờ TOVO được thiết lập

ở mức cao Vấn đề với phương pháp này là vi điều khiển phải kiểm tra liêntục xem cờ TOVO đã được thiết lập lên mức cao chưa, và không thể làmbất cứ điều gì khác Việc sử dụng ngắt sẽ tránh làm cho điều khiển bị quátải Nếu bit cho phép ngắt tràn Timer0 trong thanh ghi TIMSK được kíchhoạt, cờ TOV0 sẽ được nâng lên bất cứ khi nào các thanh ghi bộ đếmTimer0 chuyển từ 0xFF sang 0x00, và vi điều khiển nhảy đến bảng vectorngắt để thực hiện trình phục vụ ngắt ISR Bằng cách này, các vi điều khiển

có thể làm những việc khác cho đến khi nó được thông báo rằng thanh ghiđếm của Timer0 đã tràn

hoạt

Thanh ghi

Trang 7

Timer1 TOV1 TIFR TOIE1 TIMSK

Hình : Cờ kích hoạt ngắt Timer và các thanh ghi

Ví dụ 10-3: Sử dụng Timer0 và Timer1 viết chương trình :

a PORTA đếm lên mỗi khi Timer1 tràn Timer1 tràn mỗi giây 1 lần

b Mộ nguồn xung được nối với Timer0 và Timer0 được sử dụng để đếm lên số xung Bất cứ khi nào giá trị của thanh ghi bộ đếm Timer0 bằng 200, trạng thái của PORTB.0 sẽ được thay đổi

Đáp án : #include <avr/io.h>

#include <avr/interrupt.h>

int main ()

{

TIMSK = (1<<TOIE0) | (1<<TOIE1) ; //enable Timers 0 & 1 int.

while (1) //wait here

PORTD << PINC;

}

Trang 8

TCNT1H = (-31250) >>8; //the high byte

}

3.3 Lập trình với ngắt ngoài

Số lượng ngắt ngoài tích hợp trong vi điều khiển thay đổi với mỗiloại vi điều khiển AVR khác nhau Vi điều khiển Atmega16 có ba ngoàingắt trên các chân PD2 (PORTD.2), PD3 (PORTD.3), và PB2 (PORTB.2),tương ứng với INTO, INT1, và INT2 Sau khi kích hoạt của các chân, ngắtngoài được kích hoạt, vi điều khiển AVR phải dừng lại mọi công việc mà

nó đang thực hiện và nhảy đến bảng vector để thực hiện trình phục vụ.Trong phần này ba ngắt phần cứng bên ngoài của ATMEGA16 sẽ được đềcập đến

Ngắt ngoài INT0, INT1, INT2

Có ba ngắt ngoài trong ATmega32: INT0, INT1, và INT2 Chúngtương ứng nằm trên chân PD2, PD3, và PB2 Địa chỉ của các ngắt ngoàitrong bảng vector ngắt là $ 2, $ 4, và $ 6 tương ứng với INT0, INT1, vàINT2 Các ngắt phần cứng phải được kích hoạt trước khi nó được sử dụng

Ngắt ngoài INT0 là một ngắt kích hoạt cấp thấp theo mặc định, cónghĩa là, khi một tín hiệu mức thấp được đặt vào chân PD2 (PORTD.2),một yêu cầu phục vụ ngắt sẽ được gửi đến điều khiển, vi điều khiển sẽ phảinhẩy đến địa chỉ $ 0002 trong bảng vector lấy địa chỉ của trình phục vụISR

Ví dụ 10-5: Giả sử chân INT0 được nối với một công tắc mà ở trạng thái

không bấn thì luôn ở mức cao Viết một chương trình thay đổi trạng tháiPORTC.3 mỗi khi trạng thái của chân INT0 ở mức thấp

Đáp án :

Trang 9

GICR = (1<<INT0) ; //enable external interrupt 0

//MCUCR = 0x02;

while (1); //wait here

Nghiên cứu Ví dụ 10-5 để có được cái nhìn rõ nét hơn về ngắt phầncứng bên ngoài Trong chương trình này, vi điều khiển được lặp liên tụctrong vòng lặp while(1) Bất cứ khi nào các công tắc trên INTO (chân PD2)được kích hoạt(nhấn), vi điều khiển ra khỏi vòng lặp và nhảy đến vị trí

$0002 trong bảng vector ngắt, trình phục vụ ngắt ISR cho INT0 sẽ thay đổitrạng thái của chân PC0 mỗi khi được thực hiện Nếu, trong thời điểm viđiều khiển thoát khỏi trình phục vụ ngắt, trạng thái của chân INT0 vẫn còn

ở mức thấp, vi điều khiển lại quay lại thực hiện trình phục vụ ngắt Do đó,không thể khống chế được số lần trình phục vụ ngắt sẽ được vi điều khiểnthực hiện khi bấm công tắc bởi vì khoảng thời gian giữ công tắc lớn hơnnhiều khoảng thời gian mà vi điều khiển thực hiện trình phục vụ ngắt Vìvậy, nếu muốn các ISR được thực hiện một lần, trạng thái của chân INT0

Trang 10

phải được đưa trở lại mức cao trước khi vi điều khiển thoát khỏi trình phục

vụ ngắt, hoặc thực hiện ngắt theo sườn lên hoặc sườn xuống của tín hiệuđặt vào chân ngắt của vi điều khiển

INT0 Bit cho phép ngắt ngoài trên chân INT0 hoạt động

=0: không cho phép ngát ngoài trên chân INT0 hoạt động

=1: cho phép ngát ngoài trên chân INT0 hoạt độngINT1 Bit cho phép ngắt ngoài trên chân INT1 hoạt động

=0: không cho phép ngát ngoài trên chân INT1 hoạt động

=1: cho phép ngát ngoài trên chân INT1 hoạt độngINT2 Bit cho phép ngắt ngoài trên chân INT2 hoạt động

=0: không cho phép ngát ngoài trên chân INT2 hoạt động

=1: cho phép ngát ngoài trên chân INT3 hoạt động

Kích hoạt ngắt theo sườn – theo mức tín hiệu(Edge-triggered vs triggered interrupts)

level-Có hai loại kích hoạt cho các ngắt phần cứng bên ngoài

- kích hoạt theo mức tín hiệu

- kích hoạt theo sườn của tín hiệu

Ngắt ngoài INT2 là ngắt chỉ được kích hoạt theo sườn tín hiệu, trongkhi INT0 và INT1 có thể được kích hoạt theo cả hai phương pháp

ICS01, ICS00(Bit điều khiển ngắt ngoài INT0): các bít này định nghĩa mức hay sườn tín hiệu trên chân INT0 để kích hoạt ngắt

IS

C

01

ISC0 0

Mô tả

yêu cầu thực hiện ngắt

Trang 11

0 1 Bất cứ sự thay đổi nào trên chân

INT0 tạo ra yêu cầu thực hiện ngắt

cao xuống mưc thấp trên chân INT0 tạo ra yêu cầu thực hiện ngắt

thấp lên mức cao trên chân INT0 tạo ra yêu cầu thực hiện ngắt

ICS11, ICS10(Bit điều khiển ngắt ngoài INT1): các bít này định nghĩa mức hay sườn tín hiệu trên chân INT1 để kích hoạt ngắt

IS

C

11

ISC1 0

Mô tả

yêu cầu thực hiện ngắt

INT1 tạo ra yêu cầu thực hiện ngắt

cao xuống mưc thấp trên chân INT1 tạo ra yêu cầu thực hiện ngắt

thấp lên mức cao trên chân INT1 tạo ra yêu cầu thực hiện ngắt

Hình : Thanh ghi điều khiển MCUCR

ICS2(Bit điều khiển ngắt ngoài INT2): bít này định nghĩa mức hay sườn tín hiệu trên chân INT1 để kích hoạt ngắt

IS

Trang 12

0 Có sự thay đổi tín hiệu từ mức cao

xuống mưc thấp trên chân INT2 tạo

ra yêu cầu thực hiện ngắt

lên mức cao trên chân INT2 tạo ra yêu cầu thực hiện ngắt

Ví dụ 10-13: Giả sử chân INT0 được nối với một công tắc mà ở trạng thái

không bấn thì luôn ở mức cao Viết một chương trình thay đổi trạng tháiPORTC.3 chỉ một lần khi bấm công tắc(trạng thái của chân INT0 xuốngmức thấp)

MCUCR = 0x02 ; // Make INT0 falling edge triggered

Trang 13

3.4 Thứ tự ưu tiên của ngắt

Vấn đề tiếp theo sẽ được thảo luận trong phần này là chuyện gì sẽxảy ra khi hai ngắt được kích hoạt cùng một lúc Ngắt nào trong hai ngắtnày sẽ được vi điều khiển thực hiện trước?

Thứ tự ưu tiên ngắt

Nếu hai ngắt được kích hoạt cùng lúc, ngắt có mức ưu tiên cao hơnđược thực hiện trước Thứ tự ưu tiên của từng ngắt liên quan đến địa chỉcủa ngắt đó trong bảng các vector ngắt Các ngắt có địa chỉ thấp hơn, cómức ưu tiên cao hơn Xem bảng Ví dụ, địa chỉ của ngắt ngoài INT0 là 2,trong khi địa chỉ của bên ngoài gián đoạn INT2 là 6; do đó, ngắt ngoàiINT0 có mức ưu tiên cao hơn, và nếu cả hai ngắt được kích hoạt cùng lúc,ngắt ngoài INT0 được phục vụ trước

Ngắt trong ngắt

Điều gì xảy ra nếu vi điều khiển AVR đang thực hiện một trình phục

vụ ngắt ISR thì một ngắt khác được kích hoạt?

Khi vi điều khiển AVR bắt đầu thực hiện một trình phục vụ ngắtISR, nó vô hiệu hóa bit I trong thanh ghi SREG, gây ra tất cả các ngắt bị vôhiệu, và không có ngắt nào khác xảy ra trong khi trình phục vụ ngắt đangthực hiện Khi lệnh RETI được thực hiện, AVR thiết lập bit I lên mức cao,điều này làm cho các ngắt khác có thể để được thực hiện Nếu muốn cóthêm một ngắt (với bất kỳ ưu tiên) được thực hiện trong khi một trình phục

vụ ngắt khác đang được thực, có thể thiết lập bit I bằng cách sử dụng lệnhSEI Tuy nhiên người lập trình cần phải thực hiện điều đó một cách cẩnthận Ví dụ, khi một ngắt ngoài với mức ưu tiên đang được thực hiện, thiếtlập bit I lên mức cao trong khi chân ngắt ngoài vẫn còn hoạt động sẽ gây raviệc trình phục vụ ngắt ISR được kích hoạt trở lại liên tục, gây ra tràn stackvới những hậu quả không thể đoán trước

Thời gian trễ của ngắt(Interrupt latency)

Thời gian từ lúc một ngắt được kích hoạt đến khi CPU bắt đầu thựchiện các nhiệm vụ được gọi là thời gian trễ ngắt Độ trễ này là 4 lần chu kỳmáy Trong thời gian thanh ghi PC được đẩy vào stack và bit I của thanhghi SREG bị xóa dẫn đến việc tất cả các ngắt bị vô hiệu hóa Thời gian trễcủa một ngắt có thể bị ảnh hưởng bởi các loại lệnh mà CPU đang thực hiện

Trang 14

khi ngắt đó được kích hoạt, bởi vì CPU phải kết thúc lệnh mà nó đang thựchiện trước khi nó thực hiện trình phục vụ ngắt

Ví dụ 10-8(C version 10-1): Sử dụng Timer0 tạo xung vuông trên

PORTB.5, cùng lúc đó chyển dữ liệu từ thanh ghi PORTC sang thanh ghiPORTD

Ví dụ 10-9(C version 10-2): Sử dụng ngắt Timer0 và Timer1 tạo xung

vuông trên PORTB.1 và PORTB.7, cùng lúc đó chyển dữ liệu từ thanh ghiPORTC sang thanh ghi PORTD

TCNT0 = -160;

Trang 15

TCNTlH = (-640)>>s 8; //the high byte

TCCR1A = 0x00;

TCCR1B = 0x01;

TIMSK = (1<<TOIE0) | (l<<TOIE1); //enable Timers 0 and 1 int.

PORTD = PINC;

}

{

}

{

TCNT1H = (— 640)>> 8;

}

Ví dụ 10-10(C version 10-3): Sử dụng ngắt Timer0 và Timer1 viết chương

trình thực hiện :

• PORTA đếm lên mỗi khi Timer1 tràn Timer1 tràn mỗi giây 1 lần

• Timer0 được dùng để đếm lên Mỗi khi thanh ghi bộ đếm Timer0 bằng

200, thay đổi trạng thái chân PORTB.6

//no prescaler

Trang 16

TCCR1A = 0x00; //Normal mode

TIMSK = (l<<TOIE0) | (l<<TOIEl); //enable Timers 0 & 1 int.

}

Ví dụ 10-11(C version 10-4): Sử dụng ngắt Timer1 viết chương trình thay

đổi trạng thái chân PORTB.5 mỗi giây một lần, cùng lúc đó chyển dữ liệu

từ thanh ghi PORTC sang thanh ghi PORTD XTALL=8MHz

PORTD = PINC;

}

{

Trang 17

PORTB ^= 0x20; //toggle PORTB.5

)

CHƯƠNG 4 LẬP TRÌNH VỚI TIMER/COUNTER

Trong thực tế, nhiều ứng dụng cần phải đếm sự kiện hoặc tạo ra cáckhoảng trễ thời gian Do đó, trong vi điều khiển AVR có các thanh ghiđược thiết kế để dùng cho mục đích này Xem hình 1 Khi muốn đếm một

sự kiện, nguồn sự kiện bên ngoài được kết nối với chân đồng hồ của thanhghi đếm(counter register) Sau đó, khi một sự kiện xảy ra bên ngoài, giá trị

Trang 18

của thanh ghi đếm được tăng lên một đơn vị Do đó, khi nối nguồn sự kiệnbên ngoài với chân đồng hồ của thanh ghi bộ đếm, giá trị của thanh ghiđếm đại diện cho bao nhiêu lần một sự kiện đã xảy ra Tương tự như thế,khi muốn tạo ra sự chậm trễ thời gian, nguồn dao động được nối với chânđồng hồ của bộ đếm Vì vậy, khi nguồn dao động hoạt động và gửi tín hiệnxung đến bộ đếm, giá trị của thanh ghi bộ đếm được tăng lên sau mỗi xung.Kết quả là, giá trị của thanh ghi bộ đếm đại diện cho bao nhiêu xung đãđược gửi đến bộ đếm Do tốc độ của bộ dao động trong một vi điều khiểnbiết trước, chúng ta có thể tính toán được thời gian của mỗi xung do bộ daođộng gửi đến Căn cứ vào giá trị đếm được trên thanh ghi đếm, khoảng thờigian đã trôi qua có thể được xác định một cách dễ dàng.

Hình 1: Cấu trúc chung của bộ đếm và bộ định thời của vi điều khiển

Vì vậy, một trong những cách để tạo ra một khoảng trễ thời gian làxóa thanh ghi đếm(thiết lập tất cả các bit của thanh ghi đếm về 0) tạithờiđiểm bắt đầu và đợi cho đến giá trị của nó đạt đến một số lượng nhất định

Ví dụ, hãy xem xét một vi điều khiển với một dao động với tần số 1 MHz;

có nghĩa là trong vi điều khiển, giá trị của thanh ghi đếm tăng lên một lầnsau mỗi 6( )

1

10 s (1 micro giây) Vì vậy, nếu muốn có khoảng thời gian trễcủa 100 micro giây, trước tiên xoa thanh ghi bộ đếmvà đợi cho đến khi giátrị của nó bằng 100

Trong vi điều khiển, mỗi bộ đếm được gắn với một cờ Giá trị của cờnày được thiết lập khi bộ đếm bị tràn, có nghĩa là giá trị của bộ đếm đạtđến giá trị lớn nhất nó có thể chứa Cờ có thể được xóa bằng phần mềm

Phương pháp thứ hai để tạo ra một khoảng trễ thời gian là đọc giá trịcủa thanh ghi đềm và đợi cho đến khi tràn bộ đếm, khi này cờ sẽ được thiếtlập Ví dụ, trong một vi điều khiển với một tần số 1 MHz, với thanh ghiđếm 8-bit(có nghĩa giá trị lớn nhất của thanh ghi đếm là

8

16 10

2 − = 1 0xFF = 255 ), nếu chúng ta muốn có một thời gian trễ của 3 micro

Trang 19

giây, chúng ta có thể thiết lập giá trị của thanh ghi đếm với giá trị

16 253 10

FD = và chờ đợi cho đến khi cờ được thiết lập sau 3 xung nhịp của

bộ tạo dao động Sau xung lần đầu tiên, giá trị thanh ghi đếm tăng lên

16 254 10

FE = ; sau xung thứ hai, nó sẽ trở thành FF16 = 25510 ; và sau xung thứ

ba, nó tràn (giá trị của thanh ghi bộ đếm được thiết lập về 00 16 = 00 10 0x00)

Trong vi điều khiển AVR một số các bộ đinh thời là 8-bit và một số

là 16-bit Trong Atmega16, có 3 bộ định thời: Timer0, Timer 1, và Timer2.Timer0 và Timer2 là 8-bit, trong khi Timerl là 16-bit

Mỗi bộ định thời cần một nguồn xung đồng hồ để đánh dấu Cácnguồn xung đồng hồ có thể là nội bộ hay bên ngoài Nếu chúng ta sử dụngcác nguồn xung đồng hồ nội bộ, thì tần số của tinh thể dao động thạch anhđược đưa vào bộ đếm thời gian Vì vậy, nó được sử dụng cho việc tạo cáckhoảng thời gian trễ và thế hệ con-sequently được gọi là một bộ đếm thờigian Bằng cách lựa chọn nguồn xung đồng hồ bên ngoài, xung đồng hồđược nối với một trong các chân của AVR Điều này được gọi là một bộđếm

4.1 Các thanh ghi cơ bản của Timer

a TCNTx : Thanh ghi giá trị bộ đếm

Trong vi điều khiển AVR, mỗi bộ định thời có một thanh ghiTCNTn (timer/counter Register) Điều đó có nghĩa là trong Atmega16 cócác thanh ghi TCNTO, TCNT1 và TCNT2 tương ứng với các bộ định thờiTimer0, Timer1, và Timer 2 Sổ đăng ký TCNTn là một truy cập Sau khithiết lập lại, tất cả các bit của thanh ghi TCNTn bằng 0(hay có thể nói giátrị của thanh ghi TCNTx bằng 0) Giá trị của thanh ghi TCNTn tăng lênmột đơn vị với mỗi xung Giá trị của thanh ghi này có thể được truy cậpbằng cách sử dụng TCNTn.Giá trị của thanh ghi TCNTn có thể được ghihoặc đọc trực tiếp

Mỗi bộ định thời có cờ ngắt TVOn(Timer Overflow Flag) Khi bộđếm tràn, giá trị của cờ TVOn sẽ được bật lên 1

Mỗi bộ định thời có một thanh ghi điều khiển TCCRn(Timer/Counter Control Register : thanh ghi điều khiển bộ định thời) dùng

Trang 20

để thiết lập chế độ hoạt động cho nó Ví dụ, bộ định thời Timer0 có thểđược làm việc như một bộ đếm thời gian hoặc bộ đếm sự kiện bằng cáchghi các giá trị thích hợp vào các bit của thanh ghi TCCR0.

Mỗi bộ định thời có một thanh ghi so sánh OCRn (Output CompareRegister) Giá trị của thanh ghi OCRn sẽ được so sánh với giá trị của thanhghi TCNTn Khi chúng bằng nhau, cờ so sánh OCFn (Output CompareFlag) lá cờ sẽ được thiết lập lên 1

TCCR0(Timer/Counter Control Register)

TCCR0 là mộ thanh ghi 8 bit, được sử dụng để điều khiển hoạt động của Timer0 Các bit của Timer 0 được cho trong hình :

Hình :Thanh ghi TCCR0

CS02-CS00(Timer0 clock source) :Các bit này trong thanh ghi TCCRO

Trang 21

được sử dụng để chọn nguồn đồng hồ Nếu CS02: CS00 = 000, timer0không hoạt động Nếu CS02-CSOO có giá trị giữa 001 và 101, bộ dao độngđược sử dụng như là nguồn đồng hồ và timer0 lúc này là một bộ đếm thờigian Trong trường hợp này, tính giờ thường được sử dụng cho việc tạothời gian trễ.

FOC0 D7 Force compare match: bit này chỉ có thể ghi, được sử

dụng khi tạo xung Nếu bit này bằng 1, xung sẽ được tạo ra khi có một sự kiện so sánh xẩy ra

0 1 CTC(Chế độ xóa bộ đếm khi có sự kiện so sánh)

1 0 Chế độ tạo xung pha chính xác

COM01

:00

D5 D4 Chế độ so sánh:Các bit này điều khiển việc tạo

xung(xem chương…) CS02:0

0 D2 D1 D0 Chọn nguồn xung nhịp cho Timer0

0 0 0 Không chọn nguồn dao động(Timer/Counter không

1 1 0 Nguồn dao động ngoài trên chân T0 Bắt sườn xuống.

1 1 1 Nguồn dao động ngoài trên chân T0 Bắt sườn lên.

Ví dụ 9-1 : Tìm giá trị cần thiết để ghi vào các bit của thanh ghi TCCR0 nếumuốn sử dụng Timer0 ở chế độ bình thường, không sử dụng bộ chia, sửdụng bộ tạo tần số trong của AVR

Đáp án :

Ví dụ 9-2: Tìm tấn số dao động đồng hồ của timer với các bộ dao động thạchanh sau đây Giả thiết không dùng bộ chia tần số

Trang 22

TIFR(Timer/Counter Interrupt Flag Register)

Thanh ghi TIFR chứa cờ của các bộ định thời

Hình :Thanh ghi TIFR

0 Timer0 không tràn

1 Timer0 tràn(giá trị của thanh ghi bộ đếm chuyển tử 0xFF

sang 0x00) OCF0 D1 Bit cờ sự kiện so sánh của Timer0

0 Sự kiện so sánh không xẩy ra

1 Sự kiện so sánh xẩy ra

OCF1B D3 Bit cờ sự kiện so sánh kênh B

OCF1A D4 Bit cờ sự kiện so sánh kênh A

OCF2 D7 Bit cờ sự kiện so sánh của Timer2

TOV0(Timer0 Overflow)

TOV0 được thiết lập khi thanh ghi bộ đếm của Timer0 ngược Khigiá trị thanh ghi bộ đếm TCNT0 chuyển từ $ FF đến 00, cờ TOVO đượcthiết lập lên 1 và nó vẫn được thiết lập cho đến các phần mềm xóa nó

Trang 23

Để xóa cờ này, cần phải viết 1(không phải viết 0) tới nó Thật vậyquy tắc này áp dụng cho tất cả các lá cờ của các chip AVR Trong AVR,khi muốn xóa một bit cờ bất kỳ trong một thanh ghi, cần phải thiết lập bit

đó lên 1 và xóa về 0 đến các bit khác

Ví dụ, xóa cờ TOVO: TIFR = 0b00000001 ;

4.2.1.1 Chế độ hoạt động Normal của Timer0

Trong chế độ này, giá trị của thanh ghi bộ đếm Timer0 tăngmột đơn vị mỗi xung nhịp đồng hồ Nó đếm lên cho đến khi nó đạt đến giátrị tối đa OxFF Khi giá trị của thanh ghi này chuyển từ 0xFF sang 0x00, nóthiết lập mức cao cho cờ TOV0 (Timer tràn)

Các bước để lập trình Timer0 ở chế độ bình thường

Để tạo ra một khoangt thời gian trễ sử dụng Timer0 ở chế độ bìnhthường, các bước thực hiện như sau :

- Thiết lập giá trị đếm ban đầu cho thanh ghi TCNT0

- Ghi giá trị vào các bit của thanh ghi điều khiển TCCR0, chothấy chế độ nào (8-bit hoặc 16-bit) được sử dụng và tùy chọnprescaler Khi bạn chọn nguồn đồng hồ, timer / counter bắtđầu đếm, và mỗi tick gây ra các nội dung của timer / counter

TCCR0 = 0x00 ; // timer stopped, mode = Normal

- Xóa cờ TOV0 cho các vòng tiếp theo

- Quay trở lại bước 1 để tải TCNT0 lại

Ví dụ 9-3: Trong chương trình sau đây, xung vuông 50% được tạo ra trên

chân PORTB.5 Timer0 được sử dụng để tạo thời gian trễ Phân tích

Trang 24

while ((TIFR&0x1)==0); //wait for TF0 to roll over

TCCR0 = 0;

}

Lời giải :

• 0xF2 được gán vào thanh ghi TCNT0

• TCCR0 được gán giá trị, timer0 bắt đầu làm việc

• Giá trị thanh ghi đếm của Timer 0 tăng lên sau mỗi xung nhịp củađồng hồ, nó đạt được các giá trị 0xF3, 0xF4,…, và cuối cùng đạtđược giá trị 0xFF Sau một xung nhịp nữa của đồng hồ, giá trị củathanh ghi này được thiết lập về 0x00, cờ tràn TOV0 được bật lên

• Timer0 dừng hoạt động

• Cờ tràn TOV0 được xóa

Ví dụ 9-4: Trong Ví dụ 9-3, tính khoảng thời gian giữ chậm tạo ra bởi Timer.

Với XTAL= 8MHz

Lời giải :

Trang 25

Ví dụ 9-5: không dùng được vì tính toán liên quan đến thời gian thựchiện câu lệnh trong assembly

Ví dụ 9-6: Tìm khoảng thời gian trễ được tạo ra bởi Timer0 trong đoạn code sau.

while ((TIFR & 0x1)==0); //wait for TF0 to roll over

TCCR0 = 0;

}

Lời giải : Bởi vì TCNT0 0 3 = x E= 62 , 256 62 194 10 − = Điều này có nghĩa là

Timer0 sẽ đếm từ 0x3F đến 0xFF Quá trình giá trị của thanh ghi bộ đếm Timer0

quay trở về 0 mất 194 chu kỳ đồng hồ, trong đó mỗi chu kỳ đồng hồ là 0.125 sµ

Do đó thời gian giữ chậm trong chương trình trên là : 194 0.125 × µs=24.25µs

Trang 26

Ví dụ 9-7: Viết chương trình tạo ra xung vuông với chu kỳ 12.5 sµ trên PORTB.3 Tần

µ

µ =10

while ((TIFR&0xl)==0); //wait for TF0 to roll over

TCCR0 = 0;

}

Ví dụ 9-8: (sửa lại chương trình 9-7)Viết chương trình tạo ra xung vuông với tấn số

16kHz trên PORTB.3 Tần số thạch anh là XTAL= 8MHz

Lời giải :

62.516

Trang 27

s s

}

void T0Delay ( )

{

while ((TIFR&0xl)==0); //wait for TF0 to roll over

TCCR0 = 0;

}

4.2.1.2 Bộ chia tần số và việc tạo khoảng thời gian trễ lớn

Như đã biết trong các ví dụ trên, độ lớn của khoảng thời gian giữchậm phụ thuộc vào hai yếu tố :

- Tần số bộ dao động

- Thanh ghi đếm 8 bit của Timer

Cả hai yếu tố này nằm ngoài sự kiểm soát của người lập trình Nhưtrong ví dụ … khoảng thời gian giữ chậm lớn nhất có thể đạt được là khicho TCNT0 0= Nếu khoảng thời gian giữ chậm đó vẫn chưa đủ lớn, có thể

sử dụng bộ chia tần số( prescaler) để tăng khoảng thời gian giữ chậm bằngcách tăng khoảng thời gian làm cho giá trị thanh ghi bộ đếm của Timertăng lên một đơn vị

Trang 28

Việc sử dụng bộ chia tần số cho phép chia Các tùy chọn prescalercủa TCCRO cho phép chúng ta phân chia đồng hồ hướng dẫn bởi một yếu

tố của 8-1024 như đã được thể hiện trong hình 9-5 Các prescaler củaTimer / Counter 0 được thể hiện trong hình 9-9

Hình : Bộ chia tần số (Prescaler) của Timer

Ví dụ 9-9: Sửa lại giá trị của thanh ghi TCNT0 trong ví dụ trên để thu được khoảng

thời gian giữ chậm lớn nhất theo mili giây

Lời giải : Khi thiết lập TCNT0 0= , có nghĩa là thanh ghi bộ đếm của Timer sẽ đếm

từ 0x00 đến 0xFF, sau đó lại được thiết lập về 0x00 Như vậy, một vòng đếm của thanh ghi bộ đếm mất tối đa 256 xung nhịp Vì vậy, giá trị giữ chậm lớn nhất có thể đạt được là (256 0 − ×) 0.125 µs= 32 µs= 0.032ms.

Ví dụ 9-11: Tìm giá trị cho thanh ghi nếu muốn Timer0 làm việc ở chế độ Normal, bộ

chia tần số 64 lần, sử dụng nguồn dao động ngoài

Trang 29

PORTB = 0xAA; //repeat forever T0Delay( );

}

void T0Delay ( )

{

while ((TIFR&0xl)==0); //wait for TF0 to roll over

- Tìm giá trị tần số đồng hồ của Timer0 nếu sử dụng bộ chia tần số 1024 lần

- Tính khoảng thời gian giữ chậm lớn nhất khi sử dụng bộ chia tần số 1024 lần

- Để thu được khoảng thời gian giữ chậm lớn nhất, TCNT0 0 00= x Khi này, giá

trị của thanh ghi đếm sẽ tăng từ 0x00 đến 0xFF, sau đó quay lại về 0 và bật cờ TOV0 Như vậy, một lần tràn của Timer0 tương ứng với 256 lần giá trị của thanh ghi đếm Khoảng thời gian giữ chậm lớn nhất là :

4.2.1.3 Clear Timer0 on compare match (CTC) lập trình chế độ

Cũng giống như chế độ bình thường, ở chế độ CTC, giá trị của thanhghi bộ đếm cũng tăng một đơn vị mỗi chu kỳ đồng hồ Tuy nhiên giá trị củathanh ghi TCNTO chỉ tăng cho đến khi giá trị của nó bằng giá trị được lưutrong thanh ghi OCRO (sự kiện so sánh xảy ra); sau đó, thanh ghi bộ đếm

bị xóa và cờ OCFO sẽ được thiết lập lên mức cao trong chu kỳ xung nhịpđồng hồ tiếp theo Các bit cờ OCFO nằm trong thanh ghi TIFR

Trang 30

Hình : Hoạt động của Timer0 trong chế độ CTC

Ví dụ 9.17: Trong chương trình sau, một xung vuông 50% được tạo ra trên PORTB.3.

Timer0 được sử dụng để tạo ra khoảng thời gian giữ chậm Phân tích chương trình.

while ((TIFR&0x2)==0); //wait for OCF0=1

TCCR0 = 0;

}

Lời giải :

- 9 được nạp vào thanh ghi OCR0

- TCCR0 được thiết lập, Timer 0 bắt đầu làm việc

- Timer0 đếm lên từ 0x00,0x01 đến 0x09 Sau một chu kỳ xung nhịp đồng hồ nữa,

sự kiện so sánh xẩy ra, cờ OCF0=1.

- Giá trị của thanh ghi TCCR0=0, Timer0 dừng làm việc.

- Cờ OCF0 bị xóa đi.

Trang 31

Ví dụ 9.18: Tìm khoảng thời gian được tạo ra bởi Timer0 trong ví dụ trên.

Lời giải : OCR0 được nạp với 9 và TCNT0 được xóa Như vậy, sau mỗi 9 xung nhịp

đồng hồ giá trị của thanh ghi TCNT0 bằng giá trị của thanh ghi OCR0 Trong xung nhịp đồng hồ tiếp theo, cờ OCF0 sẽ được thiết lập và quá trình xóa thanh ghi bộ đếm xảy ra Điều đó có nghĩa giá trị của thanh ghi TCNT0 được xóa sau 9 1 10+ =

chu kỳ đồng hồ Bởi vì XTAL = 8 MHz, bộ đếm đếm lên mỗi 0.125 sµ Do đó, khoảng

thời gian giữ chậm được tạo ra là 10 0.125 × µs=1.25µs.

Ví dụ 9.19: Tìm thời gian trễ được tạo ra bởi Timer0 trong đoạn chương trình sau.

8

XTAL= MHz.

#include <avr/io.h>

Trang 32

int main()

{

PORTB=0x00;

while (1) //repeat forever

{

while((TIFR & (1<<OCF0))==0);

Ví dụ 9.20: Viết chương trình tạo ra thời gian trễ 25.6ms Sử dụng Timer0, CTC

mode, bộ chia tần số 1024 lần XTAL=8MHz.

Lời giải :

Bộ chia tần số 1024 lần có nghĩa là mỗi xung nhịp đồng hồ của Timer là

1024 0.125× s=128µs Vì thế để tạo 25.6ms, cần phải đợi

25.6

200128

ms s

xung nhịp đồng hồ của Timer trôi qua.

Vì thế OCRO=200 1 199− =

#include <avr/io.h>

Trang 33

void T0Delay ( );

int main()

{

while (1) //repeat forever

{

while ((TIFR&0x2)==0); //wait for OCF0=1

Timer Clock

Timer period

Timer value

N o n e

8MHz 1

0.125

8MHz = µ1s

80000.125

ms s

18

µ =

Trang 34

6 4

8

12564

µ =2

5 6

8

31.25256

MHz

kHz

3231.25kHz = 1µs 31.25

32

ms s

1 0 2 4

8

7.81251024

MHz

kHz

1287.8125kHz = 1 µs 7.8125

128

ms s

µ =

Từ bảng trên suy ra chỉ có thể sử dụng bộ chia tần số 64, 256, hoặc 1024 lần.

Chọn bộ chia tần số 64 lần, có nghĩa cần phải đợi 125 xung nhịp đồng hồ của Timer

để tạo ra thời gian trễ 1ms.

#include <avr/io.h>

void T0Delay ( );

int main()

{

while (1) //repeat forever

{

while ((TIFR&0x2)==0); //wait for OCF0=1

TCCR0 = 0x00;

}

Ví dụ 9.22: Trong chương trình phía dưới, sau khoảng thời gian bao lâu thì trạng thái

chân PB3 trở nên 1 XTAL=8MHz

#include <avr/io.h>

int main()

Trang 35

//while((TIFR & (1<<OCF0))==0);

while((TIFR & 0x02)==0);

//TIFR |= 1<<OCF0; //Clear OCF0 flag

251 0.125× µs=31.375µs Các sự kiện so sánh tiếp theo xảy ra sau mỗi 90 xung

nhịp đồng hồ của Timer, có nghĩa là sau90 0.125× µs =11.75µs.

Chú ý : (Chương trình này kết quả mô phỏng không đúng, thời gian tạo ra trên chương trình mô phỏng lớn hơn 12us Có lẽ do tốc độ xử lý của vdk không đủ).

4.2.1.4 Phương pháp tìm giá trị cần khởi tạo cho thanh ghi đếm của Timer0

Giả sử khoảng thời gian cần giữ châm đã biết, câu hỏi là làm thế nào

để tìm thấy những giá trị cần thiết cho thanh ghi TCNTO Để tính toán các

Trang 36

giá trị được nạp vào thanh ghi TCNTO, chúng ta có thể sử dụng các bướcsau đây:

1 Tính thời gian của đồng hồ đếm thời gian bằng cách sử dụng côngthức sau: T clock =1/F Timer,

Trang 37

T0Delay( ); //delay size unknown

while ((TIFR&0xl)==0); //wait for TF0 to roll over

Hình 9-14: Các thanh ghi của Timer1

Timerl cũng có hai thanh ghi điều khiển tên TCCR1A(Timer/Counter 1 Control register) và TCCR1B Cờ tràn TOV1 củaTimer1được thiết lập lên mức cao khi sự kiện tràn xảy ra Timer1 cũng có

bộ chia tần số(prescaler) với các lựa chọn 1: 1, 1: 8, 1:64,1: 256, 1: 1024

Có hai thanh ghi so sánh OCR trong Timer1, đó là OCR1A và OCR1B, vàcũng só hai lá cờ riêng biệt cho mỗi thanh ghi so sánh đó Bất cứ khi nàoTCNT1 bằng OCR1A, cờ OCF1A sẽ được thiết lập lên 1 trong chu kỳ tiếp

Trang 38

theo của xung nhịp đồng hồ Tương tự như thế, Bất cứ khi nào TCNT1bằng OCR1B, cờ OCF1B sẽ được thiết lập lên 1 trong chu kỳ tiếp theo củaxung nhịp đồng hồ Các thanh ghi so sánh OCR cũng là các thanh ghi 16bit, chúng cũng được ghép lại bởi 2 thanh thi 8 bit.

4.2.2.1 Chế độ Normal của Timer1(WGM13 :10=0000)

4.2.2.2 Chế độ CTC của Timer1

Ví dụ 9.39: Viết chương trình thay đổi trạng thái tất cả các bit của PORTB Sử dụng

Timer0, chế độ Normal, không sử dụng bộ chia tần số

while ( (TIFR&0xl)==0>; //wait for TF0 to roll over TCCRO = 0;

}

Ví dụ 9.40: Viết chương trình thay đổi trạng thái của bit PORTB.4 Sử dụng

Timer0, chế độ Normal, sử dụng bộ chia tần số N=8 XTAL=8MHz

Trang 39

Lời giải :

18

while ((TIFR& (l<<TOV0) ) ==0) ; //wait for TOVO to roll over

}

Ví dụ 9.41: Viết chương trình thay đổi trạng thái của bit PORTB.4 sau mỗi 2ms Sử

dụng Timer1, chế độ Normal, không sử dụng bộ chia tần số XTAL=8MHz

Lời giải :

18

Trang 40

while ((TIFR & (0x01<<TOV1)) ==0) ; //wait for TOV1 to roll over TCCRlB = 0;

}

Ví dụ 9.42: Viết chương trình thay đổi trạng thái của bit PORTB.4 sau mỗi 1s Sử

dụng Timer1, chế độ Normal, sử dụng bộ chia tần số 1 :256 XTAL=8MHz

PORTB = PORTB ^ (1<<PB4) ; //toggle PB4

Ngày đăng: 21/05/2016, 19:05

HÌNH ẢNH LIÊN QUAN

Hình : Thanh ghi trạng thái(SREG- Status Register) - Bài giảng lập trình AVR
nh Thanh ghi trạng thái(SREG- Status Register) (Trang 5)
Hình : Thanh ghi điều khiển ngắt timer TIMSK(Timer Interrupt Mask ) - Bài giảng lập trình AVR
nh Thanh ghi điều khiển ngắt timer TIMSK(Timer Interrupt Mask ) (Trang 6)
Hình : Cờ kích hoạt ngắt Timer và các thanh ghi - Bài giảng lập trình AVR
nh Cờ kích hoạt ngắt Timer và các thanh ghi (Trang 7)
Hình : Thanh ghi điều khiển MCUCR - Bài giảng lập trình AVR
nh Thanh ghi điều khiển MCUCR (Trang 11)
Hình : Cấu tạo của Timer0 - Bài giảng lập trình AVR
nh Cấu tạo của Timer0 (Trang 20)
Hình :Thanh ghi TIFR - Bài giảng lập trình AVR
nh Thanh ghi TIFR (Trang 22)
Hình : Bộ chia tần số (Prescaler) của Timer - Bài giảng lập trình AVR
nh Bộ chia tần số (Prescaler) của Timer (Trang 28)
Hình : Hoạt động của Timer0 trong chế độ CTC - Bài giảng lập trình AVR
nh Hoạt động của Timer0 trong chế độ CTC (Trang 30)
Hình 9-14: Các thanh ghi của Timer1 - Bài giảng lập trình AVR
Hình 9 14: Các thanh ghi của Timer1 (Trang 37)
Hình : Cấu tạo của Timer2 - Bài giảng lập trình AVR
nh Cấu tạo của Timer2 (Trang 41)
Hình : Sơ đồ tạo xung - Bài giảng lập trình AVR
nh Sơ đồ tạo xung (Trang 46)
Hình : Chế độ tạo xung nhanh của Timer0 - Bài giảng lập trình AVR
nh Chế độ tạo xung nhanh của Timer0 (Trang 54)
Hình : Bộ nhớ đệm của OCR0 trong các chế độ tạo xung - Bài giảng lập trình AVR
nh Bộ nhớ đệm của OCR0 trong các chế độ tạo xung (Trang 60)
Hình : Non-inverted Phase correct PWM mode - Bài giảng lập trình AVR
nh Non-inverted Phase correct PWM mode (Trang 61)
Hình : Phase correct PWM - Bài giảng lập trình AVR
nh Phase correct PWM (Trang 62)

TỪ KHÓA LIÊN QUAN

w