ATMEGA162单片机定时器进不了中断
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)
{
}
} 本帖最后由 qwermhb 于 2012-10-29 18:51 编辑
void timer0_ovf_isr(void)
{
TCNT0= 0x00; //重新装载计数器值
PORTB^=BIT(5); //PB5口电平取反
}
红色字是啥东西啊
ICCAVR 有一个代码生成功能啊 qwermhb 发表于 2012-10-29 18:50 static/image/common/back.gif
void timer0_ovf_isr(void)
{
TCNT0= 0x00; //重新装载计数器值
这个中断是定时器计数溢出中断,进入中断后,TCNT0= 0x00;计数寄存器清零,从新开始计数。 TLLED 发表于 2012-10-29 19:10 static/image/common/back.gif
这个中断是定时器计数溢出中断,进入中断后,TCNT0= 0x00;计数寄存器清零,从新开始计数。 ...
{:sweat:} 这里要重装计数值啊,不是清零 qwermhb 发表于 2012-10-29 20:06 static/image/common/back.gif
这里要重装计数值啊,不是清零
不管是清零,还是赋值,只是调整定时器时间的问题,现在问题这个程不能进入中断函数。 本帖最后由 qwermhb 于 2012-10-29 21:07 编辑
TLLED 发表于 2012-10-29 20:54 static/image/common/back.gif
不管是清零,还是赋值,只是调整定时器时间的问题,现在问题这个程不能进入中断函数。 ...
刚学avr吧? void Timer0Init(void)
{
TCCR0 |= (0<<CS02)|(0<<CS01)|(0<<CS00); //T/C控制寄存器
TCNT0 = 0; //TC/寄存器=0
TIMSK |= (1<<TOIE0); //定时器0溢出中断使能
}
红色字是要赋初值啊,你给个零肯定进不了啦,就算进了,中断里面也不重装计数值,永远都不会中断啊 qwermhb 发表于 2012-10-29 21:05 static/image/common/back.gif
void Timer0Init(void)
{
TCCR0 |= (0
是的,刚接触
TLLED 发表于 2012-10-29 21:52 static/image/common/back.gif
是的,刚接触
你赋值给tcnt0就可以了 qwermhb 发表于 2012-10-29 22:49 static/image/common/back.gif
你赋值给tcnt0就可以了
赋值也不能进入中断呀,问题不是在这吧 TLLED 发表于 2012-10-30 11:56 static/image/common/back.gif
赋值也不能进入中断呀,问题不是在这吧
//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
}
TLLED 发表于 2012-10-30 11:56 static/image/common/back.gif
赋值也不能进入中断呀,问题不是在这吧
初值都不给别想进中断, 去全局中断没开,SREG|=0X80; kcfoo1 发表于 2012-10-30 13:30 static/image/common/back.gif
去全局中断没开,SREG|=0X80;
SREG|=0X80;这样打开不了全局中断吗? 本帖最后由 qwermhb 于 2012-10-30 16:35 编辑
TLLED 发表于 2012-10-30 14:59 static/image/common/back.gif
SREG|=0X80;这样打开不了全局中断吗?
SEI()这样已经打开了全局中断了
你看一下这个例子吧,是一个时钟,头文件里面有定时器的初始化 qwermhb 发表于 2012-10-30 16:31 static/image/common/back.gif
SEI()这样已经打开了全局中断了
你看一下这个例子吧,是一个时钟,头文件里面有定时器的初始化 ...
先谢谢你了,我的权限发不了消息。这个问题还没有解决,这个单片机不用中断,程序都可以运行,就是进不去中断,在M8上这样设置中断,程序都没有问题。很奇怪,ATMEGA162这个单片机还有其他设置吗,换了个新单片机还是不行。 TLLED 发表于 2012-10-30 20:25 static/image/common/back.gif
先谢谢你了,我的权限发不了消息。这个问题还没有解决,这个单片机不用中断,程序都可以运行,就是进不去 ...
知道什么问题了吧{:sweat:} TCCR0 |= (0<<CS02)|(0<<CS01)|(0<<CS00); //T/C控制寄存器
改为
TCCR0 |= (1<<CS02)|(1<<CS01)|(1<<CS00); //T/C控制寄存器
原来的程序没有时钟源,T/C是停止的 jimmy_xt 发表于 2012-10-30 21:25 static/image/common/back.gif
TCCR0 |= (0
太感谢了,这样修改后问题解决了,看资料不谨慎,没有设置正确。 qwermhb 发表于 2012-10-30 21:17 static/image/common/back.gif
知道什么问题了吧
太感谢了,问题解决了。
页:
[1]