搜索
bottom↓
回复: 5

请教马老师,为什么我的程序进行过第一次模数转换后就再也进不了模数转换了?

[复制链接]

出0入0汤圆

发表于 2005-7-1 10:03:45 | 显示全部楼层 |阅读模式
//ICC-AVR application builder : 2005-6-30 16:28:29

// Target : M64

// Crystal: 8.0000Mhz



#include <iom64v.h>

#include <macros.h>

unsigned int adc_demo;



void port_init(void)

{

PORTA = 0x00;

DDRA  = 0x00;

PORTB = 0x00;

DDRB  = 0x00;

PORTC = 0x00; //m103 output only

DDRC  = 0x00;

PORTD = 0x00;

DDRD  = 0x00;

PORTE = 0x00;

DDRE  = 0x00;

PORTF = 0x00;

DDRF  = 0x00;

PORTG = 0x00;

DDRG  = 0x00;

}



//call this routine to initialise all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

XDIV  = 0x00; //xtal divider

XMCRA = 0x00; //external memory





MCUCR = 0x00;

EICRA = 0x00; //extended ext ints

EICRB = 0x00; //extended ext ints

EIMSK = 0x00;

TIMSK = 0x00; //timer interrupt sources

ETIMSK = 0x00; //extended timer interrupt sources

  port_init();



SEI(); //re-enable interrupts

//all peripherals are now initialised

}



void init_adc(void)

{

  ADCSRA=0x00;

  ADMUX|=BIT(REFS1)|BIT(REFS0)|(MUX0);

  ACSR|=BIT(ACD);

  ADCSRA|=(BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1));

  ADCSRB|=0x00;

}



#pragma interrupt_handler adc_isr:iv_ADC

void adc_isr(void)

{



adc_demo=ADC;

ADMUX|=BIT(REFS1)|BIT(REFS0)|(MUX0);

ADCSRA|=BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1);



  

}



void main(void)

{

init_devices();

init_adc();

DDRF|=BIT(DDF2);

PORTF|=BIT(PF2);

ADCSRA|=BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1);

while(1)

{

  ADCSRA|=BIT(ADSC);

  if (adc_demo>=0x3E7)

{

  PORTF|=~BIT(PF2);

   

}

}





}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2005-7-1 12:56:32 | 显示全部楼层
将主循环中的

ADCSRA |= BIT(ADSC)改成 ADCSRA |= BIT(ADEN)|BIT(ADSC)试一下。



如果能行,请说明原因,告诉大家。

出0入0汤圆

 楼主| 发表于 2005-7-1 13:13:19 | 显示全部楼层
主要原因在我采用单步调试,在第一次进入中断后却没办法进入中断。

调试的时候用中断能发觉能进入模数转换完成后的中断。但现在的问题是采样到的数据有问题。采样到的数据在60-90之间,但实际应该采样到的数据应该是930左右

出0入0汤圆

发表于 2005-7-1 13:26:51 | 显示全部楼层
实际上你对ADC还是不熟悉。

首先你要考虑准备使用ADC的连续转换方式还是单次转换方式。

不管使用哪种方式,正确读ADC的转换值应该在ADC转换完成后,转换中间读的数不会正确。

软件调试ADC有一定的困难,最好采用实际系统运行调试。



“第一次进入中断后却没办法进入中断”,单次ADC转换只完成一次转换,产生一次中断。正确的方式是:在ADC中断中读ADC的数据,然后启动下一次的ADC转换。



你在主程序中不断启动ADC,一次ADC转换还没有完成,又让你重新启动了,有问题。

出0入0汤圆

 楼主| 发表于 2005-7-1 13:38:13 | 显示全部楼层
刚才那个程序已经改过了,现在也没有不断启动ADC。我现在在主循环里面每1ms启动一次ADC。可能我读取数据的时候有问题,但我是在模数转换完成后的中断里面读取数据的。

这是我现在的程序:

//ICC-AVR application builder : 2005-6-30 16:28:29

// Target : M64

// Crystal: 8.0000Mhz



#include <iom64v.h>

#include <macros.h>

void delay_nus(unsigned int n);

unsigned int adc_demo;



void port_init(void)

{

PORTA = 0x00;

DDRA  = 0x00;

PORTB = 0x00;

DDRB  = 0x00;

PORTC = 0x00; //m103 output only

DDRC  = 0x00;

PORTD = 0x00;

DDRD  = 0x00;

PORTE = 0x00;

DDRE  = 0x00;

PORTF = 0x04;

DDRF  = 0x00;

PORTG = 0x00;

DDRG  = 0x00;

}



//call this routine to initialise all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

XDIV  = 0x00; //xtal divider

XMCRA = 0x00; //external memory





MCUCR = 0x00;

EICRA = 0x00; //extended ext ints

EICRB = 0x00; //extended ext ints

EIMSK = 0x00;

TIMSK = 0x00; //timer interrupt sources

ETIMSK = 0x00; //extended timer interrupt sources

  port_init();



SEI(); //re-enable interrupts

//all peripherals are now initialised

}



void init_adc(void)

{

  ADCSRA=0x00;

  ADMUX|=BIT(MUX0);

  ACSR|=BIT(ACD);

  ADCSRA|=(BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1)|BIT(ADPS0));



}



#pragma interrupt_handler adc_isr:iv_ADC

void adc_isr(void)

{



adc_demo = ADCL;



adc_demo +=(ADCH&0x03)*256;



//ADMUX|=BIT(REFS1)|BIT(REFS0)|BIT(MUX0);



}



void main(void)

{

init_devices();

init_adc();

DDRF|=BIT(DDF2);



while(1)

{  delay_nus(10);

  ADCSRA|=BIT(ADSC);

  if (adc_demo>=0x2BA)

  {

           PORTF|=BIT(PF2);

  }



  }

}

出0入0汤圆

 楼主| 发表于 2005-7-1 13:45:58 | 显示全部楼层
马老师,我问一个问题,读出来的ADC里面的数据会不会是补码?我发觉用1024-现在读出来的数据反而是我要的那个值。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 22:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表