QC

Lập trình AVR Timer

 Lập trình AVR Timer

Basics

   Bộ hẹn giờ rất hữu ích khi bạn muốn đặt một khoảng thời gian nào đó như báo thức của mình. Điều này có thể rất chính xác đến vài micro giây.


  Bộ hẹn giờ / Bộ đếm là một phần thiết yếu của bất kỳ MCU hiện đại nào. Hãy nhớ rằng nó là cùng một đơn vị phần cứng bên trong MCU được sử dụng làm Bộ định thời hoặc Bộ đếm. Bộ hẹn giờ / bộ đếm là một bộ phận độc lập bên trong bộ điều khiển vi mô. Về cơ bản, chúng chạy độc lập với tác vụ mà CPU đang thực hiện. Do đó, chúng rất tiện dụng và chủ yếu được sử dụng cho những việc sau:

Internal Timer: Là bộ hẹn giờ bên trong thiết bị, đánh dấu vào tần số bộ dao động. Tần số dao động có thể được cấp trực tiếp cho bộ đếm thời gian hoặc nó có thể được điều chỉnh trước. Trong chế độ này, nó được sử dụng tạo ra độ trễ chính xác. Hay như máy đếm thời gian chính xác.

External Counter:Trong chế độ này, đơn vị được sử dụng để đếm các sự kiện trên một chân bên ngoài cụ thể trên MCU.

Pulse width Modulation(PWM) Generator:  PWM được sử dụng trong điều khiển tốc độ động cơ và nhiều ứng dụng khác.

Atmega32 có 3 bộ định thời lần lượt là bộ định thời 0, bộ định thời 1 và bộ định thời 2. Hãy để chúng tôi bắt đầu khám phá với bộ đếm thời gian 0.

* Bộ định thời 0 là bộ định thời 8 bit. Về cơ bản nó có nghĩa là nó có thể đếm từ 0 đến 2 ^ 8 255. Hoạt động của bộ định thời 0 là thẳng tiến. Thanh ghi TCNT0 giữ Đếm bộ định thời và nó được tăng lên trên mỗi "tích tắc" của bộ định thời. Nếu bộ hẹn giờ được bật, nó sẽ đánh dấu từ 0 đến 255 và tràn. Nếu nó làm như vậy, một Cờ quá trình hẹn giờ (TOV) được đặt.

Bạn cũng có thể tải giá trị đếm trong TCNT0 và khởi động bộ đếm thời gian từ một số đếm cụ thể. Một tính năng thú vị khác là một giá trị có thể được đặt trong Thanh ghi so sánh đầu ra (OCR0), và bất cứ khi nào TCNT0 đạt đến giá trị đó, cờ Cờ so sánh đầu ra (OCF0) được đặt.

Timer/Counter 0
D7D6D5D4D3D2D1D0

The configuration of the Timer can be set using the TCCR0 register shown below. With this you can basically select two things:

  1. The Frequency of the Clock Source with CS02, CS01, CS00 bits.
  2. The mode of the timer. For the first example we will use it in normal mode where it ticks from zero to the highest value(255)
TCCR0
Timer Counter Control Register 0
D7D6D5D4D3D2D1D0
FOC0WGM00COM01COM00WGM01CS02CS01CS00


D2D1D0Clock Source
CS02CS01CS00Freq
000No Clock (Stopped)
001Clk
010Clk/8
011Clk/64
100Clk/256
101Clk/1024
110Clk/T0-Falling edge
111Clk/T0-Rising Edge


D6D3PWM
WGM00WGM01Mode
00Normal
01CTC (Clear timer on compare match)
10PWM (Phase correct)
11Fast PWM
















Thanh ghi cờ ngắt bộ định thời / bộ đếm (TIFR) giữ hai cờ cơ bản mà chúng ta cần là TOV và OVF. Các bit khác tương ứng với các ngắt bộ định thời, chúng ta sẽ xem xét trong một hướng dẫn khác.

Timer/Counter 0 Flag Register
D7D6D5D4D3D2D1D0
OCF2TOV2ICF1OCF1AOCF1BTOV1OCF0TOV0


Timer 0 Example

Toggle LED connected to PD4 every 100msec using Timer Zero with 1024 pre-scalar in normal mode.

Tạo tràn Max delay Timer 0 là gì? Được rồi, hãy tính toán. Bo mạch nhà phát triển Explore Ultra AVR đi kèm với tinh thể 16MHz trên bo mạch và các bit cầu chì được đặt phù hợp. Nếu chúng ta sử dụng tiền vô hướng cao nhất là 1024, tính toán cho thấy nó có thể tạo ra độ trễ 16 mili giây mỗi khi bộ đếm thời gian bị tràn số 0.

