📄 main.c
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
//#include<FIR.h>
#define uchar unsigned char
#define uint unsigned int
#define steps_N 32 //filter length
/*float FIR_coefficient[steps_N]={-0.50711,0.60589,2.2346,4.1321,4.9897,2.7761,-3.9326,-14.234,
-23.88,-25.932,-13.265,17.938,65.338,119.83,167.87,196.04,196.04,
167.87,119.83,65.338,17.938,-13.265,-25.932,-23.88,-14.234,
-3.9326,2.7761,4.9897,4.1321,2.2346,0.60589,-0.50711};*/
/*int FIR_coefficient[steps_N]={-17,20,73,135,164,91,-129,-466,-783,-850,-435,588,2141,3927,5501,
6424,6424,5501,3927,2141,588,-435,-850,-783,-466,-129,91,164,135,
73,20,-17};///2^15*/
/*int FIR_coefficient[steps_N]={-2,2,9,17,20,11,-16,-58,-98,-106,-54,73,268,491,688,803,803,688,
491,268,73,-54,-106,-98,-58,-16,11,20,17,9,2,-2};//2^10*/
/*int FIR_coefficient[steps_N]={ 0,0,1,1,1,1,-1,-4,-6,-7,-3,5,17,31,43,50,50,
43,31,17,5,-3,-7,-6,-4,-1,1,1,1,1,0,0};//2^8// >>8*/
int FIR_coefficient[steps_N]={ -1,1,2,4,5,3,-4,-15,-24,-27,-14,18,67,123,172,201,201,172,
123,67,18,-14,-27,-24,-15,-4,3,5,4,2,1,-1};//2^10 >>10 */
unsigned int FIR_data[steps_N]={0};
void ADC_INT()
{ ADMUX=0xc1;//|_BV(ADLAR);//2.56v片内基准电压,通道1,//数据左对齐
//ADC使能 ADC开中断 64分频(ADC时钟) 单次转换模式
ADCSRA=_BV(ADEN)|_BV(ADIE)|_BV(ADPS1)|_BV(ADPS2);//|_BV(ADATE);//在ATMEGA128中 ADATE 是 ADFR
ADCSRA|=_BV(ADSC);//start first ADC convert
}
void time0_INT()
{ TCNT0=194;//每500US进一次定时器0中断
TCCR0=_BV(CS01)|_BV(CS00);//64分频//ATMEGA128:............
TIMSK=_BV(TOIE0);
}
void UART_INT()////////////////////test
{ //接收使能,发送使能,接收中断允许
UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
UBRRL=8;//波特率 57600//UBRRL 8M *******************************************
}
void send_Nbyte(uchar *UART_TXD_buf,unsigned int N )///////////test
{ unsigned int i=0;
while(N--)
{ while( !(UCSRA&( _BV(UDRE) ) ) );
UDR=*(UART_TXD_buf+i++);
}
}
SIGNAL(SIG_ADC)
{ volatile long FIR_data1=0;
uint data_lo,data_hi;
char N;
N=steps_N-1;
data_lo=ADCL;
data_hi=ADCH;
FIR_data[0]=data_hi<<8;
FIR_data[0]|=data_lo;
for(;N>0;N--)
{ FIR_data1+=FIR_coefficient[N]*FIR_data[N];
FIR_data[N]=FIR_data[N-1];
}
FIR_data1+=FIR_data[0]*FIR_coefficient[0];
FIR_data1>>=10;
data_hi=0;
if(FIR_data1&0x100) data_hi|=0x01;
if(FIR_data1&0x200) data_hi|=0x02;
send_Nbyte(&data_hi,1);
data_lo=FIR_data1;
send_Nbyte(&data_lo,1);
}
SIGNAL(SIG_OVERFLOW0)//ADC sample rate is 2k
{ TCNT0=194;//重新装载初值
ADCSRA|=_BV(ADSC);//start ADC convert
}
void main()
{ ADC_INT();
time0_INT();
UART_INT();////////test
sei();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -