打印
[AVR单片机]

avr的M16单片机:在INT1中启动定时器为什么不准?

[复制链接]
2503|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
自由自在2013|  楼主 | 2014-7-23 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************************************************/  
//中断向量:
//iv_TIM0_OVF:10
//iv_TIM1_OVF:9
//iv_TIM2_OVF:5
//int0: PD2
//int1: PD3

#include <iom16v.h>
#include <macros.h>

#define CTLPORTD           PORTD
#define SW9               0
#define SW10              1

#define SET_SW9     CTLPORTD|=(1<<SW9)
#define CLR_SW9     CTLPORTD&=~(1<<SW9)

#define SET_SW10    CTLPORTD|=(1<<SW10)
#define CLR_SW10           CTLPORTD&=~(1<<SW10)

unsigned char t0_ovfnum;//t0软件定时计数器
unsigned char t1_ovfnum;//t1软件定时计数器
unsigned char t2_ovfnum;//t1软件定时计数器

unsigned char K9_fnum=0,K10_fnum=0;//K9为右侧翻身按键,K10为左侧翻身按键
                                 

void timer0_init(void);//32.68ms
void timer1_init(void);//10ms
void timer2_init(void);//10ms
void interrupt_init(void);

void main(void)
{
        unsigned char n;
        timer1_init();
        port_init();
        interrupt_init();
        while(1)
        {       
                ;
        }
}
void port_init(void)
{
        DDRD = 0xF3;    //INT0,INT1对应的上拉电阻有效
        PORTD = 0xFF;
        PORTA =0x00;
}
void interrupt_init(void)
{
        CLI();
        MCUCR = 0x0A;//外部中断1,外部中断0均为下降沿产生中断
        GICR = 0xC0;//开外部中断0,1;
        TIMSK = 0;
        SEI();              //开总中断
}
#pragma interrupt_handler int1_isr:3
void int1_isr (void)
{     
          PORTA =0x00;
          CLI();
          K9_fnum++;
          TIMSK |= 0x04; //timer interrupt sources
          GICR = 0xC0;
}

//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 10mSec
// actual value: 10.000mSec (0.0%)
void timer1_init(void)
{
        TCCR1B = 0x00; //stop
        TCNT1H = 0x00; //setup
        TCNT1L = 0x67;
        OCR1AH = 0x69;
        OCR1AL = 0xE2;
        OCR1BH = 0x04;
        OCR1BL = 0xE2;
        ICR1H  = 0x04;
        ICR1L  = 0xE2;
        TCCR1A = 0x00;
        TCCR1B = 0x05; //start Timer
        //TIMSK |= 0x04; //timer interrupt sources
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
        TCNT1H = 0x67; //reload counter high value
        TCNT1L = 0x69; //reload counter low value
        //t1_ovfnum++;
        PORTA =0xFF;
}

//TIMER2 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:  9.984mSec (0.2%)
void timer2_init(void)
{
        TCCR2 = 0x00; //stop
        ASSR  = 0x00; //set async mode
        TCNT2 = 0xB2; //setup
        OCR2  = 0x4E;
        TCCR2 = 0x07; //start
        TIMSK |= 0x40; //timer interrupt sources
}

#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
        TCNT2 = 0xB2; //reload counter value
        t2_ovfnum ++;
        if(t2_ovfnum == 200)//500ms
        {
                t2_ovfnum = 0;
                PORTD^=BIT(2);//LED电平取反
               
        }
}
/*
程序功能:
k9按键按下,继电器K1动作,平衡信号为高电平;
当平衡信号为低电平时,即到达平恒位置,此时k9按键5S时间内失灵,即K1断开;
5s延时后,再次按K9按键,按键正常工作。
*/

相关帖子

沙发
自由自在2013|  楼主 | 2014-7-23 15:33 | 只看该作者
问题补充:
外部中断1中启动定时器1,为了延时5s,可怎么测试着延时时间又长又短呢?而且不是定值

使用特权

评论回复
板凳
qq4988| | 2014-7-23 19:04 | 只看该作者
你的INT1中断处理函数关总中断了,没有打开吗

