打印

刚刚接触AVR MEGA,帮按看看

[复制链接]
1690|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2007-3-22 16:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AVR, tc, TI, se, IO
为什么进不了中断?


void main(void)
{   
    
    porta_init();
    TC1_init(1000);
    sei();
    for(;;)
    {
        //delay(100000);
        PORTA ^= 0X00;
        asm("nop");
    }
}



void TC1_init(int time_ms)                //初始化,可以按毫秒输入定时周期
{   
    TCCR1B |= CLK_8;                      //时钟源8分频
    asm("nop");                           
    int TCNT_value = Change_time(time_ms);
    TIM16_WriteTCNT1(TCNT_value);         //写16位寄存器
    TIMSK|=(1<<TOIE1);                   //允许T1溢出中断
}


//////////////////////////////////////////////
int Change_time(int i)
{
    char tcc = TCCR1B |=0x07;
    switch( tcc )
    {
        case CLK_1   : return(CLK_IO_HZ * i);      break;
        case CLK_8   : return(CLK_IO_HZ * i*8);    break;
        case CLK_64  : return(CLK_IO_HZ * i*64);   break;
        case CLK_256 : return(CLK_IO_HZ * i*256);  break;
        case CLK_1024: return(CLK_IO_HZ * i*1024); break;
    }
}
/////////////////////////

void porta_init(void)
{
    DDRA |= 0XFF;
    PORTA = 0XFF;
}

SIGNAL(SIG_OVERFLOW1)//定时器1中断
{
    TC1_init(500);
    PORTA ^= 0XFF;
    //sei();
}
//
void TIM16_WriteTCNT1( unsigned int i )
{
     unsigned char sreg;
     sreg = SREG;
    //cli();
    TCNT1 = i;
     SREG = sreg;
}

相关帖子

沙发
zhaoyu2005| | 2007-3-22 16:28 | 只看该作者

记得51的中断函数不能传递参数

AVR的不知道,你还是查一下AVR的中断函数怎么编吧

使用特权

评论回复
板凳
ayb_ice| | 2007-3-22 16:40 | 只看该作者

随便说说

  任何MCU的中断函数不可能传递参数,唯一的方法是通过全局变量传递信息,因为中断可能随时产生。

使用特权

评论回复
地板
zjf0000| | 2007-3-22 16:57 | 只看该作者

3楼说的对

任何中断都不能带参数和返回值的!!!!

使用特权

评论回复
5
keer_zu|  楼主 | 2007-3-22 17:01 | 只看该作者

那个参数只是告诉编译器中断向量的,不做参数传递

那只是一个宏定义:
我刚才试了,这个可以:(但是中断时间还是不能控制,需要在
中断处理中再次加载定时器吗?)

//TC1设置宏:(设置TCCR1B)
#define    STOP_TC1     0              //停止TC1
#define    CLK_1        1              //使用系统时钟
#define    CLK_8        2              //8分频
#define    CLK_64       3              //64分频
#define    CLK_256      4              //256分频
#define    CLK_1024     5              //1024分频
#define    T1_DOWN      6              //外部T1脚,下降沿驱动
#define    T1_UP        7              //外部T1脚,上升沿驱动
///////////////////////////////////////////////////////////////
#define  CLK_IO_HZ     7377            //定义系统时钟频率
//&&&&&&&&&&&&&&
//char I;
//#################################################################
void TC1_init(int time_ms);
int Change_time(int i);
void porta_init(void);
void TIM16_WriteTCNT1( unsigned int i );
//void delay(unsigned long int timedat);
//////////////////////////
void main(void)
{   
    
    porta_init();
    TC1_init(10000);
    sei();
    for(;;)
    {
        //delay(100000);
        PORTA ^= 0X00;
        asm("nop");
    }
}
/**/
void TC1_init(int i)
{
    TCCR1B |= CLK_8;
    asm("nop");
    TIM16_WriteTCNT1(i);
    TIMSK|=(1<<TOIE1);
}

/**
/**

void TC1_init(int time_ms)                //初始化,可以按毫秒输入定时周期
{   
    TCCR1B |= CLK_8;                      //时钟源8分频
    asm("nop");                           
    int TCNT_value = Change_time(time_ms);
    TIM16_WriteTCNT1(TCNT_value);         //写16位寄存器
    TIMSK|=(1<<TOIE1);                   //允许T1溢出中断
}


///////////////////////////////////////////////


int Change_time(int i)
{
    char tcc = TCCR1B |=0x07;
    switch( tcc )
    {
        case CLK_1   : return(CLK_IO_HZ * i);      break;
        case CLK_8   : return(CLK_IO_HZ * i*8);    break;
        case CLK_64  : return(CLK_IO_HZ * i*64);   break;
        case CLK_256 : return(CLK_IO_HZ * i*256);  break;
        case CLK_1024: return(CLK_IO_HZ * i*1024); break;
    }
}
/**/
/////////////////////////

void porta_init(void)
{
    DDRA |= 0XFF;
    PORTA = 0XFF;
}

SIGNAL(SIG_OVERFLOW1)//定时器1中断
{
    //PORTA ^= 0XFF;
    //I ++;
    PORTA ^= 0XFF;
    //if(I >= 8)I=0;
    //TC1_init(100);
    //sei();
}
//
void TIM16_WriteTCNT1( unsigned int i )
{
     //unsigned char sreg;
    // sreg = SREG;
    //cli();
    TCNT1 = i;
    // SREG = sreg;
}

void delay(unsigned long int timedat)
{
    unsigned long int trans_ctr = 0;
    while(trans_ctr < timedat)
    {
        trans_ctr++;
        asm("nop");
        asm("nop");
    }
}
////////////////

使用特权

评论回复
6
keer_zu|  楼主 | 2007-3-22 17:23 | 只看该作者

熟悉AVR的大侠帮忙看看看看

使用特权

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

本版积分规则

1352

主题

12436

帖子

53

粉丝