Board logo

标题: [求助]NIOS中ad0809有关程序的问题,十万火急 [打印本页]

作者: wopsn    时间: 2007-5-15 17:13     标题: [求助]NIOS中ad0809有关程序的问题,十万火急

下面的是论坛上whitesky_mm写的有关AD0809程序,我现在也是要用AD0809做A/D转换,我觉得下面的程序不是很完整,在ad8s = IORD_ALTERA_AVALON_PIO_DATA(AD_8SWITCH_PIO_BASE);中的IORD在整个程序上没有看到,所以不知道AD所指向的IO口是怎么来的,接到什么地方,所以希望各位高手和斑竹能够帮忙把整个程序写完整让我看看,万分的感谢~!!!!

 

#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();
  }
}


作者: caopengly    时间: 2007-5-15 23:05

"中的IORD在整个程序上没有看到,所以不知道AD所指向的IO口是怎么来的,接到什么地方,所以希望各位高手和斑竹能够帮忙把整个程序写完整让我看看"

AD_8SWITCH_PIO_BASE是AD转换值的地址。这个地址,包括前面的地址都是用户在sopc中自己定义的io口,在工程的system.h中可以查到。

你看他的程序,并不一定拿来就可以完全的一点不变的使用,你要看看0809的控制时序,然后自己通过对端口的操作来实现。


作者: wopsn    时间: 2007-5-16 01:26

谢谢斑竹的答复,主要的原因还是我对NIOS不太了解~!






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0