使用特权

评论回复
地板
huangxz| | 2014-7-23 21:22 | 只看该作者
标志寄存器也是要清的

使用特权

评论回复
5
star21| | 2014-7-24 10:28 | 只看该作者
我记得见过这个历程,没有不准啊

使用特权

评论回复
6
自由自在2013|  楼主 | 2014-7-24 13:25 | 只看该作者
star21 发表于 2014-7-24 10:28
我记得见过这个历程,没有不准啊

有没有相关的例程,可以发一下吗?

使用特权

评论回复
7
star21| | 2014-7-24 17:13 | 只看该作者
#define  uchar  unsigned char
#define  uint   unsigned int
#include <iom16v.h>
#include <macros.h>

unsigned char t0_ovfnum;//t0软件定时计数器
unsigned char t1_ovfnum;//t1软件定时计数器
unsigned char t2_ovfnum;//t1软件定时计数器

void timer0_init(void);//10ms
void timer1_init(void);//10ms
void timer2_init(void);//10ms


void main(void)
{
        unsigned char n;
        DDRD= 0xFF;
        PORTD=0xFF;
        timer0_init();//初始化定时器0
        timer1_init();//初始化定时器1
        timer2_init();//初始化定时器2
        SEI();              //开总中断
        while(1)
        {       
        }
}

//TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:  9.984mSec (0.2%)
void timer0_init(void)//10ms
{
        TCCR0 = 0x00; //stop
        TCNT0 = 0xB2; //set count
        OCR0  = 0x4E;  //set compare
        TCCR0 = 0x05; //start timer
          TIMSK |= 0x01; //timer interrupt sources
}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
        TCNT0 = 0xB2; //reload counter value
        t0_ovfnum ++;
        if(t0_ovfnum == 50)//500ms
        {
                t0_ovfnum = 0;
                PORTD^=BIT(0);//LED电平取反
                //LED_PORT ^= BIT(LED1);
        }
}


//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 10mSec
// actual value: 10.000mSec (0.0%)
void timer1_init(void)
{
        TCCR1B = 0x00; //stop
        TCNT1H = 0xFB; //setup
        TCNT1L = 0x1E;
        OCR1AH = 0x04;
        OCR1AL = 0xE2;
        OCR1BH = 0x04;
        OCR1BL = 0xE2;
        ICR1H  = 0x04;
        ICR1L  = 0xE2;
        TCCR1A = 0x00;
        TCCR1B = 0x03; //start Timer
        TIMSK |= 0x04; //timer interrupt sources
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
        //TIMER1 has overflowed
        TCNT1H = 0xFB; //reload counter high value
        TCNT1L = 0x1E; //reload counter low value
        t1_ovfnum ++;
        if(t1_ovfnum == 100)//500ms
        {
                t1_ovfnum = 0;
            PORTD^=BIT(1);//LED电平取反
                //LED_PORT ^= BIT(LED3);
        }
}

//TIMER2 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:  9.984mSec (0.2%)
void timer2_init(void)
{
        TCCR2 = 0x00; //stop
        ASSR  = 0x00; //set async mode
        TCNT2 = 0xB2; //setup
        OCR2  = 0x4E;
        TCCR2 = 0x07; //start
        TIMSK |= 0x40; //timer interrupt sources
}

#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF
void timer2_ovf_isr(void)
{
        TCNT2 = 0xB2; //reload counter value
        t2_ovfnum ++;
        if(t2_ovfnum == 200)//500ms
        {
                t2_ovfnum = 0;
                PORTD^=BIT(2);//LED电平取反
               
        }
}






使用特权

评论回复
8
我是水货~| | 2014-7-25 10:06 | 只看该作者
我也遇到定时器1的问题了,延时1s做一个秒表,结果出来的延时有十秒多!

使用特权

评论回复
9
我是水货~| | 2014-7-26 17:12 | 只看该作者
查荣四位!

使用特权

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

本版积分规则

26

主题

83

帖子

3

粉丝