📄 avrusb_adc_m8.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "usbdrv.h"
#include "adc.h"
#define fIDstart 1 //开始ADC转换
#define fIDstop 2 //停止ADC转换
#define fIDdatabit 3 //设置数据位,具体在send[0]中
#define fID_Vref 4 //设置参考电压源,具体在send[0]中
#define fID_channels 5 //设置ADC转换通道,具体在send[0]中
#define fID_read 6 //读取ADC转换值,要求读取具体数量在send[2]中
#define fID_getcount 7 //获取ADC转换数据的个数
uchar adcdata_temp[32];//
uchar currenp;
//===================================================
uchar usbFunctionSetup(uchar data[8])
{
uchar len = 0;
switch(data[1])
{
case 1: start_adc();
currenp=0;
break;
case 2: stop_adc();
break;
case 3: setup_databit(data[2]);
break;
case 4: setup_vref(data[2]);
break;
case 5: setup_channels(data[2]);
break;
case 6: len=0xff; //交给usbFunctionRead处理
break;
case 7: usbMsgPtr=&adccount;
len=1;
break;
default: break;
}
return len;
}
//====================================================
uchar usbFunctionRead(uchar *data, uchar len)
{
uchar i;
unsigned int adcdata;
if(ADC_databit==8)
{
for(i=0;i<len;i++)
{
adcdata=delet();
data[i]=(uchar) adcdata;
}
}
if(ADC_databit==10)
{
for(i=0;i<len/2;i++) //len 不会出现奇数
{
adcdata=delet();
data[2*i]=(uchar)(adcdata>>8);
data[2*i+1]=(uchar)adcdata;
}
}
return len;
}
//====================================================
int main(void)
{
uchar i, j;
unsigned int adc_average,adc_temp;
PORTD = 0;
PORTB = 0; /* no pullups on USB and ISP pins */
DDRD = ~(1 << 2); /* all outputs except PD2 = INT0 */
DDRB = ~0; /* output SE0 for USB reset */
j = 0;
while(--j){ /* USB Reset by device only required on Watchdog Reset */
i = 0;
while(--i); /* delay >10ms for USB reset */
}
DDRB = 0; /* all USB and ISP pins inputs */
DDRC = 0x00; /* all inputs except PC0, PC1 */
PORTC = 0x00;
usbInit();
sei();
for(;;)
{ /* main event loop */
usbPoll();
i=ADCSRA & (1<<ADIF);
if(i)
{
ADCSRA|=(1<<ADIF); //清除中断请求标志
if(ADC_databit==8)
{
adcdata_temp[currenp]=ADCH;
}
if(ADC_databit==10)
{
adcdata_temp[currenp]=ADCL;//痛苦呀,他妈妈的,必须先读低位,这个差点就让我发疯了
currenp++;
adcdata_temp[currenp]=ADCH;
}
currenp++;
ADCSRA|=(1<<ADSC); //启动下一次ADC
}
if(currenp>=32)
{
currenp=0;
adc_average=0;
if(ADC_databit==8)
{
for(i=0;i<32;i++)
adc_average=adc_average+(unsigned int)adcdata_temp[i];
adc_average=adc_average>>5;
insert((uchar)adc_average,0);
}
if(ADC_databit==10)
{
adc_temp=0;
for(i=0;i<16;i++)
{
adc_temp=(unsigned int)adcdata_temp[2*i+1];
adc_temp=adc_temp<<8;
adc_temp=adc_temp+(unsigned int)adcdata_temp[2*i];
adc_average=adc_average+adc_temp;
}
adc_average=adc_average>>4;
insert((uchar)(adc_average>>8),(uchar)adc_average);
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -