TLLED 发表于 2012-10-29 18:25:25

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:50:31

本帖最后由 qwermhb 于 2012-10-29 18:51 编辑

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

红色字是啥东西啊

ICCAVR 有一个代码生成功能啊

TLLED 发表于 2012-10-29 19:10:15

qwermhb 发表于 2012-10-29 18:50 static/image/common/back.gif
void timer0_ovf_isr(void)
{
TCNT0= 0x00;       //重新装载计数器值


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

qwermhb 发表于 2012-10-29 20:06:57

TLLED 发表于 2012-10-29 19:10 static/image/common/back.gif
这个中断是定时器计数溢出中断,进入中断后,TCNT0= 0x00;计数寄存器清零,从新开始计数。 ...

{:sweat:} 这里要重装计数值啊,不是清零

TLLED 发表于 2012-10-29 20:54:44

qwermhb 发表于 2012-10-29 20:06 static/image/common/back.gif
这里要重装计数值啊,不是清零

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

qwermhb 发表于 2012-10-29 21:03:33

本帖最后由 qwermhb 于 2012-10-29 21:07 编辑

TLLED 发表于 2012-10-29 20:54 static/image/common/back.gif
不管是清零,还是赋值,只是调整定时器时间的问题,现在问题这个程不能进入中断函数。 ...

刚学avr吧?

qwermhb 发表于 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溢出中断使能
}

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

TLLED 发表于 2012-10-29 21:52:11

qwermhb 发表于 2012-10-29 21:05 static/image/common/back.gif
void Timer0Init(void)
{
         TCCR0 |= (0

是的,刚接触

qwermhb 发表于 2012-10-29 22:49:27

TLLED 发表于 2012-10-29 21:52 static/image/common/back.gif
是的,刚接触

你赋值给tcnt0就可以了

TLLED 发表于 2012-10-30 11:56:58

qwermhb 发表于 2012-10-29 22:49 static/image/common/back.gif
你赋值给tcnt0就可以了

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

qwermhb 发表于 2012-10-30 12:03:01

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
}

qwermhb 发表于 2012-10-30 12:04:08

TLLED 发表于 2012-10-30 11:56 static/image/common/back.gif
赋值也不能进入中断呀,问题不是在这吧

初值都不给别想进中断,

kcfoo1 发表于 2012-10-30 13:30:42

去全局中断没开,SREG|=0X80;

TLLED 发表于 2012-10-30 14:59:25

kcfoo1 发表于 2012-10-30 13:30 static/image/common/back.gif
去全局中断没开,SREG|=0X80;

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

qwermhb 发表于 2012-10-30 16:31:05

本帖最后由 qwermhb 于 2012-10-30 16:35 编辑

TLLED 发表于 2012-10-30 14:59 static/image/common/back.gif
SREG|=0X80;这样打开不了全局中断吗?

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

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

TLLED 发表于 2012-10-30 20:25:15

qwermhb 发表于 2012-10-30 16:31 static/image/common/back.gif
SEI()这样已经打开了全局中断了

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

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

qwermhb 发表于 2012-10-30 21:17:19

TLLED 发表于 2012-10-30 20:25 static/image/common/back.gif
先谢谢你了,我的权限发不了消息。这个问题还没有解决,这个单片机不用中断,程序都可以运行,就是进不去 ...

知道什么问题了吧{:sweat:}

jimmy_xt 发表于 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是停止的

TLLED 发表于 2012-10-30 21:45:56

jimmy_xt 发表于 2012-10-30 21:25 static/image/common/back.gif
TCCR0 |= (0

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

TLLED 发表于 2012-10-30 21:46:49

qwermhb 发表于 2012-10-30 21:17 static/image/common/back.gif
知道什么问题了吧

太感谢了,问题解决了。
页: [1]
查看完整版本: ATMEGA162单片机定时器进不了中断