打印
[AVR单片机]

AVR AT90USB1287, ADC 寄存器写不进去

[复制链接]
693|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lin196@21cn.com 于 2015-12-18 16:09 编辑

AVR AT90USB1287, ADC 寄存器写不进去, 读出来全是0; 仿真时,在电脑软件上看不到这些寄存器有变化,发现AVR STUDIO 软件上的I/O viwe 里面的Address 是写着'na', 但不知道是什么意思;下面是ADC 寄存器图:





你们遇到过这情况吗,
#define BatDete_GetStatus                                 Get_Bit(PINF,0)
#define BatDete_Internal_SetOut                Set_Bit(DDRF,0)
#define BatDete_Internal_SetIN                Clr_Bit(DDRF,0)
#define ADC_channal_0 0
unsigned int adc_result=0;
unsigned char Btemp;



void Battery_ADC_init();
void Battery_ADC_init()
{
       BatDete_Internal_SetIN;                        //will IO set input              
        ADCSRA = 0b10000100;                                //enable ADC power, stop adc, single conversion, adc interrupt no used, ADC prescaler 16
        ADCH = 0x00;
        ADCL = 0x00;
        ADCSRB = 0x00;        
        DIDR0 = 0b00000001;                        //ADC0D set 1        
        ADMUX = 0b00000000;                                        //selection external AREF, adc result right, selection ADC0 channel  
                                                
}

void ADC_start_or_stop(unsigned char StartOrStop);
void ADC_start_or_stop(unsigned char StartOrStop)
{
        if(StartOrStop)
                ADCSRA = (1<<ADSC);        // Start ADC Conversion
        else
                ADCSRA = (0<<ADSC);        // Stop ADC Conversion
}

unsigned int ADC_StartConversion(unsigned char ADC_channal);
unsigned int ADC_StartConversion(unsigned char ADC_channal)
{
        unsigned char i;
        unsigned int temp;
        adc_result=0;
        
        ADCSRA = (1<<ADEN);                         //enable ADC
        switch(ADC_channal)                                //selection channal
        {
                case 0:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);                                //selection ADC channal 0
                 break;
                case 1:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0);                                //selection ADC channal 1
                 break;        
                case 2:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);                                //selection ADC channal 2
                 break;        
                case 3:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0);                                //selection ADC channal 3
                 break;        
                case 4:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(0<<MUX0);                                //selection ADC channal 4
                 break;                                                                                    
                case 5:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0);                                //selection ADC channal 5
                 break;        
                case 6:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);                                //selection ADC channal 6
                 break;        
                case 7:        
                        ADMUX        = (0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0);                                //selection ADC channal 7
                 break;                        
                                                  
        }        
        for(i=0;i<100;i++)                                //adc enable need time
                ;
        ADC_start_or_stop(1);
        i = 0;
        while((!ADIF)&&(i<254))
                i++;
        temp        =        ADCH;
        adc_result        =        temp<<8;                        
        adc_result |=        ADCL;        
                                
        return         0;
}


2015-12-18_150054.png (129.2 KB )

2015-12-18_150054.png

相关帖子

沙发
lin196@21cn.com|  楼主 | 2015-12-18 17:05 | 只看该作者
顶一下.....................

使用特权

评论回复
板凳
lin196@21cn.com|  楼主 | 2015-12-21 11:07 | 只看该作者
.......

使用特权

评论回复
地板
JY-DX-JY| | 2015-12-21 11:28 | 只看该作者
主程序呢?是不是主程序忘了初始化了?

使用特权

评论回复
5
lin196@21cn.com|  楼主 | 2015-12-22 09:44 | 只看该作者
int main()
{
        DelayMs(200);
        Init();

        LCD_Init();
        Key_Scan();
        RCC_ini();       
        CLOCK_init();
        DelayMs(50);       
        CLOCK_FreqOutput(1);
        Battery_ADC_init();       
        while(1)
        {
                wdt_reset();
                if(EnKeyScan==1||timer2Hz==1)
                {
                        Key_Scan();
                        Display();
                        ADC_StartConversion        (0);               
                }
     }
}

我有初始化,暂时测试每500ms启动一次ADC,昨天我也打开了ADC 中断,也进不去中断;
不知道是什么原因为呢?
还有AVR studio 软件上在线仿真的ADC的寄存器的地址有 na 字样,如一楼我发的图片!

使用特权

评论回复
6
shaoziyang| | 2015-12-22 11:00 | 只看该作者
这个型号比较少见啊。

使用特权

评论回复
7
lin196@21cn.com|  楼主 | 2015-12-22 13:06 | 只看该作者
查出来了,PRR0=0b10101100; Bit 0 - PRADC: Power Reduction ADC,  原来在这里把这个ADC部分关闭了,打开了就可以了,第一次用,没看出来。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

26

帖子

1

粉丝