搜索
bottom↓
回复: 19

ATMEGA162单片机定时器进不了中断

[复制链接]

出0入0汤圆

发表于 2012-10-29 18:25:25 | 显示全部楼层 |阅读模式
ATMEGA162单片机定时器进不了中断,我使用的开发工具是ICCAVR编译器。
这个程序在M8单片机上可以运行,在M162上却运行不了,不知道是不是在设置上有什么特别的地方。
有使用过的此单片机的高手,能帮小弟指点一下!!
// Target : M162
// Crystal: 7.3728Mhz

#include <iom162v.h>
#include <macros.h>

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0xff;
DDRB  = 0xff;
PORTC = 0x00;
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
PORTE = 0x00;
DDRE  = 0x00;
}

//定时器0初始化
void Timer0Init(void)
{
         TCCR0 |= (0<<CS02)|(0<<CS01)|(0<<CS00);                            //T/C控制寄存器
         TCNT0 = 0;                                       //TC/寄存器=0
         TIMSK |= (1<<TOIE0);                                       //定时器0溢出中断使能
}

//定时器0溢出中断程序入口
#pragma interrupt_handler timer0_ovf_isr:18
void timer0_ovf_isr(void)
{
TCNT0= 0x00;       //重新装载计数器值
PORTB^=BIT(5);   //PB5口电平取反
}
//主程序
void main()
{
        port_init();
        Timer0Init();
        SEI();    //中断使能
        while(1)
       {
        }
}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-29 18:50:31 | 显示全部楼层
本帖最后由 qwermhb 于 2012-10-29 18:51 编辑

void timer0_ovf_isr(void)
{
TCNT0= 0x00;       //重新装载计数器值
PORTB^=BIT(5);   //PB5口电平取反
}

红色字是啥东西啊

ICCAVR 有一个代码生成功能啊

出0入0汤圆

 楼主| 发表于 2012-10-29 19:10:15 | 显示全部楼层
