首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]niosII设计中关于ADC0809的疑难

[求助]niosII设计中关于ADC0809的疑难

在论坛上看到一个姐姐写的程序,有些地方不懂

程序如下:

#include "alt_types.h"
#include <stdio.h>
#include <unistd.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"

/* adc0809 ad_a select*/
void ad_a_select(int ad8switch)  //选择8路模拟信号中的一路
{
    switch(ad8switch)
    {
      case 0x80: //IN7
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x7);
           break;
      case 0x40: //IN6
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x6);
           break;
      case 0x20: //IN5
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x5);
           break;
      case 0x10: //IN4
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x4);
           break;
      case 0x08: //IN3
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x3);
           break;
      case 0x04: //IN2
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x2);
           break;
      case 0x02: //IN1
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x1);
           break;
      case 0x01: //IN0
           IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x0);
           break;
      default:  //warning
           printf("======warning======\n");
           break;
    }
}


/* start adc0809*/

void ad_start(void)   //adc0809转换程序
{
  int ad8s;
  
  //test the value of EOC: the value must be "1"
  printf("eoc_un ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
 
  //set ad_start=0
  IOWR_ALTERA_AVALON_PIO_DATA(AD_START_PIO_BASE,0);
  //set ad_ale=0
  IOWR_ALTERA_AVALON_PIO_DATA(AD_ALE_PIO_BASE,0);
  //set ad_oe=0
  IOWR_ALTERA_AVALON_PIO_DATA(AD_OE_PIO_BASE,0);
 
  //test the value of EOC: the value must be "1"
  printf("eoc_in ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
 
  //get the value of AD_8SWITCH_PIO
  ad8s = IORD_ALTERA_AVALON_PIO_DATA(AD_8SWITCH_PIO_BASE);
 
  //set IN0~IN7
  ad_a_select(ad8s,flag2);
   
  //set ad_ale=1
  IOWR_ALTERA_AVALON_PIO_DATA(AD_ALE_PIO_BASE,1);  //save the address into the flip-latch of address
  //set ad_ale=0
  IOWR_ALTERA_AVALON_PIO_DATA(AD_ALE_PIO_BASE,0); 
  
  //set ad_start=1
  IOWR_ALTERA_AVALON_PIO_DATA(AD_START_PIO_BASE,1); //reset the register
  
  //set ad_start=0 
  IOWR_ALTERA_AVALON_PIO_DATA(AD_START_PIO_BASE,0); //start AtoD
  
  //test the value of EOC: the value must be "0"
  printf("eoc_t ?=0: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
  
  while((IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE))!= 1)
  // whether the conversion of ADC is over:1 is over and the data have been saved into the flip-latch
  {
    printf("test eoc_f ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
  }
  
  //set ad_oe=1

  IOWR_ALTERA_AVALON_PIO_DATA(AD_OE_PIO_BASE,1); //put the data to the dataBus
  
  printf("ad_data is : %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_DATA_PIO_BASE));
  printf("\n=============AtoD is successful!=================\n");
}

int main(void)
{
  while(1)
  {
    ad_start();
  }
}

程序中

printf("eoc_in ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE);请问这句有什么意义?做什么用的啊?试否是做测试?

//set IN0~IN7
  ad_a_select(ad8s,flag2);

这不是定义了一个吗?怎么还有一个啊?


  //get the value of AD_8SWITCH_PIO
  ad8s = IORD_ALTERA_AVALON_PIO_DATA(AD_8SWITCH_PIO_BASE);中的AD_8SWITCH_PIO_BASE 是什么意思啊? 是怎么来的?接到哪的啊??

希望斑竹和各位高人解释下,还有问这个问题的姐姐能告诉我一下,不胜感激~!!!!

[此贴子已经被作者于2007-5-14 12:58:47编辑过]

printf("eoc_in ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE)是确保转换是不是结束。

ad_a_select(ad8s,flag2)是选择通道。

AD_8SWITCH_PIO_BASE 是基地址,你用过pio就知道。

在交流中前进,共同实现nios的应用。
返回列表