搜索
bottom↓
回复: 0

定时器产生的问题

[复制链接]

出0入0汤圆

发表于 2014-6-23 15:01:01 | 显示全部楼层 |阅读模式
AVR MEGA8 单片机                定时器0产生135KHZ的中断
这时用定时器2产生5MS的中断,为何定时器2的中断进不去呢


但是如果把定时器0的频率放底一点,这时定时器2的中断就会正常功能了呢?


有没有人能知道如何解决这个问题

放上代码
/******************************************************************
* 功能:   ADC&PWM
* CPU型号: ATMEGA8A
* 晶振:    12MHz
* 说明:   
* 作    者:
* 电    话:
* Q     Q:
* 日    期:2
******************************************************************/

#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>

#define uchar       unsigned char
#define uint         unsigned int

unsigned char CountNum;  //用来记录中断,第一次中断是2MS
unsigned char Count;     //用来做10MS


unsigned char NUM=255;   //最初为135KHZ频率数值

unsigned int ad0=0;  //全局变量 用来保存通道ADC0的数值
unsigned int ad1=0;  //全局变量 用来保存通道ADC1的数值
unsigned int ad2=0;  //全局变量 用来保存通道ADC2的数值
unsigned int ad3=0;  //全局变量 用来保存通道ADC2的数值

//初始化看门狗
//开
void WDT_init(void)
{
  WDR();
  WDTCR=0x0f;//2s
}

//禁止看门狗
void WDT_OFF(void)
{
    WDTCR|=(1<<WDCE)|(1<<WDE);//2s
    WDTCR=0x00;//禁止
}

/*
//初始化TC0 1S
void init_timer0()
{
                 TCCR0=0x00;//TCCR0工作于定时方式,先停止TC0
                 TCNT0=0x06;//计数器初始值
                 TCCR0=(1<<CS01)|(1<<CS00);//打开TC0用64分频
                 TIMSK|=(1<<TOIE0);//开放TOIE0中断
}
*/

//初始化TC0
void init_timer0(uchar fp,uchar num)
{
                 //TCCR0=0x00;//TCCR0工作于定时方式,先停止TC0
                 //TCNT0=255; //135KHZ 255
                 NUM=num;
                 TCNT0=num;   //55KHZ  203
                 TCCR0=fp;//打开TC0不分频
                 //TCCR0=(1<<CS01)|(1<<CS00);//打开TC0用64分频
                 TIMSK|=(1<<TOIE0);//开放TOIE0中断
}


//TC0中断函数  2MS定时
#pragma interrupt_handler timer0_fun:iv_TIMER0_OVF
void timer0_fun()
{
     //TCNT0=0x06;            //重装初值
     //TCNT0=255;            //重装初值
     /*
     if (++CountNum==5)
     {
         CountNum=0;
         Count++;
     }
     if (Count==100)       //Count=100就是一秒到时了
     {
         Count=0;
         //PORTB=~PINB;
     }
     */
    PORTD^=0x03;   // PB7输出135KHZ的 50%占空比
    //PORTD^=0x02;   // PB7输出135KHZ的 50%占空比   
    TCNT0=NUM;     //重装初值   
}

//ADC函数
//chanl:  通道口设置 此处将用到AD0-AD3
uint mega8_ad(uchar chanl)
{
     uint addata;
               
                 ACSR=0x80;            //关掉模拟比较器的电源(禁用模拟比较器)
                 ADMUX=0;              //选用外部参考电压 左对齐
                 ADMUX|=chanl;         //设置通道口 此处的chanl值为0-3 即ADC0-ADC3
                 ADCSRA=0X80;          //选全能ADC,但此时还没有开始转换
                 ADCSRA|=BIT(ADSC);    //启动第一次AD转换
                 while(!(ADCSRA&(BIT(ADIF)))); //一直到转换完成
                 
                 addata=ADCL;   //读取低8位
                 addata=addata+ADCH*256;    // 10位结果保存到addata
                 return addata;
}   

//PWM 配置函数
void pwm_w_set(uint pwm_w)     //设定PWM脉冲宽度 占空比调整
{
     OCR1B=pwm_w;  
}


//main函数

void main (void)
{
                DDRB =0XFF;  //pwm
                PORTB=0XFF;
               
                DDRD =0XFF;  //pwm
                PORTD=0X02;
               
                DDRC =0X00;  // PC0-PC3 AD0-AD3
                PORTC=0X00;
               
          TCCR1A=0X63; //配置为快速PWM
          TCCR1B=0X19; //无预分频
       
          OCR1A=399;  //(8000000/20K)-1=399
          pwm_w_set(199); //
               
                //init_timer0(5,191); // 60HZ
                init_timer0(1,167); // 135kHZ
               
                SEI();           //enable interrupts
                 
                WDT_OFF();     //禁止看门狗
                 
                while(1)
                {
                    ad0=mega8_ad(0);   //读数
                    ad1=mega8_ad(1);   //读数
                    ad2=mega8_ad(2);   //读数
                    ad3=mega8_ad(3);   //读数
                    
                    if((ad0>=409)&&(ad1>=613)&&(ad2>=818)&&(ad3>=920))  //5V参考电压 613约为3V
                    {
                        PORTB&=0xfd;  // PB1=0  灯亮
                           }
                           else
                           {
                               PORTB|=0x02;  // PB1=1  灯灭
                           }
                }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 21:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表