qwermhb 发表于 2012-10-29 18:50
void timer0_ovf_isr(void)
{
TCNT0= 0x00;       //重新装载计数器值

这个中断是定时器计数溢出中断,进入中断后,TCNT0= 0x00;计数寄存器清零,从新开始计数。

出0入0汤圆

发表于 2012-10-29 20:06:57 | 显示全部楼层
TLLED 发表于 2012-10-29 19:10
这个中断是定时器计数溢出中断,进入中断后,TCNT0= 0x00;计数寄存器清零,从新开始计数。 ...

这里要重装计数值啊,不是清零

出0入0汤圆

 楼主| 发表于 2012-10-29 20:54:44 | 显示全部楼层
qwermhb 发表于 2012-10-29 20:06
这里要重装计数值啊,不是清零

不管是清零,还是赋值,只是调整定时器时间的问题,现在问题这个程不能进入中断函数。

出0入0汤圆

发表于 2012-10-29 21:03:33 | 显示全部楼层
本帖最后由 qwermhb 于 2012-10-29 21:07 编辑
TLLED 发表于 2012-10-29 20:54
不管是清零,还是赋值,只是调整定时器时间的问题,现在问题这个程不能进入中断函数。 ...


刚学avr吧?

出0入0汤圆

发表于 2012-10-29 21:05:28 | 显示全部楼层
void Timer0Init(void)
{
         TCCR0 |= (0<<CS02)|(0<<CS01)|(0<<CS00);                            //T/C控制寄存器
         TCNT0 = 0;                                       //TC/寄存器=0
         TIMSK |= (1<<TOIE0);                                       //定时器0溢出中断使能
}

红色字是要赋初值啊,你给个零肯定进不了啦,就算进了,中断里面也不重装计数值,永远都不会中断啊

出0入0汤圆

 楼主| 发表于 2012-10-29 21:52:11 | 显示全部楼层
qwermhb 发表于 2012-10-29 21:05
void Timer0Init(void)
{
         TCCR0 |= (0

是的,刚接触

出0入0汤圆

发表于 2012-10-29 22:49:27 | 显示全部楼层
TLLED 发表于 2012-10-29 21:52
是的,刚接触

你赋值给tcnt0就可以了

出0入0汤圆

 楼主| 发表于 2012-10-30 11:56:58 | 显示全部楼层
qwermhb 发表于 2012-10-29 22:49
你赋值给tcnt0就可以了

赋值也不能进入中断呀,问题不是在这吧

出0入0汤圆

发表于 2012-10-30 12:03:01 | 显示全部楼层
TLLED 发表于 2012-10-30 11:56
赋值也不能进入中断呀,问题不是在这吧

//TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:  9.861mSec (1.4%)
void timer0_init(void)
{
TCCR0= 0x00; //stop
TCNT0= 0xB9; //set count
OCR0= 0x47; //set compare value
TCCR0= 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
TCNT0= 0xB9; //reload counter value
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();

MCUCR= 0x00;
EMCUCR = 0x00;
GIMSK= 0x00;
TIMSK= 0x02; //timer interrupt sources
ETIMSK=0x00;
GICR= 0x00;
PCMSK0=0x00;
PCMSK1=0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

出0入0汤圆

发表于 2012-10-30 12:04:08 | 显示全部楼层
TLLED 发表于 2012-10-30 11:56
赋值也不能进入中断呀,问题不是在这吧

初值都不给别想进中断,

出0入4汤圆

发表于 2012-10-30 13:30:42 | 显示全部楼层
去全局中断没开,SREG|=0X80;

出0入0汤圆

 楼主| 发表于 2012-10-30 14:59:25 | 显示全部楼层
kcfoo1 发表于 2012-10-30 13:30
去全局中断没开,SREG|=0X80;

SREG|=0X80;这样打开不了全局中断吗?

出0入0汤圆

发表于 2012-10-30 16:31:05 | 显示全部楼层
本帖最后由 qwermhb 于 2012-10-30 16:35 编辑
TLLED 发表于 2012-10-30 14:59
SREG|=0X80;这样打开不了全局中断吗?


SEI()  这样已经打开了全局中断了

你看一下这个例子吧,是一个时钟,头文件里面有定时器的初始化

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-10-30 20:25:15 | 显示全部楼层
qwermhb 发表于 2012-10-30 16:31
SEI()  这样已经打开了全局中断了

你看一下这个例子吧,是一个时钟,头文件里面有定时器的初始化 ...

先谢谢你了,我的权限发不了消息。这个问题还没有解决,这个单片机不用中断,程序都可以运行,就是进不去中断,在M8上这样设置中断,程序都没有问题。很奇怪,ATMEGA162这个单片机还有其他设置吗,换了个新单片机还是不行。

出0入0汤圆

发表于 2012-10-30 21:17:19 | 显示全部楼层
TLLED 发表于 2012-10-30 20:25
先谢谢你了,我的权限发不了消息。这个问题还没有解决,这个单片机不用中断,程序都可以运行,就是进不去 ...

知道什么问题了吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入42汤圆

发表于 2012-10-30 21:25:07 | 显示全部楼层
TCCR0 |= (0<<CS02)|(0<<CS01)|(0<<CS00);                            //T/C控制寄存器

改为        

TCCR0 |= (1<<CS02)|(1<<CS01)|(1<<CS00);                            //T/C控制寄存器

原来的程序没有时钟源,T/C是停止的

出0入0汤圆

 楼主| 发表于 2012-10-30 21:45:56 | 显示全部楼层
jimmy_xt 发表于 2012-10-30 21:25
TCCR0 |= (0

太感谢了,这样修改后问题解决了,看资料不谨慎,没有设置正确。

出0入0汤圆

 楼主| 发表于 2012-10-30 21:46:49 | 显示全部楼层
qwermhb 发表于 2012-10-30 21:17
知道什么问题了吧

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

本版积分规则

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

GMT+8, 2024-7-24 07:09

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

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