$$Ftimer = CPU Frequency/Prescalar $$ $$Ftimer = 16MHz/1024 = 15.625KHz $$ $$Ttick = 1/ 15.625K = 64 \mu seconds$$ $$Ttotal = 64\mu s X 255 = 16ms$$

Tất nhiên 16ms là không đủ, vì vậy câu hỏi hiển nhiên tiếp theo là:

Bộ hẹn giờ nên tràn bao nhiêu lần để tạo ra độ trễ xấp xỉ 100msec?

$$ OverFlowCount = 100ms/16ms = 6.25 ≈ 6 $$

Bây giờ chúng ta hãy viết một chương trình đơn giản sẽ chuyển đổi một chân cổng (PD4) sau khi bộ định thời 0 tràn 6 lần.

Tải TCNT0 với 0x00

Đặt các bit CS00 và CS02 trong thanh ghi TCCR0. Điều này sẽ bắt đầu thời gian Chúng tôi sẽ tính toán thời gian đánh dấu chỉ trong giây lát. Hoặc ở tốc độ Clk / 1024.

Theo dõi cờ TOV0 trong thanh ghi TIFR0 để kiểm tra xem bộ đếm thời gian có bị quá dòng hay không, giữ một timerOverFlowCount.

Nếu timerOverFlowCount> = 6, chuyển đổi đèn led trên PD4 và đặt lại số

#include<avr/io.h>
#define LED PD4 

int main()
{
	 uint8_t timerOverflowCount=0;	
	 DDRD=0xff;         //configure PORTD as output	
	 TCNT0=0x00;
	 TCCR0 = (1<<CS00) | (1<<CS02);
	 
	while(1)
	{			
		 while ((TIFR & 0x01) == 0); 
		  TCNT0 = 0x00;
		  TIFR=0x01; //clear timer1 overflow flag		              
		 timerOverflowCount++;		 
		 if (timerOverflowCount>=6)
		 {
			 PORTD ^= (0x01 << LED);			 
			 timerOverflowCount=0;
		 } 		 
	}	
}

Timer 1 Basics

Bộ hẹn giờ 1 là 16 bit, có nghĩa là nó có thể đếm từ 0 đến $$ 2 ^ {16} = 65536 $$. Do đó Timer / Counter 1 là 16 bit được đăng ký từ TCNT1H và TCNT1L như hình dưới đây.
Timer/Counter 1
TCNT1HTCNT1L
D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0

Timer 3 also has 2 control registers which allow us to configure it and use it in any mode you wish.

TCCR1A
Timer Counter Control Register 1A
D7D6D5D4D3D2D1D0
COM1A1COM1A0COM1B1COM1B0FOC1AFOC1BWGM11WGM10
TCCR1B
Timer Counter Control Register 1B
D7D6D5D4D3D2D1D0
ICNC1ICES1-WGM13WGM12CS12CS11CS10
D2D1D0Clock Source
CS12CS11CS10Freq
000No Clock (Stopped)
001Clk
010Clk/8
011Clk/64
100Clk/256
101Clk/1024
110Clk/T1-Falling edge
111Clk/T1-Rising Edge

Yes, and indeed we have a Flag register which will tell us the status of Timer 1 as shown below.

TIFR
Timer/Counter 1 Flag Register
D7D6D5D4D3D2D1D0
OCF2TOV2ICF1OCF1AOCF1BTOV1OCF0TOV0

Timer 1 Example

Hãy để chúng tôi lặp lại ví dụ về Timer 0 chuyển đổi PD4 cứ sau 100ms. Lần này vì nó là bộ định thời 16 bit, hãy xem độ trễ tối đa mà nó tạo ra với hệ số vô hướng trước là 1024. ( nhấp nháy led PD4 100MS).

#include<avr/io.h>
#include <util/delay.h>
#define LED PD4
int main()
{
	DDRD |= (1<<LED) ;         //configure led as outpout
	TCCR1B = (1<<CS10) | (1<<CS12); //set the pre-scalar as 1024
	OCR1A = 1562; 	   //100ms delay
	TCNT1 = 0;
	while(1)
	{
		//If flag is set toggle the led	
		while((TIFR & (1<<OCF1A)) == 0);// wait till the timer overflow flag is SET
		PORTD ^= (1<< LED);
		TCNT1 = 0; 
		TIFR |= (1<<OCF1A) ; //clear timer1 overflow flag 
	}	
}

Timer 2 : Tương tự Bộ timer 0.








Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...