atmega-timers
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:Arduino/Avr compatible libraries to control timers
# atmega-timers

`atmega-timers` is an Arduino/Avr compatible library to control timers 0, 1 and 2.

## Description

This library contains several functions to use the timers in different ways.

- One way is using the timers to execute a function on a defined period, indefinitely.

		void timer0(uint8_t prescaler, uint8_t ticks, void (*f)())
		void timer1(uint8_t prescaler, uint16_t ticks, void (*f)())
		void timer2(uint8_t prescaler, uint8_t ticks, void (*f)())

		void timer0_stop()
		void timer1_stop()
		void timer2_stop()

	- `prescaler` are predefined constants in the header file. For example:

			TIMER0_PRESCALER_8
			TIMER0_PRESCALER_64
			...

	- `ticks` are the number of steps the timer will count. Current limits are:

			timer0: 0 - 255
			timer1: 0 - 65535
			timer2: 0 - 255
	
	- `f` is the function to execute after all ticks are consumed. Must be declared `void`
	with no parameters:
		
			void sample() {
				...
			}

	- `timerX_stop()` disables that timer by setting prescaler to "none". Energy saving feature.
	
	- You can disable interrupt definition if you want to use that timer for your own
	purposes. Just comment or delete one of those lines inside `atmega-timers.h` file:
	
			#define ENABLE_TIMER0
			#define ENABLE_TIMER1
			#define ENABLE_TIMER2
		
- Other way is implementing the traditional `delay` routine. The function will `block-wait` until
the count is done.

		void wait0(uint8_t prescaler, uint8_t ticks)
		void wait1(uint8_t prescaler, uint16_t ticks)
		void wait2(uint8_t prescaler, uint8_t ticks)

	- `prescaler` are predefined constants in the header file. For example:

			TIMER0_PRESCALER_8
			TIMER0_PRESCALER_64
			...

	- `ticks` are the number of steps the timer will count. Current limits are:

			timer0: 0 - 255
			timer1: 0 - 65535
			timer2: 0 - 255

## Usage

You need to know your CPU clock frequency before setting the timers.

1. Divide CPU clock by selected prescaler:
	
		16000000 / 64 = 250000 Hz

2. Get timer period:
	
		1 / 250000 = 4 us
	
3. Divide your desired period by timer period, for example 20 milliseconds:
	
		20000 us / 4 us = 5000 ticks

4. Use timer1, as timer0 and timer2 can't support more than 256 ticks:
	
		timer1(TIMER1_PRESCALER_64, 5000U, do_something);

5. Enable global interrupts:
	
		sei();
	
## Sample Code

- Using `wait*` functions:

		#include 
		#include "atmega-timers.h"

		// toggle PORTB status
		void toggle() {
			static uint8_t output = 0xff;

			PORTB = output;
			output = !output;
		}

		void main() {
			// set all pins of PORTB as output
			DDRB = 0xff;
			
			// toggle PORTB every 500ms (using 16Mhz clock)
			while(1) {
				toggle();
				wait1(TIMER1_PRESCALER_1024, 7812U);
			}
		}

- Using `timer*` functions:

		#include 
		#include "atmega-timers.h"

		// toggle PORTB status
		void toggle() {
			static uint8_t output = 0xff;

			PORTB = output;
			output = !output;
		}

		void main() {
			// set all pins of PORTB as output
			DDRB = 0xff;
			
			// toggle PORTB every 500ms (using 16Mhz clock)
			timer1(TIMER1_PRESCALER_1024, 7812U, toggle);
			
			// enable global interrupts
			sei();

			while(1) {
				// your code goes here
			}
		}

Both examples have the same result.

## Running it in Arduino

1. Download the source code by using the Download Button on this page
2. Rename and install the library as: `{arduino_path}/libraries/AtmegaTimers`
3. Open Arduino and go to "Import Library" option. Choose AtmegaTimers from menu.

## Atmel Model Support

It should work with a long range of devices, for example:

- atmega48, 88, 168, 328
- atmega164, 324, 644, 1284
- atmega640, 1280, 1281, 2560, 2561
- atmega325, 645
- ...

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。