⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt_timer.c

📁 使用arm7芯片
💻 C
字号:
#include "Board.h"

extern int tc1;
extern int count_timer1_interrupt;
extern int count_timer0_interrupt;
extern int move_direction;
extern int move_speed;
extern int move_distance;
extern int move_interrupt;
extern int candg ;
extern unsigned int output_pulse0 ;  
extern unsigned int output_pulse1 ; 
extern int far_point ;
extern int near_point ;
extern unsigned int back;
extern unsigned int gui_wei;
extern unsigned char temp_send_data[24];
extern int repeat_times;

void Tran_COM0(unsigned char send_data[]);

#define TIMER0_INTERRUPT_LEVEL		1
#define TIMER1_INTERRUPT_LEVEL		4

//__ramfunc 
void timer0_c_irq_handler(void)
{
    AT91PS_TC TC_pt = AT91C_BASE_TC0;
    unsigned int dummy;
    dummy = TC_pt->TC_SR;
    dummy = dummy;
    unsigned int pio_status;
    unsigned char pio_status2,pio_status3;
    pio_status = AT91C_BASE_PIOA->PIO_PDSR; 
    pio_status2 = (pio_status>>9)&0x0f;
    pio_status3 = (pio_status>>13)&0x0f;
    TC_pt->TC_RC= (46800/(move_speed*400));    
    if(output_pulse1==0){
    switch (pio_status2){        
        case MOVE_NEAR:           
            move_direction = 1;  
            move_speed = 40;      
            output_pulse0 = 1;            
            break;        
        case MOVE_FAR:            
            move_direction = 0; 
            move_speed = 40;             
            output_pulse0 = 1;            
            break;  
        case MOVE_STOP:
            output_pulse0 = 0;            
            break;  
    }    
    switch (pio_status3){        
        case MOVE_NEAR:           
            move_direction = 1;  
            move_speed = 40;      
            output_pulse0 = 1;            
            break;        
        case MOVE_FAR:            
            move_direction = 0; 
            move_speed = 40;             
            output_pulse0 = 1;            
            break;  
        case MOVE_STOP:
            output_pulse0 = 0;            
            break;  
    }      
    }
    if(output_pulse0==0){
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<18)) ; 
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<17)) ; 
    }
    if(move_direction==0){
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<1)) ;
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<3)) ; 
        if(output_pulse0==1){
            AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<17)) ; 
            AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<18)) ;   
        }
    } //end if   
    else if(move_direction==1){
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<1)) ; 
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<3)) ;  
        if(output_pulse0==1){
            AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<18)) ; 
            AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<17)) ;   
        }
    } //end else  
    
    if(output_pulse0==1){
        if(move_direction==0){
            count_timer0_interrupt--;      
        }
        else if(move_direction==1){
            count_timer0_interrupt++;
        }
        //*产生脉冲        
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<0)) ;
        delay();
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<0)) ;
        delay(); 
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<2)) ;
    }
    else
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<2)) ;
}

