اطلاعیه

Collapse
No announcement yet.

اشکال در حذف نویز ADC

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

    اشکال در حذف نویز ADC

    عزیزان خسته نباشید
    خواهشا یه راهنمایی بفرمایید دستورات پایین را از کدویژن گرفتم ولی مقدار را صفرنمایش میده.اشکالم اینه : شماره کانال خواندن adc را کجا بنویسم ؟
    روی این تصویر هم نفهمیدم چطوری باید شماره کانال را وارد کنم .ممنون از همگی


    کد:
    
    
    کد:
    #include <mega8.h>
    
    #include <delay.h>
    
    unsigned char adc_data;
    #define ADC_VREF_TYPE 0x20
    
    // ADC interrupt service routine
    interrupt [ADC_INT] void adc_isr(void)
    {
    // Read the 8 most significant bits
    // of the AD conversion result
    adc_data=ADCH;
    }
    
    // Read the 8 most significant bits
    // of the AD conversion result
    // with noise canceling
    unsigned char read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    #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
    return adc_data;
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    
    
    DDRC.1=0X00;
    PORTC.1=0X00;
    
    
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // USART disabled
    UCSRB=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC Clock frequency: 125.000 kHz
    // ADC Voltage Reference: AREF pin
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x8E;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
          {
          // Place your code here
    [COLOR=#ff0000]       [SIZE=2]  temp = read_adc(1)[/SIZE];//مقدار صفر نمایش میده [/COLOR]
       
       }
    }
    temp = adc_data(1);//باز هم مقدار صفر نمایش میده
    جدیدترین ویرایش توسط yahoo2020; ۱۴:۲۳ ۱۳۹۸/۱۱/۰۶.

    #2
    پاسخ : اشکال در حذف نویز ADC

    نوشته اصلی توسط yahoo2020 نمایش پست ها
    عزیزان خسته نباشید
    خواهشا یه راهنمایی بفرمایید دستورات پایین را از کدویژن گرفتم ولی مقدار را صفرنمایش میده.اشکالم اینه : شماره کانال خواندن adc را کجا بنویسم ؟
    روی این تصویر هم نفهمیدم چطوری باید شماره کانال را وارد کنم .ممنون از همگی


    کد:
    
    
    کد:
    #include <mega8.h>
    
    #include <delay.h>
    
    unsigned char adc_data;
    #define ADC_VREF_TYPE 0x20
    
    // ADC interrupt service routine
    interrupt [ADC_INT] void adc_isr(void)
    {
    // Read the 8 most significant bits
    // of the AD conversion result
    adc_data=ADCH;
    }
    
    // Read the 8 most significant bits
    // of the AD conversion result
    // with noise canceling
    unsigned char read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    #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
    return adc_data;
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    
    
    DDRC.1=0X00;
    PORTC.1=0X00;
    
    
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // USART disabled
    UCSRB=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC Clock frequency: 125.000 kHz
    // ADC Voltage Reference: AREF pin
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x8E;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
          {
          // Place your code here
    [COLOR=#ff0000]       [SIZE=2]  temp = read_adc(1)[/SIZE];//مقدار صفر نمایش میده [/COLOR]
       
       }
    }
    temp = adc_data(1);//باز هم مقدار صفر نمایش میده
    سلام
    ببینید شما وقتی با ویزارد تنظیماتو انجام میدید دیگه لازم نیست مستقیما رجیسترها رو دستکاری کنید. فقط از تابع read_adc استفاده کنید و شماره کانال ورودی رو بهش بدید. ضمنا اینجور که مشخصه رفرنس رو به صورت خارجی قرار دادید پس باید پایه AREF رو به ولتاژ مرجعی که مد نظرتونه وصل کنید.

    دیدگاه


      #3
      پاسخ : اشکال در حذف نویز ADC

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      ببینید شما وقتی با ویزارد تنظیماتو انجام میدید دیگه لازم نیست مستقیما رجیسترها رو دستکاری کنید. فقط از تابع read_adc استفاده کنید و شماره کانال ورودی رو بهش بدید. ضمنا اینجور که مشخصه رفرنس رو به صورت خارجی قرار دادید پس باید پایه AREF رو به ولتاژ مرجعی که مد نظرتونه وصل کنید.
      ممنون. کد ها را دستکاری نکرده ام فقط چند تا کد پورت B و ..... را اینجا دلیت کردم که طولانی نباشه ولی توی برنامه اصلی دستکاری نشده .
      اره درسته از رفرنس خارجی خارجی استفاده میشه و پایه اش هم متصله . از تابع read_adc استفاده میکنم مقدار را صفر نشون میده !
      الان اگر بخوام توی کدهای بالا جای PORT.C1 را عوض کنم و بشه PORT.C2 کجا ها را باید تغییر بدم ؟سپاس
      اینجا
      temp = read_adc(2); را عوض میکنم و توی مین هم پورت C1 را میکنم C2 ولی باز هم مقدار صفر نشون میده!
      این هم کد بدون دستکاری

      کد:
      #include <mega8.h>
      
      #include <delay.h>
      
      unsigned char adc_data;
      #define ADC_VREF_TYPE 0x20
      
      // ADC interrupt service routine
      interrupt [ADC_INT] void adc_isr(void)
      {
      // Read the 8 most significant bits
      // of the AD conversion result
      adc_data=ADCH;
      }
      
      // Read the 8 most significant bits
      // of the AD conversion result
      // with noise canceling
      unsigned char read_adc(unsigned char adc_input)
      {
      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
      // Delay needed for the stabilization of the ADC input voltage
      delay_us(10);
      #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
      return adc_data;
      }
      
      // Declare your global variables here
      
      void main(void)
      {
      // Declare your local variables here
      
      // Input/Output Ports initialization
      // Port B initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
      PORTB=0x00;
      DDRB=0x00;
      
      // Port C initialization
      // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
      PORTC=0x00;
      DDRC=0x00;
      
      // Port D initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
      PORTD=0x00;
      DDRD=0x00;
      
      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      TCCR0=0x00;
      TCNT0=0x00;
      
      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: Timer1 Stopped
      // Mode: Normal top=0xFFFF
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer1 Overflow Interrupt: Off
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x00;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;
      
      // Timer/Counter 2 initialization
      // Clock source: System Clock
      // Clock value: Timer2 Stopped
      // Mode: Normal top=0xFF
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;
      
      // External Interrupt(s) initialization
      // INT0: Off
      // INT1: Off
      MCUCR=0x00;
      
      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x00;
      
      // USART initialization
      // USART disabled
      UCSRB=0x00;
      
      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;
      
      // ADC initialization
      // ADC Clock frequency: 125.000 kHz
      // ADC Voltage Reference: AREF pin
      // Only the 8 most significant bits of
      // the AD conversion result are used
      ADMUX=ADC_VREF_TYPE & 0xff;
      ADCSRA=0x8E;
      
      // SPI initialization
      // SPI disabled
      SPCR=0x00;
      
      // TWI initialization
      // TWI disabled
      TWCR=0x00;
      
      // Global enable interrupts
      #asm("sei")
      
      while (1)
            {
            // Place your code here
              temp = read_adc(2);
            }
      جدیدترین ویرایش توسط yahoo2020; ۱۶:۵۹ ۱۳۹۸/۱۱/۰۶.

      دیدگاه


        #4
        پاسخ : اشکال در حذف نویز ADC

        نوشته اصلی توسط yahoo2020 نمایش پست ها
        ممنون. کد ها را دستکاری نکرده ام فقط چند تا کد پورت B و ..... را اینجا دلیت کردم که طولانی نباشه ولی توی برنامه اصلی دستکاری نشده .
        اره درسته از رفرنس خارجی خارجی استفاده میشه و پایه اش هم متصله . از تابع read_adc استفاده میکنم مقدار را صفر نشون میده !
        الان اگر بخوام توی کدهای بالا جای PORT.C1 را عوض کنم و بشه PORT.C2 کجا ها را باید تغییر بدم ؟سپاس
        اینجا
        temp = read_adc(2); را عوض میکنم و توی مین هم پورت C1 را میکنم C2 ولی باز هم مقدار صفر نشون میده!
        این هم کد بدون دستکاری

        کد:
        #include <mega8.h>
        
        #include <delay.h>
        
        unsigned char adc_data;
        #define ADC_VREF_TYPE 0x20
        
        // ADC interrupt service routine
        interrupt [ADC_INT] void adc_isr(void)
        {
        // Read the 8 most significant bits
        // of the AD conversion result
        adc_data=ADCH;
        }
        
        // Read the 8 most significant bits
        // of the AD conversion result
        // with noise canceling
        unsigned char read_adc(unsigned char adc_input)
        {
        ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
        // Delay needed for the stabilization of the ADC input voltage
        delay_us(10);
        #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
        return adc_data;
        }
        
        // Declare your global variables here
        
        void main(void)
        {
        // Declare your local variables here
        
        // Input/Output Ports initialization
        // Port B initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
        PORTB=0x00;
        DDRB=0x00;
        
        // Port C initialization
        // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
        // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
        PORTC=0x00;
        DDRC=0x00;
        
        // Port D initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
        PORTD=0x00;
        DDRD=0x00;
        
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: Timer 0 Stopped
        TCCR0=0x00;
        TCNT0=0x00;
        
        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: Timer1 Stopped
        // Mode: Normal top=0xFFFF
        // OC1A output: Discon.
        // OC1B output: Discon.
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        // Timer1 Overflow Interrupt: Off
        // Input Capture Interrupt: Off
        // Compare A Match Interrupt: Off
        // Compare B Match Interrupt: Off
        TCCR1A=0x00;
        TCCR1B=0x00;
        TCNT1H=0x00;
        TCNT1L=0x00;
        ICR1H=0x00;
        ICR1L=0x00;
        OCR1AH=0x00;
        OCR1AL=0x00;
        OCR1BH=0x00;
        OCR1BL=0x00;
        
        // Timer/Counter 2 initialization
        // Clock source: System Clock
        // Clock value: Timer2 Stopped
        // Mode: Normal top=0xFF
        // OC2 output: Disconnected
        ASSR=0x00;
        TCCR2=0x00;
        TCNT2=0x00;
        OCR2=0x00;
        
        // External Interrupt(s) initialization
        // INT0: Off
        // INT1: Off
        MCUCR=0x00;
        
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x00;
        
        // USART initialization
        // USART disabled
        UCSRB=0x00;
        
        // Analog Comparator initialization
        // Analog Comparator: Off
        // Analog Comparator Input Capture by Timer/Counter 1: Off
        ACSR=0x80;
        SFIOR=0x00;
        
        // ADC initialization
        // ADC Clock frequency: 125.000 kHz
        // ADC Voltage Reference: AREF pin
        // Only the 8 most significant bits of
        // the AD conversion result are used
        ADMUX=ADC_VREF_TYPE & 0xff;
        ADCSRA=0x8E;
        
        // SPI initialization
        // SPI disabled
        SPCR=0x00;
        
        // TWI initialization
        // TWI disabled
        TWCR=0x00;
        
        // Global enable interrupts
        #asm("sei")
        
        while (1)
              {
              // Place your code here
                temp = read_adc(2);
              }
        میشه بپرسم دقیقا قراره چکاری انجام بدید؟ الآن فقط داره adc خونده میشه و مقدارش ریخته میشه توی متغیر temp که من حتی نمیبینم جایی تعریف شده باشه! با این تفاسیر از کجا تشخیص میدید مقدار خونده شده 0 هستش؟ اصلا چطور ممکنه وقتی temp تعریف نشده کد کامپایل بشه؟ وقتی متغیری تعریف نشده باشه کامپایلر ارور میده و خروجی تولید نمیشه.

        دیدگاه


          #5
          پاسخ : اشکال در حذف نویز ADC

          شرمنده چقدر من گیجم اینو بالا یادم رفته بنویسم.بدون این کمپایل نمیشه درسته
          کد:
          unsigned int temp;
          دلیل: ادغام دو پست برای جلوگیری از اسپم

          این دوستمون هم اینجا همین مشکل منو داشته
          https://www.eca.ir/forums/thread78491-3.html

          دیدگاه


            #6
            پاسخ : اشکال در حذف نویز ADC

            نوشته اصلی توسط yahoo2020 نمایش پست ها
            شرمنده چقدر من گیجم اینو بالا یادم رفته بنویسم.بدون این کمپایل نمیشه درسته
            کد:
            unsigned int temp;
            دلیل: ادغام دو پست برای جلوگیری از اسپم

            این دوستمون هم اینجا همین مشکل منو داشته
            https://www.eca.ir/forums/thread78491-3.html
            شما یک بار بفرمایید میخوایید دقیقا چه کاری انجام بدید تا من راهنمایی تون کنم. من حتی الآن دقیق نمیدونم مشکلتون چیه!

            دیدگاه


              #7
              پاسخ : اشکال در حذف نویز ADC

              شما یک بار بفرمایید میخوایید دقیقا چه کاری انجام بدید تا من راهنمایی تون کنم. من حتی الآن دقیق نمیدونم مشکلتون چیه!
              .................................................. ...........................
              ممنونم .من میخوام اینو یاد بگیرم که با توجه به تصویر اولین پست که گذاشته ام چطوری شماره کانال خواندن adc را تغییر بدم. مثلا مقدار را از پورت C4 یا C3 بخونم
              وقتی وقفه نداریم توی while(1)
              می نویسیم Temp = read_adc(4); خوب اینجا با تغییر عدد 4 به هر پورتی بخواهیم وصلش میکنیم. ولی با وقفه و ADC interrupt و noise canceling گیج شده ام نمیدانم چطوری باید مقدار را وارد کنم و بخونم.اگر یک مثالی میزدید ممنون میشدم.
              روی این شماتیک توی پرتیوس هر کاری کردم نشد متاسفانه
              جدیدترین ویرایش توسط yahoo2020; ۱۹:۲۲ ۱۳۹۸/۱۱/۰۶.

              دیدگاه


                #8
                پاسخ : اشکال در حذف نویز ADC

                نوشته اصلی توسط yahoo2020 نمایش پست ها
                شما یک بار بفرمایید میخوایید دقیقا چه کاری انجام بدید تا من راهنمایی تون کنم. من حتی الآن دقیق نمیدونم مشکلتون چیه!
                .................................................. ...........................
                ممنونم .من میخوام اینو یاد بگیرم که با توجه به تصویر اولین پست که گذاشته ام چطوری شماره کانال خواندن adc را تغییر بدم. مثلا مقدار را از پورت C4 یا C3 بخونم
                وقتی وقفه نداریم توی while(1)
                می نویسیم Temp = read_adc(4); خوب اینجا با تغییر عدد 4 به هر پورتی بخواهیم وصلش میکنیم. ولی با وقفه و ADC interrupt و noise canceling گیج شده ام نمیدانم چطوری باید مقدار را وارد کنم و بخونم.اگر یک مثالی میزدید ممنون میشدم.
                روی این شماتیک توی پرتیوس هر کاری کردم نشد متاسفانه
                http://s7.picofile.com/file/8386158068/Test2.rar.html
                خوب شما لازم نیست رجیسترها رو دستکاری کنید! گفتم که فقط آرگومان ورودی تابع read_adc رو شماره کانال adc که میخوایید بخونید قرار بدید! ضمنا برای کارهای ساده وقفه لازم نیست فعال کنید. همون مد single بذاریدش کافیه. اگر کارتون حساس نیست نویز کنسلینگ هم غیر فعال کنید!
                در نهایت توصیه اکید میکنم به صورت درست آموزش رو شروع کنید و دور ویزارد رو خط بکشید. سایت هایی هستند که به صورت کاملا رجیستری آموزش میدن. سعی کنید با اون سایت ها پیش برید.کمی که حرفه ای شدید به نظر من این (شبه) کامپایلر کذایی کدویژنم بندازید دور و با اتمل استدیو و امثال اون کار کنید.

                دیدگاه


                  #9
                  پاسخ : اشکال در حذف نویز ADC

                  نوشته اصلی توسط hossein.m98 نمایش پست ها
                  خوب شما لازم نیست رجیسترها رو دستکاری کنید! گفتم که فقط آرگومان ورودی تابع read_adc رو شماره کانال adc که میخوایید بخونید قرار بدید! ضمنا برای کارهای ساده وقفه لازم نیست فعال کنید. همون مد single بذاریدش کافیه. اگر کارتون حساس نیست نویز کنسلینگ هم غیر فعال کنید!
                  در نهایت توصیه اکید میکنم به صورت درست آموزش رو شروع کنید و دور ویزارد رو خط بکشید. سایت هایی هستند که به صورت کاملا رجیستری آموزش میدن. سعی کنید با اون سایت ها پیش برید.کمی که حرفه ای شدید به نظر من این (شبه) کامپایلر کذایی کدویژنم بندازید دور و با اتمل استدیو و امثال اون کار کنید.
                  ممنونم دوست عزیز .هدفم این بود این وقفه و نویز کنسلینگ را هم یاد بگیرم و الا کار خاصی به این روش وقفه ندارم. کلی هم توی این سایت ها گشتم مثال عملی متاسفانه در این مورد نبود.این هم درسته که فرمودین کارهای ساده وقفه لازم نیست فعال کنید.ولی هدفم اینه این مطلب را هم یاد بگیرم.تا این مطلب را یاد نگیرم اروم نمیشم
                  .................................................. ....
                  وقتی وقفه نداریم می نویسیم Temp = read_adc(4); خوب اینجا با تغییر عدد 4 به هر پورتی بخواهیم وصلش میکنیم. ولی با وقفه و ADC interrupt و noise canceling
                  مثل اینکه باید MUX4 طبق تصویر زیر تنظیم بشه
                  جدیدترین ویرایش توسط yahoo2020; ۲۰:۲۰ ۱۳۹۸/۱۱/۰۶.

                  دیدگاه


                    #10
                    پاسخ : اشکال در حذف نویز ADC

                    نوشته اصلی توسط yahoo2020 نمایش پست ها
                    ممنونم دوست عزیز .هدفم این بود این وقفه و نویز کنسلینگ را هم یاد بگیرم و الا کار خاصی به این روش وقفه ندارم. کلی هم توی این سایت ها گشتم مثال عملی متاسفانه در این مورد نبود.این هم درسته که فرمودین کارهای ساده وقفه لازم نیست فعال کنید.ولی هدفم اینه این مطلب را هم یاد بگیرم.تا این مطلب را یاد نگیرم اروم نمیشم
                    .................................................. ....
                    وقتی وقفه نداریم می نویسیم Temp = read_adc(4); خوب اینجا با تغییر عدد 4 به هر پورتی بخواهیم وصلش میکنیم. ولی با وقفه و ADC interrupt و noise canceling
                    مثل اینکه باید MUX4 طبق تصویر زیر تنظیم بشه
                    http://uupload.ir/files/4z61_i_978.jpg
                    این قطعه کد رو ببینید:
                    ADMUX &= 0xE0;
                    ADMUX |= 0b00011111;

                    توی خط اول اول تمام بیت های MUX0 تا MUX4 صفر میشن و توی خط پایینی 1. شما فرضا میخوایید کانال 4 رو انتخاب کنید؛ طبق جدول شما باید عدد 00100 رو به جای اون پنج تا یک در خط دوم قرار بدید یا مثلا برای کانال 3 باید عدد 00011 رو قرار بدید.
                    ADMUX |= 0b00000100;
                    ADMUX |= 0b00000011;

                    با این دو خط بقیه بیت ها بدون تغییر میمونن. توضیحات نحوه عملکرد این دو خط یکم طولانیه که اگر به عملگرهای بیتی مسلط باشید، راحت خودتون میتونید بفهمید چجوریاس. البته یک نکته ای رو باید بگم که ATmega8 بیت MUX4 نداره و جاش خالیه! در هر صورت کد بالا کار میکنه.

                    دیدگاه


                      #11
                      پاسخ : اشکال در حذف نویز ADC

                      نوشته اصلی توسط hossein.m98 نمایش پست ها
                      خوب شما لازم نیست رجیسترها رو دستکاری کنید! گفتم که فقط آرگومان ورودی تابع read_adc رو شماره کانال adc که میخوایید بخونید قرار بدید! ضمنا برای کارهای ساده وقفه لازم نیست فعال کنید. همون مد single بذاریدش کافیه. اگر کارتون حساس نیست نویز کنسلینگ هم غیر فعال کنید!
                      در نهایت توصیه اکید میکنم به صورت درست آموزش رو شروع کنید و دور ویزارد رو خط بکشید. سایت هایی هستند که به صورت کاملا رجیستری آموزش میدن. سعی کنید با اون سایت ها پیش برید.کمی که حرفه ای شدید به نظر من این (شبه) کامپایلر کذایی کدویژنم بندازید دور و با اتمل استدیو و امثال اون کار کنید.
                      سلام دوست عزیز
                      با اجازتون من پاسخ های زیبای شما رو خوندم.
                      فقط دوتا سوال داشتم از خدمتتون:
                      1) میشه چندتا از این سایت هایی که برنامه نویسی رو به صورت رجیستری آموزش میدن نام ببرید؟
                      2) از نظر شما چرا کدویژن خوب نیست؟ اتمل استودیو چه ویژگی خاصی داره که پیشنهاد می کنید؟

                      دیدگاه


                        #12
                        پاسخ : اشکال در حذف نویز ADC

                        نوشته اصلی توسط arminn13 نمایش پست ها
                        سلام دوست عزیز
                        با اجازتون من پاسخ های زیبای شما رو خوندم.
                        فقط دوتا سوال داشتم از خدمتتون:
                        1) میشه چندتا از این سایت هایی که برنامه نویسی رو به صورت رجیستری آموزش میدن نام ببرید؟
                        2) از نظر شما چرا کدویژن خوب نیست؟ اتمل استودیو چه ویژگی خاصی داره که پیشنهاد می کنید؟
                        سایت که زیاده اگر سرچ کنید n تا سایت برای آموزش هست که بعضیاشون خیلی خوب آموزش دادن.
                        اما کدویژن؛ میتونم چندتا دلیل براتون بیارم. اول اینکه کدویژن اصلا برای زبان سی توسعه داده نشده! در واقع فقط زبان مورد استفادش به سی شبیه هستش!!! دلیلشم کلی قواعد من در آوردیه که توی هیچ کامپایلر استاندارد دیگه ای پیدا نمیکنید. برای نمونه PORTA.0 از نظر استاندارد زبان سی بی معنیه چون رجیسترها که ساختار نیستند که عضوی به اسم 0 داشته باشن! یا مثلا توی تابع main تعریف متغیرها حتما باید قبل از مقدار دهی رجیسترها باشه که این یک مورد واقعا احمقانس!
                        دلیل بعدی بهینه نبودن خروجی این نرم افزاره. چند وقت پیش ها توی یکی از سایت ها مقاله ای دیدم که مقایسه ای داشتن بین کدویژن و کامپایلر GCC و از وجوه مختلف این دو رو مقایسه کرده بودن؛ جالب بود که توی همه موارد کدویژن تقریبا حرفی برای گفتن نداشت!
                        سومین دلیل اینه که کدویژن اصلا رفتاری مثل یک کامپایلر استاندارد نداره. ببینید برای تولید خروجی، فایل های پروژه باید از مراحلی مثل کامپایلر، لینکر و... گذر کنن تا خروجی تولید بشه اما کدویژن نو آوری کرده و همه کارو با هم انجام میده! شاید فکر کنید این که خوبه اما نه وقتی که پروژه بزرگ باشه و فایلهای مختلفی رو بخواییم به پروژه اضافه کنیم. یک کامپایلر استاندارد فایلی که تغییری نداشته دوباره کامپایل نمیکنه ولی در مورد کدویژن فکر میکنم همچین چیزی نداریم!
                        خوب کمی هم در مورد اتمل استدیو بگم. اتمل استدیو صرفا یک پوسته و ادیتوره که از هسته GCC بهره میبره. GCC یک کامپایلر متن باز استاندارد هستش که توی روند توسعه اش افراد زیادی دست داشتن و به خاطر همین یکی از بی نقص ترین کامپایلرهاس. همچنین GCC برای سخت افزارهای مختلفی پورت شده و تقریبا هرجا اسمی از زبان C باشه، GCC هم وجود داره.
                        یکی از دلایلی که اصرار دارم از اتمل استدیو و کامپایلر GCC استفاده کنید اینه که تقریبا همه جای جهان به غیر از ایران از این نرم افزارها به دلیل رایگان بودنشون و مزایایی که دارن استفاده میکنن و سمپل و اموزش براشون زیاده! فقط ما ایرانی ها هستیم که به خاطر یک ویزارد مسخره کدویژن چسبیدیم به اون و بدتر اینکه توی دانشگاه ها برای آموزش ازش استفاده میکنیم!

                        دیدگاه


                          #13
                          پاسخ : اشکال در حذف نویز ADC

                          مرسی از پاسخ کاملتون

                          دیدگاه

                          لطفا صبر کنید...
                          X