搜索
bottom↓
回复: 4

有关AD采样问题,紧急求助马老师

[复制链接]

出0入0汤圆

发表于 2009-11-1 00:44:58 | 显示全部楼层 |阅读模式
我这两天调一个mega48单片机,其中要用到AD采样。在调试中遇到AD只能在初始化完后采样一次,然后ADSL寄存器里面的值就不变了。我不管设自动采样,还是触发采样,都一样的结果。调了两天也没找到原因。请帮忙指教啊!附原程序

#include <iom48v.h>
#include <macros.h>

#define uchar unsigned char
#define uint unsigned int
#define PWM_PIND        0x01
#define LED0_PINB        0x80
#define LED1_PINB        0x40
#define LED2_PIND        0x10
#define Show_DATA_B        0x01                //有效位
#define Show_DATA_D        0xee                //有效位
#define Show_IO_CLR_B        (~(LED0_PINB|LED1_PINB|Show_DATA_B)        )        //清除有效显示数据
#define Show_IO_CLR_D        (~(LED2_PIND|Show_DATA_D))                        //清除有效显示数据
#define KEY1_PINB                0x20                //按键
#define KEY2_PINB                0x04
#define BF_PINB                0x02                //
#define moto_wait                0x00                //等待
#define moto_run                0x01                //运行
#define moto_haf                0x02                //运行中
#define moto_ach                0x03                //完成
#define set_max                340                        //最大值
#define set_min                80                        //最小值
uchar Port_B,Port_D;

uchar point_save;

uchar led_7[10]={0x6f,0x42,0xab,0xea,0xc6,0xec,0xed,0x4a,0xef,0xee};        //0-9
uchar led_end[3]={0xad,0xc1,0xe3};

uchar add_datas[40]={15,40,35,30,26,23,20,17,15,12,9,9,8,8,7,7,6,6,5,5,5,4,4,4,4,4,3,3,3,2,2,2,2,2,2,2};
uchar show_led[5];                        //显存

uchar Time1s_end;
uchar moto_states;                //状态
uint setup_kf;                        //设置
uint  run_kf;                                //实际运行
uint gun_on;                               
uint time_delay;                        //延时
uchar FIR_10=0;                //滤波结果
//-------------------------------------------------------------
void show_data(uint a);
//-------------------------------------------------------------


void timer1_init(void)                   //time1 setup
{
    TCCR1B = 0x00;                            //stop
    TCNT1H = 0xC6;                            //setup
    TCNT1L = 0x67;
    OCR1AH = 0x39;
    OCR1AL = 0x99;
    OCR1BH = 0x39;
    OCR1BL = 0x99;
    ICR1H  = 0x39;
    ICR1L  = 0x99;
    TCCR1A = 0x00;
    TCCR1B = 0x01;                        //start Timer
}

void ADC_init(void)                        //启动AD采样
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x07;  //select adc input 0
ACSR  = 0x80;
ADCSRB = 0x00;
ADCSRA = 0xef;
}

#pragma interrupt_handler Read_ad:22
void Read_ad(void)                               
{
        FIR_10=ADCL;                //读取AD值
}


//---------------------------数据显示转换--------------------------------
void show_data(uint a)
{
        show_led[0]=a/100;
        a%=100;
        show_led[1]=a/10;
        show_led[2]=a%10;
        show_led[3]=0;
        show_led[4]=0;
}
void show_end(void)
{
        show_led[0]='e';
        show_led[1]='n';
        show_led[2]='d';
        show_led[3]=6;
        show_led[4]=0;
}
//---------------------------开启关闭MOSE--------------------------------
void close_mosft(void)
{
        Port_D=Port_D&(~PWM_PIND);
        //Port_D=Port_D|PWM_PIND;       
}
void open_mosft(void)
{
        Port_D=Port_D|PWM_PIND;       
        //Port_D=Port_D&(~PWM_PIND);
}
//--------------------------中断显示数据---------------------------------
void sent_show_led(void)
{
        static uchar i=0;
        uchar a=0;
       
        Port_B=Port_B&Show_IO_CLR_B;               
        Port_D=Port_D&Show_IO_CLR_D;
        if(show_led[3]|show_led[4])                       
        {
                if(show_led[4]>0)--show_led[4];
                else
                {
                        --show_led[3];
                        show_led[4]=200;                 
                }
        }       
        if(!(show_led[3]%2))
        {
                if(++i>4)
                {
                 i=0;
                }
                if(i==0)Port_D|=LED2_PIND;
                else if(i==1)Port_B|=LED1_PINB;
                else if(i==2)Port_B|=LED0_PINB;
               
                if(show_led<10)
                {
                        a=led_7[show_led];
                }
                else if(show_led==' ')       
                {
                        a=0;
                }
                else
                {
                        a=led_end;
                }
                Port_B=Port_B|(a&Show_DATA_B);
                Port_D=Port_D|(a&Show_DATA_D);
        }
        PORTB=~Port_B;
        PORTD=~Port_D;
}
//------------------------1ms interrupt-------------------------------

#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
        //CLI();
        TCNT1H = 0xf8;                       
        TCNT1L = 0x2f;
        //SEI();
        Time1s_end=1;

        sent_show_led();       
}

void main()
{
        uchar start_read=0;
        uint a;
        int i;
       
        CLI();
       
         PORTC=0;
         DDRC=0;
         DDRB = 0xC1;        //IO设置
         DDRD=0XFF;
         
         timer1_init();
         ADC_init();
       
         MCUCR = 0x00;
         EICRA = 0x00; //extended ext ints
         EIMSK = 0x00;

         TIMSK0 = 0x00; //timer 0 interrupt sources
         TIMSK1 = 0x01; //timer 1 interrupt sources
         TIMSK2 = 0x00; //timer 2 interrupt sources

         PCMSK0 = 0x00; //pin change mask 0
         PCMSK1 = 0x00; //pin change mask 1
         PCMSK2 = 0x00; //pin change mask 2
         PCICR = 0x00; //pin change enable
         PRR = 0x00; //power controller
        SEI();
         
       
        while (1)
        {
                if(Time1s_end)
                {
                        Time1s_end=0;
                        show_data(FIR_10);                                  //ADCL  显示采样结果,结果一直都不变啊
                }
        }
}

出0入0汤圆

发表于 2009-11-1 01:56:40 | 显示全部楼层
当初也被这个搞了,仔细看手册才发现,ADCH必须也被读一下,ADC才能继续做更新的

出0入0汤圆

 楼主| 发表于 2009-11-1 14:03:10 | 显示全部楼层
谢谢 ggtc 白加黑
问题已经解决了!这问题困扰我两天了,吃饭都不香,睡也不安心,呵呵!
你那人啊,有空来杭州请你吃饭!
我邮箱是mycler@163.com

出0入0汤圆

发表于 2009-11-2 01:02:12 | 显示全部楼层
呵呵,太客气了,我在北京奋斗,有空多交流~ :)

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-3 08:41

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

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