打印
[AVR单片机]

AT90CAN32定时器0问题

[复制链接]
2343|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
void timer0_initial(void)
{
    TCCR0A = 0x00;   //停止定时器  
    TCNT0 = 0;      //初始值
OCR0A  = 60;     //匹配值  
TIMSK0 |= (1<<TOIE0);  //中断允许  
TCCR0A |= (1<<WGM01) | (1<<CS02) | (1<<CS00);   //启动,CTC模式,1024分频
// TCCR0A |= (1<<CS02) | (1<<CS00);   //启动,普通模式,1024分频
}
/*
T0溢出中断服务程序
*/
SIGNAL(SIG_OVERFLOW0)   
{
    uint8_t i=0;
i++;
    if (i>=99)
{
     flag_500ms = 1;   //记满100个中断周期,500毫秒标志位置位
  i = 0;
}
}
int main (void)
{
  sei();    //开总中断
timer0_initial();
     while (1)
{
        if (1==flag_500ms)
  {
    //      
   }
   else
   {
       //
   }
  }
}
从程序上感觉定时器只运行了一次,这一段程序有什么问题么?
刚接触AVR单片机,还不太了解。

相关帖子

沙发
dhdwin| | 2012-8-6 16:35 | 只看该作者
终端向量#pragma interrupt_handler timer0_ovf_isr:n   n查一下手册

使用特权

评论回复
板凳
searover79|  楼主 | 2012-8-6 16:43 | 只看该作者
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
    uint8_t i=0;
        i++;
    if (i>=99)
        {
            flag_500ms = 1;   //记满100个中断周期,500毫秒标志位置位
                i = 0;
        }
}
一开始是这么用的,但是编译时出警告

使用特权

评论回复
地板
hyhmh| | 2012-8-7 09:29 | 只看该作者
每次执行 中断子程序  uint8_t i=0;   i都赋初始值 0?

使用特权

评论回复
5
searover79|  楼主 | 2012-8-7 13:28 | 只看该作者
这里是个问题,但是改了还是不行,进不了中断 4# hyhmh

使用特权

评论回复
6
njzd99| | 2012-8-7 14:24 | 只看该作者
:)进不了

使用特权

评论回复
7
searover79|  楼主 | 2012-8-7 17:15 | 只看该作者
:L 进不了啊 6# njzd99

使用特权

评论回复
8
hyhmh| | 2012-8-8 16:34 | 只看该作者
分2步:
1)先不执行 TIME初始化,将中断子程序 改成 普通程序 在 主程序中 调用(适当加NOP延时),看 “中断子程序”是否 实现预期。通过后再进入2)。
2)使用中断子程序,检查TIME初始化 以及 中断是否使能 等。

使用特权

评论回复
9
hyhmh| | 2012-8-8 16:36 | 只看该作者
这是 汇编写的 初始化 TIME0, 运行于 AT90CAN128芯片(12MHz/16MHz晶振)
;定时器0(10ms中断)
;TCCR0A = FOC0A WGM00 COM0A1 COM0A0 WGM01 CS02 CS01 CS00
;WGM01 WGM00
;  0     0        Normal
;COM0A1 COM0A0
;  0        0        Normal port operation, OC0A disconnected
;CS02 CS01 CS00 Description
;  0    0    0         No clock source (Timer/Counter stopped)
;  0         0    1        clkI/O/(No prescaling)
;  0        1    0        clkI/O/8 (From prescaler)
;  0         1    1  clkI/O/64 (From prescaler)
;  1         0    0  clkI/O/256 (From prescaler)
;  1    0    1  clkI/O/1024 (From prescaler)
;  1    1    0  External clock source on T0 pin. Clock on falling edge.
;  1    1    1  External clock source on T0 pin. Clock on rising edge.
;TIMSK0 = – – – – – – OCIE0A TOIE0
#if FOSC==12
        ldi R16, 255-117            ; 12MHz
        out (TCNT0), R16
#else
        ldi R16, 255-156            ; 16MHz
        out (TCNT0), R16
#endif
        ldi R16, 0b00000101
        out (TCCR0A), R16
        ldi R16, 0b00000001
        sts (TIMSK0), R16

使用特权

评论回复
10
hyhmh| | 2012-8-8 16:37 | 只看该作者
检查 全局中断 是否开启?
汇编
        sei                        ;开总中断

使用特权

评论回复
11
searover79|  楼主 | 2012-8-12 09:41 | 只看该作者
谢谢。2种方法都试过了,将flag_500ms直接赋值为1,好用。软件仿真的时候寄存器的值都改变,中断程序也能进去,就是涉及到的IO口不变化 8# hyhmh

使用特权

评论回复
12
hyhmh| | 2012-8-19 16:51 | 只看该作者
AVR 单片机 I/O引脚 是要 配置方向的!

1.GIF (15.56 KB )

1.GIF

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

301

帖子

0

粉丝