×
单片机 > 单片机程序设计 > 详情

编程点滴:AVR timer0 配置模块

发布时间:2020-08-24 发布时间:
|
AVR timer0 的配置模块,给定期望的定时器中断频率,并定义好中断处理函数,模块可自动完成配置工作。

模块由主体程序及头文件组成。



/* *************************************************
* File Name: timer0_set.h
* Function: AVR定时器0配置模块
* Description: 指定期望的定时器中断频率,及中断处理函数,
模块可自动完成配置
* Authon & Date: Joshua Chan, 2012/04/01
* *************************************************/
#ifndef _TIMER0_SET_H
#define _TIMER0_SET_H

#define COUNT_MAX 0xFF

/* 中断处理函数由外部定义 */
extern void timer0_isr(void);

/* 配置8位定时器timer0比较匹配中断使能
* @freq: 定时器中断发生频率
*/
extern void timer0_comp_init(int freq);

extern void timer0_enable(void);

extern void timer0_disable(void);

#endif



/* *************************************************
 * File Name: timer0_set.c
 * Function:  AVR定时器0配置模块
 * Description: 指定期望的定时器中断频率,及中断处理函数,
                模块可自动完成配置
 * Authon & Date: Joshua Chan, 2012/04/01
 * *************************************************/
#include 
#include 
#include 
#include 
#include 
#include "constant.h"
#include "timer0_set.h"
#include "uart_io.h"

/* 寄存器配置与预分频值对应表 */
__flash static int prescaling[][2] = {
    {0, 0},
    {1, 1},
    {2, 8},
    {3, 32},
    {4, 64},
    {5, 128},
    {6, 256},
    {7, 1024},
};

/* 定义timer0比较匹配中断处理函数 */
#pragma vector = TIMER0_COMP_vect
__interrupt void timer0_isr_orig(void)
{
 /* 中断处理函数由外部传入 */
    timer0_isr();
}

/* 根据初步计算值选择预分频值 */
static unsigned char prescale_index(int num)
{
    unsigned char i;

    for (i = 0; i < 8; i++)
        if (num <= prescaling[i][1])
            return i;
    return 0;
}

/* 配置8位定时器timer0比较匹配中断使能
 * @freq: 定时器中断发生频率
 */
void timer0_comp_init(int freq)
{
    unsigned char index;
    int prescale_tmp;
    int ocr0;

    prescale_tmp = (FOSC / freq / COUNT_MAX); /* 初步计算预分频值 */
    index = prescale_index(prescale_tmp);   /* 根据上一步结果选择预分频值 */
    ocr0 = ((FOSC / prescaling[index][1] / freq) - 1); /* 计算比较值 */

 /* 根据上面的运算结果配置寄存器 */
    TCCR0 = (1<
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于arm的指纹识别门禁系统是如何设计的