找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1575|回复: 9
打印 上一主题 下一主题
收起左侧

为啥avr单片机进入定时器中断,出不去了

[复制链接]
跳转到指定楼层
楼主
ID:525358 发表于 2019-8-22 17:04 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
atmega16 晶振12m
想让灯一秒一闪
定时器1

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BIT(x) (1<<x)
typedef unsigned int u8;
typedef unsigned char u16;

int main(void)
{  
        DDRD=0xff;
        PORTD=0xff;
    TCCR1B|=BIT(CS12);//256分频
        TCNT1H=0x48;
        TCNT1L=0xe5;
        TIMSK|=BIT(TOIE1);//定时器使能位开启
        sei();//中断开启
        while(1);
}


ISR(TIMER1_OVF_vect)
{
    PORTD&=~BIT(0);
        TCNT1H=0x48;
        TCNT1L=0xe5;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:525358 发表于 2019-8-23 14:42 来自手机 | 只看该作者
都睡了吗
回复

使用道具 举报

板凳
ID:517466 发表于 2019-8-24 23:07 | 只看该作者
中断处理中,要先关闭中断。否则时间常数设得很大,接近0xff得
回复

使用道具 举报

地板
ID:517466 发表于 2019-8-24 23:46 | 只看该作者
以我的经验,中断处理程序中,要保存中断之前现场,暂时关闭中断(避免嵌套),执行中断程序中的处理,然后回复现场,开中断。另外AVR的中断处理中,需不需要清除中断标志之类的操作?
回复

使用道具 举报

5#
ID:517466 发表于 2019-8-25 00:30 | 只看该作者
我试了下,中断处理中PORTD0应该是定时取反操作,PORTD ^= (1<<PORTD0);,你的代码可能是导致永远输出PORTD0输出0,导致常亮。中断处理已经被正常执行了。你试试改成PORTD ^= (1<<PORTD0);
回复

使用道具 举报

6#
ID:517466 发表于 2019-8-25 00:31 | 只看该作者
我已经用proteus验证过了,没问题
回复

使用道具 举报

7#
ID:525358 发表于 2019-8-25 08:37 来自手机 | 只看该作者
suncat0504 发表于 2019-8-25 00:31
我已经用proteus验证过了,没问题

可以了 非常 非常感谢
回复

使用道具 举报

8#
ID:525358 发表于 2019-8-25 08:44 来自手机 | 只看该作者
suncat0504 发表于 2019-8-25 00:31
我已经用proteus验证过了,没问题

问下 中断怎么关闭
回复

使用道具 举报

9#
ID:525358 发表于 2019-8-25 09:03 来自手机 | 只看该作者
suncat0504 发表于 2019-8-25 00:31
我已经用proteus验证过了,没问题

能给个qq或微信吗
回复

使用道具 举报

10#
ID:517466 发表于 2019-8-25 21:45 | 只看该作者
对AVR我也不是很懂,都是基于51的经验而已。51中为了让避免中断嵌套,会做现场保护、恢复处理;为了避免同一个中断处理没完成,下一个同样的中断产生,会有意识地在中断处理中加入关闭、再打开中断的处理。道理应该是一样的,我想也同样适用于AVR或者其他的处理器吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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