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

📄 avrusb_adc_m8.c

📁 AVR_Meag8模拟USB接口
💻 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 + -