📄 interrupt_timer.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 + -