打印
[AVR单片机]

at90can128 定时器中断问题

[复制链接]
1570|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
paishen|  楼主 | 2013-12-19 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用winavr写了一个很简单的at90can128单片机定时器中断程序,发现无法进入中断,寄存器都是按照at90can128的数据手册设置的,不知什么原因。代码如下,请高手指点。
#include<avr/io.h>
#include<util/delay.h>
#include<string.h>
#include<avr/signal.h>
#include<stdio.h>
#include<avr/interrupt.h>
#define uchar unsigned char#define uint unsigned int
#define ZHISHIDENG PD7      //指示灯 引脚
void t1_init()
{ TCCR1B|=_BV(2);
TCNT1H=0X57;
TCNT1L=0X40;
TIMSK1|=_BV(0);
// TCCR1C=0x00;
// SREG|=_BV(7);
// sei();
}
void main()
{ void t1_init();
DDRD|=_BV(PD7);
PORTD&=~(_BV(PD7));
sei();
while(1);
}
SIGNAL( TIMER1_OVF_vect )
{ TCNT1H=0X57;
TCNT1L=0X40;
DDRD|=_BV(PD7);
PORTD|=(_BV(PD7));
}

相关帖子

沙发
huangxz| | 2013-12-19 18:45 | 只看该作者
void t1_init();
不要在函数里面再定义了。
直接引用就可以了。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 赞一个!
板凳
qin552011373| | 2013-12-20 08:49 | 只看该作者
初始化是错误的,而且现在winavr推荐使用ISR()来替代SIGNAL(),具体可以看看技术手册

使用特权

评论回复
地板
paishen|  楼主 | 2013-12-20 14:14 | 只看该作者
首先感谢2位高手的帮助

本人avr新手,了解不很多
请问
“void t1_init();
不要在函数里面再定义了。
直接引用就可以了。”

如何引用定时器初始化函数啊,在winavr库函数中未找到相关函数

使用特权

评论回复
5
paishen|  楼主 | 2013-12-20 14:14 | 只看该作者
首先感谢2位高手的帮助

本人avr新手,了解不很多
请问
“void t1_init();
不要在函数里面再定义了。
直接引用就可以了。”

如何引用定时器初始化函数啊,在winavr库函数中未找到相关函数

使用特权

评论回复
6
cyanitefire| | 2013-12-20 23:57 | 只看该作者
中断程序里就不要再定义方向了DDRD|=_BV(PD7);
你应该是想用T1中断产生脉冲波让灯闪烁吗? 若这样在中断程序应该是异或 PORTD^=(_BV(PD7))

使用特权

评论回复
7
cyanitefire| | 2013-12-21 00:06 | 只看该作者
//Atmega64, 通过OC2输出可变PWM波。给你参考下
//启动PWM,电磁铁通电,
void pwm_on()
{
        TIMSK&=~(1<<OCF2);  //禁止T2比较匹配功能,此处是为了防止在设置T2比较匹配功能时引发中断
        TCNT2=0;
        OCR2=OCR2_START;           //设置初始占空比
        TIFR|=1<<OCF2;   //向T2匹配中断标志写1,清中断标志位
        TIMSK|=1<<OCIE2;   //T2比较匹配中断使能
        TCCR2=(1<<WGM20)|(1<<COM21)|(1<<CS20);  //相位修正的PWM模式,上升比较配时清零,无分频
}


//关闭电磁铁
void pwm_off()
{
        TIMSK&=~(1<<OCIE2);  //禁止T2比较匹配中断
        TCCR2&=~((1<<CS22)|(1<<CS21)|(1<<CS20));  //关闭T2时钟
        PORTB&=~(1<<PORTB7);  //PB7置0,电磁铁断电
}


//T2比较匹配中断处理函数,设计为占空比达到最大时刚好压紧弹**,然后立即松开
ISR(TIMER2_COMP_vect)    //T2比较匹配中断服务程序,产生PWM脉冲波,
{
        if(counter_t2>counter_t2_lasts) //counter_t2_lasts每种脉宽的方波持续的脉冲数
        {
                counter_t2=0;
                OCR2++;
        }
        else
        {
                counter_t2++;
        }
        if(OCR2>OCR2_STOP)  //占空比达到最大后,关闭PWM波,
        {
                counter_t2=0; //停止PWM波,计数完成,清零
                pwm_off();   //电磁铁断电
               
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

15

帖子

1

粉丝