# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > مباحث عمومی کار با سخت افزارها، سنسورها و لوازم جانبی >  مشکل در مقدار  ADC در نرم افزار پروتئوس

## Abbas Amiri

باسلم در شبیه سازی برنامه  Proteus مقادیر بالاتر از 50 را همان 50 نمایش میدهد ولی برای مقدایر 50 به پایین مشکلی ندارد. هرچه با کدها کلنجاررفتم حل نشد. قسمتی ازکدها وتصویر مدار را گذاشتم  ، کسی دراین زمینه تجربه دارد؟


temperature=(int)(ADCW>>2);
itoa(temperature,DigitText);
lcd_puts(DigitText);
// Some code
TempF=(int)((temperature*9/5)+32);
itoa(TempF,DigitText);
lcd_puts(DigitText);

----------


## hamid-nic

سلام 
به جای LM35 می توانید از یک پتانسیومتر استفاده کنید. امتحان کنید ببینید که جواب می ده ؟

----------


## Abbas Amiri

بله امتحان کردم اگر به پروب ولتاژکه درخروجی LM35 است نگاه کنید مقدار 0.71 ولت را نشان میدهد که با توجه به تنظیمات میکرو باید عدد 71 رانشان دهد وهمانطور که عرض کردم  تا مقدار 50 را کاملاصحیح عمل میکند.

----------


## hamid-nic

ولتاژ رفرنس Vref را به چه شکلی مقدار دهی کردید ؟

----------


## Abbas Amiri

برای اینکه تمام سوالتان احتمالی آینده هم جواب داده شوند کد های مربوطه را در ذیل قرار میدهم. سخت افزار هم خیلی ساده مانند شکل فوق است.

#include <mega16.h>
#include <stdlib.h>     
#include <delay.h>
#include <alcd.h>   
//#define HOT_VALUE 30
//#define COLD_VALUE 20 
//#define HotAlarm PORTC.2
//#define ColdAlarm PORTC.0
// for Display degree sign save in Program code
// because Character map in LCD Different from PC
flash char degree_signC[3]={0xDF,0x43,0},degree_signF[3]={0xDF,0x46,0};
unsigned char display_flag=0;
char *DigitText;  //Variable For save numbers to ASCII
int  TempF ;
int temperature;
// Timer1 overflow interrupt service routine       
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1=0xc240;  
display_flag=1;
}
#define ADC_VREF_TYPE 0xC0
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
temperature=(int)(ADCW>>2);   
}

void read_adc(void)
{
delay_us(20);
#asm
    in   r30,mcucr
    cbr  r30,__sm_mask
    sbr  r30,__se_bit | __sm_adc_noise_red
    out  mcucr,r30
    sleep
    cbr  r30,__se_bit
    out  mcucr,r30
#endasm
}                 

void main(void)
{

PORTC=0x00;
DDRC=0x07;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xc2;
TCNT1L=0x40;
TIMSK=0x04;
UCSRB=0x00;
ACSR=0x80;
// ADC initialization
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8A;

lcd_init(16);
delay_ms(50);
lcd_putsf("      Wait"); 
// Global enable interrupts
#asm("sei")
ADCSRA|=0x40;  
while (1)
    {
      if(display_flag){   
        lcd_clear();   
        // *****        *****
        lcd_gotoxy(0,1);        
        lcd_putsf("Temp: ");  
        itoa(temperature,DigitText);   
        lcd_puts(DigitText);  
        lcd_putsf(degree_signC);  
        //  *******************                    
        /*if (temperature < COLD_VALUE)   
            ColdAlarm=1;               
        else if (temperature > HOT_VALUE)
            HotAlarm=1;               
        else    {
            HotAlarm=0;               
            ColdAlarm=0;  
            } */                            
        lcd_gotoxy(6,0);           
        TempF=(int)((temperature*9/5)+32);     
        itoa(TempF,DigitText);                       
        lcd_puts(DigitText);    
        lcd_putsf(degree_signF);          
        display_flag=0;                   
        read_adc();                      
      } 
    };
}

----------


## shoghal1989

منم همین مشکلو داشتم که طی 7 ساعت کار مداوم و زل زدن به صفحه مانیتور بالاخره به این نتیجه رسیدم که باید پایه های avcc و avref رو به vcc وصل کنی

----------