//__ramfunc 
void timer1_c_irq_handler(void)
{
    AT91PS_TC TC_pt = AT91C_BASE_TC1;
    unsigned int dummy;
    dummy = TC_pt->TC_SR;
    dummy = dummy;
    unsigned int pio_status;
    pio_status = AT91C_BASE_PIOA->PIO_PDSR;   
    
    if(move_direction==0){
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<1)) ;
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<3)) ; } //end if   
    else if(move_direction==1){
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<1)) ; 
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<3)) ;  } //end else  
        
    if(move_speed>0){
        TC_pt->TC_RC= (46800/(move_speed*400));
    } 
    else if(move_speed==0){
        output_pulse1 = 0;
    }  
    
    if(output_pulse1==1){
        if(move_direction==0){
            count_timer1_interrupt--;      
        }
        else if(move_direction==1){
            count_timer1_interrupt++;
        }
        //*产生脉冲        
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<0)) ;
        delay();
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<0)) ;
        delay(); 
       /*
        if(count_timer1_interrupt%400==0){
          temp_send_data[0] = (unsigned char)0x01;
	  temp_send_data[1] = (unsigned char)GET_INTERNUMBER;
	  temp_send_data[2] = (unsigned char)((count_timer1_interrupt)>>24);
	  temp_send_data[3] = (unsigned char)((count_timer1_interrupt)>>16);
	  temp_send_data[4] = (unsigned char)((count_timer1_interrupt)>>8);
	  temp_send_data[5] = (unsigned char)((count_timer1_interrupt));
	  for(int i=0;i<;i++) temp_send_data[i+6] = 0;
	  Tran_COM0(temp_send_data);
	}
	*/
    }
    
    if(((count_timer1_interrupt==near_point)||(count_timer1_interrupt==far_point))&&(output_pulse1==1)){
        output_pulse1 = 0;
        if(back ==1){
            //(move_direction==1)?(move_direction=0):(move_direction=1);
           // move_speed = 13;
            //output_pulse1 = 1;
            //back = 0;
            
            temp_send_data[0] = (unsigned char)0x01;
	    temp_send_data[1] = (unsigned char)START_SCALE;
	    for(int i=0;i<6;i++) temp_send_data[i+2] = 0;
	    Tran_COM0(temp_send_data);
        }
        else if(repeat_times>1){
            back = 1;
            (move_direction==1)?(move_direction=0):(move_direction=1);
            move_speed = 40;
            output_pulse1 = 1;
                       
            temp_send_data[0] = (unsigned char)0x01;
	    temp_send_data[1] = (unsigned char)GET_REPEAT;
	    for(int i=0;i<6;i++) temp_send_data[i+2] = 0;
	    Tran_COM0(temp_send_data);
        }
        else {
            temp_send_data[0] = (unsigned char)0x01;
	    temp_send_data[1] = (unsigned char)STOP_SCALE;
	    for(int i=0;i<6;i++) temp_send_data[i+2] = 0;
	    Tran_COM0(temp_send_data);
        }
    }
    if(gui_wei == 1){
        if(count_timer1_interrupt>0){
            move_direction = 0;
            output_pulse1 = 1;
        }
        else if(count_timer1_interrupt<0){
            move_direction = 1;
            output_pulse1 = 1;
        }
        else if(count_timer1_interrupt==0){
            output_pulse1 = 0;
            gui_wei = 0;
        }
    }
    
}

void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
{
    unsigned int dummy;    
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ;//* First, enable the clock of the TIMER    
    TC_pt->TC_CCR = AT91C_TC_CLKDIS;
    TC_pt->TC_IDR = 0xFFFFFFFF ;//* Disable the clock and the interrupts    
    dummy = TC_pt->TC_SR;//* Clear status bit    
    dummy = dummy;//* Suppress warning variable "dummy" was set but never used    
    TC_pt->TC_CMR = Mode | AT91C_TC_CPCTRG;//* Set the Mode of the Timer Counter    
    TC_pt->TC_CCR = AT91C_TC_CLKEN ;//* Enable the clock
}

void timer_init ( void )
{    
    count_timer1_interrupt=0;//init the timer interrupt counter      
    AT91F_TC_Open(AT91C_BASE_TC1,TC_CLKS_MCK1024,AT91C_ID_TC1);//* Open timer1
    //* Open Timer 1 interrupt
    AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, timer1_c_irq_handler);
    AT91C_BASE_TC1->TC_IER  = AT91C_TC_CPCS;  //  IRQ enable CPC
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1);    
    AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_TC1) ; //* Generate interrupt by software     
    AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG ;//* Start timer1
    
    count_timer0_interrupt=0;//init the timer interrupt counter      
    AT91F_TC_Open(AT91C_BASE_TC0,TC_CLKS_MCK1024,AT91C_ID_TC0);//* Open timer0
     //* Open Timer 0 interrupt
    AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, timer0_c_irq_handler);
    AT91C_BASE_TC0->TC_IER  = AT91C_TC_CPCS;  //  IRQ enable CPC
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC0);    
    AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_TC0) ; //* Generate interrupt by software     
    AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG ;//* Start timer0        
    
    //AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
}

//数据发送到串口
void Tran_COM0(unsigned char send_data[])
{        
    *AT91C_US0_TPR = (unsigned  int)send_data;   
    *AT91C_US0_TCR = 8;   
    *AT91C_US0_PTCR = AT91C_PDC_TXTEN  ;    
    while((*AT91C_US0_CSR & AT91C_US_ENDTX)!= (1<<4)) ;   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -