اطلاعیه

Collapse
No announcement yet.

مشکل در تبدیل adc

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در تبدیل adc

    با سلام قصد دارم یه برنامه برا attiny13a بنویسم توش قراره adc دوم میکرو رو اندازه بگیره بصورت مستمر مقدارش اگه از 1.81 ولت کمتر شد پایه pb5 رو یک کنه ولی برنامه تو شبیه سازی با پروتئوس کار نمی کنه اینم برنامش:
    کد:
    : #include <tiny13a.h>
     
    #include <delay.h>
     
    // Declare your global variables here
     float i,v;
    // Bandgap Voltage Reference: Off
    #define ADC_VREF_TYPE ((0<<REFS0) | (1<<ADLAR))
     
    // Read the 8 most significant bits
    // of the AD conversion result
    unsigned char read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | ADC_VREF_TYPE;
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(1000);
    // Start the AD conversion
    ADCSRA|=(1<<ADSC);
    // Wait for the AD conversion to complete
    while ((ADCSRA & (1<<ADIF))==0);
    ADCSRA|=(1<<ADIF);
    return ADCH;
    }
     
    void main(void)
    {
    // Declare your local variables here
     
    // Crystal Oscillator division factor: 1
    #pragma optsize-
    CLKPR=(1<<CLKPCE);
    CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif
     
    // Input/Output Ports initialization
    // Port B initialization
    // Function: Bit5=Out Bit4=In Bit3=In Bit2=Out Bit1=In Bit0=Out 
    DDRB=(1<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (1<<DDB0);
    // State: Bit5=1 Bit4=T Bit3=T Bit2=0 Bit1=T Bit0=0 
    PORTB=(1<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
     
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
    TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;
     
    // Timer/Counter 0 Interrupt(s) initialization
    TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
     
    // External Interrupt(s) initialization
    // INT0: Off
    // Interrupt on any change on pins PCINT0-5: Off
    GIMSK=(0<<INT0) | (0<<PCIE);
    MCUCR=(0<<ISC01) | (0<<ISC00);
     
    // Analog Comparator initialization
    // Analog Comparator: Off
    // The Analog Comparator's positive input is
    // connected to the AIN0 pin
    // The Analog Comparator's negative input is
    // connected to the AIN1 pin
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
    // Digital input buffer on AIN0: On
    // Digital input buffer on AIN1: On
    DIDR0=(0<<AIN0D) | (0<<AIN1D);
     
    // ADC initialization
    // ADC Clock frequency: 9.375 kHz
    // ADC Bandgap Voltage Reference: Off
    // ADC Auto Trigger Source: Free Running
    // Only the 8 most significant bits of
    // the AD conversion result are used
    // Digital input buffers on ADC0: Off, ADC1: Off, ADC2: On, ADC3: Off
    DIDR0|=(1<<ADC0D) | (0<<ADC2D) | (1<<ADC3D) | (1<<ADC1D);
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
    ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
    PORTB.5=0;
    delay_ms(1);
    while (1)
          {
                i=read_adc(10);
                delay_ms(1);
                v=(i*5.00)/1023;
                if (v<=1.81) PORTB.5=1;
               
          }
    }
لطفا صبر کنید...
X