avr单片机定时器1中断问题

#include<iom128v.h>#include<macros.h>voidport_init(void);voidtimer1_init(void);//void... #include <iom128v.h>
#include <macros.h>
void port_init(void);
void timer1_init(void);
//void init_devices(void);
int num = 0;
#pragma interrupt_handler second:9
void main()
{
while(1)
{
DDRF = 0x01;
PORTF = 0x01;
DDRF = 0x02;
PORTF = 0x02;
TCCR1B |= 0x04; //1 0 0 //分频为256 晶振为 11.0592M
TCNT1H = 0x5B;
TCNT1L = 0x40;
TIMSK |= 0x02; //中断屏蔽
SREG |= 0x80; //全局中断
}
}
//定时器中断函数
void second()
{
TCNT1H = 0x5B;
TCNT1L = 0x40;
if (num == 0)
{
PORTF = 0x00;
num = 1;
}
else
{
PORTF = 0x02;
num = 0;
}
}
展开
 我来答
xiaoshenke2011
2012-12-03 · TA获得超过1477个赞
知道小有建树答主
回答量:358
采纳率:0%
帮助的人:122万
展开全部
中断没有问题,有问题的是把中断初始化和下面几句放在while(1)中了:
1)--DDRF = 0x01; ---设置端口PF0为输入,其他为输出
2)--PORTF = 0x01;---设置端口PF0为高电平,其他为低电平(包括PF1)
3)--DDRF = 0x02;---设置端口PF1为输入,其他为输出
4)--PORTF = 0x02;---设置端口PF1为高电平,其他为低电平

这样导致程序不断的将PF1设为低,然后马上又设为高,因为你上面几句放在主循环中了。

根据你中断的设置,你的led端口应该是PF1; 你的1.1mhz的频率是上面几句得到的。

解决方法:
1.你把while(1)中的代码全部剪切(不是复制)到while(1)之前;
while(1)中不要任何代码就OK了。
黄石佳诚家电维修
2012-11-29 · TA获得超过1427个赞
知道小有建树答主
回答量:1559
采纳率:93%
帮助的人:627万
展开全部
//定时器中断函数
#pragma interrupt_handler second:9

void second()
{
TCNT1H = 0x5B;
TCNT1L = 0x40;
if (num == 0)
{
PORTF = 0x00;
num = 1;
}
else
{
PORTF = 0x02;
num = 0;
}
}
改成以上,你再复制进去试一下!
追问
我这么写过,现在我感觉不是中断问题,已经进入中断了,但是太快看不清闪烁
我现在又个问题是怎么把1.10529M的外部晶振,定时器设为一秒具体怎么去算?
TCCR1B |= 0x04 //分频 65536 - (11052900/256) = 1s? 我理解是这意思 ,
但是试波器显示1.1MHz 肉眼 感觉不到在闪啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
笑谈我不言9514
2012-11-29 · TA获得超过622个赞
知道小有建树答主
回答量:522
采纳率:0%
帮助的人:325万
展开全部
用的什么编译器写呀?AVR的中断函数不是这么写的哦。亲!
更多追问追答
追问
用的就是avricc,我看网上视频什么的 都是这么写啊,
你告诉我我改改试试 好用不?谢啦
追答
哦,我用的GCC,刚刚看了一下,你的没写错。。
你的初始化怎么写到主循环里去了。是开机初始化一次就行了。。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式