AVR Studio GCC编译器,编写的定时器0中断函数,调了1天半愣是现象没出现,祈求大家分析一下!谢谢了
#include<avr/io.h>#include<avr/iom128.h>#include<avr/interrupt.h>//管脚初始化voidport_init...
#include<avr/io.h>
#include<avr/iom128.h>
#include<avr/interrupt.h>
//管脚初始化
void port_init(void)
{
PORTE |= 0xC0;//PE6,PE7控制LED灯闪烁
DDRE |= 0xC0;//为输出模式
}
//定时器0初始化
void timer0_init(void)
{
TCCR0 = 0x00;//关定时器0
TCNT0 = 0x9C;//计数初值设定
TCCR0 |= 0x05;//128分频,一次计数时间为11.56us
}
//响应定时器0的中断函数
ISR(SIG_OVERFLOW0)
{
TCNT0 = 0x9C;
PORTE &= 0x3F;
}
//main函数
int main(void)
{
port_init();
timer0_init();
TIMSK |= 0x01;//中断屏蔽寄存器,使能定时器0溢出中断
SREG |= 0x01;//开全局中断使能
while(1);
}
我怀疑我调用的中断函数不对!
芯片型号:ATMega128
理想现象:烧写程序之后两LED灯亮,中断产生两LED灯灭。
但现在中断没有产生,LED灯没有灭。
注:中断调用函数有三个(ISR(vector),INTERRUPT(vector),SIGNAL(vector))我都试过了,结果都是一样,理想现象没出现 展开
#include<avr/iom128.h>
#include<avr/interrupt.h>
//管脚初始化
void port_init(void)
{
PORTE |= 0xC0;//PE6,PE7控制LED灯闪烁
DDRE |= 0xC0;//为输出模式
}
//定时器0初始化
void timer0_init(void)
{
TCCR0 = 0x00;//关定时器0
TCNT0 = 0x9C;//计数初值设定
TCCR0 |= 0x05;//128分频,一次计数时间为11.56us
}
//响应定时器0的中断函数
ISR(SIG_OVERFLOW0)
{
TCNT0 = 0x9C;
PORTE &= 0x3F;
}
//main函数
int main(void)
{
port_init();
timer0_init();
TIMSK |= 0x01;//中断屏蔽寄存器,使能定时器0溢出中断
SREG |= 0x01;//开全局中断使能
while(1);
}
我怀疑我调用的中断函数不对!
芯片型号:ATMega128
理想现象:烧写程序之后两LED灯亮,中断产生两LED灯灭。
但现在中断没有产生,LED灯没有灭。
注:中断调用函数有三个(ISR(vector),INTERRUPT(vector),SIGNAL(vector))我都试过了,结果都是一样,理想现象没出现 展开
1个回答
2015-05-23
展开全部
你的确中断向量名用的不对,ISR是新版gcc里的中断函数名,对应的TC0溢出中断向量叫
TIMER0_OVF_vect,旧版的是SIGNAL(SIG_OVERFLOW0)你完全搞混了啊啊啊啊。新版里用不了SIGNAL旧版里用不了ISR,看你自己哪个版本。而且你开全局中断也与错了亲。SREG的第七位置1,不是第0位,也就是应该是SREG |= 0x80; 亲。而且开全局中断用sei()多好,干嘛还要自己费尽去位操作,还给与错位了。你开头已经包含了IO.h为什么你后面还要再#include<avr/iom128.h>?ICC里要单独这么写,但你用的是gcc啊亲。
太多错误,太多不规范了。。。。
给个建议,认真的、用心的把avr的技术手册和gcc的user manual 看一遍,然后再多看看高手写的代码。
TIMER0_OVF_vect,旧版的是SIGNAL(SIG_OVERFLOW0)你完全搞混了啊啊啊啊。新版里用不了SIGNAL旧版里用不了ISR,看你自己哪个版本。而且你开全局中断也与错了亲。SREG的第七位置1,不是第0位,也就是应该是SREG |= 0x80; 亲。而且开全局中断用sei()多好,干嘛还要自己费尽去位操作,还给与错位了。你开头已经包含了IO.h为什么你后面还要再#include<avr/iom128.h>?ICC里要单独这么写,但你用的是gcc啊亲。
太多错误,太多不规范了。。。。
给个建议,认真的、用心的把avr的技术手册和gcc的user manual 看一遍,然后再多看看高手写的代码。
追问
谢谢了,我用sei()就会报错,请问头文件是哪一个?
我用的版本AVR Studio 4.13.528 ,请问用哪一个中断函数?
我刚刚改了SREG |= 0x80,结果一样!
追答
你的程序我跑了,把我说的地方改了之后可以跑出你要的效果,无论是SREG |= 0x80
还是sei()。我用的版本是AS6.2,gcc 4.8.1,avr库1.8.1。
至于为什么你跑不出来我不清楚。你最好再检查下你的电路两个LED是推电流驱动还是灌电流驱动。你用sei会报错,应该是你的中断库没加对。使用中断引用的头文件就是interrupt.h
。每个winavr安装目录里都有一个叫avr-libc-user-manual的pdf文档,里面会告诉你当前的库版本和使用方法,你自己搜下文档看看吧。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询